summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/lcdf-typetools
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/lcdf-typetools')
-rw-r--r--Build/source/texk/lcdf-typetools/ChangeLog221
-rw-r--r--Build/source/texk/lcdf-typetools/Makefile.am54
-rw-r--r--Build/source/texk/lcdf-typetools/Makefile.in1258
-rw-r--r--Build/source/texk/lcdf-typetools/TLpatches/ChangeLog196
-rw-r--r--Build/source/texk/lcdf-typetools/TLpatches/TL-Changes13
-rw-r--r--Build/source/texk/lcdf-typetools/TLpatches/patch-02-mingw6411
-rw-r--r--Build/source/texk/lcdf-typetools/TLpatches/patch-03-w32200
-rw-r--r--Build/source/texk/lcdf-typetools/ac/lcdf-typetools.ac15
-rw-r--r--Build/source/texk/lcdf-typetools/ac/withenable.ac8
-rw-r--r--Build/source/texk/lcdf-typetools/aclocal.m41179
-rw-r--r--Build/source/texk/lcdf-typetools/autoconf.h.in330
-rwxr-xr-xBuild/source/texk/lcdf-typetools/configure24054
-rw-r--r--Build/source/texk/lcdf-typetools/configure.ac427
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/7t.enc65
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/COPYING416
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/INSTALL176
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.am86
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.in808
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md1239
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/ONEWS433
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/README.md118
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/autoconf.h.in233
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.in771
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc269
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc591
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.hh10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac514
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphlist.txt4305
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphtounicode.tex5511
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h49
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afm.hh59
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmparse.hh64
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmw.hh29
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/amfm.hh153
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh461
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/encoding.hh27
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/findmet.hh114
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/metrics.hh177
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh371
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfcmap.hh60
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh216
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh249
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh415
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfname.hh122
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh94
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfpost.hh62
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/pairop.hh113
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/psres.hh74
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh96
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1cs.hh345
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1csgen.hh127
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1font.hh167
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1interp.hh239
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1item.hh268
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1mm.hh108
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1rw.hh232
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1unparser.hh39
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfcs.hh40
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfhead.hh41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh42
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh136
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h303
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/error.hh877
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/filename.hh41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/globmatch.hh8
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashcode.hh31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.cc187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.hh210
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/inttypes.h34
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/landmark.hh39
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/md5.h48
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/permstr.hh197
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh185
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/slurper.hh63
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh641
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/string.hh888
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/strtonum.h10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/transform.hh147
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc202
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.hh324
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec99
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.am43
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.in778
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc586
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc365
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc190
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc850
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc1685
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc29
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc321
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc130
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc1491
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc462
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc43
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc717
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc328
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc1398
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc194
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc47
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc200
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc153
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc419
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc165
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc369
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc636
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc916
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc332
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc1377
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc861
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc393
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc613
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc137
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc232
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc69
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc116
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.am31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.in736
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc376
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c2359
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc1185
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc130
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/fixlibc.c73
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc116
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc36
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/md5.c357
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc319
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc57
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc187
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc306
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc786
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/strtonum.c31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc182
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc112
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/m4/lcdf-typetools.m415
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.in748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc434
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1178
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.am17
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.in781
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc463
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1206
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc300
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.hh31
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc41
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.hh7
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc924
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.hh68
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.am16
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.in750
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1199
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc726
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am35
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.in842
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc816
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh27
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc979
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh128
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc236
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh110
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c99
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h23
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc1573
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh288
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.11669
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc2449
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh24
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc706
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh177
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh18
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc483
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh34
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc299
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh37
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.in748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.196
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc425
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.in771
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc553
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.hh136
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.148
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc450
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.in748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.155
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc369
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.am15
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.in771
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1205
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc1109
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc78
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.hh10
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.in748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.166
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist-g2u.txt1188
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist.txt386
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.am14
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.in748
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.178
-rw-r--r--Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc403
-rw-r--r--Build/source/texk/lcdf-typetools/m4/ac_cxx_template_objs.m469
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Ant.enc54
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Ant.map1
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Ant.pfbbin0 -> 152094 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Ant.pl2014
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Fon.postbin0 -> 32 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/Fon.t42290
-rw-r--r--Build/source/texk/lcdf-typetools/tests/FonetikaDaniaIwonaeBold.ttfbin0 -> 7376 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/antpolt-regular.otfbin0 -> 131876 bytes
-rwxr-xr-xBuild/source/texk/lcdf-typetools/tests/t1.test58
-rw-r--r--Build/source/texk/lcdf-typetools/tests/t2c.enc290
-rw-r--r--Build/source/texk/lcdf-typetools/tests/texmfhome.otfbin0 -> 1884 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/texnansx.enc279
-rwxr-xr-xBuild/source/texk/lcdf-typetools/tests/tfm.test26
-rw-r--r--Build/source/texk/lcdf-typetools/tests/tmf.info8
-rw-r--r--Build/source/texk/lcdf-typetools/tests/tmf.pfa185
-rw-r--r--Build/source/texk/lcdf-typetools/tests/tmf.pfbbin0 -> 7201 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/tmf.tables10
-rwxr-xr-xBuild/source/texk/lcdf-typetools/tests/ttf.test48
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhv_dl.pfa180
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhv_dl.pfbbin0 -> 7056 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhv_dl.ps208
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhv_re.afm254
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhv_re.pfa901
-rw-r--r--Build/source/texk/lcdf-typetools/tests/uhvrrc8a.pfbbin0 -> 27330 bytes
-rw-r--r--Build/source/texk/lcdf-typetools/version.ac11
232 files changed, 109839 insertions, 0 deletions
diff --git a/Build/source/texk/lcdf-typetools/ChangeLog b/Build/source/texk/lcdf-typetools/ChangeLog
new file mode 100644
index 00000000000..b846e857844
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/ChangeLog
@@ -0,0 +1,221 @@
+2019-01-28 Akira Kakuto <kakuto@w32tex.org>
+
+ Import lcdf-typetools-2.108.
+ * version.ac: Adapted.
+
+2018-02-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import lcdf-typetools-2.107.
+ * version.ac: Adapted.
+
+2017-03-27 Karl Berry <karl@freefriends.org>
+
+ * Makefile.am (AM_TESTS_ENVIRONMENT): use instead of TESTS_ENVIRONMENT.
+
+2016-06-30 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * tests/[uhv_dl.pfa, uhv_dl.pfb, uhv_dl.ps, Ant.pfb, tmf.pfa, tmf.pfb]:
+ Update for version 2.106.
+
+2016-06-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import lcdf-typetools-2.106.
+ * configure.ac, version.ac: Adapted.
+
+2016-02-23 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * Makefile.am, configure.ac: New convention.
+
+2015-09-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.105.
+ * version.ac: Adapted.
+
+2015-02-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Use the fragment ../../am/dist_hook.am.
+
+2014-07-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.104.
+ * version.ac: Adapted.
+
+2014-07-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.103.
+ * version.ac: Adapted.
+
+2014-07-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.102.
+ * version.ac: Adapted.
+
+2014-06-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.101.
+ * version.ac, tests/uhv_re.afm: Adapted.
+
+2014-01-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.100.
+ * configure.ac, version.ac: Adapted.
+
+2013-09-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Prepare for SELFAUTOGRANDPARENT in TL'14.
+
+2013-09-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.99.
+ * version.ac: Adapted.
+
+2013-09-02 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Drop ACLOCAL_AMFLAGS.
+ * configure.ac: Use AC_CONFIG_MACRO_DIRS.
+
+2013-04-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.98.
+ * version.ac, configure.ac: Adapted.
+
+2012-12-30 Karl Berry <karl@tug.org>
+
+ * configure.ac (AC_CONFIG_HEADERS): use instead of AM_CONFIG_HEADER,
+ which was removed in automake-1.13.
+
+2012-10-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.97.
+ * version.ac, configure.ac: Adapted.
+
+2012-10-23 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/tfm.test: Add to PATH because otftotfm may need to run
+ the uninstalled version of cfftot1, t1dotlessj, or ttftotype42.
+
+2012-10-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * lcdf-typetools-2.95-PATCHES/patch-30-W32TeX:
+ * lcdf-typetools-2.95/otftotfm/automatic.cc:
+ use a texmf.cnf variable jtex_filetype to distinguish TeX Live and
+ W32TeX.
+
+2012-09-25 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.95, now into subdirectory.
+ * version.ac: Adapted.
+ * Makefile.am, configure.ac: Adapted to the new layout.
+ * tests/{t1,tfm,ttf}.test: Adapted to the new layout.
+
+2012-08-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tfm.test: New shell script for an additional test.
+ * tests/antpolt-regular.otf, tests/texnansx.enc,
+ tests/Ant.{enc,map,pfb,pl}: Tfm test input and expected output.
+ * Makefile.am: Add the additional test and its data.
+
+2012-08-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * tests/t1.test tests/ttf.test: New shell scripts for tests.
+ * tests/t2c.enc, tests/uhvrrc8a.pfb, tests/uhv_dl.{pfa,pfb,ps},
+ tests/uhv_re.{afm,pfa}: T1 test input and expected output.
+ * tests/FonetikaDaniaIwonaeBold.ttf, tests/texmfhome.otf,
+ tests/Fon.{post,t42}, tests/tmf.{info,pfa,pfb,tables}:
+ Ttf test input and expected output.
+ * Makefile.am: Add the tests and their data.
+
+2012-08-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.94.
+ * version.ac: Adapted.
+ * configure.ac: Adapted.
+
+2011-12-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Replace DISTCHECK_CONFIGURE_FLAGS by
+ AM_DISTCHECK_CONFIGURE_FLAGS (for automake-1.11.2).
+
+2011-10-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am (DISTCLEANFILES): Add CXXLD.sh.
+
+2011-09-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * Makefile.am: Avoid pkgdata_DATA in order not to install an
+ empty $(pkgdatadir).
+
+2011-08-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.92.
+ * version.ac: Adapt.
+
+2011-06-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.90.
+ * version.ac: New file defining the lcdf-typetools version.
+ * configure.ac: Adapt. Define SHAREDIR as "/nonesuch" to avoid
+ useless build paths stored in the otftotfm binary.
+
+2011-03-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.88.
+ * configure.ac, Makefile.am: Adapt.
+
+2010-10-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.85.
+ * configure.ac, Makefile.am: Adapt.
+
+2010-06-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Using AC_C_INLINE, there is no need to get rid
+ of a possible inline macro under C++.
+
+2010-04-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.83.
+ * configure.ac, Makefile.am: Adapt.
+
+2010-02-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * include/efont/otfdata.hh [WIN32]: From lcdf-typetools-2.83pre.
+ * configure.ac: Fixed typo in generated AC_DEFINE descriptions.
+
+2010-02-21 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Various MinGW32 (cross) build fixes.
+ * configure.ac, include/efont/otfdata.hh:
+ MinGW32 has <sys/param.h> but also needs <winsock2.h>.
+ MinGW32 uses <windows.h> instead of <win32lib.h>.
+ * configure.ac (LIBS) [WIN32]: Add -lwsock32.
+
+ * t1rawafm/t1rawafm.cc: Do not define away 'std'.
+ * t1testpage/t1testpage.cc: Do not define away 'std'.
+ * ttftotype42/ttftotype42.cc (do_file): Remove 'if(binary)'.
+
+2010-02-20 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: Don't fail configure if not building lcdf-typetools.
+
+2009-09-03 Karl Berry <karl@tug.org>
+
+ * configure.ac: AC_DEFINE(HAVE_KPATHSEA) if we have it, else
+ kpse stuff not really enabled, e.g., glyphlist.txt and
+ texnansx.enc not found
+ tlbuild mail from Jown Owens, 31 Aug 2009 14:34:39.
+
+2009-06-19 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * configure.ac: enable compiler warnings (TeX Live style).
+ * liblcdf/clp.c (Clp_OptionChar, finish_string_list): declare
+ as static.
+
+2009-04-22 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Adapt to TL2009 build system.
+
+
+
+Copyright (C) 2009-2012 Peter Breitenlohner <tex-live@tug.org>
+You may freely use, modify and/or distribute this file.
diff --git a/Build/source/texk/lcdf-typetools/Makefile.am b/Build/source/texk/lcdf-typetools/Makefile.am
new file mode 100644
index 00000000000..10019fa2d37
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/Makefile.am
@@ -0,0 +1,54 @@
+## $Id$
+## Makefile.am for the TeX Live subdirectory texk/lcdf-typetools/
+##
+## Copyright 2017 Karl Berry <tex-live@tug.org>
+## Copyright 2009-2015 Peter Breitenlohner <tex-live@tug.org>
+## You may freely use, modify and/or distribute this file.
+##
+# Adapted for TeX Live from lcdf-typetools-src/Makefile.am
+# Copyright (c) 2003-2011 Eddie Kohler
+
+## We use the original lcdf-typetools source tree.
+SUBDIRS = . $(LCDF_TYPETOOLS_TREE)
+DIST_SUBDIRS = $(SUBDIRS)
+
+## Patches applied to the original source tree
+EXTRA_DIST = TLpatches
+
+## We must explicitly distribute some top-level files.
+EXTRA_DIST += \
+ $(LCDF_TYPETOOLS_TREE)/autoconf.h.in \
+ $(LCDF_TYPETOOLS_TREE)/configure.ac \
+ $(LCDF_TYPETOOLS_TREE)/m4
+
+# Files not to be distributed
+include $(srcdir)/../../am/dist_hook.am
+
+all-local: config.force
+
+config.force: $(KPATHSEA_DEPEND)
+ echo timestamp >config.force
+ $(SHELL) ./config.status --recheck
+
+DISTCLEANFILES = config.force CXXLD.sh
+
+## Tests
+AM_TESTS_ENVIRONMENT = LCDF_TYPETOOLS_TREE=$(LCDF_TYPETOOLS_TREE); export LCDF_TYPETOOLS_TREE;
+
+TESTS = tests/t1.test tests/tfm.test tests/ttf.test
+EXTRA_DIST += $(TESTS)
+
+## tests/t1.test
+EXTRA_DIST += tests/t2c.enc tests/uhvrrc8a.pfb \
+ tests/uhv_dl.pfa tests/uhv_dl.pfb tests/uhv_dl.ps \
+ tests/uhv_re.afm tests/uhv_re.pfa
+DISTCLEANFILES += uhv*
+## tests/tfm.test
+EXTRA_DIST += tests/antpolt-regular.otf tests/texnansx.enc \
+ tests/Ant.enc tests/Ant.map tests/Ant.pfb tests/Ant.pl
+DISTCLEANFILES += Ant* a_enhg3c.enc
+## tests/ttf.test
+EXTRA_DIST += tests/FonetikaDaniaIwonaeBold.ttf tests/texmfhome.otf \
+ tests/Fon.post tests/Fon.t42 \
+ tests/tmf.info tests/tmf.pfa tests/tmf.pfb tests/tmf.tables
+DISTCLEANFILES += Fon* tmf.*
diff --git a/Build/source/texk/lcdf-typetools/Makefile.in b/Build/source/texk/lcdf-typetools/Makefile.in
new file mode 100644
index 00000000000..4a9543efdd6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/Makefile.in
@@ -0,0 +1,1258 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Adapted for TeX Live from lcdf-typetools-src/Makefile.am
+# Copyright (c) 2003-2011 Eddie Kohler
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope check recheck distdir distdir-am dist dist-all \
+ distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
+ autoconf.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/../../build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__DIST_COMMON = $(srcdir)/../../am/dist_hook.am \
+ $(srcdir)/Makefile.in $(srcdir)/autoconf.h.in \
+ $(top_srcdir)/../../build-aux/compile \
+ $(top_srcdir)/../../build-aux/config.guess \
+ $(top_srcdir)/../../build-aux/config.sub \
+ $(top_srcdir)/../../build-aux/install-sh \
+ $(top_srcdir)/../../build-aux/ltmain.sh \
+ $(top_srcdir)/../../build-aux/missing \
+ $(top_srcdir)/../../build-aux/test-driver \
+ ../../build-aux/ar-lib ../../build-aux/compile \
+ ../../build-aux/config.guess ../../build-aux/config.sub \
+ ../../build-aux/depcomp ../../build-aux/install-sh \
+ ../../build-aux/ltmain.sh ../../build-aux/missing \
+ ../../build-aux/texinfo.tex ../../build-aux/ylwrap ChangeLog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = . $(LCDF_TYPETOOLS_TREE)
+DIST_SUBDIRS = $(SUBDIRS)
+EXTRA_DIST = TLpatches $(LCDF_TYPETOOLS_TREE)/autoconf.h.in \
+ $(LCDF_TYPETOOLS_TREE)/configure.ac $(LCDF_TYPETOOLS_TREE)/m4 \
+ $(TESTS) tests/t2c.enc tests/uhvrrc8a.pfb tests/uhv_dl.pfa \
+ tests/uhv_dl.pfb tests/uhv_dl.ps tests/uhv_re.afm \
+ tests/uhv_re.pfa tests/antpolt-regular.otf tests/texnansx.enc \
+ tests/Ant.enc tests/Ant.map tests/Ant.pfb tests/Ant.pl \
+ tests/FonetikaDaniaIwonaeBold.ttf tests/texmfhome.otf \
+ tests/Fon.post tests/Fon.t42 tests/tmf.info tests/tmf.pfa \
+ tests/tmf.pfb tests/tmf.tables
+NEVER_DIST = `find . $(NEVER_NAMES)`
+NEVER_NAMES = -name .svn
+NEVER_NAMES_SUB = -o -name .deps -o -name .dirstamp -o -name '*.$(OBJEXT)'
+NEVER_NAMES_LT = -o -name .libs -o -name '*.lo'
+DISTCLEANFILES = config.force CXXLD.sh uhv* Ant* a_enhg3c.enc Fon* \
+ tmf.*
+AM_TESTS_ENVIRONMENT = LCDF_TYPETOOLS_TREE=$(LCDF_TYPETOOLS_TREE); export LCDF_TYPETOOLS_TREE;
+TESTS = tests/t1.test tests/tfm.test tests/ttf.test
+all: autoconf.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .log .test .test$(EXEEXT) .trs
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../../am/dist_hook.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(srcdir)/../../am/dist_hook.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+autoconf.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/autoconf.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status autoconf.h
+$(srcdir)/autoconf.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f autoconf.h stamp-h1
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile autoconf.h all-local
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
+ am--refresh check check-TESTS check-am clean clean-cscope \
+ clean-generic clean-libtool cscope cscopelist-am ctags \
+ ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \
+ dist-lzip dist-shar dist-tarZ dist-xz dist-zip dist-zstd \
+ distcheck distclean distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+dist-hook:
+ cd "$(distdir)" && rm -rf $(NEVER_DIST)
+
+# Files not to be distributed
+
+all-local: config.force
+
+config.force: $(KPATHSEA_DEPEND)
+ echo timestamp >config.force
+ $(SHELL) ./config.status --recheck
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/TLpatches/ChangeLog b/Build/source/texk/lcdf-typetools/TLpatches/ChangeLog
new file mode 100644
index 00000000000..a626ca3bda3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/TLpatches/ChangeLog
@@ -0,0 +1,196 @@
+2019-01-30 Akira Kakuto <kakuto@w32tex.org>
+
+ * patch-03-w32: Remove wrong changes.
+
+2019-01-28 Akira Kakuto <kakuto@w32tex.org>
+
+ Import lcdf-typetools-2.108.
+ * patch-02-mingw64, patch-03-w32: Adapted.
+
+2018-02-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import lcdf-typetools-2.107.
+ * patch-02-mingw64, patch-03-w32: Adapted.
+
+2016-06-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import lcdf-typetools-2.106.
+ * patch-02-mingw64: Adapted.
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX:
+ Unified as patch-03-w32.
+
+2015-09-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.105.
+ * patch-01-win64 (removed): Now in distribution.
+ * patch-02-mingw64, patch-20-TL-binary, patch-21-TL-paths,
+ patch-30-W32TeX: Adapted.
+
+2014-11-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-02-mingw64 (new): Avoid MinGW64 warnings.
+
+2014-11-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-01-win64 (new): Required for MinGW64.
+
+2014-07-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.104.
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2014-07-07 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.103.
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2014-07-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.102.
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2014-06-17 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.101.
+ * patch-10-SELFAUTO (removed): Now in distribution.
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2014-01-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.100.
+
+ * patch-10-SELFAUTO, patch-20-TL-binary, patch-21-TL-paths,
+ patch-30-W32TeX: Adapted.
+
+2013-09-17 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * patch-30-W32TeX: No need to #undefine max/min, instead
+ compile with -DNOMINMAX.
+
+2013-09-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-10-SELFAUTO (new): Prepare for SELFAUTOGRANDPARENT.
+
+ * patch-30-W32TeX: Now for Visual Studio 2010 (from Akira).
+
+2013-09-10 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.99.
+
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2013-04-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.98.
+
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2012-10-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.97.
+ * patch-07-typos, patch-08-future, patch-31-WIN32 (removed):
+ Now all distributed.
+
+ * patch-20-TL-binary, patch-21-TL-paths, patch-30-W32TeX: Adapted.
+
+2012-10-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * patch-30-W32TeX: use a texmf.cnf variable jtex_filetype to
+ distinguish TeX Live and W32TeX.
+
+2012-09-25 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.95.
+ * patch-01-const, patch-02-WIN32, patch-03-manpage,
+ patch-04-PFB_OPT, patch-05-backport, patch-06-enc_format
+ (removed): Now all distributed.
+
+ * patch-07-typos (new): Fix some typos.
+ * patch-08-future (new): Use distributed top-level Makefile.
+ * patch-20-TL-binary: Adapted.
+ * patch-21-TL-paths (new): Use bin/win32/mktexupd.exe.
+ * patch-30-W32TeX, patch-31-WIN32: Adapted.
+
+2012-09-24 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * patch-31-WIN32: Update using _tempnam().
+
+2012-09-21 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ * patch-31-WIN32 (new): Avoid that WIN32 puts temporary files
+ into the root directory resulting in 'Permission denied'.
+
+2012-08-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-06-enc_format (new): Bug fix.
+ * patch-30-W32TeX: Adapted.
+
+2012-08-15 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-02-WIN32: Adapted from upstream.
+ * patch-05-backport (new): From upstream.
+
+2012-08-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-03-manpage (new): Fix manpages.
+ * patch-04-PFB_OPT (new): Correctly handle '-b' option.
+
+2012-08-13 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-02-WIN32: More WIN32.
+ * patch-20-TL-binary: More binary mode for output files.
+ * patch-30-W32TeX: W32TeX specific changes (from Akira).
+
+2012-08-11 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-02-WIN32 (new): Adapt for WIN32.
+ * patch-20-TL-binary (new): Use binary mode for output files.
+ From Akira Kakuto <kakuto@fuk.kindai.ac.jp> (W32TeX).
+
+2012-08-05 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.94.
+ * patch-01-const: Adapted
+
+2011-09-25 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-01-const (new): Avoid cast from const to non-const.
+
+2011-08-16 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.92.
+ * patch-01-void-func (removed): Now distributed.
+
+2011-06-14 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-01-void-func (new): Patch from
+ Vladimir Volovich <vvv@vsu.ru>.
+
+2011-06-06 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.90.
+ * patch-03-warning (removed): Now distributed.
+
+2011-03-09 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.88.
+ * patch-02-warnings (removed): Now distributed.
+
+ * patch-03-warning (new): Avoid `uninitialized' warning (the
+ compiler may not realize that this actually can'thappen).
+
+2011-03-08 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ * patch-02-warnings (new): Remove unused variables; add explicit
+ cast for `-1' used as `uint32_t'.
+
+2010-10-04 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.85.
+ * patch-01-otftotfm-Makefile (removed): Now distributed.
+
+2010-04-26 Peter Breitenlohner <peb@mppmu.mpg.de>
+
+ Import lcdf-typetools-2.83.
+ * patch-01-otftotfm-Makefile (new): Adapt otftotfm/Makefile.am.
+
diff --git a/Build/source/texk/lcdf-typetools/TLpatches/TL-Changes b/Build/source/texk/lcdf-typetools/TLpatches/TL-Changes
new file mode 100644
index 00000000000..8de5cfa9857
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/TLpatches/TL-Changes
@@ -0,0 +1,13 @@
+Changes applied to the lcdf-typetools tree as obtained from:
+ http://www.lcdf.org/type/lcdf-typetools-2.108.tar.gz
+
+Removed:
+ aclocal.m4
+ compile
+ configure
+ depcomp
+ install-sh
+ missing
+
+Created Autoconf macro file ../m4/ac_cxx_template_objs.m4
+ adapting code in configure.ac.
diff --git a/Build/source/texk/lcdf-typetools/TLpatches/patch-02-mingw64 b/Build/source/texk/lcdf-typetools/TLpatches/patch-02-mingw64
new file mode 100644
index 00000000000..401b55ace58
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/TLpatches/patch-02-mingw64
@@ -0,0 +1,11 @@
+diff -ur lcdf-typetools-2.108/include/config.h lcdf-typetools-src/include/config.h
+--- lcdf-typetools-2.108/include/config.h Mon Jan 28 03:39:19 2019
++++ lcdf-typetools-src/include/config.h Mon Jan 28 07:59:03 2019
+@@ -7,6 +7,7 @@
+ #ifdef WIN32
+ # ifdef __MINGW32__
+ # include <winsock2.h>
++# include <windows.h>
+ # else
+ # include <win32lib.h>
+ # endif
diff --git a/Build/source/texk/lcdf-typetools/TLpatches/patch-03-w32 b/Build/source/texk/lcdf-typetools/TLpatches/patch-03-w32
new file mode 100644
index 00000000000..e01b835b9db
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/TLpatches/patch-03-w32
@@ -0,0 +1,200 @@
+diff -ur lcdf-typetools-2.108/liblcdf/filename.cc lcdf-typetools-src/liblcdf/filename.cc
+--- lcdf-typetools-2.108/liblcdf/filename.cc Mon Jan 28 03:39:19 2019
++++ lcdf-typetools-src/liblcdf/filename.cc Thu Jan 31 06:16:24 2019
+@@ -126,5 +126,5 @@
+ if (_actual || !_path)
+ return _actual;
+ else
+- return fopen(_path.c_str(), binary ? "wb" : "w");
++ return fopen(_path.c_str(), "wb");
+ }
+diff -ur lcdf-typetools-2.108/otftotfm/automatic.cc lcdf-typetools-src/otftotfm/automatic.cc
+--- lcdf-typetools-2.108/otftotfm/automatic.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/otftotfm/automatic.cc Thu Jan 31 06:35:14 2019
+@@ -39,7 +39,9 @@
+ #include <algorithm>
+
+ #ifdef WIN32
+-# define mkdir(dir, access) mkdir(dir)
++# include <io.h>
++# include <direct.h>
++# define mkdir(dir, access) _mkdir(dir)
+ # define COPY_CMD "copy"
+ # define CMD_SEP "&"
+ #else
+@@ -124,7 +126,18 @@
+ static void
+ find_writable_texdir(ErrorHandler *errh, const char *)
+ {
++#if defined(W32TEX)
++// W32TeX does not have TEXMFVAR
++ char *p = kpsei_var_value("TEXMFVAR");
++ if (p == NULL) // W32TeX
++ look_for_writable_texdir("$TEXMFLOCAL", true);
++ else { // TeXLive
++ free (p);
++ look_for_writable_texdir("$TEXMFVAR", true);
++ }
++#else
+ look_for_writable_texdir("$TEXMFVAR", true);
++#endif
+ if (!writable_texdir)
+ look_for_writable_texdir("$VARTEXMF", false);
+ if (!writable_texdir)
+@@ -313,7 +326,7 @@
+ String ls_r = writable_texdir + "ls-R";
+ bool success = false;
+ if (access(ls_r.c_str(), R_OK) >= 0) // make sure it already exists
+- if (FILE *f = fopen(ls_r.c_str(), "a")) {
++ if (FILE *f = fopen(ls_r.c_str(), "ab")) {
+ fprintf(f, "./%s:\n%s\n", directory.c_str(), file.c_str());
+ success = true;
+ fclose(f);
+@@ -323,7 +336,11 @@
+ if (!success && writable_texdir.find_left('\'') < 0 && directory.find_left('\'') < 0 && file.find_left('\'') < 0) {
+ // look for mktexupd script
+ if (!mktexupd_tried) {
++#ifdef _WIN32
++ mktexupd = "mktexupd.exe";
++#else
+ mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
++#endif
+ mktexupd_tried = true;
+ }
+
+@@ -677,7 +694,7 @@
+ #endif
+ {
+ fclose(f);
+- f = fopen(map_file.c_str(), "w");
++ f = fopen(map_file.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+diff -ur lcdf-typetools-2.108/otftotfm/kpseinterface.c lcdf-typetools-src/otftotfm/kpseinterface.c
+--- lcdf-typetools-2.108/otftotfm/kpseinterface.c Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/otftotfm/kpseinterface.c Thu Jan 31 06:37:34 2019
+@@ -21,6 +21,9 @@
+ #include <kpathsea/expand.h>
+ #include <kpathsea/c-pathch.h>
+ #include <kpathsea/tex-file.h>
++#ifdef W32TEX
++#include <kpathsea/variable.h>
++#endif
+ #include "kpseinterface.h"
+
+ int kpsei_env_sep_char = ENV_SEP;
+@@ -86,3 +89,11 @@
+ {
+ kpathsea_debug = flags;
+ }
++
++#ifdef W32TEX
++char*
++kpsei_var_value(const char *name)
++{
++ return kpse_var_value(name);
++}
++#endif
+diff -ur lcdf-typetools-2.108/otftotfm/kpseinterface.h lcdf-typetools-src/otftotfm/kpseinterface.h
+--- lcdf-typetools-2.108/otftotfm/kpseinterface.h Thu Jun 23 21:25:52 2016
++++ lcdf-typetools-src/otftotfm/kpseinterface.h Thu Jan 31 06:38:40 2019
+@@ -13,6 +13,10 @@
+ char* kpsei_find_file(const char* name, int format);
+ void kpsei_set_debug_flags(unsigned flags);
+
++#ifdef W32TEX
++char* kpsei_var_value(const char *name);
++#endif
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff -ur lcdf-typetools-2.108/otftotfm/otftotfm.cc lcdf-typetools-src/otftotfm/otftotfm.cc
+--- lcdf-typetools-2.108/otftotfm/otftotfm.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/otftotfm/otftotfm.cc Thu Jan 31 06:40:59 2019
+@@ -63,6 +63,9 @@
+ #ifdef HAVE_FCNTL_H
+ # include <fcntl.h>
+ #endif
++#ifdef _MSC_VER
++# include <io.h>
++#endif
+
+ using namespace Efont;
+
+@@ -590,7 +593,7 @@
+
+ if (verbose)
+ errh->message("creating %s", filename.c_str());
+- FILE *f = fopen(filename.c_str(), "w");
++ FILE *f = fopen(filename.c_str(), "wb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return;
+@@ -1048,7 +1051,7 @@
+ #endif
+ {
+ fclose(f);
+- f = fopen(filename.c_str(), "w");
++ f = fopen(filename.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+diff -ur lcdf-typetools-2.108/t1dotlessj/t1dotlessj.cc lcdf-typetools-src/t1dotlessj/t1dotlessj.cc
+--- lcdf-typetools-2.108/t1dotlessj/t1dotlessj.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/t1dotlessj/t1dotlessj.cc Thu Jan 31 06:43:35 2019
+@@ -410,10 +410,10 @@
+ // write it to output
+ if (!outputf)
+ outputf = stdout;
+- if (binary) {
+ #if defined(_MSDOS) || defined(_WIN32)
+- _setmode(_fileno(outputf), _O_BINARY);
++ _setmode(_fileno(outputf), _O_BINARY);
+ #endif
++ if (binary) {
+ Type1PFBWriter w(outputf);
+ dotless_font->write(w);
+ } else {
+diff -ur lcdf-typetools-2.108/t1rawafm/t1rawafm.cc lcdf-typetools-src/t1rawafm/t1rawafm.cc
+--- lcdf-typetools-2.108/t1rawafm/t1rawafm.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/t1rawafm/t1rawafm.cc Thu Jan 31 06:44:47 2019
+@@ -359,6 +359,9 @@
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
++#if defined(_MSDOS) || defined(_WIN32)
++ _setmode(_fileno(outf), _O_BINARY);
++#endif
+
+ write_afm(outf, font);
+
+diff -ur lcdf-typetools-2.108/t1reencode/t1reencode.cc lcdf-typetools-src/t1reencode/t1reencode.cc
+--- lcdf-typetools-2.108/t1reencode/t1reencode.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/t1reencode/t1reencode.cc Thu Jan 31 06:46:38 2019
+@@ -1094,10 +1094,10 @@
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+- if (binary) {
+ #if defined(_MSDOS) || defined(_WIN32)
+- _setmode(_fileno(outf), _O_BINARY);
++ _setmode(_fileno(outf), _O_BINARY);
+ #endif
++ if (binary) {
+ Type1PFBWriter w(outf);
+ font->write(w);
+ } else {
+diff -ur lcdf-typetools-2.108/t1testpage/t1testpage.cc lcdf-typetools-src/t1testpage/t1testpage.cc
+--- lcdf-typetools-2.108/t1testpage/t1testpage.cc Mon Jan 28 03:39:20 2019
++++ lcdf-typetools-src/t1testpage/t1testpage.cc Thu Jan 31 06:47:51 2019
+@@ -665,6 +665,9 @@
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
++#if defined(_MSDOS) || defined(_WIN32)
++ _setmode(_fileno(outf), _O_BINARY);
++#endif
+
+ //font->undo_synthetic();
diff --git a/Build/source/texk/lcdf-typetools/ac/lcdf-typetools.ac b/Build/source/texk/lcdf-typetools/ac/lcdf-typetools.ac
new file mode 100644
index 00000000000..7aaff4c33af
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/ac/lcdf-typetools.ac
@@ -0,0 +1,15 @@
+## Define configure options for lcdf-typetools. Extracted from configure.ac
+## for ease of building TeX Live.
+m4_define_default([kpse_indent_26], [26])[]dnl
+m4_define([kpse_lcdf_typetools_progs], [cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42])[]dnl
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [AC_ARG_ENABLE(Kpse_Prog,
+ AS_HELP_STRING([--disable-]Kpse_Prog,
+ [do not build the ]Kpse_Prog[ program],
+ kpse_indent_26))])
+m4_define([kpse_otftotfm_auto_opts], [cfftot1 t1dotlessj ttftotype42 updmap])[]dnl
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AC_ARG_ENABLE(Kpse_Opt,
+ AS_HELP_STRING([--disable-auto-]Kpse_Opt,
+ [disable running ]Kpse_Opt[ from otftotfm],
+ kpse_indent_26))])
diff --git a/Build/source/texk/lcdf-typetools/ac/withenable.ac b/Build/source/texk/lcdf-typetools/ac/withenable.ac
new file mode 100644
index 00000000000..86de85c9e2e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/ac/withenable.ac
@@ -0,0 +1,8 @@
+## texk/lcdf-typetools/ac/withenable.ac: configure.ac fragment for the TeX Live subdirectory texk/lcdf-typetools/
+dnl
+dnl Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org>
+dnl You may freely use, modify and/or distribute this file.
+dnl
+## configure options and TL libraries required for lcdf-typetools
+KPSE_ENABLE_PROG([lcdf-typetools], [kpathsea])
+m4_include(kpse_TL[texk/lcdf-typetools/ac/lcdf-typetools.ac])
diff --git a/Build/source/texk/lcdf-typetools/aclocal.m4 b/Build/source/texk/lcdf-typetools/aclocal.m4
new file mode 100644
index 00000000000..9a16a4bdc52
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/aclocal.m4
@@ -0,0 +1,1179 @@
+# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.3], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ac_cxx_template_objs.m4])
+m4_include([../../m4/kpse-common.m4])
+m4_include([../../m4/kpse-cxx-hack.m4])
+m4_include([../../m4/kpse-kpathsea-flags.m4])
+m4_include([../../m4/kpse-warnings.m4])
+m4_include([../../m4/kpse-win32.m4])
+m4_include([../../m4/libtool.m4])
+m4_include([../../m4/ltoptions.m4])
+m4_include([../../m4/ltsugar.m4])
+m4_include([../../m4/ltversion.m4])
+m4_include([../../m4/lt~obsolete.m4])
diff --git a/Build/source/texk/lcdf-typetools/autoconf.h.in b/Build/source/texk/lcdf-typetools/autoconf.h.in
new file mode 100644
index 00000000000..975c49e35fe
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/autoconf.h.in
@@ -0,0 +1,330 @@
+/* autoconf.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+#undef CLOSEDIR_VOID
+
+/* Directory for glyphlist.txt files. */
+#undef GLYPHLISTDIR
+
+/* Define if the va_list type is addressable. */
+#undef HAVE_ADDRESSABLE_VA_LIST
+
+/* Define to incldue Adobe code in output fonts. */
+#undef HAVE_ADOBE_CODE
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the <assert.h> header file. */
+#undef HAVE_ASSERT_H
+
+/* Define to run cfftot1 from otftotfm. */
+#undef HAVE_AUTO_CFFTOT1
+
+/* Define to run t1dotlessj from otftotfm. */
+#undef HAVE_AUTO_T1DOTLESSJ
+
+/* Define to run ttftotype42 from otftotfm. */
+#undef HAVE_AUTO_TTFTOTYPE42
+
+/* Define to run updmap from otftotfm. */
+#undef HAVE_AUTO_UPDMAP
+
+/* Define if strnlen is broken. */
+#undef HAVE_BROKEN_STRNLEN
+
+/* Define if strtod is broken. */
+#undef HAVE_BROKEN_STRTOD
+
+/* Define to 1 if you have the <byteorder.h> header file. */
+#undef HAVE_BYTEORDER_H
+
+/* Define to 1 if you have the `ctime' function. */
+#undef HAVE_CTIME
+
+/* Define to 1 if you have the declaration of `isascii', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISASCII
+
+/* Define to 1 if you have the declaration of `kpse_enc_format', and to 0 if
+ you don't. */
+#undef HAVE_DECL_KPSE_ENC_FORMAT
+
+/* Define to 1 if you have the declaration of `kpse_opentype_format', and to 0
+ if you don't. */
+#undef HAVE_DECL_KPSE_OPENTYPE_FORMAT
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNLEN
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define if intXX_t types are not available. */
+#undef HAVE_FAKE_INT_TYPES
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the <float.h> header file. */
+#undef HAVE_FLOAT_H
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getwd' function. */
+#undef HAVE_GETWD
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <iostream> header file. */
+#undef HAVE_IOSTREAM
+
+/* Define if you want to use kpathsea. */
+#undef HAVE_KPATHSEA
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `memcmp' function. */
+#undef HAVE_MEMCMP
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the `mktemp' function. */
+#undef HAVE_MKTEMP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <new.h> header file. */
+#undef HAVE_NEW_H
+
+/* Define if <new> exists and works. */
+#undef HAVE_NEW_HDR
+
+/* Define if PermStrings are available. */
+#undef HAVE_PERMSTRING
+
+/* Define to include precondition checking assertions. */
+#undef HAVE_PRECONDITION_CHECKING
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strnlen' function. */
+#undef HAVE_STRNLEN
+
+/* Define to 1 if you have the `strrchr' function. */
+#undef HAVE_STRRCHR
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if `st_mtim' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_MTIM
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have u_intXX_t types but not uintXX_t types. */
+#undef HAVE_U_INT_TYPES
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Define to 0 if you don't want mmafm to run mmpfb when it needs to get an
+ intermediate master conversion program. */
+#undef MMAFM_RUN_MMPFB
+
+/* Define to 1 if you must include <arpa/inet.h> to get `ntohl'. */
+#undef NEED_ARPA_INET_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* kpsewhich's $SELFAUTODIR variable */
+#undef SELFAUTODIR
+
+/* kpsewhich's $SELFAUTOGRANDPARENT variable */
+#undef SELFAUTOGRANDPARENT
+
+/* kpsewhich's $SELFAUTOLOC variable */
+#undef SELFAUTOLOC
+
+/* kpsewhich's $SELFAUTOPARENT variable */
+#undef SELFAUTOPARENT
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define if WORDS_BIGENDIAN has been set. */
+#undef WORDS_BIGENDIAN_SET
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT64_T
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to the type of a signed integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef int64_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint64_t
diff --git a/Build/source/texk/lcdf-typetools/configure b/Build/source/texk/lcdf-typetools/configure
new file mode 100755
index 00000000000..8bb80d5bc43
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/configure
@@ -0,0 +1,24054 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for LCDF typetools (TeX Live) 2.108.
+#
+# Report bugs to <tex-k@tug.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+ test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+ PATH=/empty FPATH=/empty; export PATH FPATH
+ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and tex-k@tug.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='LCDF typetools (TeX Live)'
+PACKAGE_TARNAME='lcdf-typetools--tex-live-'
+PACKAGE_VERSION='2.108'
+PACKAGE_STRING='LCDF typetools (TeX Live) 2.108'
+PACKAGE_BUGREPORT='tex-k@tug.org'
+PACKAGE_URL=''
+
+ac_unique_file="lcdf-typetools-src/NEWS.md"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+LCDF_TYPETOOLS_TREE
+encdir
+glyphlistdir
+have_kpathsea_FALSE
+have_kpathsea_TRUE
+KPATHSEA_RULE
+KPATHSEA_DEPEND
+KPATHSEA_LIBS
+KPATHSEA_INCLUDES
+PKG_CONFIG
+texlive_build_FALSE
+texlive_build_TRUE
+SELECTED_SUBDIRS
+FIXLIBC_FALSE
+FIXLIBC_TRUE
+CXXLD
+TEMPLATE_OBJS
+CXXCPP
+WARNING_CXXFLAGS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+LCDF_TYPETOOLS_VERSION
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+WARNING_CFLAGS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_compiler_warnings
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+enable_precondition_checking
+enable_adobe_code
+enable_cxx_runtime_hack
+enable_cfftot1
+enable_mmafm
+enable_mmpfb
+enable_otfinfo
+enable_otftotfm
+enable_t1dotlessj
+enable_t1lint
+enable_t1rawafm
+enable_t1reencode
+enable_t1testpage
+enable_ttftotype42
+enable_updmap
+with_kpathsea
+with_system_kpathsea
+enable_selfauto_set
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+LT_SYS_LIBRARY_PATH
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+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 LCDF typetools (TeX Live) 2.108 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root
+ [DATAROOTDIR/doc/lcdf-typetools--tex-live-]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of LCDF typetools (TeX Live) 2.108:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-compiler-warnings=[no|min|yes|max|all]
+ Turn on compiler warnings [default: yes if
+ maintainer-mode, min otherwise]
+ --enable-shared[=PKGS] build shared libraries [default=yes]
+ --enable-static[=PKGS] build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --disable-largefile omit support for large files
+ --enable-precondition-checking
+ include precondition checking assertions
+ --disable-adobe-code do not include Adobe code
+ --enable-cxx-runtime-hack link C++ runtime statically
+ --disable-cfftot1 do not build the cfftot1 program
+ --disable-mmafm do not build the mmafm program
+ --disable-mmpfb do not build the mmpfb program
+ --disable-otfinfo do not build the otfinfo program
+ --disable-otftotfm do not build the otftotfm program
+ --disable-t1dotlessj do not build the t1dotlessj program
+ --disable-t1lint do not build the t1lint program
+ --disable-t1rawafm do not build the t1rawafm program
+ --disable-t1reencode do not build the t1reencode program
+ --disable-t1testpage do not build the t1testpage program
+ --disable-ttftotype42 do not build the ttftotype42 program
+ --disable-auto-cfftot1 disable running cfftot1 from otftotfm
+ --disable-auto-t1dotlessj
+ disable running t1dotlessj from otftotfm
+ --disable-auto-ttftotype42
+ disable running ttftotype42 from otftotfm
+ --disable-auto-updmap disable running updmap from otftotfm
+ --disable-selfauto-set disable setting SELFAUTO variables from kpsewhich
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
+ --without-kpathsea build otftotfm without kpathsea
+ --with-system-kpathsea use installed kpathsea headers and library (requires
+ pkg-config)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
+ CPP C preprocessor
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <tex-k@tug.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+LCDF typetools (TeX Live) configure 2.108
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ---------------------------- ##
+## Report this to tex-k@tug.org ##
+## ---------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_find_intX_t LINENO BITS VAR
+# -----------------------------------
+# Finds a signed integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_intX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5
+$as_echo_n "checking for int$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in int$2_t 'int' 'long int' \
+ 'long long int' 'short int' 'signed char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ enum { N = $2 / 2 - 1 };
+int
+main ()
+{
+static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+ < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ case $ac_type in #(
+ int$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_intX_t
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$4=yes"
+else
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ---------------------------- ##
+## Report this to tex-k@tug.org ##
+## ---------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
+# -----------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_cxx_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_decl
+
+# ac_fn_cxx_check_func LINENO FUNC VAR
+# ------------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_cxx_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_func
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid; break
+else
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_lo=$ac_mid; break
+else
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hi=$ac_mid
+else
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+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 LCDF typetools (TeX Live) $as_me 2.108, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+ac_aux_dir=
+for ac_dir in ../../build-aux "$srcdir"/../../build-aux; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../build-aux \"$srcdir\"/../../build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+
+
+am__api_version='1.16'
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+# Check whether --enable-compiler-warnings was given.
+if test "${enable_compiler_warnings+set}" = set; then :
+ enableval=$enable_compiler_warnings;
+fi
+case $enable_compiler_warnings in #(
+ no | min | yes | max | all) :
+ ;; #(
+ *) :
+ if test "x$enable_maintainer_mode" = xyes; then :
+ enable_compiler_warnings=yes
+else
+ enable_compiler_warnings=min
+fi ;;
+esac
+
+case `pwd` in
+ *\ * | *\ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+ ECHO='printf %s\n'
+else
+ # Use this function as a fallback that always works.
+ func_fallback_echo ()
+ {
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+ }
+ ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+ $ECHO ""
+}
+
+case $ECHO in
+ printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+ print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+ *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+ then ac_cv_path_FGREP="$GREP -F"
+ else
+ if test -z "$FGREP"; then
+ ac_path_FGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in fgrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+ # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'FGREP' >> "conftest.nl"
+ "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_FGREP="$ac_path_FGREP"
+ ac_path_FGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_FGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_FGREP"; then
+ as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_FGREP=$FGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM=$NM
+else
+ lt_nm_to_check=${ac_tool_prefix}nm
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break 2
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break 2
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+ done
+ : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
+else
+ # Didn't find any BSD compatible name lister, look for dumpbin.
+ if test -n "$DUMPBIN"; then :
+ # Let the user override the test.
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in dumpbin "link -dump"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DUMPBIN"; then
+ ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$DUMPBIN" && break
+ done
+fi
+if test -z "$DUMPBIN"; then
+ ac_ct_DUMPBIN=$DUMPBIN
+ for ac_prog in dumpbin "link -dump"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DUMPBIN"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_DUMPBIN" && break
+done
+
+ if test "x$ac_ct_DUMPBIN" = x; then
+ DUMPBIN=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DUMPBIN=$ac_ct_DUMPBIN
+ fi
+fi
+
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+ *COFF*)
+ DUMPBIN="$DUMPBIN -symbols -headers"
+ ;;
+ *)
+ DUMPBIN=:
+ ;;
+ esac
+ fi
+
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
+ fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_nm_interface="BSD nm"
+ echo "int some_variable = 0;" > conftest.$ac_ext
+ (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+ cat conftest.out >&5
+ if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+ lt_cv_nm_interface="MS dumpbin"
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ i=0
+ teststring=ABCD
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw* | cegcc*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ mint*)
+ # On MiNT this can take a long time and run out of memory.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ # Make teststring a little bigger before we do anything with it.
+ # a 1K string should be a reasonable start.
+ for i in 1 2 3 4 5 6 7 8; do
+ teststring=$teststring$teststring
+ done
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+ = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+ test 17 != "$i" # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ # Only check the string length outside the loop.
+ lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on
+ # massive amounts of additional arguments before passing them to the
+ # linker. It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ lt_unset=unset
+else
+ lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+ lt_SP2NL='tr \040 \012'
+ lt_NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ lt_SP2NL='tr \100 \n'
+ lt_NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+ ;;
+ esac
+ ;;
+ *-*-cygwin* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+ ;;
+ *-*-cygwin* )
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+ * ) # otherwise, assume *nix
+ lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+ ;;
+ esac
+ ;;
+ * ) # unhandled hosts (and "normal" native builds)
+ lt_cv_to_host_file_cmd=func_convert_file_noop
+ ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+ *-*-mingw* )
+ case $build in
+ *-*-mingw* ) # actually msys
+ lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+ ;;
+ esac
+ ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ if test yes != "$GCC"; then
+ reload_cmds=false
+ fi
+ ;;
+ darwin*)
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ # Keep this pattern in sync with the one in func_win32_libid.
+ lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+cegcc*)
+ # use the weaker test based on 'objdump'. See mingw*.
+ lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+haiku*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[3-9]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+*nto* | *qnx*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+tpf*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+ case $host_os in
+ mingw* | pw32*)
+ if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+ want_nocaseglob=yes
+ else
+ file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+ fi
+ ;;
+ esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
+ case `$DLLTOOL --help 2>&1` in
+ *--identify-strict*)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+ ;;
+ *)
+ lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+ ;;
+ esac
+ ;;
+*)
+ # fallback: assume linklib IS sharedlib
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
+ ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ar_at_file=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ echo conftest.$ac_objext > conftest.lst
+ lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -eq "$ac_status"; then
+ # Ensure the archiver fails upon bogus file names.
+ rm -f conftest.$ac_objext libconftest.a
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+ (eval $lt_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test 0 -ne "$ac_status"; then
+ lt_cv_ar_at_file=@
+ fi
+ fi
+ rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+ archiver_list_spec=
+else
+ archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+ darwin*)
+ lock_old_archive_extraction=yes ;;
+ *)
+ lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32* | cegcc*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*)
+ if test ia64 = "$host_cpu"; then
+ symcode='[ABCDEGRST]'
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
+ # Also find C++ and __fastcall symbols from MSVC++,
+ # which start with @ or ?.
+ lt_cv_sys_global_symbol_pipe="$AWK '"\
+" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+" \$ 0!~/External *\|/{next};"\
+" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+" {if(hide[section]) next};"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+" ' prfx=^$ac_symprfx"
+ else
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+ fi
+ lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+ (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+ if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+ relocations are performed -- see ld's documentation on pseudo-relocs. */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data. */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+ cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols. */
+LT_DLSYM_CONST struct {
+ const char *name;
+ void *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+ { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ cat <<\_LT_EOF >> conftest.$ac_ext
+ {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_globsym_save_LIBS=$LIBS
+ lt_globsym_save_CFLAGS=$CFLAGS
+ LIBS=conftstm.$ac_objext
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ pipe_works=yes
+ fi
+ LIBS=$lt_globsym_save_LIBS
+ CFLAGS=$lt_globsym_save_CFLAGS
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -rf conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test yes = "$pipe_works"; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+ nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+ withval=$with_sysroot;
+else
+ with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+ if test yes = "$GCC"; then
+ lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+ fi
+ ;; #(
+ /*)
+ lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+ ;; #(
+ no|'')
+ ;; #(
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+ as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+ ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in dd; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+ enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE=32
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE=64
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
+ ;;
+ powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*|s390*-*tpf*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -belf"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_cc_needs_belf=yes
+else
+ lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+ if test yes != "$lt_cv_cc_needs_belf"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS=$SAVE_CFLAGS
+ fi
+ ;;
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo 'int i;' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
+ *)
+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+ LD="${LD-ld} -64"
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$MANIFEST_TOOL"; then
+ ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+ ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+ # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_MANIFEST_TOOL"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_MANIFEST_TOOL" = x; then
+ MANIFEST_TOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+ fi
+else
+ MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_path_mainfest_tool=no
+ echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+ $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+ cat conftest.err >&5
+ if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+ lt_cv_path_mainfest_tool=yes
+ fi
+ rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+ MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+ case $host_os in
+ rhapsody* | darwin*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DSYMUTIL"; then
+ ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+ ac_ct_DSYMUTIL=$DSYMUTIL
+ # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DSYMUTIL"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DSYMUTIL" = x; then
+ DSYMUTIL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DSYMUTIL=$ac_ct_DSYMUTIL
+ fi
+else
+ DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$NMEDIT"; then
+ ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+ ac_ct_NMEDIT=$NMEDIT
+ # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_NMEDIT"; then
+ ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_NMEDIT="nmedit"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_NMEDIT" = x; then
+ NMEDIT=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ NMEDIT=$ac_ct_NMEDIT
+ fi
+else
+ NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$LIPO"; then
+ ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+ ac_ct_LIPO=$LIPO
+ # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_LIPO"; then
+ ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_LIPO="lipo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_LIPO" = x; then
+ LIPO=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ LIPO=$ac_ct_LIPO
+ fi
+else
+ LIPO="$ac_cv_prog_LIPO"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL"; then
+ ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+ ac_ct_OTOOL=$OTOOL
+ # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL"; then
+ ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL="otool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL" = x; then
+ OTOOL=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL=$ac_ct_OTOOL
+ fi
+else
+ OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OTOOL64"; then
+ ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+ ac_ct_OTOOL64=$OTOOL64
+ # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OTOOL64"; then
+ ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OTOOL64="otool64"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OTOOL64" = x; then
+ OTOOL64=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OTOOL64=$ac_ct_OTOOL64
+ fi
+else
+ OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_apple_cc_single_mod=no
+ if test -z "$LT_MULTI_MODULE"; then
+ # By default we will add the -single_module flag. You can override
+ # by either setting the environment variable LT_MULTI_MODULE
+ # non-empty at configure time, or by adding -multi_module to the
+ # link flags.
+ rm -rf libconftest.dylib*
+ echo "int foo(void){return 1;}" > conftest.c
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+ _lt_result=$?
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+ lt_cv_apple_cc_single_mod=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -rf libconftest.dylib*
+ rm -f conftest.*
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_exported_symbols_list=no
+ save_LDFLAGS=$LDFLAGS
+ echo "_main" > conftest.sym
+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_ld_exported_symbols_list=yes
+else
+ lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_ld_force_load=no
+ cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+ $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+ echo "$AR cru libconftest.a conftest.o" >&5
+ $AR cru libconftest.a conftest.o 2>&5
+ echo "$RANLIB libconftest.a" >&5
+ $RANLIB libconftest.a 2>&5
+ cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+ echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+ $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+ _lt_result=$?
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+ lt_cv_ld_force_load=yes
+ else
+ cat conftest.err >&5
+ fi
+ rm -f conftest.err libconftest.a conftest conftest.c
+ rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+ darwin1.*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ darwin*) # darwin 5.x on
+ # if running on 10.5 or later, the deployment target defaults
+ # to the OS version, if on x86, and 10.4, the deployment
+ # target defaults to 10.4. Don't you love it?
+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+ 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+ 10.*)
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ esac
+ ;;
+ esac
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
+ _lt_dar_single_mod='$single_module'
+ fi
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+ else
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+ fi
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+ _lt_dsymutil='~$DSYMUTIL $lib || :'
+ else
+ _lt_dsymutil=
+ fi
+ ;;
+ esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+##tldbg KPSE_COMMON: lcdf-typetools ().
+##tldbg KPSE_BASIC: Remember lcdf-typetools () as Kpse_Package (for future messages).
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='lcdf-typetools--tex-live-'
+ VERSION='2.108'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler accepts prototypes" >&5
+$as_echo_n "checking whether the compiler accepts prototypes... " >&6; }
+if ${kb_cv_c_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+int
+main ()
+{
+extern void foo(int i,...);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ kb_cv_c_prototypes=yes
+else
+ kb_cv_c_prototypes=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kb_cv_c_prototypes" >&5
+$as_echo "$kb_cv_c_prototypes" >&6; }
+if test "x$kb_cv_c_prototypes" = xno; then
+ as_fn_error $? "Sorry, your compiler does not understand prototypes." "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C compiler" >&5
+$as_echo_n "checking what warning flags to pass to the C compiler... " >&6; }
+if ${kpse_cv_warning_cflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$GCC" = xyes; then
+ kpse_cv_warning_cflags=
+if test "x$enable_compiler_warnings" != xno; then
+ kpse_cv_warning_cflags="-Wimplicit -Wreturn-type"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wdeclaration-after-statement" ;; #(
+ *) :
+ ;;
+esac
+ case `$CC -dumpversion` in #(
+ 3.[234].* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wno-unknown-pragmas" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmin; then
+ kpse_cv_warning_cflags="-Wall -Wunused $kpse_cv_warning_cflags"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wmissing-prototypes -Wmissing-declarations"
+ if test "x$enable_compiler_warnings" != xyes; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith"
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wcast-qual -Wcast-align -Wwrite-strings"
+ case `$CC -dumpversion` in #(
+ 3.4.* | 4.* | 5.*) :
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wold-style-definition" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmax; then
+ kpse_cv_warning_cflags="$kpse_cv_warning_cflags -Wshadow"
+ fi
+ fi
+ fi
+fi
+elif test "x$enable_compiler_warnings" = xno; then
+ kpse_cv_warning_cflags=
+else
+ kpse_cv_warning_cflags= # FIXME: warning flags for non-GNU C compilers
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cflags" >&5
+$as_echo "$kpse_cv_warning_cflags" >&6; }
+WARNING_CFLAGS=$kpse_cv_warning_cflags
+
+
+
+
+
+
+
+
+
+
+
+
+# Set options
+enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
+$as_echo "$AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
+$as_echo "$ac_ct_AS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_AS" = x; then
+ AS="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AS=$ac_ct_AS
+ fi
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+ ac_ct_DLLTOOL=$DLLTOOL
+ # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_DLLTOOL"; then
+ ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_DLLTOOL" = x; then
+ DLLTOOL="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ DLLTOOL=$ac_ct_DLLTOOL
+ fi
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OBJDUMP"; then
+ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+ ac_ct_OBJDUMP=$OBJDUMP
+ # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_OBJDUMP"; then
+ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_OBJDUMP" = x; then
+ OBJDUMP="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ OBJDUMP=$ac_ct_OBJDUMP
+ fi
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+ ;;
+esac
+
+test -z "$AS" && AS=as
+
+
+
+
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+ enable_dlopen=no
+
+
+
+ # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+ enableval=$enable_shared; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+ enableval=$enable_static; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ pic_mode=default
+fi
+
+
+
+
+
+
+
+
+ # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+ enableval=$enable_fast_install; p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for pkg in $enableval; do
+ IFS=$lt_save_ifs
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else
+ if ${lt_cv_with_aix_soname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
+ ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+ case $cc_basename in
+ nvcc*)
+ lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+ *)
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+
+
+
+
+
+ lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+ if test yes = "$GCC"; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static=
+ ;;
+
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+
+ case $cc_basename in
+ nvcc*) # Cuda Compiler Driver 2.2
+ lt_prog_compiler_wl='-Xlinker '
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='$wl-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ # old Intel for x86_64, which still supported -KPIC.
+ ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # icc used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ icc* | ifort*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ # Lahey Fortran 8.1.
+ lf95*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='--shared'
+ lt_prog_compiler_static='--static'
+ ;;
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-qpic'
+ lt_prog_compiler_static='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl=''
+ ;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
+ *Sun\ C*)
+ # Sun C 5.9
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *nto* | *qnx*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic='-fPIC -shared'
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ rdos*)
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ runpath_var=
+ allow_undefined_flag=
+ always_export_symbols=no
+ archive_cmds=
+ archive_expsym_cmds=
+ compiler_needs_object=no
+ enable_shared_with_static_runtimes=no
+ export_dynamic_flag_spec=
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ hardcode_automatic=no
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_separator=
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ inherit_rpath=no
+ link_all_deplibs=unknown
+ module_cmds=
+ module_expsym_cmds=
+ old_archive_from_new_cmds=
+ old_archive_from_expsyms_cmds=
+ thread_safe_flag_spec=
+ whole_archive_flag_spec=
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
+ exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ # Exclude shared library initialization/finalization symbols.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test yes != "$GCC"; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd* | bitrig*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+
+ # On some targets, GNU ld is compatible enough with the native linker
+ # that we're better off using the native interface for both.
+ lt_use_gnu_ld_interface=no
+ if test yes = "$with_gnu_ld"; then
+ case $host_os in
+ aix*)
+ # The AIX port of GNU ld has always aspired to compatibility
+ # with the native linker. However, as the warning in the GNU ld
+ # block says, versions before 2.19.5* couldn't really create working
+ # shared libraries, regardless of the interface used.
+ case `$LD -v 2>&1` in
+ *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+ *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+ *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ ;;
+ *)
+ lt_use_gnu_ld_interface=yes
+ ;;
+ esac
+ fi
+
+ if test yes = "$lt_use_gnu_ld_interface"; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='$wl'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+ *GNU\ gold*) supports_anon_versioning=yes ;;
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test ia64 != "$host_cpu"; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ haiku*)
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs=yes
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ tmp_diet=no
+ if test linux-dietlibc = "$host_os"; then
+ case $cc_basename in
+ diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
+ esac
+ fi
+ if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+ && test no = "$tmp_diet"
+ then
+ tmp_addflag=' $pic_flag'
+ tmp_sharedflag='-shared'
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95* | pgfortran*)
+ # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ lf95*) # Lahey Fortran 8.1
+ whole_archive_flag_spec=
+ tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
+ xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+ tmp_sharedflag='-qmkshrobj'
+ tmp_addflag= ;;
+ nvcc*) # Cuda Compiler Driver 2.2
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object=yes
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ esac
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+
+ case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
+ xlf* | bgf* | bgxlf* | mpixlf*)
+ # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+ whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ esac
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test no = "$ld_shlibs"; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
+
+ if test yes = "$GCC"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath_+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath_"; then
+ lt_cv_aix_libpath_=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath_
+fi
+
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ fi
+ archive_cmds_need_lc=yes
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds=''
+ ;;
+ m68k)
+ archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ case $cc_basename in
+ cl*)
+ # Native MSVC
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ file_list_spec='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+ enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+ # Don't use ranlib
+ old_postinstall_cmds='chmod 644 $oldlib'
+ postlink_cmds='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # Assume MSVC wrapper
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_from_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ enable_shared_with_static_runtimes=yes
+ ;;
+ esac
+ ;;
+
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec=''
+ fi
+ link_all_deplibs=yes
+ allow_undefined_flag=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+ else
+ ld_shlibs=no
+ fi
+
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2.*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='$wl-E'
+ ;;
+
+ hpux10*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+
+ # Older versions of the 11.00 compiler do not understand -b yet
+ # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler__b=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -b"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler__b=yes
+ fi
+ else
+ lt_cv_prog_compiler__b=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+ ;;
+ esac
+ fi
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ hardcode_direct_absolute=yes
+ export_dynamic_flag_spec='$wl-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ # Try to use the -exported_symbol ld option, if it does not
+ # work, assume that -exports_file does not work either and
+ # implicitly export all symbols.
+ # This should be the same for all languages, so no per-tag cache variable.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ lt_cv_irix_exported_symbol=yes
+else
+ lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+ fi
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ inherit_rpath=yes
+ link_all_deplibs=yes
+ ;;
+
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ *nto* | *qnx*)
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ hardcode_direct_absolute=yes
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
+ else
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ osf3*)
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ archive_cmds_need_lc='no'
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z defs'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ else
+ case `$CC -V 2>&1` in
+ *"Compilers 5.0"*)
+ wlarc=''
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ ;;
+ *)
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ ;;
+ esac
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ else
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test sequent = "$host_vendor"; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag='$wl-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+
+ if test sni = "$host_vendor"; then
+ case $host in
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ export_dynamic_flag_spec='$wl-Blargedynsym'
+ ;;
+ esac
+ fi
+ fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc=no
+ else
+ lt_cv_archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+ archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+ case $host_os in
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
+ esac
+ case $host_os in
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+ case $lt_search_path_spec in
+ *\;*)
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+ ;;
+ *)
+ lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ esac
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary...
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo = "/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[lt_foo]++; }
+ if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+ # AWK program above erroneously prepends '/' to C:/dos/paths
+ # for these hosts.
+ case $host_os in
+ mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+ esac
+ sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+ test -n "$runpath_var" ||
+ test yes = "$hardcode_automatic"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+ if test yes != "$enable_dlopen"; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen=load_add_on
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32* | cegcc*)
+ lt_cv_dlopen=LoadLibrary
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+ lt_cv_dlopen=dyld
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
+ *)
+ ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_shl_load=yes
+else
+ ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+ ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dlopen=yes
+else
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_svld_dlopen=yes
+else
+ ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dld_dld_link=yes
+else
+ ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test no = "$lt_cv_dlopen"; then
+ enable_dlopen=no
+ else
+ enable_dlopen=yes
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS=$LDFLAGS
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS=$LIBS
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+ if test yes = "$lt_cv_dlopen_self"; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test yes = "$cross_compiling"; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+ correspondingly for the symbols needed. */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else
+ {
+ if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ else puts (dlerror ());
+ }
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ return status;
+}
+_LT_EOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+ fi
+
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP"; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ fi
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ ;;
+ esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+ # Report what library types will actually be built
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+ test no = "$can_build_shared" && enable_shared=no
+
+ # On AIX, shared libraries and static libraries use the same namespace, and
+ # are all built from PIC.
+ case $host_os in
+ aix3*)
+ test yes = "$enable_shared" && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+ aix[4-9]*)
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+ # Make sure either enable_shared or enable_static is yes.
+ test yes = "$enable_shared" || enable_static=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_source+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
+$as_echo_n "checking whether closedir returns void... " >&6; }
+if ${ac_cv_func_closedir_void+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_closedir_void=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header_dirent>
+#ifndef __cplusplus
+int closedir ();
+#endif
+
+int
+main ()
+{
+return closedir (opendir (".")) != 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_closedir_void=no
+else
+ ac_cv_func_closedir_void=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
+$as_echo "$ac_cv_func_closedir_void" >&6; }
+if test $ac_cv_func_closedir_void = yes; then
+
+$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
+
+fi
+
+for ac_header in assert.h float.h limits.h pwd.h stdlib.h sys/param.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in putenv
+do :
+ ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv"
+if test "x$ac_cv_func_putenv" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PUTENV 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getcwd getwd memcmp memcpy mkstemp mktemp strchr strrchr
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t"
+case $ac_cv_c_int64_t in #(
+ no|yes) ;; #(
+ *)
+
+cat >>confdefs.h <<_ACEOF
+#define int64_t $ac_cv_c_int64_t
+_ACEOF
+;;
+esac
+
+ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
+case $ac_cv_c_uint64_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT64_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t $ac_cv_c_uint64_t
+_ACEOF
+;;
+ esac
+
+case :$ac_cv_c_int64_t:$ac_cv_c_int64_t: in #(
+ *':no:'*) :
+ as_fn_error $? "Sorry, your compiler does not support 64-bit integer types." "$LINENO" 5 ;; #(
+ *) :
+ ;;
+esac
+ac_fn_c_check_decl "$LINENO" "isascii" "ac_cv_have_decl_isascii" "#include <ctype.h>
+"
+if test "x$ac_cv_have_decl_isascii" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISASCII $ac_have_decl
+_ACEOF
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_MTIM 1
+_ACEOF
+
+
+fi
+
+
+
+LCDF_TYPETOOLS_VERSION=2.108
+
+
+ac_config_headers="$ac_config_headers autoconf.h"
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+else
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what warning flags to pass to the C++ compiler" >&5
+$as_echo_n "checking what warning flags to pass to the C++ compiler... " >&6; }
+if ${kpse_cv_warning_cxxflags+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$GXX" = xyes; then
+ kpse_cv_warning_cxxflags=
+kpse_warn_strings="-Wno-write-strings"
+if test "x$enable_compiler_warnings" != xno; then
+ kpse_cv_warning_cxxflags="-Wreturn-type"
+ case `$CXX -dumpversion` in #(
+ 3.* | 4.[012345].*) :
+ kpse_cv_warning_cxxflags="-Wimplicit $kpse_cv_warning_cxxflags" ;; #(
+ *) :
+ ;;
+esac
+ case `$CXX -dumpversion` in #(
+ 3.[234].* | 4.* | 5.*) :
+ kpse_cv_warning_cxxflags="$kpse_cv_warning_cxxflags -Wno-unknown-pragmas" ;; #(
+ *) :
+ ;;
+esac
+ if test "x$enable_compiler_warnings" != xmin; then
+ kpse_cv_warning_cxxflags="-Wall -Wunused $kpse_cv_warning_cxxflags"
+ if test "x$enable_compiler_warnings" != xyes; then
+ kpse_cv_warning_cxxflags="$kpse_cv_warning_cxxflags -Wparentheses -Wswitch -Wtrigraphs -Wpointer-arith"
+ kpse_cv_warning_cxxflags="$kpse_cv_warning_cxxflags -Wcast-qual -Wcast-align"
+ kpse_warn_strings="-Wwrite-strings"
+ if test "x$enable_compiler_warnings" != xmax; then
+ kpse_cv_warning_cxxflags="$kpse_cv_warning_cxxflags -Wshadow"
+ fi
+ fi
+ fi
+fi
+kpse_cv_warning_cxxflags="$kpse_cv_warning_cxxflags $kpse_warn_strings"
+elif test "x$enable_compiler_warnings" = xno; then
+ kpse_cv_warning_cxxflags=
+else
+ kpse_cv_warning_cxxflags= # FIXME: warning flags for non-GNU C++ compilers
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_warning_cxxflags" >&5
+$as_echo "$kpse_cv_warning_cxxflags" >&6; }
+WARNING_CXXFLAGS=$kpse_cv_warning_cxxflags
+
+
+
+
+
+func_stripname_cnf ()
+{
+ case $2 in
+ .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+ *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
+ esac
+} # func_stripname_cnf
+
+ if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if ${ac_cv_prog_CXXCPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+ _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working. Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+ # Code to be used in simple compile tests
+ lt_simple_compile_test_code="int some_variable = 0;"
+
+ # Code to be used in simple link tests
+ lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+ # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+ # save warnings/boilerplate of simple test code
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+ # Allow CC to be a program name with arguments.
+ lt_save_CC=$CC
+ lt_save_CFLAGS=$CFLAGS
+ lt_save_LD=$LD
+ lt_save_GCC=$GCC
+ GCC=$GXX
+ lt_save_with_gnu_ld=$with_gnu_ld
+ lt_save_path_LD=$lt_cv_path_LD
+ if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+ else
+ $as_unset lt_cv_prog_gnu_ld
+ fi
+ if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+ else
+ $as_unset lt_cv_path_LD
+ fi
+ test -z "${LDCXX+set}" || LD=$LDCXX
+ CC=${CXX-"c++"}
+ CFLAGS=$CXXFLAGS
+ compiler=$CC
+ compiler_CXX=$CC
+ func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+ if test -n "$compiler"; then
+ # We don't want -fno-exception when compiling C++ code, so set the
+ # no_builtin_flag separately
+ if test yes = "$GXX"; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+ else
+ lt_prog_compiler_no_builtin_flag_CXX=
+ fi
+
+ if test yes = "$GXX"; then
+ # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return, which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+ while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD=$ac_prog
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test yes = "$with_gnu_ld"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS=$lt_save_ifs
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD=$ac_dir/$ac_prog
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test no != "$with_gnu_ld" && break
+ ;;
+ *)
+ test yes != "$with_gnu_ld" && break
+ ;;
+ esac
+ fi
+ done
+ IFS=$lt_save_ifs
+else
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test yes = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='$wl'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+ $GREP 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+ fi
+
+ # PORTME: fill in a description of your system's C++ link characteristics
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+ ld_shlibs_CXX=yes
+ case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix[4-9]*)
+ if test ia64 = "$host_cpu"; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ file_list_spec_CXX='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct_CXX=no
+ hardcode_direct_absolute_CXX=no
+ ;;
+ esac
+
+ if test yes = "$GXX"; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`$CC -print-prog-name=collect2`
+ if test -f "$collect2name" &&
+ strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
+ fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
+ else
+ # not using gcc
+ if test ia64 = "$host_cpu"; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
+ else
+ shared_flag='$wl-bM:SRE'
+ fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
+ fi
+ fi
+
+ export_dynamic_flag_spec_CXX='$wl-bexpall'
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to
+ # export.
+ always_export_symbols_CXX=yes
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ # The "-G" linker flag allows undefined symbols.
+ no_undefined_flag_CXX='-bernotok'
+ # Determine the default libpath from the value encoded in an empty
+ # executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath__CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+ else
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an
+ # empty executable.
+ if test set = "${lt_cv_aix_libpath+set}"; then
+ aix_libpath=$lt_cv_aix_libpath
+else
+ if ${lt_cv_aix_libpath__CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+ lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\([^ ]*\) *$/\1/
+ p
+ }
+ }'
+ lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ # Check for a 64-bit object if we didn't find anything.
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$lt_cv_aix_libpath__CXX"; then
+ lt_cv_aix_libpath__CXX=/usr/lib:/lib
+ fi
+
+fi
+
+ aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' $wl-bernotok'
+ allow_undefined_flag_CXX=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
+ # We only use this code for GNU lds that support --whole-archive.
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ else
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ fi
+ archive_cmds_need_lc_CXX=yes
+ archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32* | cegcc*)
+ case $GXX,$cc_basename in
+ ,cl* | no,cl*)
+ # Native MSVC
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX=' '
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=yes
+ file_list_spec_CXX='@'
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=.dll
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
+ # The linker will not automatically build a static lib if we build a DLL.
+ # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+ enable_shared_with_static_runtimes_CXX=yes
+ # Don't use ranlib
+ old_postinstall_cmds_CXX='chmod 644 $oldlib'
+ postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
+ ;;
+ *)
+ # g++
+ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+
+
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+ else
+ whole_archive_flag_spec_CXX=''
+ fi
+ link_all_deplibs_CXX=yes
+ allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+ case $cc_basename in
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+ *) _lt_dar_can_shared=$GCC ;;
+ esac
+ if test yes = "$_lt_dar_can_shared"; then
+ output_verbose_link_cmd=func_echo_all
+ archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+ fi
+
+ else
+ ld_shlibs_CXX=no
+ fi
+
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_minus_L_CXX=yes
+ allow_undefined_flag_CXX=unsupported
+ shrext_cmds=.dll
+ archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes_CXX=yes
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ freebsd2.*)
+ # C++ shared libraries reported to be fairly broken before
+ # switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+
+ haiku*)
+ archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ link_all_deplibs_CXX=yes
+ ;;
+
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='$wl-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ hpux10*|hpux11*)
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='$wl-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_direct_absolute_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ interix[3-9]*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+ inherit_rpath_CXX=yes
+ ;;
+
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc* | ecpc* )
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ case `$CC -V` in
+ *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+ prelink_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ old_archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
+ archive_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='tpldir=Template.dir~
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 6 and above use weak symbols
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ ;;
+ xl* | mpixl* | bgxl*)
+ # IBM XL 8.0 on PPC, with GNU ld
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+ archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
+ archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+ fi
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+ compiler_needs_object_CXX=yes
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+
+ *nto* | *qnx*)
+ ld_shlibs_CXX=yes
+ ;;
+
+ openbsd* | bitrig*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ hardcode_direct_absolute_CXX=yes
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='$wl-E'
+ whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+ fi
+ output_verbose_link_cmd=func_echo_all
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ case $host in
+ osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+ *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+ esac
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ case $host in
+ osf3*)
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ ;;
+ *)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ ;;
+ esac
+
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ ;;
+ *)
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+ case $host in
+ osf3*)
+ archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ ;;
+ esac
+
+ hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands '-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='func_echo_all'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ no_undefined_flag_CXX=' $wl-z ${wl}defs'
+ if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ else
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+ fi
+
+ hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='$wl-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We CANNOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_CXX='$wl-z,text'
+ allow_undefined_flag_CXX='$wl-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='$wl-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+ '"$old_archive_cmds_CXX"
+ reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+ '"$reload_cmds_CXX"
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+ test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+ GCC_CXX=$GXX
+ LD_CXX=$LD
+
+ ## CAVEAT EMPTOR:
+ ## There is no encapsulation within the following macros, do not change
+ ## the running order or otherwise move them around unless you know exactly
+ ## what you are doing...
+ # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ for p in `eval "$output_verbose_link_cmd"`; do
+ case $prev$p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
+ prev=$p
+ continue
+ fi
+
+ # Expand the sysroot to ease extracting the directories later.
+ if test -z "$prev"; then
+ case $p in
+ -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+ -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+ -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+ esac
+ fi
+ case $p in
+ =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+ esac
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
+ -L | -R)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX=$prev$p
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX=$prev$p
+ else
+ postdeps_CXX="${postdeps_CXX} $prev$p"
+ fi
+ fi
+ prev=
+ ;;
+
+ *.lto.$objext) ;; # Ignore GCC LTO objects
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test no = "$pre_test_object_deps_done"; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX=$p
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX=$p
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test yes = "$GXX"; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+
+ amigaos*)
+ case $host_cpu in
+ powerpc)
+ # see comment about AmigaOS4 .so support
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ m68k)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ esac
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static_CXX='$wl-static'
+ ;;
+ esac
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ haiku*)
+ # PIC is the default for Haiku.
+ # The "-static" flag exists, but is broken.
+ lt_prog_compiler_static_CXX=
+ ;;
+ interix[3-9]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+ # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
+ # sets the default TLS model and affects inlining.
+ case $host_cpu in
+ hppa*64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix[4-9]*)
+ # All AIX code is PIC.
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ mingw* | cygwin* | os2* | pw32* | cegcc*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ ecpc* )
+ # old Intel C++ for x86_64, which still supported -KPIC.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ icpc* )
+ # Intel C++, used to be incompatible with GCC.
+ # ICC 10 doesn't accept -KPIC any more.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC* | pgcpp*)
+ # Portland Group C++ compiler
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+ # IBM XL 8.0, 9.0 on PPC and BlueGene
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-qpic'
+ lt_prog_compiler_static_CXX='-qstaticlink'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ *qnx* | *nto*)
+ # QNX uses GNU C++, but need to define -shared option too, otherwise
+ # it will coredump.
+ lt_prog_compiler_pic_CXX='-fPIC -shared'
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC* | sunCC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+case $host_os in
+ # For platforms that do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_static_works_CXX=no
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_cv_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $RM -r conftest*
+ LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $RM -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $RM conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+ $RM out/* && rmdir out
+ cd ..
+ $RM -r conftest
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+ # do not overwrite the value of need_locks provided by the user
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+ hard_links=yes
+ $RM conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+ if test no = "$hard_links"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+ case $host_os in
+ aix[4-9]*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
+ if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX=$ltdll_cmds
+ ;;
+ cygwin* | mingw* | cegcc*)
+ case $cc_basename in
+ cl*)
+ exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+ exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+ ;;
+ esac
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test yes,yes = "$GCC,$enable_shared"; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ $RM conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ then
+ lt_cv_archive_cmds_need_lc_CXX=no
+ else
+ lt_cv_archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+ archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+
+aix[4-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test ia64 = "$host_cpu"; then
+ # AIX 5 supports IA64
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ case $host_cpu in
+ powerpc)
+ # Since July 2007 AmigaOS4 officially supports .so libraries.
+ # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ m68k)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+ esac
+ ;;
+
+beos*)
+ library_names_spec='$libname$shared_ext'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$cc_basename in
+ yes,*)
+ # gcc
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+ ;;
+ mingw* | cegcc*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ ;;
+
+ *,cl*)
+ # Native MSVC
+ libname_spec='$name'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
+
+ case $build_os in
+ mingw*)
+ sys_lib_search_path_spec=
+ lt_save_ifs=$IFS
+ IFS=';'
+ for lt_path in $LIB
+ do
+ IFS=$lt_save_ifs
+ # Let DOS variable expansion print the short 8.3 style file name.
+ lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+ sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+ done
+ IFS=$lt_save_ifs
+ # Convert to MSYS style.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+ ;;
+ cygwin*)
+ # Convert to unix form, then to dos form, then back to unix form
+ # but this time dos style (no spaces!) so that the unix form looks
+ # like /cygdrive/c/PROGRA~1:/cygdr...
+ sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+ sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ ;;
+ *)
+ sys_lib_search_path_spec=$LIB
+ if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH.
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # FIXME: find the short name or the path components, as spaces are
+ # common. (e.g. "Program Files" -> "PROGRA~1")
+ ;;
+ esac
+
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ shlibpath_overrides_runpath=yes
+ dynamic_linker='Win32 link.exe'
+ ;;
+
+ *)
+ # Assume MSVC wrapper
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+ dynamic_linker='Win32 ld.exe'
+ ;;
+ esac
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[23].*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2.*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+haiku*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ dynamic_linker="$host_os runtime_loader"
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+ fi
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+ postinstall_cmds='chmod 555 $lib'
+ # or fails outright, so override atomically:
+ install_override_mode=555
+ ;;
+
+interix[3-9]*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+
+ # Some binutils ld are patched to set DT_RUNPATH
+ if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_shlibpath_overrides_runpath=no
+ save_LDFLAGS=$LDFLAGS
+ save_libdir=$libdir
+ eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+ lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS=$save_LDFLAGS
+ libdir=$save_libdir
+
+fi
+
+ shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+*nto* | *qnx*)
+ version_type=qnx
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='ldqnx.so'
+ ;;
+
+openbsd* | bitrig*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec=/usr/lib
+ need_lib_prefix=no
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
+ else
+ need_version=yes
+ fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+os2*)
+ libname_spec='$name'
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
+ need_lib_prefix=no
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test yes = "$with_gnu_ld"; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=sco
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ if test yes = "$with_gnu_ld"; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+tpf*)
+ # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+uts4*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+ test -n "$runpath_var_CXX" ||
+ test yes = "$hardcode_automatic_CXX"; then
+
+ # We can hardcode non-existent directories.
+ if test no != "$hardcode_direct_CXX" &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+ test no != "$hardcode_minus_L_CXX"; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+ test yes = "$inherit_rpath_CXX"; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+ fi # test -n "$compiler"
+
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+ LDCXX=$LD
+ LD=$lt_save_LD
+ GCC=$lt_save_GCC
+ with_gnu_ld=$lt_save_with_gnu_ld
+ lt_cv_path_LDCXX=$lt_cv_path_LD
+ lt_cv_path_LD=$lt_save_path_LD
+ lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+ if ${ac_cv_prog_CXXCPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+CC="$CC $WARNING_CFLAGS"
+CXX="$CXX $WARNING_CXXFLAGS"
+
+# Check whether --enable-precondition-checking was given.
+if test "${enable_precondition_checking+set}" = set; then :
+ enableval=$enable_precondition_checking; if test "$enableval" = yes; then
+
+$as_echo "#define HAVE_PRECONDITION_CHECKING 1" >>confdefs.h
+
+ fi
+fi
+
+
+# Check whether --enable-adobe-code was given.
+if test "${enable_adobe_code+set}" = set; then :
+ enableval=$enable_adobe_code;
+else
+ enable_adobe_code=yes
+fi
+
+if test "$enable_adobe_code" = yes; then
+
+$as_echo "#define HAVE_ADOBE_CODE 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where template objects are stored" >&5
+$as_echo_n "checking where template objects are stored... " >&6; }
+if ${ac_cv_cxx_templobjs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_cxx_templobjs='unknown'
+ if test "$GXX" = yes; then
+ ac_cv_cxx_templobjs='nowhere'
+ else
+ case $CXX in
+ CC|*/CC)
+ cat > conftest.cc <<EOF
+template<class T> class A { public : A () {} };
+template<class T> void f (const A<T>&) {}
+main()
+{ A<double> d;
+ A<int> i;
+ f (d);
+ f (i);
+ return 0;
+}
+EOF
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d Templates.DB ; then
+ rm -fr Templates.DB
+ fi
+ if $CXX $CXXFLAGS -ptr. -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d Templates.DB ; then
+# this should be Sun CC <= 4.2
+ CXXFLAGS="$CXXFLAGS -ptr."
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='Templates.DB/*.o'
+ else
+ ac_cv_cxx_templobjs='Templates.DB/*.lo'
+ fi
+ rm -fr Templates.DB
+ fi
+ fi
+ fi
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d SunWS_cache ; then
+ rm -fr SunWS_cache
+ fi
+ if $CXX $CXXFLAGS -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d SunWS_cache ; then
+# this should be Sun WorkShop C++ compiler 5.x
+# or Sun Forte C++ compiler >= 6.x
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.o'
+ else
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.lo'
+ fi
+ rm -fr SunWS_cache
+ fi
+ fi
+ fi
+ rm -f conftest* ;;
+ esac
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_templobjs" >&5
+$as_echo "$ac_cv_cxx_templobjs" >&6; }
+case $ac_cv_cxx_templobjs in
+ unknown|nowhere)
+ TEMPLATE_OBJS="" ;;
+ *)
+ TEMPLATE_OBJS="$ac_cv_cxx_templobjs" ;;
+esac
+
+
+# Check whether --enable-cxx-runtime-hack was given.
+if test "${enable_cxx_runtime_hack+set}" = set; then :
+ enableval=$enable_cxx_runtime_hack;
+fi
+
+
+if test "x$GXX:$enable_cxx_runtime_hack" = xyes:yes; then
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for ac_header in iostream
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "iostream" "ac_cv_header_iostream" "$ac_includes_default"
+if test "x$ac_cv_header_iostream" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_IOSTREAM 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for statically linking C++ runtime library" >&5
+$as_echo_n "checking for statically linking C++ runtime library... " >&6; }
+if ${kpse_cv_cxx_hack+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef HAVE_IOSTREAM
+#include <iostream>
+using namespace std;
+#else
+#include <iostream.h>
+#endif
+int
+main ()
+{
+cout <<"worksok\n";
+ ;
+ return 0;
+}
+_ACEOF
+ case $host in #(
+ *cygwin*) :
+ flags_try0='-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic' ;; #(
+ *) :
+ flags_try0='-nodefaultlibs -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -lm'
+ flags_try1='-lgcc_eh -lgcc -lc -lgcc_eh -lgcc'
+ flags_try2='-lgcc -lc -lgcc' ;;
+esac
+ kpse_save_LIBS=$LIBS
+ cpp_link_hack=false
+ for flags in "$flags_try1" "$flags_try2"; do
+ LIBS="$kpse_save_LIBS $flags_try0 $flags"
+ if ac_fn_cxx_try_link "$LINENO"; then :
+ if test "x$cross_compiling" = xyes; then :
+ cpp_link_hack=true; break
+else
+ case `(./conftest$ac_exeext; exit) 2>/dev/null` in #(
+ worksok) :
+ cpp_link_hack=true; break ;; #(
+ *) :
+ ;;
+esac
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ done
+ LIBS=$kpse_save_LIBS
+ if $cpp_link_hack; then
+ kpse_cv_cxx_hack=ok
+ kpse_cv_cxx_flags="$flags_try0 $flags"
+ else
+ kpse_cv_cxx_hack="not supported"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_cxx_hack" >&5
+$as_echo "$kpse_cv_cxx_hack" >&6; }
+if test "x$kpse_cv_cxx_hack" = xok; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: using $kpse_cv_cxx_flags" >&5
+$as_echo "$as_me: using $kpse_cv_cxx_flags" >&6;}
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+if test "x$kpse_cv_cxx_hack" = xok; then
+ CXXLD='$(top_builddir)/CXXLD.sh'
+ cxxld_sh="#! ${CONFIG_SHELL-/bin/sh}
+# CXXLD.sh. Generated by configure.
+set -- $CXX \"\$@\" $kpse_cv_cxx_flags
+echo \"\$0:\" \"\$@\"
+exec \"\$@\""
+ ac_config_commands="$ac_config_commands CXXLD.sh"
+
+else
+ CXXLD='$(CXX)'
+fi
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+for ac_header in fcntl.h unistd.h sys/time.h sys/wait.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <new> works" >&5
+$as_echo_n "checking whether <new> works... " >&6; }
+if ${ac_cv_good_new_hdr+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <new>
+int
+main ()
+{
+
+ int a;
+ int *b = new(&a) int;
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ ac_cv_good_new_hdr=yes
+else
+ ac_cv_good_new_hdr=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_good_new_hdr" >&5
+$as_echo "$ac_cv_good_new_hdr" >&6; }
+if test "$ac_cv_good_new_hdr" = yes; then
+
+$as_echo "#define HAVE_NEW_HDR 1" >>confdefs.h
+
+fi
+for ac_header in new.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "new.h" "ac_cv_header_new_h" "$ac_includes_default"
+if test "x$ac_cv_header_new_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NEW_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+$as_echo "#define WORDS_BIGENDIAN_SET 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_c_bigendian=yes
+else
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes; then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ ac_cv_c_bigendian=no
+else
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+need_fixlibc=0
+for ac_func in strerror
+do :
+ ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
+if test "x$ac_cv_func_strerror" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_STRERROR 1
+_ACEOF
+
+else
+ need_fixlibc=1
+fi
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken strtod" >&5
+$as_echo_n "checking for broken strtod... " >&6; }
+if ${ac_cv_broken_strtod+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_broken_strtod=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stdlib.h>
+int main(int c, char **v) {
+ char s[] = "12 ";
+ char *endp;
+ double d = strtod(s, &endp);
+ return (s + 2) == endp;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_broken_strtod=yes
+else
+ ac_cv_broken_strtod=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_strtod" >&5
+$as_echo "$ac_cv_broken_strtod" >&6; }
+if test "x$ac_cv_broken_strtod" = xyes; then
+ need_fixlibc=1
+
+$as_echo "#define HAVE_BROKEN_STRTOD 1" >>confdefs.h
+
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+ac_fn_cxx_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "#include <string.h>
+"
+if test "x$ac_cv_have_decl_strnlen" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRNLEN $ac_have_decl
+_ACEOF
+
+for ac_func in strnlen
+do :
+ ac_fn_cxx_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen"
+if test "x$ac_cv_func_strnlen" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_STRNLEN 1
+_ACEOF
+ have_strnlen=1
+else
+ need_fixlibc=1
+fi
+done
+
+if test "x$have_strnlen" = x1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken strnlen" >&5
+$as_echo_n "checking for broken strnlen... " >&6; }
+if ${ac_cv_broken_strnlen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_broken_strnlen=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+#include <stdio.h>
+int main(int c, char **v) {
+ char s[] = "01234567891";
+ return strnlen(s, 10) == 10;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+ ac_cv_broken_strnlen=yes
+else
+ ac_cv_broken_strnlen=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_broken_strnlen" >&5
+$as_echo "$ac_cv_broken_strnlen" >&6; }
+ if test "x$ac_cv_broken_strnlen" = xyes; then
+ need_fixlibc=1
+
+$as_echo "#define HAVE_BROKEN_STRNLEN 1" >>confdefs.h
+
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+for ac_func in ctime ftruncate mkstemp sigaction strdup strtoul vsnprintf waitpid
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_func "$LINENO" "floor" "ac_cv_func_floor"
+if test "x$ac_cv_func_floor" = xyes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for floor in -lm" >&5
+$as_echo_n "checking for floor in -lm... " >&6; }
+if ${ac_cv_lib_m_floor+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char floor ();
+int
+main ()
+{
+return floor ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_m_floor=yes
+else
+ ac_cv_lib_m_floor=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_floor" >&5
+$as_echo "$ac_cv_lib_m_floor" >&6; }
+if test "x$ac_cv_lib_m_floor" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+fi
+
+ac_fn_c_check_func "$LINENO" "fabs" "ac_cv_func_fabs"
+if test "x$ac_cv_func_fabs" = xyes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabs in -lm" >&5
+$as_echo_n "checking for fabs in -lm... " >&6; }
+if ${ac_cv_lib_m_fabs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fabs ();
+int
+main ()
+{
+return fabs ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_m_fabs=yes
+else
+ ac_cv_lib_m_fabs=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_fabs" >&5
+$as_echo "$ac_cv_lib_m_fabs" >&6; }
+if test "x$ac_cv_lib_m_fabs" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+ LIBS="-lm $LIBS"
+
+fi
+
+fi
+
+ if test x$need_fixlibc = x1; then
+ FIXLIBC_TRUE=
+ FIXLIBC_FALSE='#'
+else
+ FIXLIBC_TRUE='#'
+ FIXLIBC_FALSE=
+fi
+
+
+
+
+for ac_header in inttypes.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_inttypes_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H 1
+_ACEOF
+ have_inttypes_h=yes
+else
+ have_inttypes_h=no
+fi
+
+done
+
+for ac_header in sys/types.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_types_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_TYPES_H 1
+_ACEOF
+ have_sys_types_h=yes
+else
+ have_sys_types_h=no
+fi
+
+done
+
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uintXX_t typedefs" >&5
+$as_echo_n "checking for uintXX_t typedefs... " >&6; }
+if ${ac_cv_uint_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then :
+ ac_cv_uint_t=yes
+else
+ ac_cv_uint_t=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_uint_t" >&5
+$as_echo "$ac_cv_uint_t" >&6; }
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for u_intXX_t typedefs" >&5
+$as_echo_n "checking for u_intXX_t typedefs... " >&6; }
+if ${ac_cv_u_int_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then :
+ ac_cv_u_int_t=yes
+else
+ ac_cv_u_int_t=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_u_int_t" >&5
+$as_echo "$ac_cv_u_int_t" >&6; }
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+
+$as_echo "#define HAVE_U_INT_TYPES 1" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&5
+$as_echo "$as_me: WARNING:
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming \"short\" has 16 bits and \"int\" has 32 bits.
+
+=========================================" >&2;}
+
+$as_echo "#define HAVE_FAKE_INT_TYPES 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+"
+if test "x$ac_cv_type_uintptr_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINTPTR_T 1
+_ACEOF
+
+
+fi
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+$as_echo_n "checking size of void *... " >&6; }
+if ${ac_cv_sizeof_void_p+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_void_p" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (void *)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+$as_echo "$ac_cv_sizeof_void_p" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5
+$as_echo_n "checking size of unsigned int... " >&6; }
+if ${ac_cv_sizeof_unsigned_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned int)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_int=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5
+$as_echo "$ac_cv_sizeof_unsigned_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for ac_header in byteorder.h netinet/in.h sys/param.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ntohs and ntohl are defined" >&5
+$as_echo_n "checking whether ntohs and ntohl are defined... " >&6; }
+ac_ntoh_defined=no
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#endif
+
+int
+main ()
+{
+(void) ntohs(0x0020), (void) ntohl(0x03040020);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ac_ntoh_defined=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if test $ac_ntoh_defined = no; then
+ for ac_header in arpa/inet.h
+do :
+ ac_fn_cxx_check_header_mongrel "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default"
+if test "x$ac_cv_header_arpa_inet_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ARPA_INET_H 1
+_ACEOF
+ have_arpa_inet_h=yes
+else
+ have_arpa_inet_h=no
+fi
+
+done
+
+ if test $have_arpa_inet_h = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ntohs and ntohl are defined in <arpa/inet.h>" >&5
+$as_echo_n "checking whether ntohs and ntohl are defined in <arpa/inet.h>... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <arpa/inet.h>
+
+int
+main ()
+{
+(void) ntohs(0x0020), (void) ntohl(0x03040020);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define NEED_ARPA_INET_H 1" >>confdefs.h
+
+ac_ntoh_defined=yes
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+fi
+if test $ac_ntoh_defined = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================" >&5
+$as_echo "$as_me: WARNING:
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================" >&2;}
+ if test "x$enable_build" != xno; then
+ as_fn_error $? "exiting" "$LINENO" 5
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ntohs" >&5
+$as_echo_n "checking for library containing ntohs... " >&6; }
+if ${ac_cv_search_ntohs+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ntohs ();
+int
+main ()
+{
+return ntohs ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' -lnet -lwinsock32; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_ntohs=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_ntohs+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_ntohs+:} false; then :
+
+else
+ ac_cv_search_ntohs=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ntohs" >&5
+$as_echo "$ac_cv_search_ntohs" >&6; }
+ac_res=$ac_cv_search_ntohs
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native WIN32 or MINGW32" >&5
+$as_echo_n "checking for native WIN32 or MINGW32... " >&6; }
+if ${kpse_cv_have_win32+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef WIN32
+ choke me
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __MINGW32__
+ choke me
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ kpse_cv_have_win32=mingw32
+else
+ kpse_cv_have_win32=native
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ kpse_cv_have_win32=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_have_win32" >&5
+$as_echo "$kpse_cv_have_win32" >&6; }
+
+if test "x$kpse_cv_have_win32" != xno; then
+ LIBS="$LIBS -lwsock32"
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for addressable va_list type" >&5
+$as_echo_n "checking for addressable va_list type... " >&6; }
+if ${ac_cv_va_list_addr+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+void f(va_list *) {
+}
+void g(va_list val) {
+ f(&val);
+}
+void h(int a, ...) {
+ va_list val;
+ va_start(val, a);
+ g(val);
+ va_end(val);
+}
+int
+main ()
+{
+h(2, 3, 4);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_va_list_addr=yes
+else
+ ac_cv_va_list_addr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_va_list_addr" >&5
+$as_echo "$ac_cv_va_list_addr" >&6; }
+if test "x$ac_cv_va_list_addr" = xyes; then
+
+$as_echo "#define HAVE_ADDRESSABLE_VA_LIST 1" >>confdefs.h
+
+fi
+
+
+
+## Define configure options for lcdf-typetools. Extracted from configure.ac
+## for ease of building TeX Live.
+# Check whether --enable-cfftot1 was given.
+if test "${enable_cfftot1+set}" = set; then :
+ enableval=$enable_cfftot1;
+fi
+# Check whether --enable-mmafm was given.
+if test "${enable_mmafm+set}" = set; then :
+ enableval=$enable_mmafm;
+fi
+# Check whether --enable-mmpfb was given.
+if test "${enable_mmpfb+set}" = set; then :
+ enableval=$enable_mmpfb;
+fi
+# Check whether --enable-otfinfo was given.
+if test "${enable_otfinfo+set}" = set; then :
+ enableval=$enable_otfinfo;
+fi
+# Check whether --enable-otftotfm was given.
+if test "${enable_otftotfm+set}" = set; then :
+ enableval=$enable_otftotfm;
+fi
+# Check whether --enable-t1dotlessj was given.
+if test "${enable_t1dotlessj+set}" = set; then :
+ enableval=$enable_t1dotlessj;
+fi
+# Check whether --enable-t1lint was given.
+if test "${enable_t1lint+set}" = set; then :
+ enableval=$enable_t1lint;
+fi
+# Check whether --enable-t1rawafm was given.
+if test "${enable_t1rawafm+set}" = set; then :
+ enableval=$enable_t1rawafm;
+fi
+# Check whether --enable-t1reencode was given.
+if test "${enable_t1reencode+set}" = set; then :
+ enableval=$enable_t1reencode;
+fi
+# Check whether --enable-t1testpage was given.
+if test "${enable_t1testpage+set}" = set; then :
+ enableval=$enable_t1testpage;
+fi
+# Check whether --enable-ttftotype42 was given.
+if test "${enable_ttftotype42+set}" = set; then :
+ enableval=$enable_ttftotype42;
+fi
+
+# Check whether --enable-cfftot1 was given.
+if test "${enable_cfftot1+set}" = set; then :
+ enableval=$enable_cfftot1;
+fi
+# Check whether --enable-t1dotlessj was given.
+if test "${enable_t1dotlessj+set}" = set; then :
+ enableval=$enable_t1dotlessj;
+fi
+# Check whether --enable-ttftotype42 was given.
+if test "${enable_ttftotype42+set}" = set; then :
+ enableval=$enable_ttftotype42;
+fi
+# Check whether --enable-updmap was given.
+if test "${enable_updmap+set}" = set; then :
+ enableval=$enable_updmap;
+fi
+
+
+
+SELECTED_SUBDIRS=
+test "x$enable_cfftot1" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS cfftot1"
+test "x$enable_mmafm" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS mmafm"
+test "x$enable_mmpfb" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS mmpfb"
+test "x$enable_otfinfo" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS otfinfo"
+test "x$enable_otftotfm" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS otftotfm"
+test "x$enable_t1dotlessj" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS t1dotlessj"
+test "x$enable_t1lint" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS t1lint"
+test "x$enable_t1rawafm" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS t1rawafm"
+test "x$enable_t1reencode" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS t1reencode"
+test "x$enable_t1testpage" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS t1testpage"
+test "x$enable_ttftotype42" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS ttftotype42"
+
+
+
+if test "x$enable_auto_cfftot1" != xno; then :
+
+$as_echo "#define HAVE_AUTO_CFFTOT1 1" >>confdefs.h
+
+fi
+if test "x$enable_auto_t1dotlessj" != xno; then :
+
+$as_echo "#define HAVE_AUTO_T1DOTLESSJ 1" >>confdefs.h
+
+fi
+if test "x$enable_auto_ttftotype42" != xno; then :
+
+$as_echo "#define HAVE_AUTO_TTFTOTYPE42 1" >>confdefs.h
+
+fi
+if test "x$enable_auto_updmap" != xno; then :
+
+$as_echo "#define HAVE_AUTO_UPDMAP 1" >>confdefs.h
+
+fi
+
+
+
+
+
+ if test "x$enable_texlive_build" = xyes; then
+ texlive_build_TRUE=
+ texlive_build_FALSE='#'
+else
+ texlive_build_TRUE='#'
+ texlive_build_FALSE=
+fi
+
+
+
+# Check whether --with-kpathsea was given.
+if test "${with_kpathsea+set}" = set; then :
+ withval=$with_kpathsea;
+fi
+
+
+kpse_save_CPPFLAGS=$CPPFLAGS
+kpse_save_LIBS=$LIBS
+
+##tldbg _KPSE_INIT: Initialize TL infrastructure.
+kpse_BLD=`(cd "./../../." && pwd)`
+kpse_SRC=`(cd "$srcdir/../../." && pwd)`
+
+##tldbg _KPSE_USE_LIBTOOL: Generate a libtool script for use in configure tests.
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+LCDF typetools (TeX Live) config.lt 2.108
+configured by $0, generated by GNU Autoconf 2.69.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $#
+do
+ case $1 in
+ --version | --v* | -V )
+ echo "$lt_cl_version"; exit 0 ;;
+ --help | --h* | -h )
+ echo "$lt_cl_help"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --quiet | --q* | --silent | --s* | -q )
+ lt_cl_silent=: ;;
+
+ -*) as_fn_error $? "unrecognized option: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+
+ *) as_fn_error $? "unrecognized argument: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+ esac
+ shift
+done
+
+if $lt_cl_silent; then
+ exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool 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 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure. Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+ lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_link="./libtool --mode=link --tag=CXX $ac_link"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PKG_CONFIG"; then
+ ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PKG_CONFIG="${ac_tool_prefix}pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_PKG_CONFIG"; then
+ ac_ct_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_PKG_CONFIG"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_PKG_CONFIG="pkg-config"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG
+if test -n "$ac_ct_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5
+$as_echo "$ac_ct_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_PKG_CONFIG" = x; then
+ PKG_CONFIG="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_ct_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_prog_PKG_CONFIG"
+fi
+
+##tldbg _KPSE_LIB_FLAGS: Setup kpathsea (-lkpathsea) flags.
+echo 'tldbg:_KPSE_LIB_FLAGS called: libdir=kpathsea, libname=kpathsea, options=lt, tlincl=-IBLD/texk -ISRC/texk, tllib=BLD/texk/kpathsea/libkpathsea.la, tlextra=, rebuildsrcdeps=${top_srcdir}/../kpathsea/*.[ch], rebuildblddeps=${top_builddir}/../kpathsea/paths.h.' >&5
+##tldbg _KPSE_LIB_FLAGS_TL: kpathsea (kpathsea) lt.
+
+# Check whether --with-system-kpathsea was given.
+if test "${with_system_kpathsea+set}" = set; then :
+ withval=$with_system_kpathsea;
+fi
+if test "x$with_system_kpathsea" = xyes; then
+ if $PKG_CONFIG kpathsea; then
+ KPATHSEA_INCLUDES=`$PKG_CONFIG kpathsea --cflags`
+ KPATHSEA_LIBS=`$PKG_CONFIG kpathsea --libs`
+elif test "x$need_kpathsea:$with_system_kpathsea" = xyes:yes; then
+ as_fn_error $? "did not find kpathsea" "$LINENO" 5
+fi
+else
+ KPATHSEA_INCLUDES="-I$kpse_BLD/texk -I$kpse_SRC/texk"
+ KPATHSEA_LIBS="$kpse_BLD/texk/kpathsea/libkpathsea.la"
+ KPATHSEA_DEPEND='${top_builddir}/../kpathsea/libkpathsea.la'
+ KPATHSEA_RULE='# Rebuild libkpathsea
+$(KPATHSEA_DEPEND): ${top_srcdir}/../kpathsea/*.[ch] ${top_builddir}/../kpathsea/paths.h
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild
+${top_builddir}/../kpathsea/paths.h:
+ cd ${top_builddir}/../kpathsea && $(MAKE) $(AM_MAKEFLAGS) rebuild'
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libkpathsea supports debugging" >&5
+$as_echo_n "checking if libkpathsea supports debugging... " >&6; }
+if ${kpse_cv_kpse_debug+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval CPPFLAGS=\"$KPATHSEA_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$KPATHSEA_LIBS \$LIBS\"
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+int
+main ()
+{
+FILE *f = fopen("f", "r")
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ kpse_cv_kpse_debug=yes
+else
+ kpse_cv_kpse_debug=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $kpse_cv_kpse_debug" >&5
+$as_echo "$kpse_cv_kpse_debug" >&6; }
+if test "x$kpse_cv_kpse_debug" != xyes; then :
+ KPATHSEA_INCLUDES="$KPATHSEA_INCLUDES -DNO_DEBUG"
+fi
+
+
+if test "x$enable_build" != xno || test -f config.force; then
+
+eval CPPFLAGS=\"$KPATHSEA_INCLUDES \$CPPFLAGS\"
+eval LIBS=\"$KPATHSEA_LIBS \$LIBS\"
+
+
+if test "x$with_kpathsea" != xno; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kpathsea headers and library" >&5
+$as_echo_n "checking for kpathsea headers and library... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <kpathsea/kpathsea.h>
+int
+main ()
+{
+kpse_tfm_format;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ ac_fn_cxx_check_decl "$LINENO" "kpse_opentype_format" "ac_cv_have_decl_kpse_opentype_format" "#include <kpathsea/kpathsea.h>
+"
+if test "x$ac_cv_have_decl_kpse_opentype_format" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_KPSE_OPENTYPE_FORMAT $ac_have_decl
+_ACEOF
+
+ ac_fn_cxx_check_decl "$LINENO" "kpse_enc_format" "ac_cv_have_decl_kpse_enc_format" "#include <kpathsea/kpathsea.h>
+"
+if test "x$ac_cv_have_decl_kpse_enc_format" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_KPSE_ENC_FORMAT $ac_have_decl
+_ACEOF
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ with_kpathsea=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+ if test "x$with_kpathsea" = xno; then
+ as_fn_error $? "
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea-libdir=DIR option (library under DIR) and
+--with-kpathsea-includes=DIR option (header files under DIR/kpathsea), or
+disable kpathsea support using --without-kpathsea.
+
+=========================================" "$LINENO" 5
+ fi
+
+$as_echo "#define HAVE_KPATHSEA 1" >>confdefs.h
+
+fi
+
+CPPFLAGS=$kpse_save_CPPFLAGS
+LIBS=$kpse_save_LIBS
+
+
+echo timestamp >config.force
+fi
+
+ if test "x$with_kpathsea" != xno; then
+ have_kpathsea_TRUE=
+ have_kpathsea_FALSE='#'
+else
+ have_kpathsea_TRUE='#'
+ have_kpathsea_FALSE=
+fi
+
+
+# Check whether --enable-selfauto-set was given.
+if test "${enable_selfauto_set+set}" = set; then :
+ enableval=$enable_selfauto_set;
+else
+ enable_selfauto_set=yes
+fi
+
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno -a "x$enable_texlive_build" != xyes; then
+ kpsewhich='kpsewhich'
+ test "x$kpathsea" != xyes -a -x "$kpathsea/bin/kpsewhich" && kpsewhich="$kpathsea/bin/kpsewhich"
+ SELFAUTOLOC="`$kpsewhich --expand-var='$SELFAUTOLOC' 2>/dev/null`"
+ SELFAUTODIR="`$kpsewhich --expand-var='$SELFAUTODIR' 2>/dev/null`"
+ SELFAUTOPARENT="`$kpsewhich --expand-var='$SELFAUTOPARENT' 2>/dev/null`"
+ SELFAUTOGRANDPARENT="`$kpsewhich --expand-var='$SELFAUTOGRANDPARENT' 2>/dev/null`"
+ if test -z "$SELFAUTODIR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================" >&5
+$as_echo "$as_me: WARNING:
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================" >&2;}
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTOLOC "$SELFAUTOLOC"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTODIR "$SELFAUTODIR"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTOPARENT "$SELFAUTOPARENT"
+_ACEOF
+
+ if test -n "$SELFAUTOGRANDPARENT" -a "$SELFAUTOGRANDPARENT" != '$SELFAUTOGRANDPARENT'; then
+
+cat >>confdefs.h <<_ACEOF
+#define SELFAUTOGRANDPARENT "$SELFAUTOGRANDPARENT"
+_ACEOF
+
+ fi
+fi
+
+
+glyphlistdir='${datarootdir}/texmf-dist/fonts/map/glyphlist'
+encdir='${datarootdir}/texmf-dist/fonts/enc/dvips/base'
+
+
+
+
+
+
+$as_echo "#define HAVE_PERMSTRING 1" >>confdefs.h
+
+
+$as_echo "#define MMAFM_RUN_MMPFB 1" >>confdefs.h
+
+
+
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | fgrep '$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ eval "$1='$val'"
+}
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+shell_expand datadir
+
+if test "x$enable_native_texlive_build" = xyes; then
+ gdir=/nonesuch
+else
+ gdir="$glyphlistdir"
+ for i in data dataroot pkgdata g; do shell_expand ${i}dir; done
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define GLYPHLISTDIR "$gdir"
+_ACEOF
+
+
+
+
+LCDF_TYPETOOLS_TREE=lcdf-typetools-src
+
+
+ac_config_files="$ac_config_files Makefile lcdf-typetools-src/Makefile"
+
+ac_config_files="$ac_config_files lcdf-typetools-src/liblcdf/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/libefont/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/cfftot1/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/mmafm/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/mmpfb/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/otfinfo/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/otftotfm/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/t1dotlessj/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/t1lint/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/t1rawafm/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/t1reencode/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/t1testpage/Makefile"
+ac_config_files="$ac_config_files lcdf-typetools-src/ttftotype42/Makefile"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${FIXLIBC_TRUE}" && test -z "${FIXLIBC_FALSE}"; then
+ as_fn_error $? "conditional \"FIXLIBC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${texlive_build_TRUE}" && test -z "${texlive_build_FALSE}"; then
+ as_fn_error $? "conditional \"texlive_build\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${have_kpathsea_TRUE}" && test -z "${have_kpathsea_FALSE}"; then
+ as_fn_error $? "conditional \"have_kpathsea\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by LCDF typetools (TeX Live) $as_me 2.108, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <tex-k@tug.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+LCDF typetools (TeX Live) config.status 2.108
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in AS \
+DLLTOOL \
+OBJDUMP \
+SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+ case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+ *[\\\\\\\`\\"\\\$]*)
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+ ;;
+ *)
+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+ ;;
+ esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+fi
+
+
+ PACKAGE='$PACKAGE'
+ VERSION='$VERSION'
+ RM='$RM'
+ ofile='$ofile'
+
+
+
+ac_aux_dir='$ac_aux_dir'
+
+
+cxxld_sh='$cxxld_sh'
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+ "autoconf.h") CONFIG_HEADERS="$CONFIG_HEADERS autoconf.h" ;;
+ "CXXLD.sh") CONFIG_COMMANDS="$CONFIG_COMMANDS CXXLD.sh" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "lcdf-typetools-src/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/Makefile" ;;
+ "lcdf-typetools-src/liblcdf/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/liblcdf/Makefile" ;;
+ "lcdf-typetools-src/libefont/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/libefont/Makefile" ;;
+ "lcdf-typetools-src/cfftot1/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/cfftot1/Makefile" ;;
+ "lcdf-typetools-src/mmafm/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/mmafm/Makefile" ;;
+ "lcdf-typetools-src/mmpfb/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/mmpfb/Makefile" ;;
+ "lcdf-typetools-src/otfinfo/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/otfinfo/Makefile" ;;
+ "lcdf-typetools-src/otftotfm/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/otftotfm/Makefile" ;;
+ "lcdf-typetools-src/t1dotlessj/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/t1dotlessj/Makefile" ;;
+ "lcdf-typetools-src/t1lint/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/t1lint/Makefile" ;;
+ "lcdf-typetools-src/t1rawafm/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/t1rawafm/Makefile" ;;
+ "lcdf-typetools-src/t1reencode/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/t1reencode/Makefile" ;;
+ "lcdf-typetools-src/t1testpage/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/t1testpage/Makefile" ;;
+ "lcdf-typetools-src/ttftotype42/Makefile") CONFIG_FILES="$CONFIG_FILES lcdf-typetools-src/ttftotype42/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "libtool":C)
+
+ # See if we are running on zsh, and set the options that allow our
+ # commands through without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}"; then
+ setopt NO_GLOB_SUBST
+ fi
+
+ cfgfile=${ofile}T
+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+ $RM "$cfgfile"
+
+ cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool 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 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Assembler program.
+AS=$lt_AS
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Object dumper program.
+OBJDUMP=$lt_OBJDUMP
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+ case $host_os in
+ aix3*)
+ cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+_LT_EOF
+ ;;
+ esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" \
+ || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" ||
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+
+ cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+ "CXXLD.sh":C) echo "$cxxld_sh" >CXXLD.sh; chmod +x CXXLD.sh ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/Build/source/texk/lcdf-typetools/configure.ac b/Build/source/texk/lcdf-typetools/configure.ac
new file mode 100644
index 00000000000..829db6ef763
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/configure.ac
@@ -0,0 +1,427 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl
+dnl Copyright (C) 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+dnl
+dnl This file is free software; the copyright holder
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl *********************************************************************
+dnl
+dnl Adapted for TeX Live from lcdf-typetools-src/configure.ac
+dnl Copyright (c) 1997-2011 Eddie Kohler
+dnl
+dnl *********************************************************************
+dnl
+m4_include([version.ac])[] dnl define lcdf_typetools_version
+AC_INIT([LCDF typetools (TeX Live)], lcdf_typetools_version, [tex-k@tug.org])
+AC_PREREQ([2.65])
+AC_CONFIG_SRCDIR([lcdf-typetools-src/NEWS.md])
+AC_CONFIG_AUX_DIR([../../build-aux])
+AC_CONFIG_MACRO_DIRS([../../m4 m4])
+
+dnl Common code for all programs using libkpathsea.
+KPSE_COMMON([lcdf-typetools])
+
+AC_SUBST([LCDF_TYPETOOLS_VERSION], lcdf_typetools_version)
+
+AC_CONFIG_HEADERS([autoconf.h])
+
+AC_PROG_CXX
+AC_PROG_CXXCPP
+
+CC="$CC $WARNING_CFLAGS"
+CXX="$CXX $WARNING_CXXFLAGS"
+
+AC_ARG_ENABLE([precondition-checking],
+ [AS_HELP_STRING([--enable-precondition-checking], [include precondition checking assertions])],
+ [if test "$enableval" = yes; then
+ AC_DEFINE([HAVE_PRECONDITION_CHECKING], [1], [Define to include precondition checking assertions.])
+ fi])
+
+AC_ARG_ENABLE([adobe-code],
+ [AS_HELP_STRING([--disable-adobe-code], [do not include Adobe code])],
+ [], [enable_adobe_code=yes])
+if test "$enable_adobe_code" = yes; then
+ AC_DEFINE([HAVE_ADOBE_CODE], [1], [Define to incldue Adobe code in output fonts.])
+fi
+
+AC_CXX_TEMPLATE_OBJS
+
+KPSE_CXX_HACK
+
+
+dnl
+dnl directory searching
+dnl
+
+AC_LANG_C
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS([fcntl.h unistd.h sys/time.h sys/wait.h])
+
+
+dnl
+dnl <new> and/or <new.h>
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([whether <new> works], ac_cv_good_new_hdr,
+[AC_TRY_LINK([#include <new>], [
+ int a;
+ int *b = new(&a) int;
+ return 0;
+], ac_cv_good_new_hdr=yes, ac_cv_good_new_hdr=no)])
+if test "$ac_cv_good_new_hdr" = yes; then
+ AC_DEFINE([HAVE_NEW_HDR], [1], [Define if <new> exists and works.])
+fi
+AC_CHECK_HEADERS([new.h])
+
+
+dnl
+dnl endianness
+dnl
+
+AC_DEFINE([WORDS_BIGENDIAN_SET], [1], [Define if WORDS_BIGENDIAN has been set.])
+AC_C_BIGENDIAN()
+
+
+dnl
+dnl functions such as strerror, working strtod, working strnlen, strtoul,
+dnl time headers such as unistd.h
+dnl
+
+AC_LANG_C
+need_fixlibc=0
+AC_CHECK_FUNCS([strerror], [], [need_fixlibc=1])
+
+AC_CACHE_CHECK([for broken strtod], [ac_cv_broken_strtod],
+[AC_TRY_RUN([#include <stdio.h>
+#include <stdlib.h>
+int main(int c, char **v) {
+ char s[] = "12 ";
+ char *endp;
+ double d = strtod(s, &endp);
+ return (s + 2) == endp;
+}], [ac_cv_broken_strtod=yes], [ac_cv_broken_strtod=no],
+[ac_cv_broken_strtod=no])])
+if test "x$ac_cv_broken_strtod" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRTOD], [1], [Define if strtod is broken.])
+fi
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_DECLS([strnlen], [], [], [#include <string.h>])
+AC_CHECK_FUNCS([strnlen], [have_strnlen=1], [need_fixlibc=1])
+if test "x$have_strnlen" = x1; then
+ AC_CACHE_CHECK([for broken strnlen], [ac_cv_broken_strnlen],
+ [AC_TRY_RUN([#include <string.h>
+#include <stdio.h>
+int main(int c, char **v) {
+ char s[] = "01234567891";
+ return strnlen(s, 10) == 10;
+}], [ac_cv_broken_strnlen=yes], [ac_cv_broken_strnlen=no],
+[ac_cv_broken_strnlen=no])])
+ if test "x$ac_cv_broken_strnlen" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRNLEN], [1], [Define if strnlen is broken.])
+ fi
+fi
+AC_LANG_C
+
+AC_CHECK_FUNCS([ctime ftruncate mkstemp sigaction strdup strtoul vsnprintf waitpid])
+AC_CHECK_FUNC([floor], [], [AC_CHECK_LIB([m], [floor])])
+AC_CHECK_FUNC([fabs], [], [AC_CHECK_LIB([m], [fabs])])
+AM_CONDITIONAL([FIXLIBC], [test x$need_fixlibc = x1])
+
+
+dnl
+dnl integer types
+dnl
+
+AC_CHECK_HEADERS(inttypes.h, have_inttypes_h=yes, have_inttypes_h=no)
+AC_CHECK_HEADERS(sys/types.h, have_sys_types_h=yes, have_sys_types_h=no)
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ AC_CACHE_CHECK([for uintXX_t typedefs], ac_cv_uint_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_uint_t=yes, ac_cv_uint_t=no)])
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ AC_CACHE_CHECK([for u_intXX_t typedefs], ac_cv_u_int_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_u_int_t=yes, ac_cv_u_int_t=no)])
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+ AC_DEFINE(HAVE_U_INT_TYPES, 1, [Define if you have u_intXX_t types but not uintXX_t types.])
+else
+ AC_MSG_WARN([
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming "short" has 16 bits and "int" has 32 bits.
+
+=========================================])
+ AC_DEFINE(HAVE_FAKE_INT_TYPES, 1, [Define if intXX_t types are not available.])
+fi
+
+AC_CHECK_TYPES(uintptr_t, [], [],
+[#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+])
+
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned int)
+
+
+dnl
+dnl ntohs, ntohl (need them in C++ code)
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS(byteorder.h netinet/in.h sys/param.h)
+AC_MSG_CHECKING([whether ntohs and ntohl are defined])
+ac_ntoh_defined=no
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#endif
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+if test $ac_ntoh_defined = no; then
+ AC_CHECK_HEADERS([arpa/inet.h], [have_arpa_inet_h=yes], [have_arpa_inet_h=no])
+ if test $have_arpa_inet_h = yes; then
+ AC_MSG_CHECKING([whether ntohs and ntohl are defined in <arpa/inet.h>])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <arpa/inet.h>
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+AC_DEFINE(NEED_ARPA_INET_H, 1, [Define to 1 if you must include <arpa/inet.h> to get `ntohl'.])
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+ fi
+fi
+if test $ac_ntoh_defined = no; then
+ AC_MSG_WARN([
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================])
+ if test "x$enable_build" != xno; then
+ AC_MSG_ERROR([exiting])
+ fi
+fi
+AC_LANG_C
+AC_SEARCH_LIBS([ntohs], [-lnet -lwinsock32])
+
+KPSE_CHECK_WIN32
+if test "x$kpse_cv_have_win32" != xno; then
+ LIBS="$LIBS -lwsock32"
+fi
+
+dnl
+dnl is va_list addressable?
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([for addressable va_list type],
+ ac_cv_va_list_addr,
+ [AC_TRY_COMPILE([#include <stdarg.h>
+void f(va_list *) {
+}
+void g(va_list val) {
+ f(&val);
+}
+void h(int a, ...) {
+ va_list val;
+ va_start(val, a);
+ g(val);
+ va_end(val);
+}], [h(2, 3, 4);], ac_cv_va_list_addr=yes, ac_cv_va_list_addr=no)])
+if test "x$ac_cv_va_list_addr" = xyes; then
+ AC_DEFINE(HAVE_ADDRESSABLE_VA_LIST, 1, [Define if the va_list type is addressable.])
+fi
+
+
+dnl
+dnl select programs to be compiled and automatically run
+dnl
+
+m4_include([ac/lcdf-typetools.ac])
+
+SELECTED_SUBDIRS=
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [test "x$enable_[]Kpse_Prog" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS Kpse_Prog"
+])
+AC_SUBST(SELECTED_SUBDIRS)
+
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AS_IF([test "x$enable_auto_]Kpse_Opt[" != xno],
+ [AC_DEFINE([HAVE_AUTO_]AS_TR_CPP(Kpse_Opt), 1,
+ [Define to run ]Kpse_Opt[ from otftotfm.])])
+])
+
+
+dnl
+dnl kpathsea
+dnl
+
+dnl The configure option '--enable-texlive-build' is inherited
+dnl and automatically enabled, when built as part of TeX Live.
+
+AM_CONDITIONAL([texlive_build], [test "x$enable_texlive_build" = xyes])
+
+AC_ARG_WITH([kpathsea],
+ AS_HELP_STRING([--without-kpathsea],
+ [build otftotfm without kpathsea]))
+
+KPSE_KPATHSEA_FLAGS
+
+if test "x$enable_build" != xno || test -f config.force; then
+
+KPSE_ADD_FLAGS([kpathsea])
+
+if test "x$with_kpathsea" != xno; then
+ AC_MSG_CHECKING([for kpathsea headers and library])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <kpathsea/kpathsea.h>]],
+ [[kpse_tfm_format;]])],
+ [AC_MSG_RESULT([yes])
+ AC_CHECK_DECLS([kpse_opentype_format], , ,
+ [#include <kpathsea/kpathsea.h>])
+ AC_CHECK_DECLS([kpse_enc_format], , ,
+ [#include <kpathsea/kpathsea.h>])],
+ [AC_MSG_RESULT([no])
+ with_kpathsea=no])
+
+ if test "x$with_kpathsea" = xno; then
+ AC_MSG_ERROR([
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea-libdir=DIR option (library under DIR) and
+--with-kpathsea-includes=DIR option (header files under DIR/kpathsea), or
+disable kpathsea support using --without-kpathsea.
+
+=========================================])
+ fi
+ AC_DEFINE(HAVE_KPATHSEA, 1, [Define if you want to use kpathsea.])
+fi
+
+KPSE_RESTORE_FLAGS
+
+echo timestamp >config.force
+fi
+
+AM_CONDITIONAL([have_kpathsea], [test "x$with_kpathsea" != xno])
+
+AC_ARG_ENABLE([selfauto-set],
+ AS_HELP_STRING([--disable-selfauto-set], [disable setting SELFAUTO variables from kpsewhich]),
+ [], [enable_selfauto_set=yes])
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno -a "x$enable_texlive_build" != xyes; then
+ kpsewhich='kpsewhich'
+ test "x$kpathsea" != xyes -a -x "$kpathsea/bin/kpsewhich" && kpsewhich="$kpathsea/bin/kpsewhich"
+ SELFAUTOLOC="`$kpsewhich --expand-var='$SELFAUTOLOC' 2>/dev/null`"
+ SELFAUTODIR="`$kpsewhich --expand-var='$SELFAUTODIR' 2>/dev/null`"
+ SELFAUTOPARENT="`$kpsewhich --expand-var='$SELFAUTOPARENT' 2>/dev/null`"
+ SELFAUTOGRANDPARENT="`$kpsewhich --expand-var='$SELFAUTOGRANDPARENT' 2>/dev/null`"
+ if test -z "$SELFAUTODIR"; then
+ AC_MSG_WARN([
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================])
+ fi
+ AC_DEFINE_UNQUOTED([SELFAUTOLOC], "$SELFAUTOLOC", [kpsewhich's $SELFAUTOLOC variable])
+ AC_DEFINE_UNQUOTED([SELFAUTODIR], "$SELFAUTODIR", [kpsewhich's $SELFAUTODIR variable])
+ AC_DEFINE_UNQUOTED([SELFAUTOPARENT], "$SELFAUTOPARENT", [kpsewhich's $SELFAUTOPARENT variable])
+ if test -n "$SELFAUTOGRANDPARENT" -a "$SELFAUTOGRANDPARENT" != '$SELFAUTOGRANDPARENT'; then
+ AC_DEFINE_UNQUOTED([SELFAUTOGRANDPARENT], "$SELFAUTOGRANDPARENT", [kpsewhich's $SELFAUTOGRANDPARENT variable])
+ fi
+fi
+
+
+dnl
+dnl glyphlist.txt and *.enc installation locations
+dnl
+glyphlistdir='${datarootdir}/texmf-dist/fonts/map/glyphlist'
+encdir='${datarootdir}/texmf-dist/fonts/enc/dvips/base'
+AC_SUBST([glyphlistdir])
+AC_SUBST([encdir])
+
+
+dnl
+dnl verbatim portions of the header
+dnl
+
+AC_DEFINE(HAVE_PERMSTRING, 1, [Define if PermStrings are available.])
+AC_DEFINE(MMAFM_RUN_MMPFB, 1, [Define to 0 if you don't want mmafm to run mmpfb when it needs to get an intermediate master conversion program.])
+dnl PATHNAME_SEPARATOR?
+
+
+dnl
+dnl set path variables
+dnl
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | fgrep '$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ eval "$1='$val'"
+}
+
+dnl Preset $prefix and $exec_prefix.
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+shell_expand datadir
+
+if test "x$enable_native_texlive_build" = xyes; then
+ gdir=/nonesuch
+else
+ gdir="$glyphlistdir"
+ for i in data dataroot pkgdata g; do shell_expand ${i}dir; done
+fi
+AC_DEFINE_UNQUOTED([GLYPHLISTDIR], ["$gdir"], [Directory for glyphlist.txt files.])
+
+
+dnl
+dnl Output
+dnl
+
+AC_SUBST([LCDF_TYPETOOLS_TREE], [lcdf-typetools-src])
+
+AC_CONFIG_FILES([Makefile lcdf-typetools-src/Makefile])
+AC_FOREACH([Kpse_Prog], [liblcdf libefont] kpse_lcdf_typetools_progs,
+ [AC_CONFIG_FILES([lcdf-typetools-src/]Kpse_Prog[/Makefile])])
+
+AC_OUTPUT
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/7t.enc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/7t.enc
new file mode 100644
index 00000000000..727f29e5f8c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/7t.enc
@@ -0,0 +1,65 @@
+% A version of the 7t/OT1 encoding, with useful UNICODING comments,
+% intended for use with otftotfm.
+% We do not remove kerns between digits and other characters; a user who wants
+% tabular digits should select the OpenType "tnum" feature.
+% We also do not remove kerns between space and other characters; space is our
+% boundary character.
+
+/LCDF7TEncoding [
+%00
+ /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon
+ /Phi /Psi /Omega /ff /fi /fl /ffi /ffl
+%10
+ /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+%20
+ /space /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+%30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+%40
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+%50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+%60
+ /quoteleft /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+%70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis
+%80
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%90
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%A0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%B0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%C0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%D0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%E0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+%F0
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ % LIGKERN question quoteleft =: questiondown ;
+ % LIGKERN exclam quoteleft =: exclamdown ;
+ % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+ % LIGKERN quoteleft quoteleft =: quotedblleft ;
+ % LIGKERN quoteright quoteright =: quotedblright ;
+ % LIGKERN || = 32 ;
+ % UNICODING Delta =: Deltagreek Delta ; Omega =: Omegagreek Omega ;
+ % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
+] def
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/COPYING b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/COPYING
new file mode 100644
index 00000000000..67572846722
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/COPYING
@@ -0,0 +1,416 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+
+
+
+
+
+
+
+
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+
+
+
+
+
+
+
+
+
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/INSTALL b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/INSTALL
new file mode 100644
index 00000000000..95d84c820fb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.am
new file mode 100644
index 00000000000..0bb3d977ad2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.am
@@ -0,0 +1,86 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+SUBDIRS = liblcdf libefont @SELECTED_SUBDIRS@
+DIST_SUBDIRS = liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm \
+ t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
+
+EXTRA_DIST = \
+ ONEWS README.md NEWS.md \
+ lcdf-typetools.spec \
+ include/config.h \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashcode.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/md5.h \
+ include/lcdf/permstr.hh \
+ include/lcdf/point.hh \
+ include/lcdf/slurper.hh \
+ include/lcdf/straccum.hh \
+ include/lcdf/string.hh \
+ include/lcdf/strtonum.h \
+ include/lcdf/transform.hh \
+ include/lcdf/vector.hh include/lcdf/vector.cc \
+ include/efont/afm.hh \
+ include/efont/afmparse.hh \
+ include/efont/afmw.hh \
+ include/efont/amfm.hh \
+ include/efont/cff.hh \
+ include/efont/encoding.hh \
+ include/efont/findmet.hh \
+ include/efont/metrics.hh \
+ include/efont/otf.hh \
+ include/efont/otfcmap.hh \
+ include/efont/otfdata.hh \
+ include/efont/otfgpos.hh \
+ include/efont/otfgsub.hh \
+ include/efont/otfname.hh \
+ include/efont/otfos2.hh \
+ include/efont/otfpost.hh \
+ include/efont/pairop.hh \
+ include/efont/psres.hh \
+ include/efont/t1bounds.hh \
+ include/efont/t1cs.hh \
+ include/efont/t1csgen.hh \
+ include/efont/t1font.hh \
+ include/efont/t1interp.hh \
+ include/efont/t1item.hh \
+ include/efont/t1mm.hh \
+ include/efont/t1rw.hh \
+ include/efont/t1unparser.hh \
+ include/efont/ttfcs.hh \
+ include/efont/ttfhead.hh \
+ include/efont/ttfkern.hh \
+ glyphlist.txt \
+ texglyphlist.txt \
+ texglyphlist-g2u.txt \
+ 7t.enc
+
+glyphlist_DATA = glyphlist.txt texglyphlist.txt
+enc_DATA = 7t.enc
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm \
+t1reencode t1testpage ttftotype42: liblcdf libefont
+ cd $@ && $(MAKE)
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(srcdir)/cfftot1/cfftot1.1 $(srcdir)/mmafm/mmafm.1 $(srcdir)/mmpfb/mmpfb.1 $(srcdir)/otfinfo/otfinfo.1 $(srcdir)/otftotfm/otftotfm.1 $(srcdir)/t1dotlessj/t1dotlessj.1 $(srcdir)/t1lint/t1lint.1 $(srcdir)/t1rawafm/t1rawafm.1 $(srcdir)/t1reencode/t1reencode.1 $(srcdir)/t1testpage/t1testpage.1 $(srcdir)/ttftotype42/ttftotype42.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(srcdir)/README.md
+ perl -pi -e 's/^Version: [\d.ab]+$$/Version: $(VERSION)/;' $(srcdir)/lcdf-typetools.spec
+
+dist-hook:
+ if test -f $(srcdir)/make-glyphtounicode.pl; then (cd $(srcdir); perl make-glyphtounicode.pl) > $(distdir)/glyphtounicode.tex; elif test -f $(srcdir)/glyphtounicode.tex; then cp $(srcdir)/glyphtounicode.tex $(distdir); fi
+
+$(srcdir)/glyphtounicode.tex: $(srcdir)/glyphlist.txt $(srcdir)/texglyphlist.txt $(srcdir)/texglyphlist-g2u.txt $(srcdir)/make-glyphtounicode.pl
+ cd $(srcdir); perl make-glyphtounicode.pl > glyphtounicode.tex
+
+.PHONY: rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.in
new file mode 100644
index 00000000000..796dafa82a2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/Makefile.in
@@ -0,0 +1,808 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = lcdf-typetools-src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(encdir)" "$(DESTDIR)$(glyphlistdir)"
+DATA = $(enc_DATA) $(glyphlist_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in COPYING INSTALL
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+SUBDIRS = liblcdf libefont @SELECTED_SUBDIRS@
+DIST_SUBDIRS = liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm \
+ t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
+
+EXTRA_DIST = \
+ ONEWS README.md NEWS.md \
+ lcdf-typetools.spec \
+ include/config.h \
+ include/lcdf/bezier.hh \
+ include/lcdf/clp.h \
+ include/lcdf/error.hh \
+ include/lcdf/filename.hh \
+ include/lcdf/globmatch.hh \
+ include/lcdf/hashcode.hh \
+ include/lcdf/hashmap.hh include/lcdf/hashmap.cc \
+ include/lcdf/inttypes.h \
+ include/lcdf/landmark.hh \
+ include/lcdf/md5.h \
+ include/lcdf/permstr.hh \
+ include/lcdf/point.hh \
+ include/lcdf/slurper.hh \
+ include/lcdf/straccum.hh \
+ include/lcdf/string.hh \
+ include/lcdf/strtonum.h \
+ include/lcdf/transform.hh \
+ include/lcdf/vector.hh include/lcdf/vector.cc \
+ include/efont/afm.hh \
+ include/efont/afmparse.hh \
+ include/efont/afmw.hh \
+ include/efont/amfm.hh \
+ include/efont/cff.hh \
+ include/efont/encoding.hh \
+ include/efont/findmet.hh \
+ include/efont/metrics.hh \
+ include/efont/otf.hh \
+ include/efont/otfcmap.hh \
+ include/efont/otfdata.hh \
+ include/efont/otfgpos.hh \
+ include/efont/otfgsub.hh \
+ include/efont/otfname.hh \
+ include/efont/otfos2.hh \
+ include/efont/otfpost.hh \
+ include/efont/pairop.hh \
+ include/efont/psres.hh \
+ include/efont/t1bounds.hh \
+ include/efont/t1cs.hh \
+ include/efont/t1csgen.hh \
+ include/efont/t1font.hh \
+ include/efont/t1interp.hh \
+ include/efont/t1item.hh \
+ include/efont/t1mm.hh \
+ include/efont/t1rw.hh \
+ include/efont/t1unparser.hh \
+ include/efont/ttfcs.hh \
+ include/efont/ttfhead.hh \
+ include/efont/ttfkern.hh \
+ glyphlist.txt \
+ texglyphlist.txt \
+ texglyphlist-g2u.txt \
+ 7t.enc
+
+glyphlist_DATA = glyphlist.txt texglyphlist.txt
+enc_DATA = 7t.enc
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-encDATA: $(enc_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(enc_DATA)'; test -n "$(encdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(encdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(encdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(encdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(encdir)" || exit $$?; \
+ done
+
+uninstall-encDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(enc_DATA)'; test -n "$(encdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(encdir)'; $(am__uninstall_files_from_dir)
+install-glyphlistDATA: $(glyphlist_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(glyphlist_DATA)'; test -n "$(glyphlistdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(glyphlistdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(glyphlistdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(glyphlistdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(glyphlistdir)" || exit $$?; \
+ done
+
+uninstall-glyphlistDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(glyphlist_DATA)'; test -n "$(glyphlistdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(glyphlistdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(encdir)" "$(DESTDIR)$(glyphlistdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-encDATA install-glyphlistDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-encDATA uninstall-glyphlistDATA
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am dist-hook distclean distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-encDATA \
+ install-exec install-exec-am install-glyphlistDATA \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-encDATA uninstall-glyphlistDATA
+
+.PRECIOUS: Makefile
+
+
+liblcdf libefont:
+ cd $@ && $(MAKE)
+libefont: liblcdf
+cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm \
+t1reencode t1testpage ttftotype42: liblcdf libefont
+ cd $@ && $(MAKE)
+
+versionize:
+ perl -pi -e 's/^\.ds V.*/.ds V $(VERSION)/;' $(srcdir)/cfftot1/cfftot1.1 $(srcdir)/mmafm/mmafm.1 $(srcdir)/mmpfb/mmpfb.1 $(srcdir)/otfinfo/otfinfo.1 $(srcdir)/otftotfm/otftotfm.1 $(srcdir)/t1dotlessj/t1dotlessj.1 $(srcdir)/t1lint/t1lint.1 $(srcdir)/t1rawafm/t1rawafm.1 $(srcdir)/t1reencode/t1reencode.1 $(srcdir)/t1testpage/t1testpage.1 $(srcdir)/ttftotype42/ttftotype42.1
+ perl -pi -e 's/^(\U$(PACKAGE)\E) [\d.ab]+$$/$$1 $(VERSION)/;' $(srcdir)/README.md
+ perl -pi -e 's/^Version: [\d.ab]+$$/Version: $(VERSION)/;' $(srcdir)/lcdf-typetools.spec
+
+dist-hook:
+ if test -f $(srcdir)/make-glyphtounicode.pl; then (cd $(srcdir); perl make-glyphtounicode.pl) > $(distdir)/glyphtounicode.tex; elif test -f $(srcdir)/glyphtounicode.tex; then cp $(srcdir)/glyphtounicode.tex $(distdir); fi
+
+$(srcdir)/glyphtounicode.tex: $(srcdir)/glyphlist.txt $(srcdir)/texglyphlist.txt $(srcdir)/texglyphlist-g2u.txt $(srcdir)/make-glyphtounicode.pl
+ cd $(srcdir); perl make-glyphtounicode.pl > glyphtounicode.tex
+
+.PHONY: rpm liblcdf libefont cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md
new file mode 100644
index 00000000000..68382c0e911
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/NEWS.md
@@ -0,0 +1,1239 @@
+LCDF Typetools NEWS
+===================
+
+## Version 2.108 – 27.Jan.2019
+
+* Handle more fonts.
+
+* `otftotfm -a`: Run `updmap-sys` by default.
+
+
+## Version 2.107 – 22.Feb.2018
+
+* Some corrections to output of `--math-spacing`.
+
+* Reduce undefined behavior.
+
+* Handle some incorrect fonts more gracefully.
+
+
+## Version 2.106 – 21.Jun.2016
+
+* Minor updates, mostly involving licensing of Adobe code and data.
+
+
+## Version 2.105 – 15.Sep.2015
+
+* Several crash fixes.
+
+* `otfinfo -g`: Print all Unicode mappings for a glyph.
+
+* t1lint: Support counter control hints.
+
+* Thanks to Github issue contributors.
+
+
+## Version 2.104 – 7.Jul.2014
+
+* Fix a nit with format-1 chaining context substitutions.
+
+
+## Version 2.103 – 6.Jul.2014
+
+* otftotfm: Address a problem experienced by Bob Tennent where a
+ ligature setting wasn't included in the output VPL.
+
+
+## Version 2.102 – 4.Jul.2014
+
+* otftotfm: Fix the construction of multi-character secondary
+ replacements; they were given enormous widths. Reported by Wydra
+ Dennis.
+
+
+## Version 2.101 – 16.Jun.2014
+
+* otftotfm: Handle fonts with unexpected transformation matrices,
+ such as CFF fonts with 2048 units per em.
+
+* otftotfm: Add `--x-height` option.
+
+* otftotfm: Handle more TrueType fonts by fixing otftotfm bugs and
+ compensating for some TTF bugs.
+
+* Thanks to Bob Tennent and Marc Penninga.
+
+
+## Version 2.100 – 8.Jan.2014
+
+* otftotfm: On some fonts, ligature handling could enter an infinite
+ loop. Fix this. Reported by Marc Penninga and Bob Tennent.
+
+* Fix updmap runs.
+
+* Build updates for C++11 and other compilers.
+
+
+## Version 2.99 – 13.Aug.2013
+
+* cfftot1: Correct bug that rarely corrupted Type 1 output fonts.
+ Reported by Sebastian Schubert.
+
+
+## Version 2.98 – 10.Apr.2013
+
+* Fix alignment bug that corrupted output fonts on some platforms
+ (MIPS especially). Reported by Norbert Preining.
+
+
+## Version 2.97 – 25.Oct.2012
+
+* Same.
+
+
+## Version 2.96 – 25.Oct.2012
+
+* Build improvements inspired by Peter Breitenlohner.
+
+
+## Version 2.95 – 21.Sep.2012
+
+* Fix cfftot1: Don't crash on problematic fonts. Bob Tennent report.
+
+
+## Version 2.94 – 3.Aug.2012
+
+* More compilation updates.
+
+
+## Version 2.93 – 23.Jul.2012
+
+* Correct compilation problem reported by Dennis Veatch.
+
+* Update OpenType feature, script, and language lists, and some other nits.
+
+
+## Version 2.92 – 14.Aug.2011
+
+* Correct horrible x86-64 byte-order issue. Bug reported by Michael Ummels.
+
+
+## Version 2.91 – 13.Jun.2011
+
+* Correct some compilation problems on unusual systems reported by Vladimir
+ Volovich.
+
+
+## Version 2.90 – 3.Jun.2011
+
+* Correct crash on glyph names that start with a dot. Marc van Dongen
+ report.
+
+
+## Version 2.89 – 2.Jun.2011
+
+* Better handle combinations of fonts and options that would create so many
+ substitutions that otftotfm would run out of memory. Marc van Dongen
+ report.
+
+* Thanks to Peter Breitenlohner.
+
+
+## Version 2.88 – 8.Mar.2011
+
+* Warning reduction.
+
+
+## Version 2.87 – 27.Jan.2011
+
+* Avoid double-free error in t1testpage. Reported by Kurt Pfeifle.
+
+
+## Version 2.86 – 16.Dec.2010
+
+* Support version 4 of the OpenType OS/2 table. Reported by Thomas
+ Zumbrunn.
+
+
+## Version 2.85 – 26.Sep.2010
+
+* Correct otftotfm bug with glyphlist.txt mappings like I_J.
+
+
+## Version 2.84 – 15.Sep.2010
+
+* otftotfm: Avoid crashes on very large fonts and other odd situations.
+ Bugs reported by Martin Schröder.
+
+* Include new Unicode mappings for glyph names from MSAM and MSBM.
+
+* Bug fixes to texglyphlist.txt Unicode mappings. Thanks to Clea F. Rees.
+
+
+## Version 2.83 – 23.Apr.2010
+
+* otftotfm: If `-fkern` loads no GPOS lookups, apply the TTF kern table (if
+ it exists). This should use the TTF kern table strictly more often than
+ the previous version. Based on draft changes to the OpenType spec.
+
+* Update with changes from TeX Live. Thanks to Peter Breitenlohner.
+
+
+## Version 2.82 – 19.Jan.2010
+
+* otftotfm: Correctly handle multiply-encoded glyphs (for example, if "j"
+ ends up encoded in more than one slot, apply the j => j.smcp feature to
+ both occurrences). Reported by Michael Ummels.
+
+
+## Version 2.81 – 7.Jan.2010
+
+* otftotfm: Fix "em" and "ex" measurements (QUAD and XHEIGHT font
+ dimensions) for TrueType fonts. Problem reported by Nico Schlömer.
+
+* otftotfm: Add `--type42` option.
+
+
+## Version 2.80 – 10.Nov.2009
+
+* otftotfm: Add `--fixed-width`, `--proportional-width`, and `--italic-angle`
+ options. Requested by Karl Berry.
+
+
+## Version 2.79 – 12.Jun.2009
+
+* otftotfm: Use TrueType "kern" tables to satisfy the `-fkern` feature if
+ GPOS information isn't available. Requested by Nico Schlömer.
+
+* ttftotype42: Split very large non-glyf tables, as well as very large glyf
+ tables. Requested by Mark DeVries.
+
+* otfinfo: The `-T` option dumps a table's contents to standard out.
+
+* Introduce and use a consistent hashcode_t type. Reported by Karl Berry.
+
+
+## Version 2.78 – 6.Apr.2009
+
+* t1lint: Report warnings when a font charstring command has too many
+ arguments. Requested by Han The Thanh.
+
+
+## Version 2.77 – 6.Apr.2009
+
+* Font library changes: correctly implement binary search in a couple
+ places -- unexpected sizes could lead to overflow and bad behavior.
+ Reported by Mark DeVries for ttftotype42 and CharisSILR.
+
+
+## Version 2.76 – 27.Mar.2009
+
+* mmpfb: Ensure all output subroutines end in the "return" command; some
+ type 1 processors treat a subroutine ending in "endchar" as an error.
+ Reported by Melissa O'Neill.
+
+* mmpfb, cfftot1: Ensure that stem3 hints (hstem3, vstem3) meet the
+ necessary constraints, even despite rounding.
+
+* t1lint: Add checks for some more problems, such as subroutines that do
+ not end in "return." Reported/requested by Melissa O'Neill and Han The
+ Thanh.
+
+
+## Version 2.75 – 22.Feb.2009
+
+* Report a helpful warning if automatic mode is specified to a version
+ without kpathsea support. Question from Keith Briggs.
+
+
+## Version 2.74 – 16.Feb.2009
+
+* Correctly detect <unistd.h>. Problem reported by C.M. Connelly.
+
+
+## Version 2.73 – 15.Feb.2009
+
+* cfftot1 bug fix: Avoid introducing stray "rmoveto" commands and attendant
+ visual artifacts into the output. The problem was caused by some
+ coordinate system confusion. Reported by John Owens, who had tried to
+ convert Inconsolata.
+
+
+## Version 2.72 – 27.Oct.2008
+
+* t1rawafm: Add missing newlines; thanks, Michael Zedler.
+
+* otftotfm: Understand "UniXXXX" glyph names. They're not standard, but
+ it's pretty obvious what they imply. Reported by Vasile Gaburici.
+
+
+## Version 2.71 – 8.Aug.2008
+
+* otftotfm: Correctly install TrueType files when `--force`. Reported by
+ Vasile Gaburici.
+
+
+## Version 2.70 – 8.Aug.2008
+
+* Add new t1rawafm program, which generates a "raw" (kernless and
+ ligatureless) AFM file given a font file (PFB/PFA).
+
+* otftotfm: When installing, `--automatic` ignores files existing in the
+ current directory. Confusion reported by Vasile Gaburici.
+
+* Type 1 parsing: Parse fonts with rare encoding formats, such as bases
+ other than 10.
+
+
+## Version 2.69 – 5.May.2008
+
+* Mini portability fix for problem reported by Vladimir Volovich.
+
+
+## Version 2.68 – 2.May.2008
+
+* otftotfm: Tweak the ligature sorting algorithm. Prefer lowercase
+ ligatures to mixed-case and uppercase ligatures; prefer the conventional
+ f-ligatures to all others. Reported by Ulrich Dirr.
+
+
+## Version 2.67 – 25.Apr.2008
+
+* otftotfm: Improve font name construction for base fonts. Reported by
+ Ulrich Dirr.
+
+
+## Version 2.66 – 3.Aug.2007
+
+* otftotfm: TrueType fonts had inappropriately large kerning pairs; fixed.
+ Reported by Marc Penninga.
+
+
+## Version 2.65 – 22.Jul.2007
+
+* t1testpage: Fix bug triggered by fonts with empty encoding slots.
+ Reported by Michael Zedler.
+
+
+## Version 2.64 – 25.Jun.2007
+
+* Handle Extension format GPOS and GSUB lookup tables, used for very large
+ fonts. Reported by Marc Penninga.
+
+* cfftot1, t1lint: Correct misunderstanding of the Flex spec: there MUST be
+ an rmoveto in between any two Flex subroutines, even if that rmoveto
+ doesn't move anywhere. (Question: Are hmoveto/vmoveto acceptable? Adobe
+ Reader seems to think so.) Reported by John Owens with respect to
+ Caslon-Antique.
+
+
+## Version 2.63 – 12.Jun.2007
+
+* Correctly handle fonts with 4-byte character code cmap tables. Reported
+ by Alexey Vikhlinin.
+
+
+## Version 2.62 – 11.Apr.2007
+
+* t1dotlessj: Do not use the same UniqueID as the input font. Inspired by
+ Reinhard Kotucha.
+
+* otftotfm: Generate a map line even if there was a missing character in
+ some UNICODING. Reported by Andreas Bühmann.
+
+
+## Version 2.61 – 25.Mar.2007
+
+* otftotfm: Automatically reduce DESIGNUNITS and try again if a font has
+ humungocharacters that overflow PL files' limited range of allowed real
+ numbers. Reported by John Owens.
+
+
+## Version 2.60 – 27.Feb.2007
+
+* otftotfm: Rearrange order of virtual fonts so most-frequently-used font
+ comes in position 0. Requested by Michael Zedler.
+
+* otftotfm: Apply letterspacing to "dotlessj". Maybe finally this is right.
+
+
+## Version 2.59 – 23.Feb.2007
+
+* otftotfm: %POSITION commands don't add glyphs to the encoding. Requested
+ by Achim Blumensath.
+
+
+## Version 2.58 – 22.Feb.2007
+
+* otftotfm: More of the same (with respect to "Germandbls"), again reported
+ by Michael Zedler.
+
+
+## Version 2.57 – 21.Feb.2007
+
+* otftotfm: More of the same: "emptyslot" glyphs don't generate spurious
+ base fonts. Again reported by Michael Zedler.
+
+
+## Version 2.56 – 13.Feb.2007
+
+* otftotfm: Guess what?
+
+
+## Version 2.55 – 13.Feb.2007
+
+* otftotfm: Finally fix (?) letterspacing for simulated characters.
+
+
+## Version 2.54 – 12.Feb.2007
+
+* otftotfm: Include letterspacing for simulated characters. Bug reported
+ by Michael Zedler.
+
+
+## Version 2.53 – 11.Feb.2007
+
+* otftotfm: Positionings and letterspacing apply even with
+ `--base-encodings`. Bug reported by Michael Zedler.
+
+
+## Version 2.52 – 6.Feb.2007
+
+* otftotfm: `--base-encodings` fixes for dotless-J fonts.
+
+
+## Version 2.51 – 6.Feb.2007
+
+* otftotfm: Some `--base-encodings` fixes.
+
+
+## Version 2.50 – 6.Feb.2007
+
+* otftotfm: Add `--base-encodings` option. Requested by Michael Zedler.
+
+
+## Version 2.49 – 11.Jan.2007
+
+* Report certain types of invalid 'size' features that occasionally occur
+ in old fonts. Thanks to John Owens and Read Roberts.
+
+
+## Version 2.48 – 11.Dec.2006
+
+* Translate font names into UTF-8 encoding. Reported by John Owens.
+
+
+## Version 2.47 – 10.Dec.2006
+
+* otfinfo: Add new names, such as "Preferred Family", to `otfinfo -i` output.
+ Requested by John Owens.
+
+
+## Version 2.46 – 29.Oct.2006
+
+* otftotfm: Base metrics files now reflect the actual base font metrics
+ more accurately (rather than containing virtual-font-only metrics
+ information, such as letterspacing). This should make it easier to tell,
+ using "diff", whether two base metrics files contain the same data.
+
+* otftotfm: `--no-type1` does not affect dotless-j font generation; use
+ `--no-dotlessj` for that (Michael Zedler).
+
+* otftotfm: Don't generate virtual fonts unless you have to (Michael
+ Zedler).
+
+
+## Version 2.45 – 17.Sep.2006
+
+* Include new ttftotype42 program.
+
+
+## Version 2.44 – 16.Sep.2006
+
+* otfinfo/otftotfm: Support new fonts whose 'size' features are defined
+ correctly. Thanks to Read Roberts for defining the compatibility check.
+
+
+## Version 2.43 – 22.Aug.2006
+
+* otftotfm: Check for availability of kpse_opentype_format. Bug reported
+ by Carsten Luckmann.
+
+
+## Version 2.42 – 22.Aug.2006
+
+* otftotfm: Any `--altselector-char` is actually encoded, so you can use it as
+ a regular character as well as an altselector. Suggested by Carsten
+ Luckmann.
+
+
+## Version 2.41 – 12.Aug.2006
+
+* otftotfm: Some TrueType fixes. Problems reported by Michael Zedler.
+
+
+## Version 2.40 – 1.Aug.2006
+
+* otftotfm: Initial support for TrueType-flavored OpenType fonts. Inspired
+ because John Owens is working with Microsoft's Calibri et al.
+
+
+## Version 2.39 – 11.Jul.2006
+
+* cfftot1: Unify some subroutines previously missed, for slightly smaller
+ output. Reported by Michael Zedler.
+
+
+## Version 2.38 – 8.May.2006
+
+* otfinfo: Add `--info` option. Requested by John Owens.
+
+
+## Version 2.37 – 25.Jan.2006
+
+* otftotfm: Add 'ringfitted'. Requested by Michael Zedler. Required bug
+ fix.
+
+
+## Version 2.36 – 9.Nov.2005
+
+* otfinfo: Add `-a/--family` option. Based on patch from Ottavio G. Rizzo.
+
+* otftotfm: Fix bug where `-q` would inhibit map line output, reported by
+ Achim Blumensath.
+
+
+## Version 2.35 – 3.Oct.2005
+
+* otftotfm: Allow `--ligkern "T h=:T_h"` (note lack of spaces around '=:').
+ Inspired by Michael Saunders.
+
+* otftotfm: Split TeX extensions out from 'glyphlist.txt' into
+ 'texglyphlist.txt', leaving 'glyphlist.txt' exactly as distributed by
+ Adobe. Otftotfm reads both files. Requested by Werner Lemberg.
+
+* otftotfm: Add `% WARNMISSING` and `--warn-missing`, so that missing
+ characters result in blots and cause warnings when processed by dvips.
+ Requested by Michael Zedler.
+
+* otfinfo: Add `-v/--font-version` option and document `-t/--tables` option.
+
+* t1reencode: Add many more standard encodings to t1reencode, and fix
+ existing ones. Patch from Peter Betzler.
+
+
+## Version 2.34 – 11.Jun.2005
+
+* otftotfm: Search for 'glyphlist.txt' using kpathsea, and set kpathsea
+ program name to 'lcdftools'. Requested by Karl Berry.
+
+
+## Version 2.33 – 3.Jun.2005
+
+* otftotfm: Include more secondary replacements, including double-bar,
+ centered asterisk, per-ten-thousand, and so forth. Patch from Michael
+ Zedler.
+
+* otftotfm: Add `% POSITION` and `--position`. Requested by Michael
+ Zedler.
+
+
+## Version 2.32 – 31.May.2005
+
+* otftotfm: Report correct dimensions for characters only in the base
+ encoding. Reported by Michael Zedler.
+
+
+## Version 2.31 – 30.May.2005
+
+* otftotfm: Fix crash tickled by constructed characters, reported by
+ Michael Zedler.
+
+* Compilation fixes suggested by Nelson H.F. Beebe.
+
+
+## Version 2.30 – 8.May.2005
+
+* otftotfm: Add support for 'dblbracketleft' and 'dblbracketright'.
+ Secondary replacement can add characters to the font.
+
+* otftotfm: Ligkern commands 'A {5} B' and 'A {L} B' can coexist, leading
+ to a 5-character kern and no ligature. Requested by Michael Zedler.
+
+
+## Version 2.29 – 7.May.2005
+
+* otftotfm: Fix crash reported by Ryuji Suzuki.
+
+* otftotfm: Add support for 'capitalcompwordmark' and
+ 'ascendercompwordmark', requested by Michael Zedler.
+
+* otftotfm: Use OpenType OS/2 table to determine x-height, if available.
+
+
+## Version 2.28 – 25.Apr.2005
+
+* otftotfm: `--math-spacing` doesn't set italic corrections to 0. Thanks
+ to Achim Blumensath.
+
+
+## Version 2.27 – 24.Apr.2005
+
+* otftotfm: Add support for setting kerns: `--ligkern "A {5} B"`. Thanks
+ to Achim Blumensath for a patch.
+
+* otftotfm: Add preliminary support for heuristically-derived math accent
+ positions via a 'skewchar' argument to `--math-spacing`. Thanks again to
+ Achim Blumensath.
+
+
+## Version 2.26 – 2.Apr.2005
+
+* otftotfm: Support more kinds of substitution.
+
+* otftotfm: Support old-style and new-style chaining context substitutions
+ using Adobe's procedure. Older fonts had erroneous substitutions because
+ of a software error; newer fonts don't.
+
+* otftotfm: Fix crash tickled by newer versions of MinionPro and other
+ fonts, reported by Michael Zedler and Oliver M. Haynold.
+
+
+## Version 2.25 – 10.Mar.2005
+
+* otftotfm: Ignore unencoded default ligkerns (don't try to encode their
+ characters). Reported by Michael Zedler.
+
+
+## Version 2.24 – 10.Mar.2005
+
+* otftotfm: Fix assertion failure introduced in 2.23.
+
+
+## Version 2.23 – 8.Mar.2005
+
+* otftotfm: Fix bug present since 2.20 where, for example, `--unicoding
+ "germandbls =: SSsmall"` was ignored in favor of a named 'germandbls'
+ character. Reported by Michael Zedler.
+
+
+## Version 2.22 – 2.Mar.2005
+
+* otftotfm: Include default ligatures unless `--no-default-ligkern` is
+ given. This seems cleaner than the previous semantics (which included
+ the default ligatures unless there were ligatures in the encoding and/or
+ the command line), but it is incompatible. Inspired by question from
+ Christopher Swingely.
+
+
+## Version 2.21 – 16.Feb.2005
+
+* otftotfm: Base fonts include no kerns or ligatures. Requested by Michael
+ Zedler.
+
+* cfftot1: Correctly handle default values for CFF fonts, so that, for
+ example, isFixedPitch is defined to false even when the font doesn't
+ mention it. Requested by Huver.
+
+
+## Version 2.20 – 9.Feb.2005
+
+* otftotfm: Add `--space-factor` and `--math-spacing` options, based on
+ patches from Achim Blumensath.
+
+* otftotfm: Improve handling of explicit `--ligkern` ligatures: they override
+ default ligatures, and any characters mentioned are shoehorned into the
+ encoding. Catalyzed by Michael Zedler.
+
+
+## Version 2.19 – 4.Feb.2005
+
+* otftotfm: Add `--subs-filter`, `--include-subs`, `--exclude-subs`, and
+ `--clear-subs` options (inspired by patch from Achim Blumensath).
+
+* otftotfm: Update documentation and behavior for newer teTeX
+ installations. For instance, run the system `updmap` by default (unless
+ you give the `--no-updmap` option). This makes automatic mode much
+ easier to set up.
+
+* otftotfm: Output pltotf and vptovf messages to standard error (Achim
+ Blumensath).
+
+* otftotfm: Protect arguments given to the shell (Achim Blumensath).
+
+* otfinfo: Add `-g` option to query all glyphs in a font.
+
+
+## Version 2.18 – 26.Jan.2005
+
+* otftotfm: Fix bug that could cause infinite loops on FreeBSD machines.
+
+
+## Version 2.17 – 4.Jan.2005
+
+* Add t1reencode program. Requested by Ralph Aichinger.
+
+* otftotfm: Add `--output-encoding` option.
+
+* t1lint: Check that UniqueID and XUID values are in range.
+
+
+## Version 2.16 – 19.Nov.2004
+
+* `--include-alternates` and `--exclude-alternates` options only apply to
+ features that appear later in the options list.
+
+* Fix bug where not all `--altselector-feature` features would be used.
+ Problem reported by Emil Lohse.
+
+* Add `--clear-alternates` option.
+
+
+## Version 2.15 – 21.Sep.2004
+
+* AIX compile fixes. Reported by Vladimir Volovich.
+
+* Include RPM .spec file, provided by C.M. Connelly.
+
+
+## Version 2.14 – 16.Sep.2004
+
+* Use AM_MAINTAINER_MODE. Suggested by Karl Berry.
+
+* IRIX compile fixes. Reported by Olaf Weber.
+
+
+## Version 2.13 – 12.Sep.2004
+
+* otftotfm: Check $TEXMF if $VARTEXMF has no writable directory. Reported
+ by Simon Patarin.
+
+* Add `--enable-selfauto-loc` configuration option, enabled by default, to
+ help otftotfm run with TeX configuration files that use SELFAUTODIR and
+ related variables. Suggested by Thomas Esser; mechanism from dvipng.
+
+
+## Version 2.12 – 19.Aug.2004
+
+* Catch bug that would affect otftotfm on 64-bit machines.
+
+
+## Version 2.11 – 18.Aug.2004
+
+* otftotfm: Adjust TDS 1.1 support thanks to Olaf Weber.
+
+
+## Version 2.10 – 18.Aug.2004
+
+* otftotfm: Add preliminary support for the TeX Directory Structure 1.1
+ standard.
+
+* Bug fix that should let us compile on Cygwin. Problem reported by
+ Christian Gudrian.
+
+
+## Version 2.9 – 10.Aug.2004
+
+* otftotfm: Add `--letter-feature` option, inspired by Michael Zedler.
+
+
+## Version 2.8 – 5.Aug.2004
+
+* otftotfm: Fix bug where missing GPOS or GSUB tables would cause an abort.
+ Reported by Ryuji Suzuki.
+
+
+## Version 2.7 – 3.Aug.2004
+
+* otftotfm: Bug fix for obscure cases involving 'dotlessj' characters: the
+ output VPL could contain a reference to "(SETCHAR X)", which is illegal.
+ Reported by Marco Kuhlmann.
+
+
+## Version 2.6 – 12.Jul.2004
+
+* t1testpage adds preliminary support for font smoke proofs with `--smoke`.
+ Requested by Karl Berry.
+
+* t1testpage adds `--glyph` option.
+
+
+## Version 2.5 – 6.Jul.2004
+
+* Support compilation with gcc-3.4.1. Reported by Thomas Esser.
+
+
+## Version 2.4 – 30.Jun.2004
+
+* cfftot1: Fix off-by-one bug where the encoding of the last encoded
+ character was ignored, reported by Detlev Droege.
+
+* otftotfm: Some internal changes; bugs are possible.
+
+
+## Version 2.3 – 15.Jun.2004
+
+* otftotfm: Add `--default-ligkern` and `--no-encoding-commands` options,
+ to address problem with "t1.enc" reported by Ulrich Dirr.
+
+* otftotfm documentation updates.
+
+
+## Version 2.2 – 8.May.2004
+
+* otftotfm: 't1dotlessj' errors don't prevent 'psfonts.map' from being
+ updated. Reported by Stephen Moye.
+
+* t1dotlessj: Report different kinds of errors with different exit statuses.
+
+
+## Version 2.1 – 5.Apr.2004
+
+* otftotfm: Warn if no encoding specified. Requested by Zsolt Kiraly.
+
+* otftotfm: Improve documentation, particularly by adding example run with
+ ".fd" file.
+
+
+## Version 2.0 – 21.Mar.2004
+
+* mmpfb, t1dotlessj, t1lint, t1testpage: On Windows, add _O_BINARY flag
+ when appropriate. Reported by Fabrice Popineau.
+
+
+## Version 1.99 – 24.Feb.2004
+
+* otftotfm: Fix overfull encoding bug that could cause an assertion
+ failure, reported by Adam Lindsay.
+
+* otftotfm: Speed improvement.
+
+
+## Version 1.98 – 22.Feb.2004
+
+* otftotfm: Add support for 'SSsmall' glyph. Einar Smith noted that the
+ OpenType 'smcp' feature doesn't translate the sharp-S character to
+ small-caps "SS" in most fonts. Now, add `--unicoding "germandbls =:
+ SSsmall"` to get that behavior.
+
+* otftotfm: Compilation fix for problem reported by Nelson H.F. Beebe.
+
+
+## Version 1.97 – 6.Feb.2004
+
+* cfftot1: Fix bug in handling fonts with supplemental encodings. Problem
+ reported by Eike <eiked>.
+
+
+## Version 1.96 – 11.Jan.2004
+
+* otftotfm: Handle alternate characters like 'Q.alt' in the input encoding:
+ map them to the actual alternate glyph, rather than to the base Unicode
+ value ('Q'). Reported by Ulrich Dirr.
+
+
+## Version 1.95 – 3.Jan.2004
+
+* otftotfm: Add automatic support for t1dotlessj. If the desired encoding
+ has a 'dotlessj' character, and the input font doesn't, then otftotfm
+ will run 't1dotlessj', create a dotless-J font, and include it using
+ virtual fonts.
+
+* otftotfm: Avoid warnings about bad "(STOP)" commands in pltotf
+ (introduced by the `--min-kern` facility).
+
+
+## Version 1.91 – 31.Dec.2003
+
+* mmpfb, t1dotlessj: Fix sidebearing problems.
+
+
+## Version 1.90 – 29.Dec.2003
+
+* mmpfb: Fix behavior with Adobe Jenson and other fonts with intermediate
+ masters, and `--minimize` output, which had been broken since 1.65.
+
+* Add t1dotlessj program.
+
+
+## Version 1.88 – 23.Dec.2003
+
+* otfinfo: Change coding to be friendlier to older C++ compilers. Requested
+ by Ulrich Dirr.
+
+
+## Version 1.87 – 22.Dec.2003
+
+* otftotfm: Fix `--extend` bug reported by Ulrich Dirr (the expansion factor
+ was formerly applied to character heights and depths, not widths).
+
+
+## Version 1.86 – 19.Dec.2003
+
+* otftotfm: Change where `--base` is added to support pdftex: If the font
+ name is "WarnoPro+10", the base font name is "WarnoPro--base+10".
+ Reported by Ulrich Dirr.
+
+
+## Version 1.85 – 10.Dec.2003
+
+* otftotfm: Add `--altselector-feature` option, so you can specify the
+ features activated by `--altselector-char`. Defaults to salt and dlig.
+
+* otftotfm: Fix intermittent hang.
+
+
+## Version 1.80 – 4.Dec.2003
+
+* otftotfm: Add `--altselector-char` option, and `--include-alternates` and
+ `--exclude-alternates` options. These options support access to alternate
+ characters through ligatures, using a mechanism originally planned by Sivan
+ Toledo ("Exploiting Rich Fonts", TUGboat 21(2), 2000). Requested by Martin
+ Budaj.
+
+* Add default encoding for 'SS' character (same as 'Germandbls'). Reported
+ by Ulrich Dirr.
+
+
+## Version 1.75 – 3.Dec.2003
+
+* cfftot1: Handle the case when 'hintmask' is the first operator in a Type 2
+ charstring. Reported by Tom Kacvinsky.
+
+
+## Version 1.70 – 1.Dec.2003
+
+* otftotfm: Add `--min-kern` option requested by Ulrich Dirr.
+
+* mmafm: Add `--min-kern` as a preferred synonym for `--kern-precision`.
+
+
+## Version 1.67 – 29.Nov.2003
+
+* otftotfm: Don't run off the end of an array. Bug reported and patch
+ provided by Akira Kakuto.
+
+
+## Version 1.66 – 24.Nov.2003
+
+* cfftot1: Don't generate "currentfile eexec" twice. Bug reported by Adam
+ Lindsay.
+
+
+## Version 1.65 – 24.Nov.2003
+
+* otftotfm: Include default ligatures if user does not specify ligatures.
+ Requested by Adam Lindsay.
+
+* otftotfm: Generated VPL includes FONTDSIZE when referring to base. Bug
+ reported by Adam Lindsay.
+
+* Preliminary support for CID-keyed OpenType fonts.
+
+
+## Version 1.60 – 7.Oct.2003
+
+* cfftot1: Support fonts using the 'seac' operator. Requested by Ralf
+ Koenig.
+
+
+## Version 1.52 – 4.Sep.2003
+
+* otftotfm: Add `--design-size` option requested by Johannes Kuester.
+
+* t1testpage: Fix `--help` and add manual page at C.M. Connelly's request.
+
+
+## Version 1.51 – 2.Sep.2003
+
+* otftotfm: Generated TFM and PL files have DESIGNSIZE set to the font's
+ actual design size, as read from the 'size' feature. Requested by
+ Johannes Kuester.
+
+
+## Version 1.50 – 26.Aug.2003
+
+* Minor compilation fix; problem reported by Nelson H.F. Beebe.
+
+
+## Version 1.50b4 – 26.Aug.2003
+
+* otfinfo: Minor compilation fix from Tom Kacvinsky.
+
+
+## Version 1.50b3 – 25.Aug.2003
+
+* cfftot1: Emit UniqueID as an integer. Reported by Tom Kacvinsky.
+
+* otftotfm: `--without-kpathsea` fix. Patch provided by Adam Lindsay.
+
+* More compilation fixes provided by Tom Kacvinsky.
+
+
+## Version 1.50b2 – 24.Aug.2003
+
+* otfinfo: New program, requested by Adam Lindsay.
+
+* otftotfm: The `--query-scripts` and `--query-features` options are no
+ longer supported. Use `otfinfo -s` and `otfinfo -f` instead.
+
+* otftotfm: Fix crash reported by Adam Lindsay.
+
+* otftotfm: In automatic mode, after modifying a 'psfonts.map' file, run
+ the script 'TEXMF/dvips/updmap' if present.
+
+* Compilation fixes for Solaris provided by Tom Kacvinsky and Nelson
+ H.F. Beebe.
+
+
+## Version 1.50b1 – 20.Aug.2003
+
+* Integrate mminstance (the mmafm and mmpfb programs), and bump the version
+ number to reflect this.
+
+
+## Version 0.53 – 10.Aug.2003
+
+* Fix problem with Type 1 output in `--without-kpathsea` reported by Adam
+ Lindsay.
+
+* Fix crash on encodings containing 'emptyslot' reported by Marco Kuhlmann.
+
+
+## Version 0.52 – 7.Aug.2003
+
+* Attempt to fix some build problems reported by Nelson H.F. Beebe.
+
+
+## Version 0.51 – 5.Aug.2003
+
+* otftotfm: Fix crashes with small encodings and absent boundary
+ characters. Reported by Bruce D'Arcus.
+
+* otftotfm: Add `--boundary-char` and `--kpathsea-debug` options.
+
+
+## Version 0.50 – 4.Aug.2003
+
+* otftotfm: Handle more complex substitutions, such as those required to
+ support `-fordn` and `-ffrac`.
+
+* otftotfm: The output virtual and base fonts can have different
+ "encodings" with overlapping encoding slots. This can make fonts more
+ compact.
+
+* When assigning slots to introduced characters, otftotfm prefers
+ characters introduced by earlier lookups. This follows the spirit of the
+ OpenType specification, since early lookups in some ways "override" later
+ ones. The previous scoring mechanism remains in force within each
+ individual lookup.
+
+* otftotfm: Rewrite GsubEncoding to Metrics, changing its fundamental
+ abstraction (to two-ligatures). Simpler and cleaner overall.
+
+* otftotfm TODO: Ligatures that apply to middle or right context (for
+ example, the two substitutions "a b c d => a b c y" and "b c => x" should
+ combine to "a b c d => a x y", but they won't yet).
+
+
+## Version 0.19 – 30.Jul.2003
+
+* otftotfm: Add support for 'emptyslot' UNICODINGs. Requested by Marco
+ Kuhlmann.
+
+
+## Version 0.18 – 9.Jul.2003
+
+* Otftotfm will now synthesize characters for some T1 glyphs automatically,
+ specifically 'cwm' (compound word mark), 'visualspace', and 'Germandbls'.
+ Requested by Marco Kuhlmann.
+
+* The glyphlist.txt file contains Unicode mappings for character names
+ found in the BlueSky Computer Modern math italic and symbol fonts.
+
+* It also contains fake Unicode mappings for the 'cwm', 'visualspace', and
+ 'Germandbls' characters found in EC.enc.
+
+* otftotfm: Don't output a KRN between two characters if there exists a LIG
+ for those two characters.
+
+
+## Version 0.17 – 6.Jul.2003
+
+* otftotfm: Ligatures removed with LIGKERN commands won't show up in the
+ encoding.
+
+* Improve scoring heuristics by which otftotfm decides which characters are
+ more important (for when there isn't enough encoding space for all new
+ glyphs).
+
+
+## Version 0.16 – 6.Jul.2003
+
+* otftotfm: In automatic mode, store dvips files (encodings and
+ psfonts.map) in 'TEXMF/dvips/VENDOR', rather than 'TEXMF/dvips'. Users of
+ previous versions will probably want to move their 'TEXMF/dvips/a_*.enc'
+ and 'TEXMF/dvips/lcdftools.map' files to a 'TEXMF/dvips/lcdftools/'
+ directory, and run 'mktexlsr TEXMF'.
+
+* otftotfm: When there isn't enough encoding space for all new glyphs,
+ prefer shorter ligatures made out of regular letters -- for instance,
+ prefer f_j to f_f_j, and T_h to f_iacute. Requested by Bruce D'Arcus.
+
+* otftotfm: Add `--ligkern` and `--unicoding` options.
+
+* otftotfm: Add `--coding-scheme` option and `% CODINGSCHEME` encoding
+ comment, to define the PL/TFM coding scheme for the font. Apparently
+ fontinst actually looks at the coding scheme. Also, when you specify a
+ coding scheme, set DESIGNUNITS to 1, again to satisfy fontinst. Requested
+ by Marco Kuhlmann.
+
+* otftotfm: Remove virtual font 'N.vf' when installing a regular font
+ 'N.tfm' in automatic mode. This reduces the risk that an old virtual font
+ will screw up your installation.
+
+
+## Version 0.15 – 4.Jul.2003
+
+* otftotfm: Bug fix: Don't multiply apply substitutions and kerns from the
+ same lookup.
+
+* otftotfm: Supports simple left-contextual substitutions, necessary for
+ ExPontoPro's 'calt' (Contextual Alternates) feature.
+
+
+## Version 0.14 – 2.Jul.2003
+
+* otftotfm: Add `-L/--letterspacing` option at Bruce D'Arcus's request.
+
+* otftotfm: Hypothetically supports the contextual substitutions necessary
+ for the 'init' (Initial Forms) feature.
+
+* otftotfm: When you make a virtual font named "foo", remove any entries
+ for "foo" from VENDOR.map.
+
+
+## Version 0.13 – 27.Jun.2003
+
+* `--without-kpathsea` works. Problem reported by Adam Lindsay.
+
+
+## Version 0.12 – 27.Jun.2003
+
+* otftotfm: Better error messages when directories cannot be found.
+ Reported by Bruce D'Arcus.
+
+
+## Version 0.11 – 26.Jun.2003
+
+* otftotfm: Handles the contextual substitutions necessary for 'cswh'
+ (Contextual Swash) and 'fina' (Terminal Forms) features.
+
+
+## Version 0.10 – 26.Jun.2003
+
+* otftotfm: Update ls-R files for new encodings.
+
+
+## Version 0.9 – 25.Jun.2003
+
+* otftotfm: psfonts.map lines contain the file name only (no directories).
+ Requested by Norbert Preining.
+
+* otftotfm: Properly report errors when encoding files can't be found.
+
+* Fix kpathsea searching and dependency problems reported by Bruce D'Arcus
+ and Claire Connelly, among others.
+
+* Fix templates to allow compilation with GCC 2.95.
+
+
+## Version 0.8 – 23.Jun.2003
+
+* otftopl has been renamed to otftotfm. The new program takes different
+ options. Automatic mode is particularly different, and TFM output is now
+ the default.
+
+* otftotfm: Automatic mode now sticks files into a TeX Directory Structure
+ hierarchy. This works well with many TeX installations. It also
+ automatically translates OpenType fonts into Type 1 PostScript with
+ cfftot1 (unless you configure with `--disable-cfftot1`), and modifies a
+ psfonts.map file for each font. See the manual page for more information.
+
+* otftotfm: Generates virtual fonts when required to support glyph
+ positioning features. (`-f cpsp` is one example.)
+
+* otftotfm: Warns when a feature could not be completely implemented.
+
+* otftotfm: Add `--verbose` and `--no-create` options, among others
+ (`--no-virtual`, `--map-file`, `--vendor`, `--typeface`, `--no-type1`...).
+
+* otftotfm: Encoding files are now named "a_SIGNATURE.enc", not
+ "auto_SIGNATURE.enc".
+
+* The configure script now searches for the kpathsea library, since
+ otftotfm's automatic mode depends on kpathsea. Provide
+ `--without-kpathsea` to disable it.
+
+
+## Version 0.7 – 13.Jun.2003
+
+* cfftot1: Fix bug to handle MinionPro-Italic without crashing.
+
+
+## Version 0.6 – 12.Jun.2003
+
+* cfftot1: Fix definitions of Subrs entries 1 and 2; now fonts with flex
+ hints will work.
+
+* cfftot1: Reduce noise generated by fonts with flex hints.
+
+* cfftot1: Generates valid character strings for characters whose first
+ point is at the origin. (Previously, such charstrings wouldn't begin with
+ a "moveto".)
+
+* otftopl: Support simple context substitutions and chained context
+ substitutions. Required to support ACaslonPro-Italic's "swsh" feature.
+ Reported by Adam Lindsay <atl@comp.lancs.ac.uk>.
+
+* otftopl: Prefer `--query-features` and `--query-scripts` to
+ `--print-features` and `--print-scripts`.
+
+* otftopl: Better warnings and error messages for bad LIGKERN/UNICODING
+ commands in encoding files, and when there isn't enough room in an
+ encoding for ligature glyphs.
+
+* t1lint: Reads stdin if no filenames supplied on the command line.
+
+
+## Version 0.5 – 5.Jun.2003
+
+* Template reorganization so the typetools compile with GCC 3.3.
+
+
+## Version 0.4 – 3.Jun.2003
+
+* otftopl: Added `--slant` and `--extend` options.
+
+* otftopl's generated encodings have slightly different form, and are thus
+ friendlier to ps2pk's bad parser.
+
+
+## Version 0.3 – 3.Jun.2003
+
+* Fixed bug: cfftot1 produced invalid results for fonts with encodings
+ other than StandardEncoding, due to a misbehavior in the way Type 1 fonts
+ were stored. Reported by Vladimir Volovich <vvv@vsu.ru>.
+
+
+## Version 0.2 – 3.Jun.2003
+
+* Fix CFF parsing bugs and configure errors reported by Vladimir Volovich
+ <vvv@vsu.ru>.
+
+
+## Version 0.1 – 2.Jun.2003
+
+* Initial release.
+
+* See also the ONEWS file for older news about mmafm and mmpfb.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ONEWS b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ONEWS
new file mode 100644
index 00000000000..6bd9dc8c42d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ONEWS
@@ -0,0 +1,433 @@
+Mminstance NEWS
+
+This file contains news relevant to the mmafm and mmpfb programs, which
+used to be distributed separately in the mminstance package.
+
+Version 1.50 20.Aug.2003
+
+* As of version 1.50, mminstance is distributed as part of the
+ lcdf-typetools package. Changes for versions 1.50 and up are listed in
+ NEWS.
+
+
+Version 1.26.3 14.Aug.2003
+
+* Library changes to attempt to satisfy more C++ compilers. Again massive
+ thanks to Nelson H.F. Beebe, and new massive thanks to Fabrice Popineau.
+
+
+Version 1.26.2 13.Aug.2003
+
+* Revert from '#include <cXXX>' to '#include <XXX.h>'.
+
+
+Version 1.26.1 11.Aug.2003
+
+* 'uintptr_t' configury, and more template changes.
+
+
+Version 1.26 10.Aug.2003
+
+* Further address build problems reported by Nelson Beebe.
+
+
+Version 1.25 7.Aug.2003
+
+* Address build problems reported by Nelson H.F. Beebe.
+
+
+Version 1.24 30.Jul.2003
+
+* Fix configure check for whether va_list is addressable. Ryan Murray found
+ the bug; thanks hugely to Claire Connelly for testing resources.
+
+* Minor code restructuring.
+
+* mmpfb: --minimize is the default.
+
+* mmpfb: --minimize additionally forces some interpolated values to
+ integers, specifically BlueValues, OtherBlues, FamilyBlues,
+ FamilyOtherBlues, and BlueShift. Maybe this will avoid some problems
+ people have had with embedding mmpfb-generated fonts and Acrobat 6.
+
+* Change rounding procedures. Now fonts generated on different platforms
+ will likely not differ in rounding details. (What a difference 0.00001
+ makes!)
+
+
+Version 1.23 9.Jul.2003
+
+* Add configure check for whether va_list is addressable. Thanks to Claire
+ Connelly.
+
+
+Version 1.22 5.Jun.2003
+
+* More template nonsense. Mea culpa to Melissa O'Neill and Claire Connelly.
+
+
+Version 1.21 4.Jun.2003
+
+* GCC 3.3 would not link mminstance due to missing template instantiations.
+ Moved templatei.cc into libefont.a to fix this. Reported by Melissa
+ O'Neill <oneill@cs.hmc.edu>.
+
+
+Version 1.20 26.Jan.2003
+
+* mmafm: Fix bug with parsing intermediate-master files that made AJensonMM
+ unusable. Reported by Fulko van Westrenen <westrenen@fvw.cistron.nl>.
+
+
+Version 1.19 5.Jan.2003
+
+* mmpfb: Previously, error introduced by the rounding process could build
+ up over the length of a path, causing an anomaly when the path was
+ closed. Now mmpfb compensates for rounding error, resulting in a path
+ with better fidelity.
+
+* mmpfb: Add the `--minimize' option to minimize output fonts, allowing the
+ X font server to load mmpfb-generated fonts. Problem with the X font
+ server reported by Joerg Lippman <joerg.lippmann@o3-software.de>.
+
+* mmpfb: Add placeholder subroutines to fill in any gaps in the subroutine
+ array, which the X font server doesn't like (that IBM Type 1 code is
+ bad!). Probably this should be optional, since it makes the font bigger.
+
+* mmpfb: Renumber subroutines consecutively.
+
+* mmpfb: Generate a new FullName as well as a new FontName.
+
+* Adapt to newer Automake and LCDF and Efont libraries.
+
+
+Version 1.18 5.Oct.2002
+
+* Fix for compilation with newer C++ compilers.
+
+
+Version 1.17 30.Sep.2002
+
+* Fix for NuevaMM-It: the ItalicAngle array was not being properly
+ commented out. Reported by Thomas Wu <twu@gene.com>.
+
+
+Version 1.16.3 17.Sep.2001
+
+* Workaround for Mac OS X: its sscanf() function behaves incorrectly when a
+ format string ends with ` %n'. Reported and patched by Melissa O'Neill
+ <oneill@cs.sfu.ca>.
+
+
+Version 1.16.2 6.Sep.2001
+
+* Improvements so mminstance compiles on more platforms. Problems reported
+ by Nelson H. F. Beebe <beebe@math.utah.edu>.
+
+
+Version 1.16.1 15.Jul.2001
+
+* Bug fix: more cleanups for newer GCCs. Reported by C. M. Connelly
+ <c@eskimo.com>.
+
+
+Version 1.16 18.Jun.2001
+
+* Bug fix: now newer C++ compilers will compile mminstance. Reported by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.15.1 12.Aug.2000
+
+* Don't use `-Wall' by default; old C++ compilers generate huge numbers of
+ irrelevant warnings. Reported by Tom Kacvinsky <tjk@ams.org>.
+
+
+Version 1.15 12.Jul.2000
+
+* mmpfb: Remove calls to nonexistent subroutines. (This was not actually a
+ bug; the calls to nonexistent subroutines would never execute anyway. The
+ font ITCGaramondMM-It had characters like `/question { A callsubr B
+ callsubr }', where the `A' subroutine would either draw an entire
+ character and call `endchar' -- so `B' would never get called -- or it
+ would do nothing at all. Previous mmpfb versions would remove the `B'
+ subroutine but keep the `B callsubr' call if the interpolated `A' called
+ `endchar'.) Requested by Han The Thanh <thanh@informatics.muni.cz>.
+
+* mmpfb: Removed warning about `strange othersubr commands'.
+
+
+Version 1.14 22.Jun.2000
+
+* mmpfb: Fixed a bug with large UniqueID values. Reported by Sivan Toledo
+ <sivan@math.tau.ac.il>.
+
+* mmpfb: Support for interpolating BlueFuzz without any warnings.
+
+
+Version 1.13 16.Apr.2000
+
+* mmpfb: Can handle synthetic fonts like TektonMM-Oblique. Requested by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.12 5.Apr.2000
+
+* mmpfb: Make sure to remove multiple master commands from hint replacement
+ subroutines. Required another overhaul. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+
+Version 1.11 3.Apr.2000
+
+* mmafm: Added `--kern-precision' option. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+* Bug fix: now mminstance can be compiled with recent versions of gcc. The
+ error was a strange use of va_arg(). Reported by C. M. Connelly
+ <c@eskimo.com>.
+
+
+Version 1.10 21.Feb.2000
+
+* mmpfb: Comment out DesignVector, NormDesignVector, and WeightVector
+ entries. Now Ghostscript 6.0's ps2pdf script will work with
+ mmpfb-generated fonts. Change requested by Melissa O'Neill
+ <oneill@cs.sfu.ca>.
+
+
+Version 1.9 18.Jan.2000
+
+* mmpfb: Bug fix in special callothersubrs code introduced in Version 1.8.
+ This bug probably did not affect anyone.
+
+
+Version 1.8 10.Jan.2000
+
+* mmpfb: Don't warn when encountering `BuildCharArray'. This shows up in
+ some ITC multiple masters. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+* mmpfb: Handle special callothersubrs from ITC Garamond MM. This required
+ big changes, but the code is cleaner now, and more likely to be right in
+ future: best of both worlds. Requested by Han The Thanh
+ <thanh@informatics.muni.cz>.
+
+
+Version 1.7 30.Dec.1999
+
+* mmpfb: Fixed bug where garbled encoding vectors could be produced.
+ Patch sent in by Christopher League <league@contrapunctus.net>.
+
+* Bug fix: Some error messages used to cause assertion failures.
+
+
+Version 1.6 28.Nov.1999
+
+* mmafm: Added `--precision' option for optionally rounding AFM dimensions.
+ Requested by Christopher League <league@contrapunctus.net>.
+
+* Many bug fixes for compiling under NeXTSTEP or g++ 2.95. Patches sent in
+ by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* Bug fix: numbers with both decimal point and exponent, like `1.2e5', are
+ parsed correctly.
+
+
+Version 1.5 4.Jul.1999
+
+* mmpfb: Added `--subrs' option for reducing the number of subroutines in
+ the output font. Use this option if you plan to use Acrobat Distiller 3.0
+ to distill PostScript files including mmpfb-generated fonts. Distiller
+ 3.0 has a low limit on the number of subroutines per font. Several
+ changes to the Type 1 library support this. Problem reported by Thierry
+ Bouche <Thierry.Bouche@ujf-grenoble.fr>; tracking help by Tom Kacvinsky
+ <tjk@ams.org>.
+
+* Both programs accept multiple master instance names, like
+ `MinionMM_367_400_18_', and will interpolate that instance from the
+ multiple master font.
+
+* Removed `FONTPATH' and `AFMPATH'. `PSRESOURCEPATH' has been preferred for
+ a couple months.
+
+* Updated ErrorHandler.
+
+
+Version 1.4.1 26.Jun.1999
+
+* mmpfb: Also comment out the /UniqueID in the Private dictionary, if any.
+ Reported by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>.
+
+
+Version 1.4 25.Jun.1999
+
+* mmpfb: Always comment out any /UniqueID in the font. This bug prevented
+ some printers from printing files with mmpfb-interpolated fonts. Reported
+ by Thierry Bouche <Thierry.Bouche@ujf-grenoble.fr>.
+
+* mmpfb: Comment out `Blend...' entries in the FontInfo dictionary. Now
+ Adobe Acrobat Distiller can handle mmpfb-interpolated fonts; it correctly
+ treats them like single-master fonts. Problem reported by Thierry Bouche
+ <Thierry.Bouche@ujf-grenoble.fr>.
+
+* mmpfb: Comment out multiple-master-specific dictionary entries, rather
+ than removing them entirely.
+
+* mmpfb: Interpolates Blend FontInfo dictionary entries, like
+ `UnderlinePosition' (maybe; can't find any fonts that use them, so it's
+ untested).
+
+
+Version 1.3.1 21.May.1999
+
+* Changed libraries to conform to STL interfaces.
+
+* Change to psres.cc to fix compilation bug under old C++ compilers.
+
+
+Version 1.3 11.Apr.1999
+
+* Mmafm will now automatically run `mmpfb --amcp-info' when necessary, so
+ you don't have to create the AMCP files yourself. Caveat: This will only
+ work if you use the PSRESOURCEPATH environment variable and have
+ PSres.upr files set up correctly.
+
+* mmafm: Added the PSRESOURCEPATH environment variable, in favor of
+ AFMPATH and FONTPATH.
+
+* mmafm: Checks for completely unknown design vectors.
+
+* mmpfb: Now uses the PSRESOURCEPATH environment variable to look for fonts
+ by name.
+
+* mmpfb: Modifies the output font's XUID to prevent font cache pollution.
+
+* Improved documentation.
+
+* Unfortunately, this version still doesn't work under NeXTSTEP.
+
+
+Version 1.3b2 22.Jan.1999
+
+* Don't use `index' as a method name; it's a macro under NeXTSTEP. Reported
+ by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* Patch around problems with NeXTSTEP's strtod and strtol. Also reported by
+ Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 1.3b1 12.Jan.1999
+
+* Han The Thanh <thanh@informatics.muni.cz> reports that Acrobat Reader
+ gives a "bad /BBox" warning on mmpfb-interpolated fonts. This seems to be
+ because mmpfb would produce fractional FontBBox entries. Fix: round the
+ FontBBox entries so it contains integers.
+
+* Small bug fix: negative non-integers were formerly read incorrectly,
+ introducing an error of not more than 2 integer units.
+
+
+Version 1.2 18.Dec.1998
+
+* Better error messages and fewer coredumps on bad files.
+
+* The mminstance package now uses automake.
+
+
+Version 1.1 27.Sep.1998
+
+* mmpfb: Changes to remove all multiple master commands in the output font,
+ not just most of them.
+
+* mmpfb: Added error message on bad input file.
+
+* Removed hackery which prevented linking with -lstdc++.
+
+* `--help' now prints on stdout, as the GNU standards require.
+
+* Makefiles: added `make uninstall' target, enabled `./configure's program
+ name transformations, made VPATH builds possible.
+
+
+Version 1.0 17.Sep.1998
+
+* No changes; just decided it was stable.
+
+
+Version 0.92 2.Sep.1998
+
+* Code reorganization in metrics. (Removed LineScanner, which wasn't a general
+ design; split into a more general Slurper and a specific AfmParser.)
+
+
+Version 0.91 15.May.1998
+
+* mmafm: Nonexistent files caused a coredump instead of an error (fixed).
+
+* mmafm: Added support for finding AMFMs via path variables and PSres.upr
+ files (you don't have to give an AMFM filename on the command line, you can
+ give a font name).
+
+
+Version 0.9 4.Mar.1998
+
+* Fixed a bug in parsing fonts with intermediate masters.
+
+* mmafm: Added support for finding AFMs via path variables and PSres.upr
+ files, and for giving their filenames on the command line.
+
+* Wrote manual pages.
+
+
+Version 0.8
+
+* Major release: Mmafm uses a new AFM/AMFM parsing library.
+
+* Restructured the two packages (mmafm and mmpfb) into one package
+ (mminstance) containing both programs.
+
+* Improved error messages, command line behavior, usage, and help.
+
+
+Version 0.62
+
+* Fixed small bug in t1interp.cc which caused serious problems. (Function
+ Type1Interp::number() fell off the end instead of returning true.) Bug
+ reported by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+
+Version 0.6
+
+* Major release: Both programs use a new, modular Type 1 parsing library,
+ they take real numbers as arguments, and the configure scripts no longer
+ try to link with -lstdc++. Thanks to Melissa O'Neill <oneill@cs.sfu.ca>
+ for suggestions.
+
+* mmafm looks for separate .amcp files for intermediate master conversion
+ programs. Suggested by Melissa O'Neill <oneill@cs.sfu.ca>.
+
+* mmpfb can read and generate PFA fonts.
+
+* Other fixes.
+
+
+Version 0.5
+
+* Fixed bug preventing the programs from working with Kepler.
+
+
+Version 0.4
+
+* Fixed mmpfb to handle older multiple master fonts (Myriad and Minion) and
+ to generate non-truncated PFBs.
+
+
+Version 0.2 16.Aug.1997
+
+* Fixed serious bug in normalize_vector that resulted in incorrect output.
+
+
+Version 0.1 21.Jul.1997
+
+* Initial release.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/README.md b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/README.md
new file mode 100644
index 00000000000..8666241a121
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/README.md
@@ -0,0 +1,118 @@
+LCDF Typetools
+==============
+
+LCDF Typetools comprises several programs for manipulating PostScript
+Type 1, Type 1 Multiple Master, OpenType, and TrueType fonts.
+
+**cfftot1** translates a Compact Font Format (CFF) font, or a
+PostScript-flavored OpenType font, into PostScript Type 1 format. It
+correctly handles subroutines and hints.
+
+**mmafm** creates an AFM file (font metrics) corresponding to an instance of
+a Type 1 Multiple Master font. It reads the AMFM and AFM files distributed
+with the font.
+
+**mmpfb** creates a normal, single-master font program which looks like an
+instance of a Type 1 Multiple Master font. It reads the multiple master font
+program in PFA or PFB format.
+
+**otfinfo** reports information about OpenType and TrueType fonts, such as
+the OpenType features and Unicode code points they support, or the contents
+of their `size` optical size features.
+
+**otftotfm** creates TeX font metrics and encodings that correspond to an
+OpenType or TrueType font. It interprets glyph positionings, substitutions,
+and ligatures as far as it is able. You can say which OpenType features
+should be activated.
+
+**t1dotlessj** reads a Type 1 font, then creates a new Type 1 font whose
+only character is a dotless lower-case j matching the input font’s design.
+
+**t1lint** checks Type 1 fonts for correctness. It tests most of the
+requirements listed in Adobe Systems’ Black Book (“Adobe Type 1 Font
+Format”), and some others.
+
+**t1rawafm** creates an AFM font metrics file corresponding to a raw Type 1
+font file (in PFA or PFB format).
+
+**t1reencode** reencodes a Type 1 font, replacing its internal encoding with
+one you specify.
+
+**t1testpage** creates PostScript test pages for a given Type 1 font. These
+pages show every character defined in the font.
+
+**ttftotype42** creates a Type 42 wrapper for a TrueType or
+TrueType-flavored OpenType font. This allows the font to be embedded in a
+PostScript file.
+
+Each of these programs has a manual page; `man PROGRAMNAME/PROGRAMNAME.1`
+for more information.
+
+See `NEWS` in this directory for changes in recent versions. The LCDF
+Typetools home page is:
+
+http://www.lcdf.org/type/
+
+
+Installation
+------------
+
+Type `./configure`, then `make`.
+
+If `./configure` does not exist (you downloaded from Github), run
+`./bootstrap.sh` first.
+
+`./configure` accepts the usual options; see `INSTALL` for details.
+Some of the typetools programs can link with additional libraries. Otftotfm
+can use the Kpathsea library for integration with TeX directories; if your
+version of this library is in a nonstandard place, supply `./configure` with
+the `--with-kpathsea=PREFIX` option to find it.
+
+You can also disable individual programs by supplying `./configure` with
+`--disable-PROGNAME` options. See `./configure --help` for more
+information.
+
+
+Mmafm and mmpfb
+---------------
+
+Run `mmafm --help` and `mmpfb --help` for a full option summary. Here are
+two example runs:
+
+ % mmafm MyriadMM.amfm --weight=300 --width=585 > MyriadMM_300_585_.afm
+ % mmpfb MyriadMM.pfb --weight=300 --width=585 > MyriadMM_300_585_.pfb
+
+Mmafm expects the name of an AMFM file on the command line. It also needs
+an AFM file for each master (these should have been distributed with the
+AMFM file). You can give the AFM files’ names on the command line, along
+with the AMFM file, or you let mmafm find the AFM files automatically. For
+the automatic method, you must follow one of these 2 conventions:
+
+1. The AFM files are in the same directory as the AMFM file. They are
+named `FONTNAME.afm` -- `MyriadMM-LightCn.afm`, for example.
+
+2. There is a `PSres.upr` file that lists the AFMs by font name, and the
+`PSRESOURCEPATH` environment variable contains the directory with that
+`PSres.upr` file. (`ps2pk` comes with a sample `PSres.upr` file.)
+
+
+Copyright and license
+---------------------
+
+All source code is Copyright (c) 1997-2019 Eddie Kohler.
+
+This code is distributed under the GNU General Public License, Version 2
+(and only Version 2). The GNU General Public License is available via the
+Web at <http://www.gnu.org/licenses/gpl.html>, or in the COPYING file in
+this directory.
+
+
+Author
+------
+
+Eddie Kohler <ekohler@gmail.com>, http://www.lcdf.org/
+
+The current version of the lcdf-typetools package is available on the Web at
+http://www.lcdf.org/type/
+
+LCDF stands for Little Cambridgeport Design Factory.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/autoconf.h.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/autoconf.h.in
new file mode 100644
index 00000000000..178587ae6d4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/autoconf.h.in
@@ -0,0 +1,233 @@
+/* autoconf.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Directory for glyphlist.txt files. */
+#undef GLYPHLISTDIR
+
+/* Define if the va_list type is addressable. */
+#undef HAVE_ADDRESSABLE_VA_LIST
+
+/* Define to incldue Adobe code in output fonts. */
+#undef HAVE_ADOBE_CODE
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to run cfftot1 from otftotfm. */
+#undef HAVE_AUTO_CFFTOT1
+
+/* Define to run t1dotlessj from otftotfm. */
+#undef HAVE_AUTO_T1DOTLESSJ
+
+/* Define to run ttftotype42 from otftotfm. */
+#undef HAVE_AUTO_TTFTOTYPE42
+
+/* Define to run updmap from otftotfm. */
+#undef HAVE_AUTO_UPDMAP
+
+/* Define if strnlen is broken. */
+#undef HAVE_BROKEN_STRNLEN
+
+/* Define if strtod is broken. */
+#undef HAVE_BROKEN_STRTOD
+
+/* Define to 1 if you have the <byteorder.h> header file. */
+#undef HAVE_BYTEORDER_H
+
+/* Define to 1 if you have the `ctime' function. */
+#undef HAVE_CTIME
+
+/* Define to 1 if you have the declaration of `kpse_enc_format', and to 0 if
+ you don't. */
+#undef HAVE_DECL_KPSE_ENC_FORMAT
+
+/* Define to 1 if you have the declaration of `kpse_opentype_format', and to 0
+ if you don't. */
+#undef HAVE_DECL_KPSE_OPENTYPE_FORMAT
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNLEN
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define if intXX_t types are not available. */
+#undef HAVE_FAKE_INT_TYPES
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you want to use kpathsea. */
+#undef HAVE_KPATHSEA
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <new.h> header file. */
+#undef HAVE_NEW_H
+
+/* Define if <new> exists and works. */
+#undef HAVE_NEW_HDR
+
+/* Define if PermStrings are available. */
+#undef HAVE_PERMSTRING
+
+/* Define to include precondition checking assertions. */
+#undef HAVE_PRECONDITION_CHECKING
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strnlen' function. */
+#undef HAVE_STRNLEN
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have u_intXX_t types but not uintXX_t types. */
+#undef HAVE_U_INT_TYPES
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to 0 if you don't want mmafm to run mmpfb when it needs to get an
+ intermediate master conversion program. */
+#undef MMAFM_RUN_MMPFB
+
+/* Define to 1 if you must include <arpa/inet.h> to get `ntohl'. */
+#undef NEED_ARPA_INET_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* kpsewhich's $SELFAUTODIR variable */
+#undef SELFAUTODIR
+
+/* kpsewhich's $SELFAUTOGRANDPARENT variable */
+#undef SELFAUTOGRANDPARENT
+
+/* kpsewhich's $SELFAUTOLOC variable */
+#undef SELFAUTOLOC
+
+/* kpsewhich's $SELFAUTOPARENT variable */
+#undef SELFAUTOPARENT
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define if WORDS_BIGENDIAN has been set. */
+#undef WORDS_BIGENDIAN_SET
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.am
new file mode 100644
index 00000000000..8f63f7a06e8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = cfftot1
+man_MANS = cfftot1.1
+
+cfftot1_SOURCES = cfftot1.cc \
+ maket1font.cc maket1font.hh
+
+cfftot1_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = cfftot1.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.in
new file mode 100644
index 00000000000..e7e03ce5594
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/Makefile.in
@@ -0,0 +1,771 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = cfftot1$(EXEEXT)
+subdir = lcdf-typetools-src/cfftot1
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_cfftot1_OBJECTS = cfftot1.$(OBJEXT) maket1font.$(OBJEXT)
+cfftot1_OBJECTS = $(am_cfftot1_OBJECTS)
+cfftot1_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cfftot1.Po ./$(DEPDIR)/maket1font.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(cfftot1_SOURCES)
+DIST_SOURCES = $(cfftot1_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = cfftot1.1
+cfftot1_SOURCES = cfftot1.cc \
+ maket1font.cc maket1font.hh
+
+cfftot1_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = cfftot1.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/cfftot1/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/cfftot1/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+cfftot1$(EXEEXT): $(cfftot1_OBJECTS) $(cfftot1_DEPENDENCIES) $(EXTRA_cfftot1_DEPENDENCIES)
+ @rm -f cfftot1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cfftot1_OBJECTS) $(cfftot1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfftot1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maket1font.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/cfftot1.Po
+ -rm -f ./$(DEPDIR)/maket1font.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/cfftot1.Po
+ -rm -f ./$(DEPDIR)/maket1font.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1
new file mode 100644
index 00000000000..43057e099eb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.1
@@ -0,0 +1,87 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH CFFTOT1 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+cfftot1 \- convert PostScript font from CFF to Type 1
+.SH SYNOPSIS
+.B cfftot1
+\%[\fB\-a\fR]
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.BR Cfftot1
+converts PostScript font programs in the Compact Font Format (CFF) into
+Type 1 font programs in PFB or PFA format, preserving all hints that can be
+represented in Type 1. The input file should be a raw CFF file or a
+PostScript-flavored OpenType font. If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BI \-a "\fR, " \-\-pfa
+Output font in ASCII PFA format.
+'
+.Sp
+.TP 5
+.BI \-b "\fR, " \-\-pfb
+Output font in binary PFB format. This is the default.
+'
+.Sp
+.TP 5
+.BI \-n " name\fR, " \-\-name " name"
+Output the CFF's component font named
+.IR name .
+CFF files can contain more than one font, although few do. Use this option
+to select a particular font from a multi-font collection. By default
+cfftot1 chooses the collection's first font.
+'
+.Sp
+.TP 5
+.BI \-o " file\fR, " \-\-output " file"
+Write output font to
+.IR file
+instead of the standard output.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M t1binary 1 ,
+.M t1ascii 1
+.LP
+.I "Adobe Type 1 Font Format"
+.LP
+Adobe Technical Notes #5176,
+.IR "The Compact Font Format Specification" ,
+and #5177,
+.I "The Type 2 Charstring Format"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc
new file mode 100644
index 00000000000..c77ddd2f512
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/cfftot1.cc
@@ -0,0 +1,269 @@
+/* cfftot1.cc -- driver for translating CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include "maket1font.hh"
+#include <efont/cff.hh>
+#include <efont/otf.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define PFB_OPT 304
+#define PFA_OPT 305
+#define OUTPUT_OPT 306
+#define NAME_OPT 307
+
+const Clp_Option options[] = {
+ { "ascii", 'a', PFA_OPT, 0, 0 },
+ { "binary", 'b', PFB_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "name", 'n', NAME_OPT, Clp_ValString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static bool binary = true;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Cfftot1%> translates a PostScript font from the Compact Font Format (CFF) to\n\
+the usual Type 1 format. The input file should be either a raw CFF font or a\n\
+PostScript-flavored OpenType font. The result, which is usually written to the\n\
+standard output, is written in PFB or PFA format.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -n, --name=NAME Select font NAME from CFF.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ -h, --help Print this message and exit.\n\
+ -v, --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// MAIN
+
+static void
+do_file(const char *infn, const char *outfn, PermString name, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!infn || strcmp(infn, "-") == 0) {
+ f = stdin;
+ infn = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(infn, "rb")))
+ errh->fatal("%s: %s", infn, strerror(errno));
+
+ int c = getc(f);
+ ungetc(c, f);
+
+ Cff::Font *font = 0;
+
+ if (c == EOF)
+ errh->fatal("%s: empty file", infn);
+ if (c != 1 && c != 'O')
+ errh->fatal("%s: not a CFF or OpenType/CFF font", infn);
+
+ StringAccum sa(150000);
+ int amt;
+ do {
+ if (char *x = sa.reserve(32768)) {
+ amt = fread(x, 1, 32768, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->lerror(infn, "%s", strerror(errno));
+ if (f != stdin)
+ fclose(f);
+
+ ContextErrorHandler cerrh(errh, "While processing %s:", infn);
+ cerrh.set_indent(0);
+ String data = sa.take_string();
+ unsigned units_per_em = 0;
+ if (c == 'O') {
+ Efont::OpenType::Font font(data, &cerrh);
+ data = font.table("CFF");
+ units_per_em = font.units_per_em();
+ }
+
+ Cff *cff = new Cff(data, units_per_em, &cerrh);
+ Cff::FontParent *fp = cff->font(name, &cerrh);
+ if (errh->nerrors() == 0
+ && !(font = dynamic_cast<Cff::Font *>(fp)))
+ errh->fatal("%s: CID-keyed fonts not supported", infn);
+
+ if (errh->nerrors() > 0)
+ return;
+
+ Type1Font *font1 = create_type1_font(font, &cerrh);
+
+ if (!outfn || strcmp(outfn, "-") == 0) {
+ f = stdout;
+ outfn = "<stdout>";
+ } else if (!(f = fopen(outfn, "wb")))
+ errh->fatal("%s: %s", outfn, strerror(errno));
+
+ if (binary) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ Type1PFBWriter t1w(f);
+ font1->write(t1w);
+ } else {
+ Type1PFAWriter t1w(f);
+ font1->write(t1w);
+ }
+
+ if (f != stdout)
+ fclose(f);
+}
+
+int
+main(int argc, char *argv[])
+{
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ const char *input_file = 0;
+ const char *output_file = 0;
+ const char *font_name = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case NAME_OPT:
+ if (font_name)
+ usage_error(errh, "font name specified twice");
+ font_name = clp->vstr;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("cfftot1 (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case OUTPUT_OPT:
+ output_file:
+ if (output_file)
+ usage_error(errh, "output file specified twice");
+ output_file = clp->vstr;
+ break;
+
+ case Clp_NotOption:
+ if (input_file && output_file)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto output_file;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ do_file(input_file, output_file, font_name, errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc
new file mode 100644
index 00000000000..54a4000b9bd
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.cc
@@ -0,0 +1,591 @@
+/* maket1font.{cc,hh} -- translate CFF fonts to Type 1 fonts
+ *
+ * Copyright (c) 2002-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "maket1font.hh"
+#include <efont/t1interp.hh>
+#include <efont/t1csgen.hh>
+#include <lcdf/point.hh>
+#include <lcdf/error.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1unparser.hh>
+
+using namespace Efont;
+
+typedef unsigned CsRef;
+enum { CSR_GLYPH = 0x00000000, CSR_SUBR = 0x80000000,
+ CSR_GSUBR = 0xC0000000,
+ CSR_TYPE = 0xC0000000, CSR_NUM = 0x3FFFFFFF };
+
+class MakeType1CharstringInterp : public Type1CharstringGenInterp { public:
+
+ MakeType1CharstringInterp(int precision = 5);
+ ~MakeType1CharstringInterp();
+
+ Type1Font *output() const { return _output; }
+
+ void run(const CharstringProgram *, Type1Font *, PermString glyph_definer, ErrorHandler *);
+ void run(const CharstringContext &, Type1Charstring &, ErrorHandler *);
+
+ bool type2_command(int, const uint8_t *, int *);
+
+ String landmark(ErrorHandler *errh) const;
+
+ class Subr;
+
+ private:
+
+ // output
+ Type1Font *_output;
+ int _flex_message;
+
+ // subroutines
+ int _subr_bias;
+ int _gsubr_bias;
+ mutable Vector<Subr *> _glyphs;
+ mutable Vector<Subr *> _subrs;
+ mutable Vector<Subr *> _gsubrs;
+
+ Subr *_cur_subr;
+ int _cur_glyph;
+
+ Subr *csr_subr(CsRef, bool force) const;
+ Type1Charstring *csr_charstring(CsRef) const;
+
+};
+
+class MakeType1CharstringInterp::Subr { public:
+
+ Subr(CsRef csr) : _csr(csr), _output_subrno(-1), _stamp(0) { }
+
+ bool up_to_date() const { return _stamp == max_stamp; }
+ void update() { _stamp = max_stamp; }
+ static void bump_date() { max_stamp++; }
+
+ //String name(const MakeType1CharstringInterp *) const;
+ Type1Charstring *charstring(const MakeType1CharstringInterp *) const;
+
+ int ncalls() const { return _calls.size(); }
+ Subr *call(int i) const { return _calls[i]; }
+ bool has_call(Subr *) const;
+
+ struct Caller {
+ Subr *subr;
+ int pos;
+ int len;
+ Caller(Subr *s, int p, int l)
+ : subr(s), pos(p), len(l) {
+ }
+ String charstring(MakeType1CharstringInterp *mcsi) const {
+ Type1Charstring *t1cs = subr->charstring(mcsi);
+ return t1cs->substring(pos, len);
+ }
+ };
+
+ int ncallers() const { return _callers.size(); }
+ const Caller &caller(int i) const { return _callers[i]; }
+
+ void add_call(Subr *s) { _calls.push_back(s); }
+ void add_caller(Subr *s, int pos, int len);
+
+ int output_subrno() const { return _output_subrno; }
+ void set_output_subrno(int n) { _output_subrno = n; }
+
+ void transfer_nested_calls(int pos, int length, Subr *new_caller) const;
+ void change_callers(Subr *, int pos, int length, int new_length);
+ bool unify(MakeType1CharstringInterp *);
+
+ private:
+
+ CsRef _csr;
+ Vector<Subr *> _calls;
+ Vector<Caller> _callers;
+
+ int _output_subrno;
+ int _stamp;
+
+ static int max_stamp;
+
+ friend class MakeType1CharstringInterp;
+
+};
+
+int MakeType1CharstringInterp::Subr::max_stamp = 1;
+
+inline void
+MakeType1CharstringInterp::Subr::add_caller(Subr *s, int pos, int len)
+{
+ _callers.push_back(Caller(s, pos, len));
+}
+
+bool
+MakeType1CharstringInterp::Subr::has_call(Subr *s) const
+{
+ for (int i = 0; i < _calls.size(); i++)
+ if (_calls[i] == s)
+ return true;
+ return false;
+}
+
+
+/*****
+ * MakeType1CharstringInterp
+ **/
+
+MakeType1CharstringInterp::MakeType1CharstringInterp(int precision)
+ : Type1CharstringGenInterp(precision), _flex_message(0)
+{
+}
+
+MakeType1CharstringInterp::~MakeType1CharstringInterp()
+{
+ for (int i = 0; i < _glyphs.size(); i++)
+ delete _glyphs[i];
+ for (int i = 0; i < _subrs.size(); i++)
+ delete _subrs[i];
+ for (int i = 0; i < _gsubrs.size(); i++)
+ delete _gsubrs[i];
+}
+
+String
+MakeType1CharstringInterp::landmark(ErrorHandler *errh) const
+{
+ if (_cur_glyph >= 0 && _cur_glyph < program()->nglyphs())
+ return errh->format("glyph %<%s%>", program()->glyph_name(_cur_glyph).c_str());
+ else
+ return String();
+}
+
+
+// subroutines
+
+MakeType1CharstringInterp::Subr *
+MakeType1CharstringInterp::csr_subr(CsRef csr, bool force) const
+{
+ Vector<Subr *> *vp;
+ if ((csr & CSR_TYPE) == CSR_SUBR)
+ vp = &_subrs;
+ else if ((csr & CSR_TYPE) == CSR_GSUBR)
+ vp = &_gsubrs;
+ else if ((csr & CSR_TYPE) == CSR_GLYPH)
+ vp = &_glyphs;
+ else
+ return 0;
+
+ int n = (csr & CSR_NUM);
+ if (n >= vp->size())
+ return 0;
+
+ Subr *&what = (*vp)[n];
+ if (!what && force)
+ what = new Subr(csr);
+ return what;
+}
+
+#if 0
+String
+MakeType1CharstringInterp::Subr::name(const MakeType1CharstringInterp *mcsi) const
+{
+ int n = (_csr & CSR_NUM);
+ switch (_csr & CSR_TYPE) {
+ case CSR_SUBR:
+ return "subr" + String(n);
+ case CSR_GSUBR:
+ return "gsubr" + String(n);
+ case CSR_GLYPH:
+ if (String name = mcsi->output()->glyph_name(n))
+ return name;
+ else
+ return "??glyph" + String(n) + "??";
+ default:
+ return "";
+ }
+}
+#endif
+
+Type1Charstring *
+MakeType1CharstringInterp::Subr::charstring(const MakeType1CharstringInterp *mcsi) const
+{
+ int n = (_csr & CSR_NUM);
+ switch (_csr & CSR_TYPE) {
+ case CSR_SUBR:
+ case CSR_GSUBR:
+ if (_output_subrno >= 0)
+ return static_cast<Type1Charstring *>(mcsi->output()->subr(_output_subrno));
+ return 0;
+ case CSR_GLYPH:
+ return static_cast<Type1Charstring *>(mcsi->output()->glyph(n));
+ default:
+ return 0;
+ }
+}
+
+void
+MakeType1CharstringInterp::Subr::transfer_nested_calls(int pos, int length, Subr *new_caller) const
+{
+ int right = pos + length;
+ for (int i = 0; i < _calls.size(); i++) {
+ Subr *cs = _calls[i];
+ // 11.Jul.2006 - remember not to shift the new caller's records! (Michael Zedler)
+ if (cs != new_caller)
+ for (int j = 0; j < cs->_callers.size(); j++) {
+ Caller &c = cs->_callers[j];
+ if (c.subr == this && pos <= c.pos && c.pos + c.len <= right) {
+ // shift caller to point at the subroutine
+ c.subr = new_caller;
+ c.pos -= pos;
+ new_caller->add_call(cs);
+ }
+ }
+ }
+}
+
+void
+MakeType1CharstringInterp::Subr::change_callers(Subr *caller, int pos, int length, int new_length)
+{
+ if (up_to_date())
+ return;
+ update();
+
+ int right = pos + length;
+ int delta = new_length - length;
+ for (int i = 0; i < _callers.size(); i++) {
+ Caller &c = _callers[i];
+ if (c.subr != caller)
+ /* nada */;
+ else if (pos <= c.pos && c.pos + c.len <= right) {
+ // erase
+ //if (c.debug) fprintf(stderr, " ERASE caller %08x:%d+%d [%d+%d]\n", c.subr->_csr, c.pos, c.len, pos, length);
+ c.subr = 0;
+ } else if (right <= c.pos) {
+ //if (c.debug) fprintf(stderr, " ADJUST caller %08x:%d+%d -> %d+%d [%d+%d]\n", c.subr->_csr, c.pos, c.len, c.pos+delta, c.len, pos, length);
+ c.pos += delta;
+ } else if (c.pos <= pos && right <= c.pos + c.len) {
+ //if (c.debug) fprintf(stderr, " ADJUST caller %08x:%d+%d -> %d+%d [%d+%d]\n", c.subr->_csr, c.pos, c.len, c.pos, c.len+delta, pos, length);
+ c.len += delta;
+ } else
+ c.subr = 0;
+ }
+}
+
+bool
+MakeType1CharstringInterp::Subr::unify(MakeType1CharstringInterp *mcsi)
+{
+ // clean up caller list
+ for (int i = 0; i < _callers.size(); i++)
+ if (!_callers[i].subr) {
+ _callers[i] = _callers.back();
+ _callers.pop_back();
+ i--;
+ }
+
+ if (!_callers.size())
+ return false;
+ assert(!_calls.size()); // because this hasn't been unified yet
+
+ // Find the smallest shared complete charstring.
+ String substr = _callers[0].charstring(mcsi);
+ int suboff = 0;
+ for (int i = 1; i < _callers.size(); i++) {
+ String substr1 = _callers[i].charstring(mcsi);
+ const char *d = substr.data() + suboff, *d1 = substr1.data();
+ const char *dx = substr.data() + substr.length(), *d1x = d1 + substr1.length();
+ while (dx > d && d1x > d1 && dx[-1] == d1x[-1])
+ dx--, d1x--;
+ if (d1x != d1) {
+ // 8.13.2013 -- We might have stopped in the middle of a number
+ // or command in d1 -- even if we absorbed all of d! For
+ // example, maybe d's version is "15 rlineto" (encoded "154 5"),
+ // and our version is "518 rlineto" (encoded "248 154 5")! So
+ // whenever we stop before the end of d1, we must adjust our
+ // position to the next caret in d1, which, in the example,
+ // would be after "248 154" and before "5".
+ int suboff1 = Type1Charstring(substr1).first_caret_after(d1x - d1);
+ dx += suboff1 - (d1x - d1);
+ }
+ suboff = dx - substr.data();
+ }
+ substr = substr.substring(Type1Charstring(substr).first_caret_after(suboff));
+ if (!substr.length())
+ return false;
+ for (int i = 0; i < _callers.size(); i++) {
+ Caller &c = _callers[i];
+ if (int delta = c.len - substr.length()) {
+ //if (c.debug) fprintf(stderr, " PREFIX caller %08x:%d+%d -> %d+%d [%s]\n", c.subr->_csr, c.pos, c.len, c.pos+delta, c.len+delta, CharstringUnparser::unparse(Type1Charstring(substr)).c_str());
+ c.pos += delta;
+ c.len -= delta;
+ }
+ }
+
+ // otherwise, success
+ _output_subrno = mcsi->output()->nsubrs();
+ mcsi->output()->set_subr(_output_subrno, Type1Charstring(substr + "\013"));
+
+ // This subr has become real, so it is suitable for later unifications.
+ // Mark it as having called any subroutines contained completely within itself.
+ // How to do this? Look at one caller, and go over all its calls.
+ _callers[0].subr->transfer_nested_calls(_callers[0].pos, _callers[0].len, this);
+
+ // adapt callers
+ String callsubr_string = Type1CharstringGen::callsubr_string(_output_subrno);
+
+ for (int i = 0; i < _callers.size(); i++)
+ // 13.Jun.2003 - must check whether _callers[i].subr exists: if we
+ // called a subroutine more than once, change_callers() might have
+ // zeroed it out.
+ if (_callers[i].subr && _callers[i].subr != this) {
+ Subr::Caller c = _callers[i];
+ c.subr->charstring(mcsi)->assign_substring(c.pos, c.len, callsubr_string);
+ Subr::bump_date();
+ for (int j = 0; j < c.subr->ncalls(); j++)
+ c.subr->call(j)->change_callers(c.subr, c.pos, c.len, callsubr_string.length());
+ assert(!_callers[i].subr);
+ }
+
+ // this subr is no longer "called"/interpolated from anywhere
+ _callers.clear();
+
+ //fprintf(stderr, "Succeeded %x\n", _csr);
+ return true;
+}
+
+
+// running
+
+bool
+MakeType1CharstringInterp::type2_command(int cmd, const uint8_t *data, int *left)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr:
+ case Cs::cCallgsubr:
+ if (subr_depth() < MAX_SUBR_DEPTH && size() == 1) {
+ //fprintf(stderr, "succeeded %d\n", (int) top());
+ bool g = (cmd == Cs::cCallgsubr);
+ CsRef csref = ((int)top() + program()->xsubr_bias(g)) | (g ? CSR_GSUBR : CSR_SUBR);
+ Subr *callee = csr_subr(csref, true);
+ if (callee)
+ _cur_subr->add_call(callee);
+
+ int left = csgen().length();
+
+ bool more = callxsubr_command(g);
+
+ int right = csgen().length();
+ if (error() >= 0 && callee)
+ callee->add_caller(_cur_subr, left, right - left);
+ return more;
+ } else {
+ //fprintf(stderr, "failed %d\n", (int) top());
+ goto normal;
+ }
+
+ normal:
+ default:
+ return CharstringInterp::type2_command(cmd, data, left);
+
+ }
+}
+
+void
+MakeType1CharstringInterp::run(const CharstringContext &g, Type1Charstring &out, ErrorHandler *errh)
+{
+ Type1CharstringGenInterp::run(g, out);
+
+ if (Type1CharstringGenInterp::had_bad_flex() && !(_flex_message & 1)) {
+ errh->lwarning(landmark(errh), "complex flex hint replaced with curves");
+ errh->message("(This font contains flex hints prohibited by Type 1. They%,ve been\nreplaced by ordinary curves.)");
+ _flex_message |= 1;
+ }
+#if !HAVE_ADOBE_CODE
+ if (Type1CharstringGenInterp::had_flex() && !(_flex_message & 2)) {
+ errh->lwarning(landmark(errh), "flex hints required");
+ errh->message("(This program was compiled without Adobe code for flex hint support,\nso its output may not work on all devices.)");
+ _flex_message |= 2;
+ }
+ if (Type1CharstringGenInterp::had_hr() && !(_flex_message & 4)) {
+ errh->lwarning(landmark(errh), "hint replacement required");
+ errh->message("(This program was compiled without Adobe code for hint replacement,\nso its output may not work on all devices.)");
+ _flex_message |= 4;
+ }
+#endif
+}
+
+void
+MakeType1CharstringInterp::run(const CharstringProgram *program, Type1Font *output, PermString glyph_definer, ErrorHandler *errh)
+{
+ _output = output;
+ set_hint_replacement_storage(output);
+
+ _glyphs.assign(program->nglyphs(), 0);
+ _subrs.assign(program->nsubrs(), 0);
+ _subr_bias = program->subr_bias();
+ _gsubrs.assign(program->ngsubrs(), 0);
+ _gsubr_bias = program->gsubr_bias();
+
+ // run over the glyphs
+ int nglyphs = program->nglyphs();
+ Type1Charstring receptacle;
+ for (int i = 0; i < nglyphs; i++) {
+ _cur_subr = _glyphs[i] = new Subr(CSR_GLYPH | i);
+ _cur_glyph = i;
+ run(program->glyph_context(i), receptacle, errh);
+#if 0
+ PermString n = program->glyph_name(i);
+ if (i == 408 || i == 20) {
+ fprintf(stderr, "%d: %s was %s\n", i, n.c_str(), CharstringUnparser::unparse(*program->glyph(i)).c_str());
+ fprintf(stderr, " now %s\n", CharstringUnparser::unparse(receptacle).c_str());
+ fprintf(stderr, " *** %d.%d: %s\n", 134, 30, CharstringUnparser::unparse(Type1Charstring(receptacle.data_string().substring(134, 30))).c_str());
+ }
+#endif
+ PermString name = program->glyph_name(i);
+ if (output->glyph(name)) {
+ errh->warning("glyph %<%s%> defined more than once", name.c_str());
+ int i = 1;
+ do {
+ name = program->glyph_name(i) + String(".") + String(i);
+ ++i;
+ } while (output->glyph(name));
+ }
+ output->add_glyph(Type1Subr::make_glyph(name, receptacle, glyph_definer));
+ }
+
+ // unify Subrs
+ for (int i = 0; i < _subrs.size(); i++)
+ if (_subrs[i])
+ _subrs[i]->unify(this);
+
+ for (int i = 0; i < _gsubrs.size(); i++)
+ if (_gsubrs[i])
+ _gsubrs[i]->unify(this);
+}
+
+
+/*****
+ * main
+ **/
+
+static void
+add_number_def(Type1Font *output, int dict, PermString name, const Cff::Font *font, Cff::DictOperator op)
+{
+ double v;
+ if (font->dict_value(op, &v))
+ output->add_definition(dict, Type1Definition::make(name, v, "def"));
+}
+
+static void
+add_delta_def(Type1Font *output, int dict, PermString name, const Cff::Font *font, Cff::DictOperator op)
+{
+ Vector<double> vec;
+ if (font->dict_value(op, vec)) {
+ for (int i = 1; i < vec.size(); i++)
+ vec[i] += vec[i - 1];
+ StringAccum sa;
+ for (int i = 0; i < vec.size(); i++)
+ sa << (i ? ' ' : '[') << vec[i];
+ sa << ']';
+ output->add_definition(dict, Type1Definition::make_literal(name, sa.take_string(), (dict == Type1Font::dP ? "|-" : "readonly def")));
+ }
+}
+
+Type1Font *
+create_type1_font(Cff::Font *font, ErrorHandler *errh)
+{
+ String version = font->dict_string(Cff::oVersion);
+ Type1Font *output = Type1Font::skeleton_make(font->font_name(), version);
+ output->skeleton_comments_end();
+ StringAccum sa;
+
+ // FontInfo dictionary
+ if (version)
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("version", version, "readonly def"));
+ if (String s = font->dict_string(Cff::oNotice))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Notice", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oCopyright))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Copyright", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oFullName))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("FullName", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oFamilyName))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("FamilyName", s, "readonly def"));
+ if (String s = font->dict_string(Cff::oWeight))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_string("Weight", s, "readonly def"));
+ double v;
+ if (font->dict_value(Cff::oIsFixedPitch, &v))
+ output->add_definition(Type1Font::dFI, Type1Definition::make_literal("isFixedPitch", (v ? "true" : "false"), "def"));
+ add_number_def(output, Type1Font::dFI, "ItalicAngle", font, Cff::oItalicAngle);
+ add_number_def(output, Type1Font::dFI, "UnderlinePosition", font, Cff::oUnderlinePosition);
+ add_number_def(output, Type1Font::dFI, "UnderlineThickness", font, Cff::oUnderlineThickness);
+ output->skeleton_fontinfo_end();
+
+ // Encoding, other font dictionary entries
+ output->add_item(font->type1_encoding_copy());
+ font->dict_value(Cff::oPaintType, &v);
+ output->add_definition(Type1Font::dF, Type1Definition::make("PaintType", v, "def"));
+ output->add_definition(Type1Font::dF, Type1Definition::make("FontType", 1.0, "def"));
+ Vector<double> vec;
+ if (font->dict_value(Cff::oFontMatrix, vec) && vec.size() == 6) {
+ sa << '[' << vec[0] << ' ' << vec[1] << ' ' << vec[2] << ' ' << vec[3] << ' ' << vec[4] << ' ' << vec[5] << ']';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontMatrix", sa.take_string(), "readonly def"));
+ } else
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontMatrix", "[0.001 0 0 0.001 0 0]", "readonly def"));
+ add_number_def(output, Type1Font::dF, "StrokeWidth", font, Cff::oStrokeWidth);
+ add_number_def(output, Type1Font::dF, "UniqueID", font, Cff::oUniqueID);
+ if (font->dict_value(Cff::oXUID, vec) && vec.size()) {
+ for (int i = 0; i < vec.size(); i++)
+ sa << (i ? ' ' : '[') << vec[i];
+ sa << ']';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("XUID", sa.take_string(), "readonly def"));
+ }
+ if (font->dict_value(Cff::oFontBBox, vec) && vec.size() == 4) {
+ sa << '{' << vec[0] << ' ' << vec[1] << ' ' << vec[2] << ' ' << vec[3] << '}';
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontBBox", sa.take_string(), "readonly def"));
+ } else
+ output->add_definition(Type1Font::dF, Type1Definition::make_literal("FontBBox", "{0 0 0 0}", "readonly def"));
+ output->skeleton_fontdict_end();
+
+ // Private dictionary
+ add_delta_def(output, Type1Font::dP, "BlueValues", font, Cff::oBlueValues);
+ add_delta_def(output, Type1Font::dP, "OtherBlues", font, Cff::oOtherBlues);
+ add_delta_def(output, Type1Font::dP, "FamilyBlues", font, Cff::oFamilyBlues);
+ add_delta_def(output, Type1Font::dP, "FamilyOtherBlues", font, Cff::oFamilyOtherBlues);
+ add_number_def(output, Type1Font::dP, "BlueScale", font, Cff::oBlueScale);
+ add_number_def(output, Type1Font::dP, "BlueShift", font, Cff::oBlueShift);
+ add_number_def(output, Type1Font::dP, "BlueFuzz", font, Cff::oBlueFuzz);
+ if (font->dict_value(Cff::oStdHW, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("StdHW", String("[") + String(v) + "]", "|-"));
+ if (font->dict_value(Cff::oStdVW, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("StdVW", String("[") + String(v) + "]", "|-"));
+ add_delta_def(output, Type1Font::dP, "StemSnapH", font, Cff::oStemSnapH);
+ add_delta_def(output, Type1Font::dP, "StemSnapV", font, Cff::oStemSnapV);
+ if (font->dict_value(Cff::oForceBold, &v))
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("ForceBold", (v ? "true" : "false"), "def"));
+ add_number_def(output, Type1Font::dP, "LanguageGroup", font, Cff::oLanguageGroup);
+ add_number_def(output, Type1Font::dP, "ExpansionFactor", font, Cff::oExpansionFactor);
+ add_number_def(output, Type1Font::dP, "UniqueID", font, Cff::oUniqueID);
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("MinFeature", "{16 16}", "|-"));
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("password", "5839", "def"));
+ output->add_definition(Type1Font::dP, Type1Definition::make_literal("lenIV", "0", "def"));
+ output->skeleton_private_end();
+ output->skeleton_common_subrs();
+
+ // add glyphs
+ MakeType1CharstringInterp maker(5);
+ maker.run(font, output, " |-", errh);
+
+ return output;
+}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.hh
new file mode 100644
index 00000000000..75f2527897f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/cfftot1/maket1font.hh
@@ -0,0 +1,10 @@
+#ifndef EFONT_MAKET1FONT_HH
+#define EFONT_MAKET1FONT_HH
+#include <efont/cff.hh>
+namespace Efont {
+class Type1Font;
+}
+
+Efont::Type1Font *create_type1_font(Efont::Cff::Font *, ErrorHandler *);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac
new file mode 100644
index 00000000000..a18a8979d5b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/configure.ac
@@ -0,0 +1,514 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT([lcdf-typetools], [2.108])
+AC_CONFIG_SRCDIR([NEWS.md])
+AM_INIT_AUTOMAKE
+AC_CONFIG_HEADERS([autoconf.h])
+AM_MAINTAINER_MODE
+
+AC_PROG_MAKE_SET
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_CXXCPP
+
+AC_ARG_ENABLE([warnings],
+ [AS_HELP_STRING([--enable-warnings], [compile with -W -Wall])],
+ [if test "$enableval" = yes; then
+ CFLAGS="$CFLAGS -W -Wall"; CXXFLAGS="$CXXFLAGS -W -Wall"
+ fi])
+
+AC_ARG_ENABLE([precondition-checking],
+ [AS_HELP_STRING([--enable-precondition-checking], [include precondition checking assertions])],
+ [if test "$enableval" = yes; then
+ AC_DEFINE([HAVE_PRECONDITION_CHECKING], [1], [Define to include precondition checking assertions.])
+ fi])
+
+AC_ARG_ENABLE([adobe-code],
+ [AS_HELP_STRING([--disable-adobe-code], [do not include Adobe code])],
+ [], [enable_adobe_code=yes])
+if test "$enable_adobe_code" = yes; then
+ AC_DEFINE([HAVE_ADOBE_CODE], [1], [Define to incldue Adobe code in output fonts.])
+fi
+
+
+dnl AN_MAKEVAR([AR], [AC_PROG_AR])
+dnl AN_PROGRAM([ar], [AC_PROG_AR])
+dnl AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL(AR, ar, :)])
+dnl AC_PROG_AR
+
+AC_PROG_RANLIB
+
+
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_template_objs.html
+dnl
+AC_DEFUN([AC_CXX_TEMPLATE_OBJS],
+[AC_CACHE_CHECK(where template objects are stored, ac_cv_cxx_templobjs,
+ [ ac_cv_cxx_templobjs='unknown'
+ if test "$GXX" = yes; then
+ ac_cv_cxx_templobjs='nowhere'
+ else
+ case $CXX in
+ CC|*/CC)
+ cat > conftest.cc <<EOF
+template<class T> class A { public : A () {} };
+template<class T> void f (const A<T>&) {}
+main()
+{ A<double> d;
+ A<int> i;
+ f (d);
+ f (i);
+ return 0;
+}
+EOF
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d Templates.DB ; then
+ rm -fr Templates.DB
+ fi
+ if $CXX $CXXFLAGS -ptr. -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d Templates.DB ; then
+# this should be Sun CC <= 4.2
+ CXXFLAGS="$CXXFLAGS -ptr."
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='Templates.DB/*.o'
+ else
+ ac_cv_cxx_templobjs='Templates.DB/*.lo'
+ fi
+ rm -fr Templates.DB
+ fi
+ fi
+ fi
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d SunWS_cache ; then
+ rm -fr SunWS_cache
+ fi
+ if $CXX $CXXFLAGS -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d SunWS_cache ; then
+# this should be Sun WorkShop C++ compiler 5.x
+# or Sun Forte C++ compiler >= 6.x
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.o'
+ else
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.lo'
+ fi
+ rm -fr SunWS_cache
+ fi
+ fi
+ fi
+ rm -f conftest* ;;
+ esac
+ fi
+ case "x$ac_cv_cxx_templobjs" in
+ xunknown|xnowhere)
+ TEMPLATE_OBJS="" ;;
+ *)
+ TEMPLATE_OBJS="$ac_cv_cxx_templobjs" ;;
+ esac])
+ AC_SUBST(TEMPLATE_OBJS)])
+
+AC_CXX_TEMPLATE_OBJS
+
+
+dnl
+dnl standard headers
+dnl (Though obsolete, AC_HEADER_STC changes the standard includes.)
+dnl
+
+AC_LANG_C
+AC_HEADER_STDC
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS([fcntl.h unistd.h sys/time.h sys/wait.h])
+
+
+dnl
+dnl <new> and/or <new.h>
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([whether <new> works], ac_cv_good_new_hdr,
+[AC_TRY_LINK([#include <new>], [
+ int a;
+ int *b = new(&a) int;
+ return 0;
+], ac_cv_good_new_hdr=yes, ac_cv_good_new_hdr=no)])
+if test "$ac_cv_good_new_hdr" = yes; then
+ AC_DEFINE([HAVE_NEW_HDR], [1], [Define if <new> exists and works.])
+fi
+AC_CHECK_HEADERS([new.h])
+
+
+dnl
+dnl endianness
+dnl
+
+AC_DEFINE([WORDS_BIGENDIAN_SET], [1], [Define if WORDS_BIGENDIAN has been set.])
+AC_C_BIGENDIAN()
+
+
+dnl
+dnl functions such as strerror, working strtod, working strnlen, strtoul,
+dnl time headers such as unistd.h
+dnl
+
+AC_LANG_C
+need_fixlibc=0
+AC_CHECK_FUNCS([strerror], [], [need_fixlibc=1])
+
+AC_CACHE_CHECK([for broken strtod], [ac_cv_broken_strtod],
+[AC_TRY_RUN([#include <stdio.h>
+#include <stdlib.h>
+int main(int c, char **v) {
+ char s[] = "12 ";
+ char *endp;
+ double d = strtod(s, &endp);
+ return (s + 2) == endp;
+}], [ac_cv_broken_strtod=yes], [ac_cv_broken_strtod=no],
+[ac_cv_broken_strtod=no])])
+if test "x$ac_cv_broken_strtod" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRTOD], [1], [Define if strtod is broken.])
+fi
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_DECLS([strnlen], [], [], [#include <string.h>])
+AC_CHECK_FUNCS([strnlen], [have_strnlen=1], [need_fixlibc=1])
+if test "x$have_strnlen" = x1; then
+ AC_CACHE_CHECK([for broken strnlen], [ac_cv_broken_strnlen],
+ [AC_TRY_RUN([#include <string.h>
+#include <stdio.h>
+int main(int c, char **v) {
+ char s[] = "01234567891";
+ return strnlen(s, 10) == 10;
+}], [ac_cv_broken_strnlen=yes], [ac_cv_broken_strnlen=no],
+[ac_cv_broken_strnlen=no])])
+ if test "x$ac_cv_broken_strnlen" = xyes; then
+ need_fixlibc=1
+ AC_DEFINE([HAVE_BROKEN_STRNLEN], [1], [Define if strnlen is broken.])
+ fi
+fi
+AC_LANG_C
+
+AC_CHECK_FUNCS([ctime ftruncate mkstemp sigaction strdup strtoul vsnprintf waitpid])
+AC_CHECK_FUNC([floor], [], [AC_CHECK_LIB([m], [floor])])
+AC_CHECK_FUNC([fabs], [], [AC_CHECK_LIB([m], [fabs])])
+AM_CONDITIONAL([FIXLIBC], [test x$need_fixlibc = x1])
+
+
+dnl
+dnl integer types
+dnl
+
+AC_CHECK_HEADERS(inttypes.h, have_inttypes_h=yes, have_inttypes_h=no)
+AC_CHECK_HEADERS(sys/types.h, have_sys_types_h=yes, have_sys_types_h=no)
+
+if test $have_inttypes_h = no -a $have_sys_types_h = yes; then
+ AC_CACHE_CHECK([for uintXX_t typedefs], ac_cv_uint_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])uint32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_uint_t=yes, ac_cv_uint_t=no)])
+fi
+if test $have_inttypes_h = no -a $have_sys_types_h = yes -a "$ac_cv_uint_t" = no; then
+ AC_CACHE_CHECK([for u_intXX_t typedefs], ac_cv_u_int_t,
+ [AC_EGREP_HEADER(dnl
+changequote(<<,>>)<<(^|[^a-zA-Z_0-9])u_int32_t[^a-zA-Z_0-9]>>changequote([,]),
+ sys/types.h, ac_cv_u_int_t=yes, ac_cv_u_int_t=no)])
+fi
+if test $have_inttypes_h = yes -o "$ac_cv_uint_t" = yes; then
+ :
+elif test "$ac_cv_u_int_t" = yes; then
+ AC_DEFINE(HAVE_U_INT_TYPES, 1, [Define if you have u_intXX_t types but not uintXX_t types.])
+else
+ AC_MSG_WARN([
+=========================================
+
+Neither uint32_t nor u_int32_t defined by <inttypes.h> or <sys/types.h>!
+Assuming "short" has 16 bits and "int" has 32 bits.
+
+=========================================])
+ AC_DEFINE(HAVE_FAKE_INT_TYPES, 1, [Define if intXX_t types are not available.])
+fi
+
+AC_CHECK_TYPES(uintptr_t, [], [],
+[#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+])
+
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned int)
+
+
+dnl
+dnl ntohs, ntohl (need them in C++ code)
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CHECK_HEADERS([byteorder.h netinet/in.h sys/param.h])
+AC_MSG_CHECKING([whether ntohs and ntohl are defined])
+ac_ntoh_defined=no
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#endif
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+if test $ac_ntoh_defined = no; then
+ AC_CHECK_HEADERS([arpa/inet.h], [have_arpa_inet_h=yes], [have_arpa_inet_h=no])
+ if test $have_arpa_inet_h = yes; then
+ AC_MSG_CHECKING([whether ntohs and ntohl are defined in <arpa/inet.h>])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <arpa/inet.h>
+]], [[(void) ntohs(0x0020), (void) ntohl(0x03040020);]])],
+ [AC_MSG_RESULT(yes)
+AC_DEFINE(NEED_ARPA_INET_H, 1, [Define to 1 if you must include <arpa/inet.h> to get `ntohl'.])
+ac_ntoh_defined=yes],
+ [AC_MSG_RESULT(no)])
+ fi
+fi
+if test $ac_ntoh_defined = no; then
+ AC_MSG_ERROR([
+=========================================
+
+Cannot find a definition for ntohs and/or ntohl!
+
+=========================================])
+fi
+AC_LANG_C
+AC_SEARCH_LIBS([ntohs], [-lnet -lwinsock32])
+
+
+dnl
+dnl is va_list addressable?
+dnl
+
+AC_LANG_CPLUSPLUS
+AC_CACHE_CHECK([for addressable va_list type],
+ ac_cv_va_list_addr,
+ [AC_TRY_COMPILE([#include <stdarg.h>
+void f(va_list *) {
+}
+void g(va_list val) {
+ f(&val);
+}
+void h(int a, ...) {
+ va_list val;
+ va_start(val, a);
+ g(val);
+ va_end(val);
+}], [h(2, 3, 4);], ac_cv_va_list_addr=yes, ac_cv_va_list_addr=no)])
+if test "x$ac_cv_va_list_addr" = xyes; then
+ AC_DEFINE(HAVE_ADDRESSABLE_VA_LIST, 1, [Define if the va_list type is addressable.])
+fi
+
+
+dnl
+dnl select programs to be compiled and automatically run
+dnl
+
+m4_include([m4/lcdf-typetools.m4])
+
+SELECTED_SUBDIRS=
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [test "x$enable_[]Kpse_Prog" = xno || SELECTED_SUBDIRS="$SELECTED_SUBDIRS Kpse_Prog"
+])
+AC_SUBST(SELECTED_SUBDIRS)
+
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AS_IF([test "x$enable_auto_]Kpse_Opt[" != xno],
+ [AC_DEFINE([HAVE_AUTO_]AS_TR_CPP(Kpse_Opt), 1,
+ [Define to run ]Kpse_Opt[ from otftotfm.])])
+])
+
+
+dnl
+dnl kpathsea
+dnl
+
+AC_ARG_WITH([kpathsea],
+ [AS_HELP_STRING([--with-kpathsea=PREFIX], [Kpathsea is installed (under PREFIX)])],
+ [kpathsea=$withval], [kpathsea=])
+
+KPATHSEA_INCLUDES=
+KPATHSEA_LIBS=
+KPATHSEA_DEPEND=
+
+if test "x$kpathsea" != xno; then
+ SAVE_CPPFLAGS="$CPPFLAGS"; SAVE_LDFLAGS="$LDFLAGS"
+ if test "x$kpathsea" != x -a "x$kpathsea" != xyes; then
+ KPATHSEA_INCLUDES="-I$kpathsea/include"
+ KPATHSEA_LIBS="-L$kpathsea/lib"
+ else
+ kpathsea=yes
+ fi
+
+ dnl check for kpathsea/kpathsea.h
+ if true; then
+ CPPFLAGS="$SAVE_CPPFLAGS $KPATHSEA_INCLUDES"
+ AC_CHECK_HEADER([kpathsea/kpathsea.h], [kpse_header=yes], [kpse_header=no])
+ fi
+
+ dnl if not found and kpathsea prefix not set, check /usr/local
+ if test "x$kpse_header" != xyes -a "x$kpathsea" = xyes -a -r /usr/local/include/kpathsea/tex-file.h; then
+ KPATHSEA_INCLUDES="-I/usr/local/include"
+ KPATHSEA_LIBS="-L/usr/local/lib"
+ CPPFLAGS="$SAVE_CPPFLAGS $KPATHSEA_INCLUDES"
+ AC_CHECK_HEADER([kpathsea/tex-file.h], [kpse_header=yes], [kpse_header=no])
+ fi
+
+ dnl check for -lkpathsea
+ if true; then
+ LDFLAGS="$SAVE_LDFLAGS $KPATHSEA_LIBS"
+ AC_CHECK_LIB([kpathsea], [kpse_set_program_name], [kpse_library=yes], [kpse_library=no])
+ fi
+
+ dnl bail out if not found
+ if test "x$kpse_header" != xyes -o "x$kpse_library" != xyes; then
+ AC_MSG_ERROR([
+=========================================
+
+I can't find the kpathsea library and/or header files. Tell me where to look
+using the --with-kpathsea=PREFIX option (header files should be under
+PREFIX/include/kpathsea, and library under PREFIX/lib), or disable support
+using --without-kpathsea.
+
+=========================================])
+ fi
+
+ dnl OK, found
+ AC_DEFINE(HAVE_KPATHSEA, 1, [Define if you want to use kpathsea.])
+ if true; then
+ KPATHSEA_LIBS="$KPATHSEA_LIBS -lkpathsea"
+ fi
+
+ dnl does it have opentype support?
+ if false; then
+ AC_DEFINE(HAVE_DECL_KPSE_OPENTYPE_FORMAT)
+ else
+ AC_CHECK_DECLS([kpse_opentype_format], [], [], [#include <kpathsea/kpathsea.h>])
+ fi
+
+ dnl does it have a separate format for encoding files?
+ AC_CHECK_DECLS([kpse_enc_format], [], [], [#include <kpathsea/kpathsea.h>])
+
+ CPPFLAGS="$SAVE_CPPFLAGS"; LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+AM_CONDITIONAL([have_kpathsea], [test "x$with_kpathsea" != xno])
+AC_SUBST([KPATHSEA_INCLUDES])
+AC_SUBST([KPATHSEA_LIBS])
+AC_SUBST([KPATHSEA_DEPEND])
+
+AC_ARG_ENABLE([selfauto-set],
+ [AS_HELP_STRING([--disable-selfauto-set], [disable setting SELFAUTO variables from kpsewhich])],
+ [], [enable_selfauto_set=yes])
+
+if test "x$enable_selfauto_set" = xyes -a "x$kpathsea" != xno; then
+ kpsewhich='kpsewhich'
+ test "x$kpathsea" != xyes -a -x "$kpathsea/bin/kpsewhich" && kpsewhich="$kpathsea/bin/kpsewhich"
+ SELFAUTOLOC="`$kpsewhich --expand-var='$SELFAUTOLOC' 2>/dev/null`"
+ SELFAUTODIR="`$kpsewhich --expand-var='$SELFAUTODIR' 2>/dev/null`"
+ SELFAUTOPARENT="`$kpsewhich --expand-var='$SELFAUTOPARENT' 2>/dev/null`"
+ SELFAUTOGRANDPARENT="`$kpsewhich --expand-var='$SELFAUTOGRANDPARENT' 2>/dev/null`"
+ if test -z "$SELFAUTODIR"; then
+ AC_MSG_WARN([
+=========================================
+
+Could not extract SELFAUTO variables from $kpsewhich.
+Either supply the correct PREFIX to --with-kpathsea, or supply
+--disable-selfauto-loc.
+
+=========================================])
+ fi
+ AC_DEFINE_UNQUOTED([SELFAUTOLOC], "$SELFAUTOLOC", [kpsewhich's $SELFAUTOLOC variable])
+ AC_DEFINE_UNQUOTED([SELFAUTODIR], "$SELFAUTODIR", [kpsewhich's $SELFAUTODIR variable])
+ AC_DEFINE_UNQUOTED([SELFAUTOPARENT], "$SELFAUTOPARENT", [kpsewhich's $SELFAUTOPARENT variable])
+ if test -n "$SELFAUTOGRANDPARENT" -a "$SELFAUTOGRANDPARENT" != '$SELFAUTOGRANDPARENT'; then
+ AC_DEFINE_UNQUOTED([SELFAUTOGRANDPARENT], "$SELFAUTOGRANDPARENT", [kpsewhich's $SELFAUTOGRANDPARENT variable])
+ fi
+fi
+
+
+dnl
+dnl glyphlist.txt and *.enc installation locations
+dnl
+
+AC_ARG_ENABLE([glyphlistdir],
+ [AS_HELP_STRING([--enable-glyphlistdir=DIR], [store glyphlist.txt files in DIR [pkgdatadir]])], [glyphlistdir="$enableval"], [glyphlistdir=NONE])
+AC_ARG_ENABLE([encdir],
+ [AS_HELP_STRING([--enable-encdir=DIR], [store encoding files in DIR [pkgdatadir]])], [encdir="$enableval"], [encdir=NONE])
+
+test "x$glyphlistdir" = xNONE -o "x$glyphlistdir" = xno \
+ -o "x$glyphlistdir" = x && glyphlistdir='${pkgdatadir}'
+test "x$encdir" = xNONE -o "x$encdir" = xno \
+ -o "x$encdir" = x && encdir='${pkgdatadir}'
+
+AC_SUBST([glyphlistdir])
+AC_SUBST([encdir])
+
+
+dnl
+dnl TeX Live build stub
+dnl
+
+KPATHSEA_RULE=
+AC_SUBST([KPATHSEA_RULE])
+
+
+dnl
+dnl verbatim portions of the header
+dnl
+
+AC_DEFINE(HAVE_PERMSTRING, 1, [Define if PermStrings are available.])
+AC_DEFINE(MMAFM_RUN_MMPFB, 1, [Define to 0 if you don't want mmafm to run mmpfb when it needs to get an intermediate master conversion program.])
+dnl PATHNAME_SEPARATOR?
+
+
+dnl
+dnl set path variables
+dnl
+
+shell_expand () {
+ val=`eval echo '$'"$1"`
+ while echo "x$val" | grep '\$' >/dev/null 2>&1; do val=`eval echo "$val"`; done
+ val=`echo "$val" | sed 's,//*,/,g'`
+ eval "$1='$val'"
+}
+
+dnl Preset $prefix and $exec_prefix.
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+pkgdatadir="${datadir}/$PACKAGE"
+gdir="$glyphlistdir"
+for i in data dataroot pkgdata g; do shell_expand ${i}dir; done
+AC_DEFINE_UNQUOTED([GLYPHLISTDIR], ["$gdir"], [Directory for glyphlist.txt files.])
+
+
+dnl
+dnl Output
+dnl
+
+AC_OUTPUT(Makefile liblcdf/Makefile libefont/Makefile cfftot1/Makefile mmafm/Makefile mmpfb/Makefile otfinfo/Makefile otftotfm/Makefile t1dotlessj/Makefile t1lint/Makefile t1rawafm/Makefile t1reencode/Makefile t1testpage/Makefile ttftotype42/Makefile)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphlist.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphlist.txt
new file mode 100644
index 00000000000..dcc9573c324
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphlist.txt
@@ -0,0 +1,4305 @@
+# -----------------------------------------------------------
+# Copyright 2002, 2010, 2015 Adobe Systems Incorporated.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you
+# may not use this file except in compliance with the License. You may
+# obtain a copy of the License at
+# http://www.apache.org/licenses/LICENSE-2.0.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+# -----------------------------------------------------------
+# Name: Adobe Glyph List
+# Table version: 2.0
+# Date: September 20, 2002
+# URL: https://github.com/adobe-type-tools/agl-aglfn
+#
+# Format: two semicolon-delimited fields:
+# (1) glyph name--upper/lowercase letters and digits
+# (2) Unicode scalar value--four uppercase hexadecimal digits
+#
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+#END
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphtounicode.tex b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphtounicode.tex
new file mode 100644
index 00000000000..adaf8c82fc1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/glyphtounicode.tex
@@ -0,0 +1,5511 @@
+% lcdf-typetools glyphtounicode.tex, Version 2.95
+% Contents: Glyph mapping information for pdftex, used for PDF searching
+% Generated from:
+% - glyphlist.txt, Version 2.0
+% - texglyphlist.txt, Version 2.95
+% - texglyphlist-g2u.txt, Version 2.95
+\pdfglyphtounicode{A}{0041}
+\pdfglyphtounicode{AE}{00C6}
+\pdfglyphtounicode{AEacute}{01FC}
+\pdfglyphtounicode{AEmacron}{01E2}
+\pdfglyphtounicode{AEsmall}{00E6}
+\pdfglyphtounicode{Aacute}{00C1}
+\pdfglyphtounicode{Aacutesmall}{00E1}
+\pdfglyphtounicode{Abreve}{0102}
+\pdfglyphtounicode{Abreveacute}{1EAE}
+\pdfglyphtounicode{Abrevecyrillic}{04D0}
+\pdfglyphtounicode{Abrevedotbelow}{1EB6}
+\pdfglyphtounicode{Abrevegrave}{1EB0}
+\pdfglyphtounicode{Abrevehookabove}{1EB2}
+\pdfglyphtounicode{Abrevetilde}{1EB4}
+\pdfglyphtounicode{Acaron}{01CD}
+\pdfglyphtounicode{Acircle}{24B6}
+\pdfglyphtounicode{Acircumflex}{00C2}
+\pdfglyphtounicode{Acircumflexacute}{1EA4}
+\pdfglyphtounicode{Acircumflexdotbelow}{1EAC}
+\pdfglyphtounicode{Acircumflexgrave}{1EA6}
+\pdfglyphtounicode{Acircumflexhookabove}{1EA8}
+\pdfglyphtounicode{Acircumflexsmall}{00E2}
+\pdfglyphtounicode{Acircumflextilde}{1EAA}
+\pdfglyphtounicode{Acute}{00B4}
+\pdfglyphtounicode{Acutesmall}{00B4}
+\pdfglyphtounicode{Acyrillic}{0410}
+\pdfglyphtounicode{Adblgrave}{0200}
+\pdfglyphtounicode{Adieresis}{00C4}
+\pdfglyphtounicode{Adieresiscyrillic}{04D2}
+\pdfglyphtounicode{Adieresismacron}{01DE}
+\pdfglyphtounicode{Adieresissmall}{00E4}
+\pdfglyphtounicode{Adotbelow}{1EA0}
+\pdfglyphtounicode{Adotmacron}{01E0}
+\pdfglyphtounicode{Agrave}{00C0}
+\pdfglyphtounicode{Agravesmall}{00E0}
+\pdfglyphtounicode{Ahookabove}{1EA2}
+\pdfglyphtounicode{Aiecyrillic}{04D4}
+\pdfglyphtounicode{Ainvertedbreve}{0202}
+\pdfglyphtounicode{Alpha}{0391}
+\pdfglyphtounicode{Alphatonos}{0386}
+\pdfglyphtounicode{Amacron}{0100}
+\pdfglyphtounicode{Amonospace}{FF21}
+\pdfglyphtounicode{Aogonek}{0104}
+\pdfglyphtounicode{Aring}{00C5}
+\pdfglyphtounicode{Aringacute}{01FA}
+\pdfglyphtounicode{Aringbelow}{1E00}
+\pdfglyphtounicode{Aringsmall}{00E5}
+\pdfglyphtounicode{Asmall}{0061}
+\pdfglyphtounicode{Atilde}{00C3}
+\pdfglyphtounicode{Atildesmall}{00E3}
+\pdfglyphtounicode{Aybarmenian}{0531}
+\pdfglyphtounicode{B}{0042}
+\pdfglyphtounicode{Bcircle}{24B7}
+\pdfglyphtounicode{Bdotaccent}{1E02}
+\pdfglyphtounicode{Bdotbelow}{1E04}
+\pdfglyphtounicode{Becyrillic}{0411}
+\pdfglyphtounicode{Benarmenian}{0532}
+\pdfglyphtounicode{Beta}{0392}
+\pdfglyphtounicode{Bhook}{0181}
+\pdfglyphtounicode{Blinebelow}{1E06}
+\pdfglyphtounicode{Bmonospace}{FF22}
+\pdfglyphtounicode{Brevesmall}{02D8}
+\pdfglyphtounicode{Bsmall}{0062}
+\pdfglyphtounicode{Btopbar}{0182}
+\pdfglyphtounicode{C}{0043}
+\pdfglyphtounicode{Caarmenian}{053E}
+\pdfglyphtounicode{Cacute}{0106}
+\pdfglyphtounicode{Caron}{02C7}
+\pdfglyphtounicode{Caronsmall}{02C7}
+\pdfglyphtounicode{Ccaron}{010C}
+\pdfglyphtounicode{Ccedilla}{00C7}
+\pdfglyphtounicode{Ccedillaacute}{1E08}
+\pdfglyphtounicode{Ccedillasmall}{00E7}
+\pdfglyphtounicode{Ccircle}{24B8}
+\pdfglyphtounicode{Ccircumflex}{0108}
+\pdfglyphtounicode{Cdot}{010A}
+\pdfglyphtounicode{Cdotaccent}{010A}
+\pdfglyphtounicode{Cedillasmall}{00B8}
+\pdfglyphtounicode{Chaarmenian}{0549}
+\pdfglyphtounicode{Cheabkhasiancyrillic}{04BC}
+\pdfglyphtounicode{Checyrillic}{0427}
+\pdfglyphtounicode{Chedescenderabkhasiancyrillic}{04BE}
+\pdfglyphtounicode{Chedescendercyrillic}{04B6}
+\pdfglyphtounicode{Chedieresiscyrillic}{04F4}
+\pdfglyphtounicode{Cheharmenian}{0543}
+\pdfglyphtounicode{Chekhakassiancyrillic}{04CB}
+\pdfglyphtounicode{Cheverticalstrokecyrillic}{04B8}
+\pdfglyphtounicode{Chi}{03A7}
+\pdfglyphtounicode{Chook}{0187}
+\pdfglyphtounicode{Circumflexsmall}{02C6}
+\pdfglyphtounicode{Cmonospace}{FF23}
+\pdfglyphtounicode{Coarmenian}{0551}
+\pdfglyphtounicode{Csmall}{0063}
+\pdfglyphtounicode{D}{0044}
+\pdfglyphtounicode{DZ}{01F1}
+\pdfglyphtounicode{DZcaron}{01C4}
+\pdfglyphtounicode{Daarmenian}{0534}
+\pdfglyphtounicode{Dafrican}{0189}
+\pdfglyphtounicode{Dbar}{0110}
+\pdfglyphtounicode{Dcaron}{010E}
+\pdfglyphtounicode{Dcedilla}{1E10}
+\pdfglyphtounicode{Dcircle}{24B9}
+\pdfglyphtounicode{Dcircumflexbelow}{1E12}
+\pdfglyphtounicode{Dcroat}{0110}
+\pdfglyphtounicode{Ddotaccent}{1E0A}
+\pdfglyphtounicode{Ddotbelow}{1E0C}
+\pdfglyphtounicode{Decyrillic}{0414}
+\pdfglyphtounicode{Deicoptic}{03EE}
+\pdfglyphtounicode{Delta}{2206}
+\pdfglyphtounicode{Deltagreek}{0394}
+\pdfglyphtounicode{Dhook}{018A}
+\pdfglyphtounicode{Dieresis}{00A8}
+\pdfglyphtounicode{DieresisAcute}{F6CC}
+\pdfglyphtounicode{DieresisGrave}{F6CD}
+\pdfglyphtounicode{Dieresissmall}{00A8}
+\pdfglyphtounicode{Digamma}{D875 DFCB}
+\pdfglyphtounicode{Digammagreek}{03DC}
+\pdfglyphtounicode{Djecyrillic}{0402}
+\pdfglyphtounicode{Dlinebelow}{1E0E}
+\pdfglyphtounicode{Dmonospace}{FF24}
+\pdfglyphtounicode{Dotaccentsmall}{02D9}
+\pdfglyphtounicode{Dslash}{0110}
+\pdfglyphtounicode{Dsmall}{0064}
+\pdfglyphtounicode{Dtopbar}{018B}
+\pdfglyphtounicode{Dz}{01F2}
+\pdfglyphtounicode{Dzcaron}{01C5}
+\pdfglyphtounicode{Dzeabkhasiancyrillic}{04E0}
+\pdfglyphtounicode{Dzecyrillic}{0405}
+\pdfglyphtounicode{Dzhecyrillic}{040F}
+\pdfglyphtounicode{E}{0045}
+\pdfglyphtounicode{Eacute}{00C9}
+\pdfglyphtounicode{Eacutesmall}{00E9}
+\pdfglyphtounicode{Ebreve}{0114}
+\pdfglyphtounicode{Ecaron}{011A}
+\pdfglyphtounicode{Ecedillabreve}{1E1C}
+\pdfglyphtounicode{Echarmenian}{0535}
+\pdfglyphtounicode{Ecircle}{24BA}
+\pdfglyphtounicode{Ecircumflex}{00CA}
+\pdfglyphtounicode{Ecircumflexacute}{1EBE}
+\pdfglyphtounicode{Ecircumflexbelow}{1E18}
+\pdfglyphtounicode{Ecircumflexdotbelow}{1EC6}
+\pdfglyphtounicode{Ecircumflexgrave}{1EC0}
+\pdfglyphtounicode{Ecircumflexhookabove}{1EC2}
+\pdfglyphtounicode{Ecircumflexsmall}{00EA}
+\pdfglyphtounicode{Ecircumflextilde}{1EC4}
+\pdfglyphtounicode{Ecyrillic}{0404}
+\pdfglyphtounicode{Edblgrave}{0204}
+\pdfglyphtounicode{Edieresis}{00CB}
+\pdfglyphtounicode{Edieresissmall}{00EB}
+\pdfglyphtounicode{Edot}{0116}
+\pdfglyphtounicode{Edotaccent}{0116}
+\pdfglyphtounicode{Edotbelow}{1EB8}
+\pdfglyphtounicode{Efcyrillic}{0424}
+\pdfglyphtounicode{Egrave}{00C8}
+\pdfglyphtounicode{Egravesmall}{00E8}
+\pdfglyphtounicode{Eharmenian}{0537}
+\pdfglyphtounicode{Ehookabove}{1EBA}
+\pdfglyphtounicode{Eightroman}{2167}
+\pdfglyphtounicode{Einvertedbreve}{0206}
+\pdfglyphtounicode{Eiotifiedcyrillic}{0464}
+\pdfglyphtounicode{Elcyrillic}{041B}
+\pdfglyphtounicode{Elevenroman}{216A}
+\pdfglyphtounicode{Emacron}{0112}
+\pdfglyphtounicode{Emacronacute}{1E16}
+\pdfglyphtounicode{Emacrongrave}{1E14}
+\pdfglyphtounicode{Emcyrillic}{041C}
+\pdfglyphtounicode{Emonospace}{FF25}
+\pdfglyphtounicode{Encyrillic}{041D}
+\pdfglyphtounicode{Endescendercyrillic}{04A2}
+\pdfglyphtounicode{Eng}{014A}
+\pdfglyphtounicode{Enghecyrillic}{04A4}
+\pdfglyphtounicode{Enhookcyrillic}{04C7}
+\pdfglyphtounicode{Eogonek}{0118}
+\pdfglyphtounicode{Eopen}{0190}
+\pdfglyphtounicode{Epsilon}{0395}
+\pdfglyphtounicode{Epsilontonos}{0388}
+\pdfglyphtounicode{Ercyrillic}{0420}
+\pdfglyphtounicode{Ereversed}{018E}
+\pdfglyphtounicode{Ereversedcyrillic}{042D}
+\pdfglyphtounicode{Escyrillic}{0421}
+\pdfglyphtounicode{Esdescendercyrillic}{04AA}
+\pdfglyphtounicode{Esh}{01A9}
+\pdfglyphtounicode{Esmall}{0065}
+\pdfglyphtounicode{Eta}{0397}
+\pdfglyphtounicode{Etarmenian}{0538}
+\pdfglyphtounicode{Etatonos}{0389}
+\pdfglyphtounicode{Eth}{00D0}
+\pdfglyphtounicode{Ethsmall}{00F0}
+\pdfglyphtounicode{Etilde}{1EBC}
+\pdfglyphtounicode{Etildebelow}{1E1A}
+\pdfglyphtounicode{Euro}{20AC}
+\pdfglyphtounicode{Ezh}{01B7}
+\pdfglyphtounicode{Ezhcaron}{01EE}
+\pdfglyphtounicode{Ezhreversed}{01B8}
+\pdfglyphtounicode{F}{0046}
+\pdfglyphtounicode{FFIsmall}{0066 0066 0069}
+\pdfglyphtounicode{FFLsmall}{0066 0066 006C}
+\pdfglyphtounicode{FFsmall}{0066 0066}
+\pdfglyphtounicode{FIsmall}{0066 0069}
+\pdfglyphtounicode{FLsmall}{0066 006C}
+\pdfglyphtounicode{Fcircle}{24BB}
+\pdfglyphtounicode{Fdotaccent}{1E1E}
+\pdfglyphtounicode{Feharmenian}{0556}
+\pdfglyphtounicode{Feicoptic}{03E4}
+\pdfglyphtounicode{Fhook}{0191}
+\pdfglyphtounicode{Finv}{2132}
+\pdfglyphtounicode{Fitacyrillic}{0472}
+\pdfglyphtounicode{Fiveroman}{2164}
+\pdfglyphtounicode{Fmonospace}{FF26}
+\pdfglyphtounicode{Fourroman}{2163}
+\pdfglyphtounicode{Fsmall}{0066}
+\pdfglyphtounicode{G}{0047}
+\pdfglyphtounicode{GBsquare}{3387}
+\pdfglyphtounicode{Gacute}{01F4}
+\pdfglyphtounicode{Gamma}{0393}
+\pdfglyphtounicode{Gammaafrican}{0194}
+\pdfglyphtounicode{Gangiacoptic}{03EA}
+\pdfglyphtounicode{Gbreve}{011E}
+\pdfglyphtounicode{Gcaron}{01E6}
+\pdfglyphtounicode{Gcedilla}{0122}
+\pdfglyphtounicode{Gcircle}{24BC}
+\pdfglyphtounicode{Gcircumflex}{011C}
+\pdfglyphtounicode{Gcommaaccent}{0122}
+\pdfglyphtounicode{Gdot}{0120}
+\pdfglyphtounicode{Gdotaccent}{0120}
+\pdfglyphtounicode{Gecyrillic}{0413}
+\pdfglyphtounicode{Germandbls}{0053 0053}
+\pdfglyphtounicode{Germandblssmall}{0073 0073}
+\pdfglyphtounicode{Ghadarmenian}{0542}
+\pdfglyphtounicode{Ghemiddlehookcyrillic}{0494}
+\pdfglyphtounicode{Ghestrokecyrillic}{0492}
+\pdfglyphtounicode{Gheupturncyrillic}{0490}
+\pdfglyphtounicode{Ghook}{0193}
+\pdfglyphtounicode{Gimarmenian}{0533}
+\pdfglyphtounicode{Gjecyrillic}{0403}
+\pdfglyphtounicode{Gmacron}{1E20}
+\pdfglyphtounicode{Gmir}{2141}
+\pdfglyphtounicode{Gmonospace}{FF27}
+\pdfglyphtounicode{Grave}{0060}
+\pdfglyphtounicode{Gravesmall}{0060}
+\pdfglyphtounicode{Gsmall}{0067}
+\pdfglyphtounicode{Gsmallhook}{029B}
+\pdfglyphtounicode{Gstroke}{01E4}
+\pdfglyphtounicode{H}{0048}
+\pdfglyphtounicode{H18533}{25CF}
+\pdfglyphtounicode{H18543}{25AA}
+\pdfglyphtounicode{H18551}{25AB}
+\pdfglyphtounicode{H22073}{25A1}
+\pdfglyphtounicode{HPsquare}{33CB}
+\pdfglyphtounicode{Haabkhasiancyrillic}{04A8}
+\pdfglyphtounicode{Hadescendercyrillic}{04B2}
+\pdfglyphtounicode{Hardsigncyrillic}{042A}
+\pdfglyphtounicode{Hbar}{0126}
+\pdfglyphtounicode{Hbrevebelow}{1E2A}
+\pdfglyphtounicode{Hcedilla}{1E28}
+\pdfglyphtounicode{Hcircle}{24BD}
+\pdfglyphtounicode{Hcircumflex}{0124}
+\pdfglyphtounicode{Hdieresis}{1E26}
+\pdfglyphtounicode{Hdotaccent}{1E22}
+\pdfglyphtounicode{Hdotbelow}{1E24}
+\pdfglyphtounicode{Hmonospace}{FF28}
+\pdfglyphtounicode{Hoarmenian}{0540}
+\pdfglyphtounicode{Horicoptic}{03E8}
+\pdfglyphtounicode{Hsmall}{0068}
+\pdfglyphtounicode{Hungarumlaut}{02DD}
+\pdfglyphtounicode{Hungarumlautsmall}{02DD}
+\pdfglyphtounicode{Hzsquare}{3390}
+\pdfglyphtounicode{I}{0049}
+\pdfglyphtounicode{IAcyrillic}{042F}
+\pdfglyphtounicode{IJ}{0132}
+\pdfglyphtounicode{IUcyrillic}{042E}
+\pdfglyphtounicode{Iacute}{00CD}
+\pdfglyphtounicode{Iacutesmall}{00ED}
+\pdfglyphtounicode{Ibreve}{012C}
+\pdfglyphtounicode{Icaron}{01CF}
+\pdfglyphtounicode{Icircle}{24BE}
+\pdfglyphtounicode{Icircumflex}{00CE}
+\pdfglyphtounicode{Icircumflexsmall}{00EE}
+\pdfglyphtounicode{Icyrillic}{0406}
+\pdfglyphtounicode{Idblgrave}{0208}
+\pdfglyphtounicode{Idieresis}{00CF}
+\pdfglyphtounicode{Idieresisacute}{1E2E}
+\pdfglyphtounicode{Idieresiscyrillic}{04E4}
+\pdfglyphtounicode{Idieresissmall}{00EF}
+\pdfglyphtounicode{Idot}{0130}
+\pdfglyphtounicode{Idotaccent}{0130}
+\pdfglyphtounicode{Idotbelow}{1ECA}
+\pdfglyphtounicode{Iebrevecyrillic}{04D6}
+\pdfglyphtounicode{Iecyrillic}{0415}
+\pdfglyphtounicode{Ifractur}{2111}
+\pdfglyphtounicode{Ifraktur}{2111}
+\pdfglyphtounicode{Igrave}{00CC}
+\pdfglyphtounicode{Igravesmall}{00EC}
+\pdfglyphtounicode{Ihookabove}{1EC8}
+\pdfglyphtounicode{Iicyrillic}{0418}
+\pdfglyphtounicode{Iinvertedbreve}{020A}
+\pdfglyphtounicode{Iishortcyrillic}{0419}
+\pdfglyphtounicode{Imacron}{012A}
+\pdfglyphtounicode{Imacroncyrillic}{04E2}
+\pdfglyphtounicode{Imonospace}{FF29}
+\pdfglyphtounicode{Iniarmenian}{053B}
+\pdfglyphtounicode{Iocyrillic}{0401}
+\pdfglyphtounicode{Iogonek}{012E}
+\pdfglyphtounicode{Iota}{0399}
+\pdfglyphtounicode{Iotaafrican}{0196}
+\pdfglyphtounicode{Iotadieresis}{03AA}
+\pdfglyphtounicode{Iotatonos}{038A}
+\pdfglyphtounicode{Ismall}{0069}
+\pdfglyphtounicode{Istroke}{0197}
+\pdfglyphtounicode{Itilde}{0128}
+\pdfglyphtounicode{Itildebelow}{1E2C}
+\pdfglyphtounicode{Izhitsacyrillic}{0474}
+\pdfglyphtounicode{Izhitsadblgravecyrillic}{0476}
+\pdfglyphtounicode{J}{004A}
+\pdfglyphtounicode{Jaarmenian}{0541}
+\pdfglyphtounicode{Jcircle}{24BF}
+\pdfglyphtounicode{Jcircumflex}{0134}
+\pdfglyphtounicode{Jecyrillic}{0408}
+\pdfglyphtounicode{Jheharmenian}{054B}
+\pdfglyphtounicode{Jmonospace}{FF2A}
+\pdfglyphtounicode{Jsmall}{006A}
+\pdfglyphtounicode{K}{004B}
+\pdfglyphtounicode{KBsquare}{3385}
+\pdfglyphtounicode{KKsquare}{33CD}
+\pdfglyphtounicode{Kabashkircyrillic}{04A0}
+\pdfglyphtounicode{Kacute}{1E30}
+\pdfglyphtounicode{Kacyrillic}{041A}
+\pdfglyphtounicode{Kadescendercyrillic}{049A}
+\pdfglyphtounicode{Kahookcyrillic}{04C3}
+\pdfglyphtounicode{Kappa}{039A}
+\pdfglyphtounicode{Kastrokecyrillic}{049E}
+\pdfglyphtounicode{Kaverticalstrokecyrillic}{049C}
+\pdfglyphtounicode{Kcaron}{01E8}
+\pdfglyphtounicode{Kcedilla}{0136}
+\pdfglyphtounicode{Kcircle}{24C0}
+\pdfglyphtounicode{Kcommaaccent}{0136}
+\pdfglyphtounicode{Kdotbelow}{1E32}
+\pdfglyphtounicode{Keharmenian}{0554}
+\pdfglyphtounicode{Kenarmenian}{053F}
+\pdfglyphtounicode{Khacyrillic}{0425}
+\pdfglyphtounicode{Kheicoptic}{03E6}
+\pdfglyphtounicode{Khook}{0198}
+\pdfglyphtounicode{Kjecyrillic}{040C}
+\pdfglyphtounicode{Klinebelow}{1E34}
+\pdfglyphtounicode{Kmonospace}{FF2B}
+\pdfglyphtounicode{Koppacyrillic}{0480}
+\pdfglyphtounicode{Koppagreek}{03DE}
+\pdfglyphtounicode{Ksicyrillic}{046E}
+\pdfglyphtounicode{Ksmall}{006B}
+\pdfglyphtounicode{L}{004C}
+\pdfglyphtounicode{LJ}{01C7}
+\pdfglyphtounicode{LL}{004C 004C}
+\pdfglyphtounicode{Lacute}{0139}
+\pdfglyphtounicode{Lambda}{039B}
+\pdfglyphtounicode{Lcaron}{013D}
+\pdfglyphtounicode{Lcedilla}{013B}
+\pdfglyphtounicode{Lcircle}{24C1}
+\pdfglyphtounicode{Lcircumflexbelow}{1E3C}
+\pdfglyphtounicode{Lcommaaccent}{013B}
+\pdfglyphtounicode{Ldot}{013F}
+\pdfglyphtounicode{Ldotaccent}{013F}
+\pdfglyphtounicode{Ldotbelow}{1E36}
+\pdfglyphtounicode{Ldotbelowmacron}{1E38}
+\pdfglyphtounicode{Liwnarmenian}{053C}
+\pdfglyphtounicode{Lj}{01C8}
+\pdfglyphtounicode{Ljecyrillic}{0409}
+\pdfglyphtounicode{Llinebelow}{1E3A}
+\pdfglyphtounicode{Lmonospace}{FF2C}
+\pdfglyphtounicode{Lslash}{0141}
+\pdfglyphtounicode{Lslashsmall}{0142}
+\pdfglyphtounicode{Lsmall}{006C}
+\pdfglyphtounicode{M}{004D}
+\pdfglyphtounicode{MBsquare}{3386}
+\pdfglyphtounicode{Macron}{00AF}
+\pdfglyphtounicode{Macronsmall}{00AF}
+\pdfglyphtounicode{Macute}{1E3E}
+\pdfglyphtounicode{Mcircle}{24C2}
+\pdfglyphtounicode{Mdotaccent}{1E40}
+\pdfglyphtounicode{Mdotbelow}{1E42}
+\pdfglyphtounicode{Menarmenian}{0544}
+\pdfglyphtounicode{Mmonospace}{FF2D}
+\pdfglyphtounicode{Msmall}{006D}
+\pdfglyphtounicode{Mturned}{019C}
+\pdfglyphtounicode{Mu}{039C}
+\pdfglyphtounicode{N}{004E}
+\pdfglyphtounicode{NJ}{01CA}
+\pdfglyphtounicode{Nacute}{0143}
+\pdfglyphtounicode{Ncaron}{0147}
+\pdfglyphtounicode{Ncedilla}{0145}
+\pdfglyphtounicode{Ncircle}{24C3}
+\pdfglyphtounicode{Ncircumflexbelow}{1E4A}
+\pdfglyphtounicode{Ncommaaccent}{0145}
+\pdfglyphtounicode{Ndotaccent}{1E44}
+\pdfglyphtounicode{Ndotbelow}{1E46}
+\pdfglyphtounicode{Ng}{014A}
+\pdfglyphtounicode{Nhookleft}{019D}
+\pdfglyphtounicode{Nineroman}{2168}
+\pdfglyphtounicode{Nj}{01CB}
+\pdfglyphtounicode{Njecyrillic}{040A}
+\pdfglyphtounicode{Nlinebelow}{1E48}
+\pdfglyphtounicode{Nmonospace}{FF2E}
+\pdfglyphtounicode{Nowarmenian}{0546}
+\pdfglyphtounicode{Nsmall}{006E}
+\pdfglyphtounicode{Ntilde}{00D1}
+\pdfglyphtounicode{Ntildesmall}{00F1}
+\pdfglyphtounicode{Nu}{039D}
+\pdfglyphtounicode{O}{004F}
+\pdfglyphtounicode{OE}{0152}
+\pdfglyphtounicode{OEsmall}{0153}
+\pdfglyphtounicode{Oacute}{00D3}
+\pdfglyphtounicode{Oacutesmall}{00F3}
+\pdfglyphtounicode{Obarredcyrillic}{04E8}
+\pdfglyphtounicode{Obarreddieresiscyrillic}{04EA}
+\pdfglyphtounicode{Obreve}{014E}
+\pdfglyphtounicode{Ocaron}{01D1}
+\pdfglyphtounicode{Ocenteredtilde}{019F}
+\pdfglyphtounicode{Ocircle}{24C4}
+\pdfglyphtounicode{Ocircumflex}{00D4}
+\pdfglyphtounicode{Ocircumflexacute}{1ED0}
+\pdfglyphtounicode{Ocircumflexdotbelow}{1ED8}
+\pdfglyphtounicode{Ocircumflexgrave}{1ED2}
+\pdfglyphtounicode{Ocircumflexhookabove}{1ED4}
+\pdfglyphtounicode{Ocircumflexsmall}{00F4}
+\pdfglyphtounicode{Ocircumflextilde}{1ED6}
+\pdfglyphtounicode{Ocyrillic}{041E}
+\pdfglyphtounicode{Odblacute}{0150}
+\pdfglyphtounicode{Odblgrave}{020C}
+\pdfglyphtounicode{Odieresis}{00D6}
+\pdfglyphtounicode{Odieresiscyrillic}{04E6}
+\pdfglyphtounicode{Odieresissmall}{00F6}
+\pdfglyphtounicode{Odotbelow}{1ECC}
+\pdfglyphtounicode{Ogoneksmall}{02DB}
+\pdfglyphtounicode{Ograve}{00D2}
+\pdfglyphtounicode{Ogravesmall}{00F2}
+\pdfglyphtounicode{Oharmenian}{0555}
+\pdfglyphtounicode{Ohm}{2126}
+\pdfglyphtounicode{Ohookabove}{1ECE}
+\pdfglyphtounicode{Ohorn}{01A0}
+\pdfglyphtounicode{Ohornacute}{1EDA}
+\pdfglyphtounicode{Ohorndotbelow}{1EE2}
+\pdfglyphtounicode{Ohorngrave}{1EDC}
+\pdfglyphtounicode{Ohornhookabove}{1EDE}
+\pdfglyphtounicode{Ohorntilde}{1EE0}
+\pdfglyphtounicode{Ohungarumlaut}{0150}
+\pdfglyphtounicode{Oi}{01A2}
+\pdfglyphtounicode{Oinvertedbreve}{020E}
+\pdfglyphtounicode{Omacron}{014C}
+\pdfglyphtounicode{Omacronacute}{1E52}
+\pdfglyphtounicode{Omacrongrave}{1E50}
+\pdfglyphtounicode{Omega}{2126}
+\pdfglyphtounicode{Omegacyrillic}{0460}
+\pdfglyphtounicode{Omegagreek}{03A9}
+\pdfglyphtounicode{Omegainv}{2127}
+\pdfglyphtounicode{Omegaroundcyrillic}{047A}
+\pdfglyphtounicode{Omegatitlocyrillic}{047C}
+\pdfglyphtounicode{Omegatonos}{038F}
+\pdfglyphtounicode{Omicron}{039F}
+\pdfglyphtounicode{Omicrontonos}{038C}
+\pdfglyphtounicode{Omonospace}{FF2F}
+\pdfglyphtounicode{Oneroman}{2160}
+\pdfglyphtounicode{Oogonek}{01EA}
+\pdfglyphtounicode{Oogonekmacron}{01EC}
+\pdfglyphtounicode{Oopen}{0186}
+\pdfglyphtounicode{Oslash}{00D8}
+\pdfglyphtounicode{Oslashacute}{01FE}
+\pdfglyphtounicode{Oslashsmall}{00F8}
+\pdfglyphtounicode{Osmall}{006F}
+\pdfglyphtounicode{Ostrokeacute}{01FE}
+\pdfglyphtounicode{Otcyrillic}{047E}
+\pdfglyphtounicode{Otilde}{00D5}
+\pdfglyphtounicode{Otildeacute}{1E4C}
+\pdfglyphtounicode{Otildedieresis}{1E4E}
+\pdfglyphtounicode{Otildesmall}{00F5}
+\pdfglyphtounicode{P}{0050}
+\pdfglyphtounicode{Pacute}{1E54}
+\pdfglyphtounicode{Pcircle}{24C5}
+\pdfglyphtounicode{Pdotaccent}{1E56}
+\pdfglyphtounicode{Pecyrillic}{041F}
+\pdfglyphtounicode{Peharmenian}{054A}
+\pdfglyphtounicode{Pemiddlehookcyrillic}{04A6}
+\pdfglyphtounicode{Phi}{03A6}
+\pdfglyphtounicode{Phook}{01A4}
+\pdfglyphtounicode{Pi}{03A0}
+\pdfglyphtounicode{Piwrarmenian}{0553}
+\pdfglyphtounicode{Pmonospace}{FF30}
+\pdfglyphtounicode{Psi}{03A8}
+\pdfglyphtounicode{Psicyrillic}{0470}
+\pdfglyphtounicode{Psmall}{0070}
+\pdfglyphtounicode{Q}{0051}
+\pdfglyphtounicode{Qcircle}{24C6}
+\pdfglyphtounicode{Qmonospace}{FF31}
+\pdfglyphtounicode{Qsmall}{0071}
+\pdfglyphtounicode{R}{0052}
+\pdfglyphtounicode{Raarmenian}{054C}
+\pdfglyphtounicode{Racute}{0154}
+\pdfglyphtounicode{Rcaron}{0158}
+\pdfglyphtounicode{Rcedilla}{0156}
+\pdfglyphtounicode{Rcircle}{24C7}
+\pdfglyphtounicode{Rcommaaccent}{0156}
+\pdfglyphtounicode{Rdblgrave}{0210}
+\pdfglyphtounicode{Rdotaccent}{1E58}
+\pdfglyphtounicode{Rdotbelow}{1E5A}
+\pdfglyphtounicode{Rdotbelowmacron}{1E5C}
+\pdfglyphtounicode{Reharmenian}{0550}
+\pdfglyphtounicode{Rfractur}{211C}
+\pdfglyphtounicode{Rfraktur}{211C}
+\pdfglyphtounicode{Rho}{03A1}
+\pdfglyphtounicode{Ringsmall}{02DA}
+\pdfglyphtounicode{Rinvertedbreve}{0212}
+\pdfglyphtounicode{Rlinebelow}{1E5E}
+\pdfglyphtounicode{Rmonospace}{FF32}
+\pdfglyphtounicode{Rsmall}{0072}
+\pdfglyphtounicode{Rsmallinverted}{0281}
+\pdfglyphtounicode{Rsmallinvertedsuperior}{02B6}
+\pdfglyphtounicode{S}{0053}
+\pdfglyphtounicode{SF010000}{250C}
+\pdfglyphtounicode{SF020000}{2514}
+\pdfglyphtounicode{SF030000}{2510}
+\pdfglyphtounicode{SF040000}{2518}
+\pdfglyphtounicode{SF050000}{253C}
+\pdfglyphtounicode{SF060000}{252C}
+\pdfglyphtounicode{SF070000}{2534}
+\pdfglyphtounicode{SF080000}{251C}
+\pdfglyphtounicode{SF090000}{2524}
+\pdfglyphtounicode{SF100000}{2500}
+\pdfglyphtounicode{SF110000}{2502}
+\pdfglyphtounicode{SF190000}{2561}
+\pdfglyphtounicode{SF200000}{2562}
+\pdfglyphtounicode{SF210000}{2556}
+\pdfglyphtounicode{SF220000}{2555}
+\pdfglyphtounicode{SF230000}{2563}
+\pdfglyphtounicode{SF240000}{2551}
+\pdfglyphtounicode{SF250000}{2557}
+\pdfglyphtounicode{SF260000}{255D}
+\pdfglyphtounicode{SF270000}{255C}
+\pdfglyphtounicode{SF280000}{255B}
+\pdfglyphtounicode{SF360000}{255E}
+\pdfglyphtounicode{SF370000}{255F}
+\pdfglyphtounicode{SF380000}{255A}
+\pdfglyphtounicode{SF390000}{2554}
+\pdfglyphtounicode{SF400000}{2569}
+\pdfglyphtounicode{SF410000}{2566}
+\pdfglyphtounicode{SF420000}{2560}
+\pdfglyphtounicode{SF430000}{2550}
+\pdfglyphtounicode{SF440000}{256C}
+\pdfglyphtounicode{SF450000}{2567}
+\pdfglyphtounicode{SF460000}{2568}
+\pdfglyphtounicode{SF470000}{2564}
+\pdfglyphtounicode{SF480000}{2565}
+\pdfglyphtounicode{SF490000}{2559}
+\pdfglyphtounicode{SF500000}{2558}
+\pdfglyphtounicode{SF510000}{2552}
+\pdfglyphtounicode{SF520000}{2553}
+\pdfglyphtounicode{SF530000}{256B}
+\pdfglyphtounicode{SF540000}{256A}
+\pdfglyphtounicode{SS}{0053 0053}
+\pdfglyphtounicode{SSsmall}{0073 0073}
+\pdfglyphtounicode{Sacute}{015A}
+\pdfglyphtounicode{Sacutedotaccent}{1E64}
+\pdfglyphtounicode{Sampigreek}{03E0}
+\pdfglyphtounicode{Scaron}{0160}
+\pdfglyphtounicode{Scarondotaccent}{1E66}
+\pdfglyphtounicode{Scaronsmall}{0161}
+\pdfglyphtounicode{Scedilla}{015E}
+\pdfglyphtounicode{Schwa}{018F}
+\pdfglyphtounicode{Schwacyrillic}{04D8}
+\pdfglyphtounicode{Schwadieresiscyrillic}{04DA}
+\pdfglyphtounicode{Scircle}{24C8}
+\pdfglyphtounicode{Scircumflex}{015C}
+\pdfglyphtounicode{Scommaaccent}{0218}
+\pdfglyphtounicode{Sdotaccent}{1E60}
+\pdfglyphtounicode{Sdotbelow}{1E62}
+\pdfglyphtounicode{Sdotbelowdotaccent}{1E68}
+\pdfglyphtounicode{Seharmenian}{054D}
+\pdfglyphtounicode{Sevenroman}{2166}
+\pdfglyphtounicode{Shaarmenian}{0547}
+\pdfglyphtounicode{Shacyrillic}{0428}
+\pdfglyphtounicode{Shchacyrillic}{0429}
+\pdfglyphtounicode{Sheicoptic}{03E2}
+\pdfglyphtounicode{Shhacyrillic}{04BA}
+\pdfglyphtounicode{Shimacoptic}{03EC}
+\pdfglyphtounicode{Sigma}{03A3}
+\pdfglyphtounicode{Sixroman}{2165}
+\pdfglyphtounicode{Smonospace}{FF33}
+\pdfglyphtounicode{Softsigncyrillic}{042C}
+\pdfglyphtounicode{Ssmall}{0073}
+\pdfglyphtounicode{Stigmagreek}{03DA}
+\pdfglyphtounicode{T}{0054}
+\pdfglyphtounicode{Tau}{03A4}
+\pdfglyphtounicode{Tbar}{0166}
+\pdfglyphtounicode{Tcaron}{0164}
+\pdfglyphtounicode{Tcedilla}{0162}
+\pdfglyphtounicode{Tcircle}{24C9}
+\pdfglyphtounicode{Tcircumflexbelow}{1E70}
+\pdfglyphtounicode{Tcommaaccent}{0162}
+\pdfglyphtounicode{Tdotaccent}{1E6A}
+\pdfglyphtounicode{Tdotbelow}{1E6C}
+\pdfglyphtounicode{Tecyrillic}{0422}
+\pdfglyphtounicode{Tedescendercyrillic}{04AC}
+\pdfglyphtounicode{Tenroman}{2169}
+\pdfglyphtounicode{Tetsecyrillic}{04B4}
+\pdfglyphtounicode{Theta}{0398}
+\pdfglyphtounicode{Thook}{01AC}
+\pdfglyphtounicode{Thorn}{00DE}
+\pdfglyphtounicode{Thornsmall}{00FE}
+\pdfglyphtounicode{Threeroman}{2162}
+\pdfglyphtounicode{Tildesmall}{02DC}
+\pdfglyphtounicode{Tiwnarmenian}{054F}
+\pdfglyphtounicode{Tlinebelow}{1E6E}
+\pdfglyphtounicode{Tmonospace}{FF34}
+\pdfglyphtounicode{Toarmenian}{0539}
+\pdfglyphtounicode{Tonefive}{01BC}
+\pdfglyphtounicode{Tonesix}{0184}
+\pdfglyphtounicode{Tonetwo}{01A7}
+\pdfglyphtounicode{Tretroflexhook}{01AE}
+\pdfglyphtounicode{Tsecyrillic}{0426}
+\pdfglyphtounicode{Tshecyrillic}{040B}
+\pdfglyphtounicode{Tsmall}{0074}
+\pdfglyphtounicode{Twelveroman}{216B}
+\pdfglyphtounicode{Tworoman}{2161}
+\pdfglyphtounicode{U}{0055}
+\pdfglyphtounicode{Uacute}{00DA}
+\pdfglyphtounicode{Uacutesmall}{00FA}
+\pdfglyphtounicode{Ubreve}{016C}
+\pdfglyphtounicode{Ucaron}{01D3}
+\pdfglyphtounicode{Ucircle}{24CA}
+\pdfglyphtounicode{Ucircumflex}{00DB}
+\pdfglyphtounicode{Ucircumflexbelow}{1E76}
+\pdfglyphtounicode{Ucircumflexsmall}{00FB}
+\pdfglyphtounicode{Ucyrillic}{0423}
+\pdfglyphtounicode{Udblacute}{0170}
+\pdfglyphtounicode{Udblgrave}{0214}
+\pdfglyphtounicode{Udieresis}{00DC}
+\pdfglyphtounicode{Udieresisacute}{01D7}
+\pdfglyphtounicode{Udieresisbelow}{1E72}
+\pdfglyphtounicode{Udieresiscaron}{01D9}
+\pdfglyphtounicode{Udieresiscyrillic}{04F0}
+\pdfglyphtounicode{Udieresisgrave}{01DB}
+\pdfglyphtounicode{Udieresismacron}{01D5}
+\pdfglyphtounicode{Udieresissmall}{00FC}
+\pdfglyphtounicode{Udotbelow}{1EE4}
+\pdfglyphtounicode{Ugrave}{00D9}
+\pdfglyphtounicode{Ugravesmall}{00F9}
+\pdfglyphtounicode{Uhookabove}{1EE6}
+\pdfglyphtounicode{Uhorn}{01AF}
+\pdfglyphtounicode{Uhornacute}{1EE8}
+\pdfglyphtounicode{Uhorndotbelow}{1EF0}
+\pdfglyphtounicode{Uhorngrave}{1EEA}
+\pdfglyphtounicode{Uhornhookabove}{1EEC}
+\pdfglyphtounicode{Uhorntilde}{1EEE}
+\pdfglyphtounicode{Uhungarumlaut}{0170}
+\pdfglyphtounicode{Uhungarumlautcyrillic}{04F2}
+\pdfglyphtounicode{Uinvertedbreve}{0216}
+\pdfglyphtounicode{Ukcyrillic}{0478}
+\pdfglyphtounicode{Umacron}{016A}
+\pdfglyphtounicode{Umacroncyrillic}{04EE}
+\pdfglyphtounicode{Umacrondieresis}{1E7A}
+\pdfglyphtounicode{Umonospace}{FF35}
+\pdfglyphtounicode{Uogonek}{0172}
+\pdfglyphtounicode{Upsilon}{03A5}
+\pdfglyphtounicode{Upsilon1}{03D2}
+\pdfglyphtounicode{Upsilonacutehooksymbolgreek}{03D3}
+\pdfglyphtounicode{Upsilonafrican}{01B1}
+\pdfglyphtounicode{Upsilondieresis}{03AB}
+\pdfglyphtounicode{Upsilondieresishooksymbolgreek}{03D4}
+\pdfglyphtounicode{Upsilonhooksymbol}{03D2}
+\pdfglyphtounicode{Upsilontonos}{038E}
+\pdfglyphtounicode{Uring}{016E}
+\pdfglyphtounicode{Ushortcyrillic}{040E}
+\pdfglyphtounicode{Usmall}{0075}
+\pdfglyphtounicode{Ustraightcyrillic}{04AE}
+\pdfglyphtounicode{Ustraightstrokecyrillic}{04B0}
+\pdfglyphtounicode{Utilde}{0168}
+\pdfglyphtounicode{Utildeacute}{1E78}
+\pdfglyphtounicode{Utildebelow}{1E74}
+\pdfglyphtounicode{V}{0056}
+\pdfglyphtounicode{Vcircle}{24CB}
+\pdfglyphtounicode{Vdotbelow}{1E7E}
+\pdfglyphtounicode{Vecyrillic}{0412}
+\pdfglyphtounicode{Vewarmenian}{054E}
+\pdfglyphtounicode{Vhook}{01B2}
+\pdfglyphtounicode{Vmonospace}{FF36}
+\pdfglyphtounicode{Voarmenian}{0548}
+\pdfglyphtounicode{Vsmall}{0076}
+\pdfglyphtounicode{Vtilde}{1E7C}
+\pdfglyphtounicode{W}{0057}
+\pdfglyphtounicode{Wacute}{1E82}
+\pdfglyphtounicode{Wcircle}{24CC}
+\pdfglyphtounicode{Wcircumflex}{0174}
+\pdfglyphtounicode{Wdieresis}{1E84}
+\pdfglyphtounicode{Wdotaccent}{1E86}
+\pdfglyphtounicode{Wdotbelow}{1E88}
+\pdfglyphtounicode{Wgrave}{1E80}
+\pdfglyphtounicode{Wmonospace}{FF37}
+\pdfglyphtounicode{Wsmall}{0077}
+\pdfglyphtounicode{X}{0058}
+\pdfglyphtounicode{Xcircle}{24CD}
+\pdfglyphtounicode{Xdieresis}{1E8C}
+\pdfglyphtounicode{Xdotaccent}{1E8A}
+\pdfglyphtounicode{Xeharmenian}{053D}
+\pdfglyphtounicode{Xi}{039E}
+\pdfglyphtounicode{Xmonospace}{FF38}
+\pdfglyphtounicode{Xsmall}{0078}
+\pdfglyphtounicode{Y}{0059}
+\pdfglyphtounicode{Yacute}{00DD}
+\pdfglyphtounicode{Yacutesmall}{00FD}
+\pdfglyphtounicode{Yatcyrillic}{0462}
+\pdfglyphtounicode{Ycircle}{24CE}
+\pdfglyphtounicode{Ycircumflex}{0176}
+\pdfglyphtounicode{Ydieresis}{0178}
+\pdfglyphtounicode{Ydieresissmall}{00FF}
+\pdfglyphtounicode{Ydotaccent}{1E8E}
+\pdfglyphtounicode{Ydotbelow}{1EF4}
+\pdfglyphtounicode{Yen}{00A5}
+\pdfglyphtounicode{Yericyrillic}{042B}
+\pdfglyphtounicode{Yerudieresiscyrillic}{04F8}
+\pdfglyphtounicode{Ygrave}{1EF2}
+\pdfglyphtounicode{Yhook}{01B3}
+\pdfglyphtounicode{Yhookabove}{1EF6}
+\pdfglyphtounicode{Yiarmenian}{0545}
+\pdfglyphtounicode{Yicyrillic}{0407}
+\pdfglyphtounicode{Yiwnarmenian}{0552}
+\pdfglyphtounicode{Ymonospace}{FF39}
+\pdfglyphtounicode{Ysmall}{0079}
+\pdfglyphtounicode{Ytilde}{1EF8}
+\pdfglyphtounicode{Yusbigcyrillic}{046A}
+\pdfglyphtounicode{Yusbigiotifiedcyrillic}{046C}
+\pdfglyphtounicode{Yuslittlecyrillic}{0466}
+\pdfglyphtounicode{Yuslittleiotifiedcyrillic}{0468}
+\pdfglyphtounicode{Z}{005A}
+\pdfglyphtounicode{Zaarmenian}{0536}
+\pdfglyphtounicode{Zacute}{0179}
+\pdfglyphtounicode{Zcaron}{017D}
+\pdfglyphtounicode{Zcaronsmall}{017E}
+\pdfglyphtounicode{Zcircle}{24CF}
+\pdfglyphtounicode{Zcircumflex}{1E90}
+\pdfglyphtounicode{Zdot}{017B}
+\pdfglyphtounicode{Zdotaccent}{017B}
+\pdfglyphtounicode{Zdotbelow}{1E92}
+\pdfglyphtounicode{Zecyrillic}{0417}
+\pdfglyphtounicode{Zedescendercyrillic}{0498}
+\pdfglyphtounicode{Zedieresiscyrillic}{04DE}
+\pdfglyphtounicode{Zeta}{0396}
+\pdfglyphtounicode{Zhearmenian}{053A}
+\pdfglyphtounicode{Zhebrevecyrillic}{04C1}
+\pdfglyphtounicode{Zhecyrillic}{0416}
+\pdfglyphtounicode{Zhedescendercyrillic}{0496}
+\pdfglyphtounicode{Zhedieresiscyrillic}{04DC}
+\pdfglyphtounicode{Zlinebelow}{1E94}
+\pdfglyphtounicode{Zmonospace}{FF3A}
+\pdfglyphtounicode{Zsmall}{007A}
+\pdfglyphtounicode{Zstroke}{01B5}
+\pdfglyphtounicode{a}{0061}
+\pdfglyphtounicode{aabengali}{0986}
+\pdfglyphtounicode{aacute}{00E1}
+\pdfglyphtounicode{aadeva}{0906}
+\pdfglyphtounicode{aagujarati}{0A86}
+\pdfglyphtounicode{aagurmukhi}{0A06}
+\pdfglyphtounicode{aamatragurmukhi}{0A3E}
+\pdfglyphtounicode{aarusquare}{3303}
+\pdfglyphtounicode{aavowelsignbengali}{09BE}
+\pdfglyphtounicode{aavowelsigndeva}{093E}
+\pdfglyphtounicode{aavowelsigngujarati}{0ABE}
+\pdfglyphtounicode{abbreviationmarkarmenian}{055F}
+\pdfglyphtounicode{abbreviationsigndeva}{0970}
+\pdfglyphtounicode{abengali}{0985}
+\pdfglyphtounicode{abopomofo}{311A}
+\pdfglyphtounicode{abreve}{0103}
+\pdfglyphtounicode{abreveacute}{1EAF}
+\pdfglyphtounicode{abrevecyrillic}{04D1}
+\pdfglyphtounicode{abrevedotbelow}{1EB7}
+\pdfglyphtounicode{abrevegrave}{1EB1}
+\pdfglyphtounicode{abrevehookabove}{1EB3}
+\pdfglyphtounicode{abrevetilde}{1EB5}
+\pdfglyphtounicode{acaron}{01CE}
+\pdfglyphtounicode{acircle}{24D0}
+\pdfglyphtounicode{acircumflex}{00E2}
+\pdfglyphtounicode{acircumflexacute}{1EA5}
+\pdfglyphtounicode{acircumflexdotbelow}{1EAD}
+\pdfglyphtounicode{acircumflexgrave}{1EA7}
+\pdfglyphtounicode{acircumflexhookabove}{1EA9}
+\pdfglyphtounicode{acircumflextilde}{1EAB}
+\pdfglyphtounicode{acute}{00B4}
+\pdfglyphtounicode{acutebelowcmb}{0317}
+\pdfglyphtounicode{acutecmb}{0301}
+\pdfglyphtounicode{acutecomb}{0301}
+\pdfglyphtounicode{acutedeva}{0954}
+\pdfglyphtounicode{acutelowmod}{02CF}
+\pdfglyphtounicode{acutetonecmb}{0341}
+\pdfglyphtounicode{acyrillic}{0430}
+\pdfglyphtounicode{adblgrave}{0201}
+\pdfglyphtounicode{addakgurmukhi}{0A71}
+\pdfglyphtounicode{adeva}{0905}
+\pdfglyphtounicode{adieresis}{00E4}
+\pdfglyphtounicode{adieresiscyrillic}{04D3}
+\pdfglyphtounicode{adieresismacron}{01DF}
+\pdfglyphtounicode{adotbelow}{1EA1}
+\pdfglyphtounicode{adotmacron}{01E1}
+\pdfglyphtounicode{ae}{00E6}
+\pdfglyphtounicode{aeacute}{01FD}
+\pdfglyphtounicode{aekorean}{3150}
+\pdfglyphtounicode{aemacron}{01E3}
+\pdfglyphtounicode{afii00208}{2015}
+\pdfglyphtounicode{afii08941}{20A4}
+\pdfglyphtounicode{afii10017}{0410}
+\pdfglyphtounicode{afii10018}{0411}
+\pdfglyphtounicode{afii10019}{0412}
+\pdfglyphtounicode{afii10020}{0413}
+\pdfglyphtounicode{afii10021}{0414}
+\pdfglyphtounicode{afii10022}{0415}
+\pdfglyphtounicode{afii10023}{0401}
+\pdfglyphtounicode{afii10024}{0416}
+\pdfglyphtounicode{afii10025}{0417}
+\pdfglyphtounicode{afii10026}{0418}
+\pdfglyphtounicode{afii10027}{0419}
+\pdfglyphtounicode{afii10028}{041A}
+\pdfglyphtounicode{afii10029}{041B}
+\pdfglyphtounicode{afii10030}{041C}
+\pdfglyphtounicode{afii10031}{041D}
+\pdfglyphtounicode{afii10032}{041E}
+\pdfglyphtounicode{afii10033}{041F}
+\pdfglyphtounicode{afii10034}{0420}
+\pdfglyphtounicode{afii10035}{0421}
+\pdfglyphtounicode{afii10036}{0422}
+\pdfglyphtounicode{afii10037}{0423}
+\pdfglyphtounicode{afii10038}{0424}
+\pdfglyphtounicode{afii10039}{0425}
+\pdfglyphtounicode{afii10040}{0426}
+\pdfglyphtounicode{afii10041}{0427}
+\pdfglyphtounicode{afii10042}{0428}
+\pdfglyphtounicode{afii10043}{0429}
+\pdfglyphtounicode{afii10044}{042A}
+\pdfglyphtounicode{afii10045}{042B}
+\pdfglyphtounicode{afii10046}{042C}
+\pdfglyphtounicode{afii10047}{042D}
+\pdfglyphtounicode{afii10048}{042E}
+\pdfglyphtounicode{afii10049}{042F}
+\pdfglyphtounicode{afii10050}{0490}
+\pdfglyphtounicode{afii10051}{0402}
+\pdfglyphtounicode{afii10052}{0403}
+\pdfglyphtounicode{afii10053}{0404}
+\pdfglyphtounicode{afii10054}{0405}
+\pdfglyphtounicode{afii10055}{0406}
+\pdfglyphtounicode{afii10056}{0407}
+\pdfglyphtounicode{afii10057}{0408}
+\pdfglyphtounicode{afii10058}{0409}
+\pdfglyphtounicode{afii10059}{040A}
+\pdfglyphtounicode{afii10060}{040B}
+\pdfglyphtounicode{afii10061}{040C}
+\pdfglyphtounicode{afii10062}{040E}
+\pdfglyphtounicode{afii10063}{F6C4}
+\pdfglyphtounicode{afii10064}{F6C5}
+\pdfglyphtounicode{afii10065}{0430}
+\pdfglyphtounicode{afii10066}{0431}
+\pdfglyphtounicode{afii10067}{0432}
+\pdfglyphtounicode{afii10068}{0433}
+\pdfglyphtounicode{afii10069}{0434}
+\pdfglyphtounicode{afii10070}{0435}
+\pdfglyphtounicode{afii10071}{0451}
+\pdfglyphtounicode{afii10072}{0436}
+\pdfglyphtounicode{afii10073}{0437}
+\pdfglyphtounicode{afii10074}{0438}
+\pdfglyphtounicode{afii10075}{0439}
+\pdfglyphtounicode{afii10076}{043A}
+\pdfglyphtounicode{afii10077}{043B}
+\pdfglyphtounicode{afii10078}{043C}
+\pdfglyphtounicode{afii10079}{043D}
+\pdfglyphtounicode{afii10080}{043E}
+\pdfglyphtounicode{afii10081}{043F}
+\pdfglyphtounicode{afii10082}{0440}
+\pdfglyphtounicode{afii10083}{0441}
+\pdfglyphtounicode{afii10084}{0442}
+\pdfglyphtounicode{afii10085}{0443}
+\pdfglyphtounicode{afii10086}{0444}
+\pdfglyphtounicode{afii10087}{0445}
+\pdfglyphtounicode{afii10088}{0446}
+\pdfglyphtounicode{afii10089}{0447}
+\pdfglyphtounicode{afii10090}{0448}
+\pdfglyphtounicode{afii10091}{0449}
+\pdfglyphtounicode{afii10092}{044A}
+\pdfglyphtounicode{afii10093}{044B}
+\pdfglyphtounicode{afii10094}{044C}
+\pdfglyphtounicode{afii10095}{044D}
+\pdfglyphtounicode{afii10096}{044E}
+\pdfglyphtounicode{afii10097}{044F}
+\pdfglyphtounicode{afii10098}{0491}
+\pdfglyphtounicode{afii10099}{0452}
+\pdfglyphtounicode{afii10100}{0453}
+\pdfglyphtounicode{afii10101}{0454}
+\pdfglyphtounicode{afii10102}{0455}
+\pdfglyphtounicode{afii10103}{0456}
+\pdfglyphtounicode{afii10104}{0457}
+\pdfglyphtounicode{afii10105}{0458}
+\pdfglyphtounicode{afii10106}{0459}
+\pdfglyphtounicode{afii10107}{045A}
+\pdfglyphtounicode{afii10108}{045B}
+\pdfglyphtounicode{afii10109}{045C}
+\pdfglyphtounicode{afii10110}{045E}
+\pdfglyphtounicode{afii10145}{040F}
+\pdfglyphtounicode{afii10146}{0462}
+\pdfglyphtounicode{afii10147}{0472}
+\pdfglyphtounicode{afii10148}{0474}
+\pdfglyphtounicode{afii10192}{F6C6}
+\pdfglyphtounicode{afii10193}{045F}
+\pdfglyphtounicode{afii10194}{0463}
+\pdfglyphtounicode{afii10195}{0473}
+\pdfglyphtounicode{afii10196}{0475}
+\pdfglyphtounicode{afii10831}{F6C7}
+\pdfglyphtounicode{afii10832}{F6C8}
+\pdfglyphtounicode{afii10846}{04D9}
+\pdfglyphtounicode{afii299}{200E}
+\pdfglyphtounicode{afii300}{200F}
+\pdfglyphtounicode{afii301}{200D}
+\pdfglyphtounicode{afii57381}{066A}
+\pdfglyphtounicode{afii57388}{060C}
+\pdfglyphtounicode{afii57392}{0660}
+\pdfglyphtounicode{afii57393}{0661}
+\pdfglyphtounicode{afii57394}{0662}
+\pdfglyphtounicode{afii57395}{0663}
+\pdfglyphtounicode{afii57396}{0664}
+\pdfglyphtounicode{afii57397}{0665}
+\pdfglyphtounicode{afii57398}{0666}
+\pdfglyphtounicode{afii57399}{0667}
+\pdfglyphtounicode{afii57400}{0668}
+\pdfglyphtounicode{afii57401}{0669}
+\pdfglyphtounicode{afii57403}{061B}
+\pdfglyphtounicode{afii57407}{061F}
+\pdfglyphtounicode{afii57409}{0621}
+\pdfglyphtounicode{afii57410}{0622}
+\pdfglyphtounicode{afii57411}{0623}
+\pdfglyphtounicode{afii57412}{0624}
+\pdfglyphtounicode{afii57413}{0625}
+\pdfglyphtounicode{afii57414}{0626}
+\pdfglyphtounicode{afii57415}{0627}
+\pdfglyphtounicode{afii57416}{0628}
+\pdfglyphtounicode{afii57417}{0629}
+\pdfglyphtounicode{afii57418}{062A}
+\pdfglyphtounicode{afii57419}{062B}
+\pdfglyphtounicode{afii57420}{062C}
+\pdfglyphtounicode{afii57421}{062D}
+\pdfglyphtounicode{afii57422}{062E}
+\pdfglyphtounicode{afii57423}{062F}
+\pdfglyphtounicode{afii57424}{0630}
+\pdfglyphtounicode{afii57425}{0631}
+\pdfglyphtounicode{afii57426}{0632}
+\pdfglyphtounicode{afii57427}{0633}
+\pdfglyphtounicode{afii57428}{0634}
+\pdfglyphtounicode{afii57429}{0635}
+\pdfglyphtounicode{afii57430}{0636}
+\pdfglyphtounicode{afii57431}{0637}
+\pdfglyphtounicode{afii57432}{0638}
+\pdfglyphtounicode{afii57433}{0639}
+\pdfglyphtounicode{afii57434}{063A}
+\pdfglyphtounicode{afii57440}{0640}
+\pdfglyphtounicode{afii57441}{0641}
+\pdfglyphtounicode{afii57442}{0642}
+\pdfglyphtounicode{afii57443}{0643}
+\pdfglyphtounicode{afii57444}{0644}
+\pdfglyphtounicode{afii57445}{0645}
+\pdfglyphtounicode{afii57446}{0646}
+\pdfglyphtounicode{afii57448}{0648}
+\pdfglyphtounicode{afii57449}{0649}
+\pdfglyphtounicode{afii57450}{064A}
+\pdfglyphtounicode{afii57451}{064B}
+\pdfglyphtounicode{afii57452}{064C}
+\pdfglyphtounicode{afii57453}{064D}
+\pdfglyphtounicode{afii57454}{064E}
+\pdfglyphtounicode{afii57455}{064F}
+\pdfglyphtounicode{afii57456}{0650}
+\pdfglyphtounicode{afii57457}{0651}
+\pdfglyphtounicode{afii57458}{0652}
+\pdfglyphtounicode{afii57470}{0647}
+\pdfglyphtounicode{afii57505}{06A4}
+\pdfglyphtounicode{afii57506}{067E}
+\pdfglyphtounicode{afii57507}{0686}
+\pdfglyphtounicode{afii57508}{0698}
+\pdfglyphtounicode{afii57509}{06AF}
+\pdfglyphtounicode{afii57511}{0679}
+\pdfglyphtounicode{afii57512}{0688}
+\pdfglyphtounicode{afii57513}{0691}
+\pdfglyphtounicode{afii57514}{06BA}
+\pdfglyphtounicode{afii57519}{06D2}
+\pdfglyphtounicode{afii57534}{06D5}
+\pdfglyphtounicode{afii57636}{20AA}
+\pdfglyphtounicode{afii57645}{05BE}
+\pdfglyphtounicode{afii57658}{05C3}
+\pdfglyphtounicode{afii57664}{05D0}
+\pdfglyphtounicode{afii57665}{05D1}
+\pdfglyphtounicode{afii57666}{05D2}
+\pdfglyphtounicode{afii57667}{05D3}
+\pdfglyphtounicode{afii57668}{05D4}
+\pdfglyphtounicode{afii57669}{05D5}
+\pdfglyphtounicode{afii57670}{05D6}
+\pdfglyphtounicode{afii57671}{05D7}
+\pdfglyphtounicode{afii57672}{05D8}
+\pdfglyphtounicode{afii57673}{05D9}
+\pdfglyphtounicode{afii57674}{05DA}
+\pdfglyphtounicode{afii57675}{05DB}
+\pdfglyphtounicode{afii57676}{05DC}
+\pdfglyphtounicode{afii57677}{05DD}
+\pdfglyphtounicode{afii57678}{05DE}
+\pdfglyphtounicode{afii57679}{05DF}
+\pdfglyphtounicode{afii57680}{05E0}
+\pdfglyphtounicode{afii57681}{05E1}
+\pdfglyphtounicode{afii57682}{05E2}
+\pdfglyphtounicode{afii57683}{05E3}
+\pdfglyphtounicode{afii57684}{05E4}
+\pdfglyphtounicode{afii57685}{05E5}
+\pdfglyphtounicode{afii57686}{05E6}
+\pdfglyphtounicode{afii57687}{05E7}
+\pdfglyphtounicode{afii57688}{05E8}
+\pdfglyphtounicode{afii57689}{05E9}
+\pdfglyphtounicode{afii57690}{05EA}
+\pdfglyphtounicode{afii57694}{FB2A}
+\pdfglyphtounicode{afii57695}{FB2B}
+\pdfglyphtounicode{afii57700}{FB4B}
+\pdfglyphtounicode{afii57705}{FB1F}
+\pdfglyphtounicode{afii57716}{05F0}
+\pdfglyphtounicode{afii57717}{05F1}
+\pdfglyphtounicode{afii57718}{05F2}
+\pdfglyphtounicode{afii57723}{FB35}
+\pdfglyphtounicode{afii57793}{05B4}
+\pdfglyphtounicode{afii57794}{05B5}
+\pdfglyphtounicode{afii57795}{05B6}
+\pdfglyphtounicode{afii57796}{05BB}
+\pdfglyphtounicode{afii57797}{05B8}
+\pdfglyphtounicode{afii57798}{05B7}
+\pdfglyphtounicode{afii57799}{05B0}
+\pdfglyphtounicode{afii57800}{05B2}
+\pdfglyphtounicode{afii57801}{05B1}
+\pdfglyphtounicode{afii57802}{05B3}
+\pdfglyphtounicode{afii57803}{05C2}
+\pdfglyphtounicode{afii57804}{05C1}
+\pdfglyphtounicode{afii57806}{05B9}
+\pdfglyphtounicode{afii57807}{05BC}
+\pdfglyphtounicode{afii57839}{05BD}
+\pdfglyphtounicode{afii57841}{05BF}
+\pdfglyphtounicode{afii57842}{05C0}
+\pdfglyphtounicode{afii57929}{02BC}
+\pdfglyphtounicode{afii61248}{2105}
+\pdfglyphtounicode{afii61289}{2113}
+\pdfglyphtounicode{afii61352}{2116}
+\pdfglyphtounicode{afii61573}{202C}
+\pdfglyphtounicode{afii61574}{202D}
+\pdfglyphtounicode{afii61575}{202E}
+\pdfglyphtounicode{afii61664}{200C}
+\pdfglyphtounicode{afii63167}{066D}
+\pdfglyphtounicode{afii64937}{02BD}
+\pdfglyphtounicode{agrave}{00E0}
+\pdfglyphtounicode{agujarati}{0A85}
+\pdfglyphtounicode{agurmukhi}{0A05}
+\pdfglyphtounicode{ahiragana}{3042}
+\pdfglyphtounicode{ahookabove}{1EA3}
+\pdfglyphtounicode{aibengali}{0990}
+\pdfglyphtounicode{aibopomofo}{311E}
+\pdfglyphtounicode{aideva}{0910}
+\pdfglyphtounicode{aiecyrillic}{04D5}
+\pdfglyphtounicode{aigujarati}{0A90}
+\pdfglyphtounicode{aigurmukhi}{0A10}
+\pdfglyphtounicode{aimatragurmukhi}{0A48}
+\pdfglyphtounicode{ainarabic}{0639}
+\pdfglyphtounicode{ainfinalarabic}{FECA}
+\pdfglyphtounicode{aininitialarabic}{FECB}
+\pdfglyphtounicode{ainmedialarabic}{FECC}
+\pdfglyphtounicode{ainvertedbreve}{0203}
+\pdfglyphtounicode{aivowelsignbengali}{09C8}
+\pdfglyphtounicode{aivowelsigndeva}{0948}
+\pdfglyphtounicode{aivowelsigngujarati}{0AC8}
+\pdfglyphtounicode{akatakana}{30A2}
+\pdfglyphtounicode{akatakanahalfwidth}{FF71}
+\pdfglyphtounicode{akorean}{314F}
+\pdfglyphtounicode{alef}{05D0}
+\pdfglyphtounicode{alefarabic}{0627}
+\pdfglyphtounicode{alefdageshhebrew}{FB30}
+\pdfglyphtounicode{aleffinalarabic}{FE8E}
+\pdfglyphtounicode{alefhamzaabovearabic}{0623}
+\pdfglyphtounicode{alefhamzaabovefinalarabic}{FE84}
+\pdfglyphtounicode{alefhamzabelowarabic}{0625}
+\pdfglyphtounicode{alefhamzabelowfinalarabic}{FE88}
+\pdfglyphtounicode{alefhebrew}{05D0}
+\pdfglyphtounicode{aleflamedhebrew}{FB4F}
+\pdfglyphtounicode{alefmaddaabovearabic}{0622}
+\pdfglyphtounicode{alefmaddaabovefinalarabic}{FE82}
+\pdfglyphtounicode{alefmaksuraarabic}{0649}
+\pdfglyphtounicode{alefmaksurafinalarabic}{FEF0}
+\pdfglyphtounicode{alefmaksurainitialarabic}{FEF3}
+\pdfglyphtounicode{alefmaksuramedialarabic}{FEF4}
+\pdfglyphtounicode{alefpatahhebrew}{FB2E}
+\pdfglyphtounicode{alefqamatshebrew}{FB2F}
+\pdfglyphtounicode{aleph}{2135}
+\pdfglyphtounicode{allequal}{224C}
+\pdfglyphtounicode{alpha}{03B1}
+\pdfglyphtounicode{alphatonos}{03AC}
+\pdfglyphtounicode{amacron}{0101}
+\pdfglyphtounicode{amonospace}{FF41}
+\pdfglyphtounicode{ampersand}{0026}
+\pdfglyphtounicode{ampersandmonospace}{FF06}
+\pdfglyphtounicode{ampersandsmall}{0026}
+\pdfglyphtounicode{amsquare}{33C2}
+\pdfglyphtounicode{anbopomofo}{3122}
+\pdfglyphtounicode{angbopomofo}{3124}
+\pdfglyphtounicode{angbracketleft}{27E8}
+\pdfglyphtounicode{angbracketright}{27E9}
+\pdfglyphtounicode{angkhankhuthai}{0E5A}
+\pdfglyphtounicode{angle}{2220}
+\pdfglyphtounicode{anglebracketleft}{3008}
+\pdfglyphtounicode{anglebracketleftvertical}{FE3F}
+\pdfglyphtounicode{anglebracketright}{3009}
+\pdfglyphtounicode{anglebracketrightvertical}{FE40}
+\pdfglyphtounicode{angleleft}{2329}
+\pdfglyphtounicode{angleright}{232A}
+\pdfglyphtounicode{angstrom}{212B}
+\pdfglyphtounicode{anoteleia}{0387}
+\pdfglyphtounicode{anticlockwise}{27F2}
+\pdfglyphtounicode{anudattadeva}{0952}
+\pdfglyphtounicode{anusvarabengali}{0982}
+\pdfglyphtounicode{anusvaradeva}{0902}
+\pdfglyphtounicode{anusvaragujarati}{0A82}
+\pdfglyphtounicode{aogonek}{0105}
+\pdfglyphtounicode{apaatosquare}{3300}
+\pdfglyphtounicode{aparen}{249C}
+\pdfglyphtounicode{apostrophearmenian}{055A}
+\pdfglyphtounicode{apostrophemod}{02BC}
+\pdfglyphtounicode{apple}{F8FF}
+\pdfglyphtounicode{approaches}{2250}
+\pdfglyphtounicode{approxequal}{2248}
+\pdfglyphtounicode{approxequalorimage}{2252}
+\pdfglyphtounicode{approximatelyequal}{2245}
+\pdfglyphtounicode{approxorequal}{224A}
+\pdfglyphtounicode{araeaekorean}{318E}
+\pdfglyphtounicode{araeakorean}{318D}
+\pdfglyphtounicode{arc}{2312}
+\pdfglyphtounicode{archleftdown}{21B6}
+\pdfglyphtounicode{archrightdown}{21B7}
+\pdfglyphtounicode{arighthalfring}{1E9A}
+\pdfglyphtounicode{aring}{00E5}
+\pdfglyphtounicode{aringacute}{01FB}
+\pdfglyphtounicode{aringbelow}{1E01}
+\pdfglyphtounicode{arrowboth}{2194}
+\pdfglyphtounicode{arrowbothv}{2195}
+\pdfglyphtounicode{arrowdashdown}{21E3}
+\pdfglyphtounicode{arrowdashleft}{21E0}
+\pdfglyphtounicode{arrowdashright}{21E2}
+\pdfglyphtounicode{arrowdashup}{21E1}
+\pdfglyphtounicode{arrowdblboth}{21D4}
+\pdfglyphtounicode{arrowdblbothv}{21D5}
+\pdfglyphtounicode{arrowdbldown}{21D3}
+\pdfglyphtounicode{arrowdblleft}{21D0}
+\pdfglyphtounicode{arrowdblright}{21D2}
+\pdfglyphtounicode{arrowdblup}{21D1}
+\pdfglyphtounicode{arrowdown}{2193}
+\pdfglyphtounicode{arrowdownleft}{2199}
+\pdfglyphtounicode{arrowdownright}{2198}
+\pdfglyphtounicode{arrowdownwhite}{21E9}
+\pdfglyphtounicode{arrowheaddownmod}{02C5}
+\pdfglyphtounicode{arrowheadleftmod}{02C2}
+\pdfglyphtounicode{arrowheadrightmod}{02C3}
+\pdfglyphtounicode{arrowheadupmod}{02C4}
+\pdfglyphtounicode{arrowhorizex}{F8E7}
+\pdfglyphtounicode{arrowleft}{2190}
+\pdfglyphtounicode{arrowleftbothalf}{21BD}
+\pdfglyphtounicode{arrowleftdbl}{21D0}
+\pdfglyphtounicode{arrowleftdblstroke}{21CD}
+\pdfglyphtounicode{arrowleftoverright}{21C6}
+\pdfglyphtounicode{arrowlefttophalf}{21BC}
+\pdfglyphtounicode{arrowleftwhite}{21E6}
+\pdfglyphtounicode{arrownortheast}{2197}
+\pdfglyphtounicode{arrownorthwest}{2196}
+\pdfglyphtounicode{arrowparrleftright}{21C6}
+\pdfglyphtounicode{arrowparrrightleft}{21C4}
+\pdfglyphtounicode{arrowright}{2192}
+\pdfglyphtounicode{arrowrightbothalf}{21C1}
+\pdfglyphtounicode{arrowrightdblstroke}{21CF}
+\pdfglyphtounicode{arrowrightheavy}{279E}
+\pdfglyphtounicode{arrowrightoverleft}{21C4}
+\pdfglyphtounicode{arrowrighttophalf}{21C0}
+\pdfglyphtounicode{arrowrightwhite}{21E8}
+\pdfglyphtounicode{arrowsoutheast}{2198}
+\pdfglyphtounicode{arrowsouthwest}{2199}
+\pdfglyphtounicode{arrowtableft}{21E4}
+\pdfglyphtounicode{arrowtabright}{21E5}
+\pdfglyphtounicode{arrowtailleft}{21A2}
+\pdfglyphtounicode{arrowtailright}{21A3}
+\pdfglyphtounicode{arrowtripleleft}{21DA}
+\pdfglyphtounicode{arrowtripleright}{21DB}
+\pdfglyphtounicode{arrowup}{2191}
+\pdfglyphtounicode{arrowupdn}{2195}
+\pdfglyphtounicode{arrowupdnbse}{21A8}
+\pdfglyphtounicode{arrowupdownbase}{21A8}
+\pdfglyphtounicode{arrowupleft}{2196}
+\pdfglyphtounicode{arrowupleftofdown}{21C5}
+\pdfglyphtounicode{arrowupright}{2197}
+\pdfglyphtounicode{arrowupwhite}{21E7}
+\pdfglyphtounicode{arrowvertex}{F8E6}
+\pdfglyphtounicode{asciicircum}{005E}
+\pdfglyphtounicode{asciicircummonospace}{FF3E}
+\pdfglyphtounicode{asciitilde}{007E}
+\pdfglyphtounicode{asciitildemonospace}{FF5E}
+\pdfglyphtounicode{ascript}{0251}
+\pdfglyphtounicode{ascriptturned}{0252}
+\pdfglyphtounicode{asmallhiragana}{3041}
+\pdfglyphtounicode{asmallkatakana}{30A1}
+\pdfglyphtounicode{asmallkatakanahalfwidth}{FF67}
+\pdfglyphtounicode{asterisk}{002A}
+\pdfglyphtounicode{asteriskaltonearabic}{066D}
+\pdfglyphtounicode{asteriskarabic}{066D}
+\pdfglyphtounicode{asteriskcentered}{2217}
+\pdfglyphtounicode{asteriskmath}{2217}
+\pdfglyphtounicode{asteriskmonospace}{FF0A}
+\pdfglyphtounicode{asterisksmall}{FE61}
+\pdfglyphtounicode{asterism}{2042}
+\pdfglyphtounicode{asuperior}{0061}
+\pdfglyphtounicode{asymptoticallyequal}{2243}
+\pdfglyphtounicode{at}{0040}
+\pdfglyphtounicode{atilde}{00E3}
+\pdfglyphtounicode{atmonospace}{FF20}
+\pdfglyphtounicode{atsmall}{FE6B}
+\pdfglyphtounicode{aturned}{0250}
+\pdfglyphtounicode{aubengali}{0994}
+\pdfglyphtounicode{aubopomofo}{3120}
+\pdfglyphtounicode{audeva}{0914}
+\pdfglyphtounicode{augujarati}{0A94}
+\pdfglyphtounicode{augurmukhi}{0A14}
+\pdfglyphtounicode{aulengthmarkbengali}{09D7}
+\pdfglyphtounicode{aumatragurmukhi}{0A4C}
+\pdfglyphtounicode{auvowelsignbengali}{09CC}
+\pdfglyphtounicode{auvowelsigndeva}{094C}
+\pdfglyphtounicode{auvowelsigngujarati}{0ACC}
+\pdfglyphtounicode{avagrahadeva}{093D}
+\pdfglyphtounicode{aybarmenian}{0561}
+\pdfglyphtounicode{ayin}{05E2}
+\pdfglyphtounicode{ayinaltonehebrew}{FB20}
+\pdfglyphtounicode{ayinhebrew}{05E2}
+\pdfglyphtounicode{b}{0062}
+\pdfglyphtounicode{babengali}{09AC}
+\pdfglyphtounicode{backslash}{005C}
+\pdfglyphtounicode{backslashmonospace}{FF3C}
+\pdfglyphtounicode{badeva}{092C}
+\pdfglyphtounicode{bagujarati}{0AAC}
+\pdfglyphtounicode{bagurmukhi}{0A2C}
+\pdfglyphtounicode{bahiragana}{3070}
+\pdfglyphtounicode{bahtthai}{0E3F}
+\pdfglyphtounicode{bakatakana}{30D0}
+\pdfglyphtounicode{bar}{007C}
+\pdfglyphtounicode{bardbl}{2225}
+\pdfglyphtounicode{barmonospace}{FF5C}
+\pdfglyphtounicode{bbopomofo}{3105}
+\pdfglyphtounicode{bcircle}{24D1}
+\pdfglyphtounicode{bdotaccent}{1E03}
+\pdfglyphtounicode{bdotbelow}{1E05}
+\pdfglyphtounicode{beamedsixteenthnotes}{266C}
+\pdfglyphtounicode{because}{2235}
+\pdfglyphtounicode{becyrillic}{0431}
+\pdfglyphtounicode{beharabic}{0628}
+\pdfglyphtounicode{behfinalarabic}{FE90}
+\pdfglyphtounicode{behinitialarabic}{FE91}
+\pdfglyphtounicode{behiragana}{3079}
+\pdfglyphtounicode{behmedialarabic}{FE92}
+\pdfglyphtounicode{behmeeminitialarabic}{FC9F}
+\pdfglyphtounicode{behmeemisolatedarabic}{FC08}
+\pdfglyphtounicode{behnoonfinalarabic}{FC6D}
+\pdfglyphtounicode{bekatakana}{30D9}
+\pdfglyphtounicode{benarmenian}{0562}
+\pdfglyphtounicode{bet}{05D1}
+\pdfglyphtounicode{beta}{03B2}
+\pdfglyphtounicode{betasymbolgreek}{03D0}
+\pdfglyphtounicode{betdagesh}{FB31}
+\pdfglyphtounicode{betdageshhebrew}{FB31}
+\pdfglyphtounicode{beth}{2136}
+\pdfglyphtounicode{bethebrew}{05D1}
+\pdfglyphtounicode{betrafehebrew}{FB4C}
+\pdfglyphtounicode{between}{226C}
+\pdfglyphtounicode{bhabengali}{09AD}
+\pdfglyphtounicode{bhadeva}{092D}
+\pdfglyphtounicode{bhagujarati}{0AAD}
+\pdfglyphtounicode{bhagurmukhi}{0A2D}
+\pdfglyphtounicode{bhook}{0253}
+\pdfglyphtounicode{bihiragana}{3073}
+\pdfglyphtounicode{bikatakana}{30D3}
+\pdfglyphtounicode{bilabialclick}{0298}
+\pdfglyphtounicode{bindigurmukhi}{0A02}
+\pdfglyphtounicode{birusquare}{3331}
+\pdfglyphtounicode{blackcircle}{25CF}
+\pdfglyphtounicode{blackdiamond}{25C6}
+\pdfglyphtounicode{blackdownpointingtriangle}{25BC}
+\pdfglyphtounicode{blackleftpointingpointer}{25C4}
+\pdfglyphtounicode{blackleftpointingtriangle}{25C0}
+\pdfglyphtounicode{blacklenticularbracketleft}{3010}
+\pdfglyphtounicode{blacklenticularbracketleftvertical}{FE3B}
+\pdfglyphtounicode{blacklenticularbracketright}{3011}
+\pdfglyphtounicode{blacklenticularbracketrightvertical}{FE3C}
+\pdfglyphtounicode{blacklowerlefttriangle}{25E3}
+\pdfglyphtounicode{blacklowerrighttriangle}{25E2}
+\pdfglyphtounicode{blackrectangle}{25AC}
+\pdfglyphtounicode{blackrightpointingpointer}{25BA}
+\pdfglyphtounicode{blackrightpointingtriangle}{25B6}
+\pdfglyphtounicode{blacksmallsquare}{25AA}
+\pdfglyphtounicode{blacksmilingface}{263B}
+\pdfglyphtounicode{blacksquare}{25A0}
+\pdfglyphtounicode{blackstar}{2605}
+\pdfglyphtounicode{blackupperlefttriangle}{25E4}
+\pdfglyphtounicode{blackupperrighttriangle}{25E5}
+\pdfglyphtounicode{blackuppointingsmalltriangle}{25B4}
+\pdfglyphtounicode{blackuppointingtriangle}{25B2}
+\pdfglyphtounicode{blank}{2423}
+\pdfglyphtounicode{blinebelow}{1E07}
+\pdfglyphtounicode{block}{2588}
+\pdfglyphtounicode{bmonospace}{FF42}
+\pdfglyphtounicode{bobaimaithai}{0E1A}
+\pdfglyphtounicode{bohiragana}{307C}
+\pdfglyphtounicode{bokatakana}{30DC}
+\pdfglyphtounicode{bparen}{249D}
+\pdfglyphtounicode{bqsquare}{33C3}
+\pdfglyphtounicode{braceex}{F8F4}
+\pdfglyphtounicode{braceleft}{007B}
+\pdfglyphtounicode{braceleftbt}{F8F3}
+\pdfglyphtounicode{braceleftmid}{F8F2}
+\pdfglyphtounicode{braceleftmonospace}{FF5B}
+\pdfglyphtounicode{braceleftsmall}{FE5B}
+\pdfglyphtounicode{bracelefttp}{F8F1}
+\pdfglyphtounicode{braceleftvertical}{FE37}
+\pdfglyphtounicode{braceright}{007D}
+\pdfglyphtounicode{bracerightbt}{F8FE}
+\pdfglyphtounicode{bracerightmid}{F8FD}
+\pdfglyphtounicode{bracerightmonospace}{FF5D}
+\pdfglyphtounicode{bracerightsmall}{FE5C}
+\pdfglyphtounicode{bracerighttp}{F8FC}
+\pdfglyphtounicode{bracerightvertical}{FE38}
+\pdfglyphtounicode{bracketleft}{005B}
+\pdfglyphtounicode{bracketleftbt}{F8F0}
+\pdfglyphtounicode{bracketleftex}{F8EF}
+\pdfglyphtounicode{bracketleftmonospace}{FF3B}
+\pdfglyphtounicode{bracketlefttp}{F8EE}
+\pdfglyphtounicode{bracketright}{005D}
+\pdfglyphtounicode{bracketrightbt}{F8FB}
+\pdfglyphtounicode{bracketrightex}{F8FA}
+\pdfglyphtounicode{bracketrightmonospace}{FF3D}
+\pdfglyphtounicode{bracketrighttp}{F8F9}
+\pdfglyphtounicode{breve}{02D8}
+\pdfglyphtounicode{brevebelowcmb}{032E}
+\pdfglyphtounicode{brevecmb}{0306}
+\pdfglyphtounicode{breveinvertedbelowcmb}{032F}
+\pdfglyphtounicode{breveinvertedcmb}{0311}
+\pdfglyphtounicode{breveinverteddoublecmb}{0361}
+\pdfglyphtounicode{bridgebelowcmb}{032A}
+\pdfglyphtounicode{bridgeinvertedbelowcmb}{033A}
+\pdfglyphtounicode{brokenbar}{00A6}
+\pdfglyphtounicode{bstroke}{0180}
+\pdfglyphtounicode{bsuperior}{0062}
+\pdfglyphtounicode{btopbar}{0183}
+\pdfglyphtounicode{buhiragana}{3076}
+\pdfglyphtounicode{bukatakana}{30D6}
+\pdfglyphtounicode{bullet}{2022}
+\pdfglyphtounicode{bulletinverse}{25D8}
+\pdfglyphtounicode{bulletoperator}{2219}
+\pdfglyphtounicode{bullseye}{25CE}
+\pdfglyphtounicode{c}{0063}
+\pdfglyphtounicode{caarmenian}{056E}
+\pdfglyphtounicode{cabengali}{099A}
+\pdfglyphtounicode{cacute}{0107}
+\pdfglyphtounicode{cadeva}{091A}
+\pdfglyphtounicode{cagujarati}{0A9A}
+\pdfglyphtounicode{cagurmukhi}{0A1A}
+\pdfglyphtounicode{calsquare}{3388}
+\pdfglyphtounicode{candrabindubengali}{0981}
+\pdfglyphtounicode{candrabinducmb}{0310}
+\pdfglyphtounicode{candrabindudeva}{0901}
+\pdfglyphtounicode{candrabindugujarati}{0A81}
+\pdfglyphtounicode{capslock}{21EA}
+\pdfglyphtounicode{careof}{2105}
+\pdfglyphtounicode{caron}{02C7}
+\pdfglyphtounicode{caronbelowcmb}{032C}
+\pdfglyphtounicode{caroncmb}{030C}
+\pdfglyphtounicode{carriagereturn}{21B5}
+\pdfglyphtounicode{cbopomofo}{3118}
+\pdfglyphtounicode{ccaron}{010D}
+\pdfglyphtounicode{ccedilla}{00E7}
+\pdfglyphtounicode{ccedillaacute}{1E09}
+\pdfglyphtounicode{ccircle}{24D2}
+\pdfglyphtounicode{ccircumflex}{0109}
+\pdfglyphtounicode{ccurl}{0255}
+\pdfglyphtounicode{cdot}{010B}
+\pdfglyphtounicode{cdotaccent}{010B}
+\pdfglyphtounicode{cdsquare}{33C5}
+\pdfglyphtounicode{cedilla}{00B8}
+\pdfglyphtounicode{cedillacmb}{0327}
+\pdfglyphtounicode{ceilingleft}{2308}
+\pdfglyphtounicode{ceilingright}{2309}
+\pdfglyphtounicode{cent}{00A2}
+\pdfglyphtounicode{centigrade}{2103}
+\pdfglyphtounicode{centinferior}{00A2}
+\pdfglyphtounicode{centmonospace}{FFE0}
+\pdfglyphtounicode{centoldstyle}{00A2}
+\pdfglyphtounicode{centsuperior}{00A2}
+\pdfglyphtounicode{chaarmenian}{0579}
+\pdfglyphtounicode{chabengali}{099B}
+\pdfglyphtounicode{chadeva}{091B}
+\pdfglyphtounicode{chagujarati}{0A9B}
+\pdfglyphtounicode{chagurmukhi}{0A1B}
+\pdfglyphtounicode{chbopomofo}{3114}
+\pdfglyphtounicode{cheabkhasiancyrillic}{04BD}
+\pdfglyphtounicode{check}{2713}
+\pdfglyphtounicode{checkmark}{2713}
+\pdfglyphtounicode{checyrillic}{0447}
+\pdfglyphtounicode{chedescenderabkhasiancyrillic}{04BF}
+\pdfglyphtounicode{chedescendercyrillic}{04B7}
+\pdfglyphtounicode{chedieresiscyrillic}{04F5}
+\pdfglyphtounicode{cheharmenian}{0573}
+\pdfglyphtounicode{chekhakassiancyrillic}{04CC}
+\pdfglyphtounicode{cheverticalstrokecyrillic}{04B9}
+\pdfglyphtounicode{chi}{03C7}
+\pdfglyphtounicode{chieuchacirclekorean}{3277}
+\pdfglyphtounicode{chieuchaparenkorean}{3217}
+\pdfglyphtounicode{chieuchcirclekorean}{3269}
+\pdfglyphtounicode{chieuchkorean}{314A}
+\pdfglyphtounicode{chieuchparenkorean}{3209}
+\pdfglyphtounicode{chochangthai}{0E0A}
+\pdfglyphtounicode{chochanthai}{0E08}
+\pdfglyphtounicode{chochingthai}{0E09}
+\pdfglyphtounicode{chochoethai}{0E0C}
+\pdfglyphtounicode{chook}{0188}
+\pdfglyphtounicode{cieucacirclekorean}{3276}
+\pdfglyphtounicode{cieucaparenkorean}{3216}
+\pdfglyphtounicode{cieuccirclekorean}{3268}
+\pdfglyphtounicode{cieuckorean}{3148}
+\pdfglyphtounicode{cieucparenkorean}{3208}
+\pdfglyphtounicode{cieucuparenkorean}{321C}
+\pdfglyphtounicode{circle}{25CB}
+\pdfglyphtounicode{circleR}{00AE}
+\pdfglyphtounicode{circleS}{24C8}
+\pdfglyphtounicode{circleasterisk}{229B}
+\pdfglyphtounicode{circlecopyrt}{20DD}
+\pdfglyphtounicode{circledivide}{2298}
+\pdfglyphtounicode{circledot}{2299}
+\pdfglyphtounicode{circleequal}{229C}
+\pdfglyphtounicode{circleminus}{2296}
+\pdfglyphtounicode{circlemultiply}{2297}
+\pdfglyphtounicode{circleot}{2299}
+\pdfglyphtounicode{circleplus}{2295}
+\pdfglyphtounicode{circlepostalmark}{3036}
+\pdfglyphtounicode{circlering}{229A}
+\pdfglyphtounicode{circlewithlefthalfblack}{25D0}
+\pdfglyphtounicode{circlewithrighthalfblack}{25D1}
+\pdfglyphtounicode{circumflex}{02C6}
+\pdfglyphtounicode{circumflexbelowcmb}{032D}
+\pdfglyphtounicode{circumflexcmb}{0302}
+\pdfglyphtounicode{clear}{2327}
+\pdfglyphtounicode{clickalveolar}{01C2}
+\pdfglyphtounicode{clickdental}{01C0}
+\pdfglyphtounicode{clicklateral}{01C1}
+\pdfglyphtounicode{clickretroflex}{01C3}
+\pdfglyphtounicode{clockwise}{27F3}
+\pdfglyphtounicode{club}{2663}
+\pdfglyphtounicode{clubsuitblack}{2663}
+\pdfglyphtounicode{clubsuitwhite}{2667}
+\pdfglyphtounicode{cmcubedsquare}{33A4}
+\pdfglyphtounicode{cmonospace}{FF43}
+\pdfglyphtounicode{cmsquaredsquare}{33A0}
+\pdfglyphtounicode{coarmenian}{0581}
+\pdfglyphtounicode{colon}{003A}
+\pdfglyphtounicode{colonmonetary}{20A1}
+\pdfglyphtounicode{colonmonospace}{FF1A}
+\pdfglyphtounicode{colonsign}{20A1}
+\pdfglyphtounicode{colonsmall}{FE55}
+\pdfglyphtounicode{colontriangularhalfmod}{02D1}
+\pdfglyphtounicode{colontriangularmod}{02D0}
+\pdfglyphtounicode{comma}{002C}
+\pdfglyphtounicode{commaabovecmb}{0313}
+\pdfglyphtounicode{commaaboverightcmb}{0315}
+\pdfglyphtounicode{commaaccent}{F6C3}
+\pdfglyphtounicode{commaarabic}{060C}
+\pdfglyphtounicode{commaarmenian}{055D}
+\pdfglyphtounicode{commainferior}{002C}
+\pdfglyphtounicode{commamonospace}{FF0C}
+\pdfglyphtounicode{commareversedabovecmb}{0314}
+\pdfglyphtounicode{commareversedmod}{02BD}
+\pdfglyphtounicode{commasmall}{FE50}
+\pdfglyphtounicode{commasuperior}{002C}
+\pdfglyphtounicode{commaturnedabovecmb}{0312}
+\pdfglyphtounicode{commaturnedmod}{02BB}
+\pdfglyphtounicode{compass}{263C}
+\pdfglyphtounicode{complement}{2201}
+\pdfglyphtounicode{compwordmark}{200C}
+\pdfglyphtounicode{congruent}{2245}
+\pdfglyphtounicode{contourintegral}{222E}
+\pdfglyphtounicode{control}{2303}
+\pdfglyphtounicode{controlACK}{0006}
+\pdfglyphtounicode{controlBEL}{0007}
+\pdfglyphtounicode{controlBS}{0008}
+\pdfglyphtounicode{controlCAN}{0018}
+\pdfglyphtounicode{controlCR}{000D}
+\pdfglyphtounicode{controlDC1}{0011}
+\pdfglyphtounicode{controlDC2}{0012}
+\pdfglyphtounicode{controlDC3}{0013}
+\pdfglyphtounicode{controlDC4}{0014}
+\pdfglyphtounicode{controlDEL}{007F}
+\pdfglyphtounicode{controlDLE}{0010}
+\pdfglyphtounicode{controlEM}{0019}
+\pdfglyphtounicode{controlENQ}{0005}
+\pdfglyphtounicode{controlEOT}{0004}
+\pdfglyphtounicode{controlESC}{001B}
+\pdfglyphtounicode{controlETB}{0017}
+\pdfglyphtounicode{controlETX}{0003}
+\pdfglyphtounicode{controlFF}{000C}
+\pdfglyphtounicode{controlFS}{001C}
+\pdfglyphtounicode{controlGS}{001D}
+\pdfglyphtounicode{controlHT}{0009}
+\pdfglyphtounicode{controlLF}{000A}
+\pdfglyphtounicode{controlNAK}{0015}
+\pdfglyphtounicode{controlRS}{001E}
+\pdfglyphtounicode{controlSI}{000F}
+\pdfglyphtounicode{controlSO}{000E}
+\pdfglyphtounicode{controlSOT}{0002}
+\pdfglyphtounicode{controlSTX}{0001}
+\pdfglyphtounicode{controlSUB}{001A}
+\pdfglyphtounicode{controlSYN}{0016}
+\pdfglyphtounicode{controlUS}{001F}
+\pdfglyphtounicode{controlVT}{000B}
+\pdfglyphtounicode{coproduct}{2A3F}
+\pdfglyphtounicode{copyright}{00A9}
+\pdfglyphtounicode{copyrightsans}{00A9}
+\pdfglyphtounicode{copyrightserif}{00A9}
+\pdfglyphtounicode{cornerbracketleft}{300C}
+\pdfglyphtounicode{cornerbracketlefthalfwidth}{FF62}
+\pdfglyphtounicode{cornerbracketleftvertical}{FE41}
+\pdfglyphtounicode{cornerbracketright}{300D}
+\pdfglyphtounicode{cornerbracketrighthalfwidth}{FF63}
+\pdfglyphtounicode{cornerbracketrightvertical}{FE42}
+\pdfglyphtounicode{corporationsquare}{337F}
+\pdfglyphtounicode{cosquare}{33C7}
+\pdfglyphtounicode{coverkgsquare}{33C6}
+\pdfglyphtounicode{cparen}{249E}
+\pdfglyphtounicode{cruzeiro}{20A2}
+\pdfglyphtounicode{cstretched}{0297}
+\pdfglyphtounicode{ct}{0063 0074}
+\pdfglyphtounicode{curlyand}{22CF}
+\pdfglyphtounicode{curlyleft}{21AB}
+\pdfglyphtounicode{curlyor}{22CE}
+\pdfglyphtounicode{curlyright}{21AC}
+\pdfglyphtounicode{currency}{00A4}
+\pdfglyphtounicode{cwm}{200C}
+\pdfglyphtounicode{cyrBreve}{02D8}
+\pdfglyphtounicode{cyrFlex}{00A0 0311}
+\pdfglyphtounicode{cyrbreve}{02D8}
+\pdfglyphtounicode{cyrflex}{00A0 0311}
+\pdfglyphtounicode{d}{0064}
+\pdfglyphtounicode{daarmenian}{0564}
+\pdfglyphtounicode{dabengali}{09A6}
+\pdfglyphtounicode{dadarabic}{0636}
+\pdfglyphtounicode{dadeva}{0926}
+\pdfglyphtounicode{dadfinalarabic}{FEBE}
+\pdfglyphtounicode{dadinitialarabic}{FEBF}
+\pdfglyphtounicode{dadmedialarabic}{FEC0}
+\pdfglyphtounicode{dagesh}{05BC}
+\pdfglyphtounicode{dageshhebrew}{05BC}
+\pdfglyphtounicode{dagger}{2020}
+\pdfglyphtounicode{daggerdbl}{2021}
+\pdfglyphtounicode{dagujarati}{0AA6}
+\pdfglyphtounicode{dagurmukhi}{0A26}
+\pdfglyphtounicode{dahiragana}{3060}
+\pdfglyphtounicode{dakatakana}{30C0}
+\pdfglyphtounicode{dalarabic}{062F}
+\pdfglyphtounicode{dalet}{05D3}
+\pdfglyphtounicode{daletdagesh}{FB33}
+\pdfglyphtounicode{daletdageshhebrew}{FB33}
+\pdfglyphtounicode{daleth}{2138}
+\pdfglyphtounicode{dalethatafpatah}{05D3 05B2}
+\pdfglyphtounicode{dalethatafpatahhebrew}{05D3 05B2}
+\pdfglyphtounicode{dalethatafsegol}{05D3 05B1}
+\pdfglyphtounicode{dalethatafsegolhebrew}{05D3 05B1}
+\pdfglyphtounicode{dalethebrew}{05D3}
+\pdfglyphtounicode{dalethiriq}{05D3 05B4}
+\pdfglyphtounicode{dalethiriqhebrew}{05D3 05B4}
+\pdfglyphtounicode{daletholam}{05D3 05B9}
+\pdfglyphtounicode{daletholamhebrew}{05D3 05B9}
+\pdfglyphtounicode{daletpatah}{05D3 05B7}
+\pdfglyphtounicode{daletpatahhebrew}{05D3 05B7}
+\pdfglyphtounicode{daletqamats}{05D3 05B8}
+\pdfglyphtounicode{daletqamatshebrew}{05D3 05B8}
+\pdfglyphtounicode{daletqubuts}{05D3 05BB}
+\pdfglyphtounicode{daletqubutshebrew}{05D3 05BB}
+\pdfglyphtounicode{daletsegol}{05D3 05B6}
+\pdfglyphtounicode{daletsegolhebrew}{05D3 05B6}
+\pdfglyphtounicode{daletsheva}{05D3 05B0}
+\pdfglyphtounicode{daletshevahebrew}{05D3 05B0}
+\pdfglyphtounicode{dalettsere}{05D3 05B5}
+\pdfglyphtounicode{dalettserehebrew}{05D3 05B5}
+\pdfglyphtounicode{dalfinalarabic}{FEAA}
+\pdfglyphtounicode{dammaarabic}{064F}
+\pdfglyphtounicode{dammalowarabic}{064F}
+\pdfglyphtounicode{dammatanaltonearabic}{064C}
+\pdfglyphtounicode{dammatanarabic}{064C}
+\pdfglyphtounicode{danda}{0964}
+\pdfglyphtounicode{dargahebrew}{05A7}
+\pdfglyphtounicode{dargalefthebrew}{05A7}
+\pdfglyphtounicode{dasiapneumatacyrilliccmb}{0485}
+\pdfglyphtounicode{dbar}{0111}
+\pdfglyphtounicode{dblGrave}{00A0 030F}
+\pdfglyphtounicode{dblanglebracketleft}{300A}
+\pdfglyphtounicode{dblanglebracketleftvertical}{FE3D}
+\pdfglyphtounicode{dblanglebracketright}{300B}
+\pdfglyphtounicode{dblanglebracketrightvertical}{FE3E}
+\pdfglyphtounicode{dblarchinvertedbelowcmb}{032B}
+\pdfglyphtounicode{dblarrowdwn}{21CA}
+\pdfglyphtounicode{dblarrowheadleft}{219E}
+\pdfglyphtounicode{dblarrowheadright}{21A0}
+\pdfglyphtounicode{dblarrowleft}{21D4}
+\pdfglyphtounicode{dblarrowright}{21D2}
+\pdfglyphtounicode{dblarrowup}{21C8}
+\pdfglyphtounicode{dblbracketleft}{27E6}
+\pdfglyphtounicode{dblbracketright}{27E7}
+\pdfglyphtounicode{dbldanda}{0965}
+\pdfglyphtounicode{dblgrave}{00A0 030F}
+\pdfglyphtounicode{dblgravecmb}{030F}
+\pdfglyphtounicode{dblintegral}{222C}
+\pdfglyphtounicode{dbllowline}{2017}
+\pdfglyphtounicode{dbllowlinecmb}{0333}
+\pdfglyphtounicode{dbloverlinecmb}{033F}
+\pdfglyphtounicode{dblprimemod}{02BA}
+\pdfglyphtounicode{dblverticalbar}{2016}
+\pdfglyphtounicode{dblverticallineabovecmb}{030E}
+\pdfglyphtounicode{dbopomofo}{3109}
+\pdfglyphtounicode{dbsquare}{33C8}
+\pdfglyphtounicode{dcaron}{010F}
+\pdfglyphtounicode{dcedilla}{1E11}
+\pdfglyphtounicode{dcircle}{24D3}
+\pdfglyphtounicode{dcircumflexbelow}{1E13}
+\pdfglyphtounicode{dcroat}{0111}
+\pdfglyphtounicode{ddabengali}{09A1}
+\pdfglyphtounicode{ddadeva}{0921}
+\pdfglyphtounicode{ddagujarati}{0AA1}
+\pdfglyphtounicode{ddagurmukhi}{0A21}
+\pdfglyphtounicode{ddalarabic}{0688}
+\pdfglyphtounicode{ddalfinalarabic}{FB89}
+\pdfglyphtounicode{dddhadeva}{095C}
+\pdfglyphtounicode{ddhabengali}{09A2}
+\pdfglyphtounicode{ddhadeva}{0922}
+\pdfglyphtounicode{ddhagujarati}{0AA2}
+\pdfglyphtounicode{ddhagurmukhi}{0A22}
+\pdfglyphtounicode{ddotaccent}{1E0B}
+\pdfglyphtounicode{ddotbelow}{1E0D}
+\pdfglyphtounicode{decimalseparatorarabic}{066B}
+\pdfglyphtounicode{decimalseparatorpersian}{066B}
+\pdfglyphtounicode{decyrillic}{0434}
+\pdfglyphtounicode{defines}{225C}
+\pdfglyphtounicode{degree}{00B0}
+\pdfglyphtounicode{dehihebrew}{05AD}
+\pdfglyphtounicode{dehiragana}{3067}
+\pdfglyphtounicode{deicoptic}{03EF}
+\pdfglyphtounicode{dekatakana}{30C7}
+\pdfglyphtounicode{deleteleft}{232B}
+\pdfglyphtounicode{deleteright}{2326}
+\pdfglyphtounicode{delta}{03B4}
+\pdfglyphtounicode{deltaturned}{018D}
+\pdfglyphtounicode{denominatorminusonenumeratorbengali}{09F8}
+\pdfglyphtounicode{dezh}{02A4}
+\pdfglyphtounicode{dhabengali}{09A7}
+\pdfglyphtounicode{dhadeva}{0927}
+\pdfglyphtounicode{dhagujarati}{0AA7}
+\pdfglyphtounicode{dhagurmukhi}{0A27}
+\pdfglyphtounicode{dhook}{0257}
+\pdfglyphtounicode{dialytikatonos}{0385}
+\pdfglyphtounicode{dialytikatonoscmb}{0344}
+\pdfglyphtounicode{diamond}{2666}
+\pdfglyphtounicode{diamondmath}{22C4}
+\pdfglyphtounicode{diamondsolid}{2666}
+\pdfglyphtounicode{diamondsuitwhite}{2662}
+\pdfglyphtounicode{dieresis}{00A8}
+\pdfglyphtounicode{dieresisacute}{00A0 0308 0301}
+\pdfglyphtounicode{dieresisbelowcmb}{0324}
+\pdfglyphtounicode{dieresiscmb}{0308}
+\pdfglyphtounicode{dieresisgrave}{00A0 0308 0300}
+\pdfglyphtounicode{dieresistonos}{0385}
+\pdfglyphtounicode{difference}{224F}
+\pdfglyphtounicode{dihiragana}{3062}
+\pdfglyphtounicode{dikatakana}{30C2}
+\pdfglyphtounicode{dittomark}{3003}
+\pdfglyphtounicode{divide}{00F7}
+\pdfglyphtounicode{dividemultiply}{22C7}
+\pdfglyphtounicode{divides}{2223}
+\pdfglyphtounicode{divisionslash}{2215}
+\pdfglyphtounicode{djecyrillic}{0452}
+\pdfglyphtounicode{dkshade}{2593}
+\pdfglyphtounicode{dlinebelow}{1E0F}
+\pdfglyphtounicode{dlsquare}{3397}
+\pdfglyphtounicode{dmacron}{0111}
+\pdfglyphtounicode{dmonospace}{FF44}
+\pdfglyphtounicode{dnblock}{2584}
+\pdfglyphtounicode{dochadathai}{0E0E}
+\pdfglyphtounicode{dodekthai}{0E14}
+\pdfglyphtounicode{dohiragana}{3069}
+\pdfglyphtounicode{dokatakana}{30C9}
+\pdfglyphtounicode{dollar}{0024}
+\pdfglyphtounicode{dollarinferior}{0024}
+\pdfglyphtounicode{dollarmonospace}{FF04}
+\pdfglyphtounicode{dollaroldstyle}{0024}
+\pdfglyphtounicode{dollarsmall}{FE69}
+\pdfglyphtounicode{dollarsuperior}{0024}
+\pdfglyphtounicode{dong}{20AB}
+\pdfglyphtounicode{dorusquare}{3326}
+\pdfglyphtounicode{dotaccent}{02D9}
+\pdfglyphtounicode{dotaccentcmb}{0307}
+\pdfglyphtounicode{dotbelowcmb}{0323}
+\pdfglyphtounicode{dotbelowcomb}{0323}
+\pdfglyphtounicode{dotkatakana}{30FB}
+\pdfglyphtounicode{dotlessi}{0131}
+\pdfglyphtounicode{dotlessj}{0237}
+\pdfglyphtounicode{dotlessjstrokehook}{0284}
+\pdfglyphtounicode{dotmath}{22C5}
+\pdfglyphtounicode{dotplus}{2214}
+\pdfglyphtounicode{dottedcircle}{25CC}
+\pdfglyphtounicode{doubleyodpatah}{FB1F}
+\pdfglyphtounicode{doubleyodpatahhebrew}{FB1F}
+\pdfglyphtounicode{downfall}{22CE}
+\pdfglyphtounicode{downslope}{29F9}
+\pdfglyphtounicode{downtackbelowcmb}{031E}
+\pdfglyphtounicode{downtackmod}{02D5}
+\pdfglyphtounicode{dparen}{249F}
+\pdfglyphtounicode{dsuperior}{0064}
+\pdfglyphtounicode{dtail}{0256}
+\pdfglyphtounicode{dtopbar}{018C}
+\pdfglyphtounicode{duhiragana}{3065}
+\pdfglyphtounicode{dukatakana}{30C5}
+\pdfglyphtounicode{dz}{01F3}
+\pdfglyphtounicode{dzaltone}{02A3}
+\pdfglyphtounicode{dzcaron}{01C6}
+\pdfglyphtounicode{dzcurl}{02A5}
+\pdfglyphtounicode{dzeabkhasiancyrillic}{04E1}
+\pdfglyphtounicode{dzecyrillic}{0455}
+\pdfglyphtounicode{dzhecyrillic}{045F}
+\pdfglyphtounicode{e}{0065}
+\pdfglyphtounicode{eacute}{00E9}
+\pdfglyphtounicode{earth}{2641}
+\pdfglyphtounicode{ebengali}{098F}
+\pdfglyphtounicode{ebopomofo}{311C}
+\pdfglyphtounicode{ebreve}{0115}
+\pdfglyphtounicode{ecandradeva}{090D}
+\pdfglyphtounicode{ecandragujarati}{0A8D}
+\pdfglyphtounicode{ecandravowelsigndeva}{0945}
+\pdfglyphtounicode{ecandravowelsigngujarati}{0AC5}
+\pdfglyphtounicode{ecaron}{011B}
+\pdfglyphtounicode{ecedillabreve}{1E1D}
+\pdfglyphtounicode{echarmenian}{0565}
+\pdfglyphtounicode{echyiwnarmenian}{0587}
+\pdfglyphtounicode{ecircle}{24D4}
+\pdfglyphtounicode{ecircumflex}{00EA}
+\pdfglyphtounicode{ecircumflexacute}{1EBF}
+\pdfglyphtounicode{ecircumflexbelow}{1E19}
+\pdfglyphtounicode{ecircumflexdotbelow}{1EC7}
+\pdfglyphtounicode{ecircumflexgrave}{1EC1}
+\pdfglyphtounicode{ecircumflexhookabove}{1EC3}
+\pdfglyphtounicode{ecircumflextilde}{1EC5}
+\pdfglyphtounicode{ecyrillic}{0454}
+\pdfglyphtounicode{edblgrave}{0205}
+\pdfglyphtounicode{edeva}{090F}
+\pdfglyphtounicode{edieresis}{00EB}
+\pdfglyphtounicode{edot}{0117}
+\pdfglyphtounicode{edotaccent}{0117}
+\pdfglyphtounicode{edotbelow}{1EB9}
+\pdfglyphtounicode{eegurmukhi}{0A0F}
+\pdfglyphtounicode{eematragurmukhi}{0A47}
+\pdfglyphtounicode{efcyrillic}{0444}
+\pdfglyphtounicode{egrave}{00E8}
+\pdfglyphtounicode{egujarati}{0A8F}
+\pdfglyphtounicode{eharmenian}{0567}
+\pdfglyphtounicode{ehbopomofo}{311D}
+\pdfglyphtounicode{ehiragana}{3048}
+\pdfglyphtounicode{ehookabove}{1EBB}
+\pdfglyphtounicode{eibopomofo}{311F}
+\pdfglyphtounicode{eight}{0038}
+\pdfglyphtounicode{eightarabic}{0668}
+\pdfglyphtounicode{eightbengali}{09EE}
+\pdfglyphtounicode{eightcircle}{2467}
+\pdfglyphtounicode{eightcircleinversesansserif}{2791}
+\pdfglyphtounicode{eightdeva}{096E}
+\pdfglyphtounicode{eighteencircle}{2471}
+\pdfglyphtounicode{eighteenparen}{2485}
+\pdfglyphtounicode{eighteenperiod}{2499}
+\pdfglyphtounicode{eightgujarati}{0AEE}
+\pdfglyphtounicode{eightgurmukhi}{0A6E}
+\pdfglyphtounicode{eighthackarabic}{0668}
+\pdfglyphtounicode{eighthangzhou}{3028}
+\pdfglyphtounicode{eighthnotebeamed}{266B}
+\pdfglyphtounicode{eightideographicparen}{3227}
+\pdfglyphtounicode{eightinferior}{2088}
+\pdfglyphtounicode{eightmonospace}{FF18}
+\pdfglyphtounicode{eightoldstyle}{0038}
+\pdfglyphtounicode{eightparen}{247B}
+\pdfglyphtounicode{eightperiod}{248F}
+\pdfglyphtounicode{eightpersian}{06F8}
+\pdfglyphtounicode{eightroman}{2177}
+\pdfglyphtounicode{eightsuperior}{2078}
+\pdfglyphtounicode{eightthai}{0E58}
+\pdfglyphtounicode{einvertedbreve}{0207}
+\pdfglyphtounicode{eiotifiedcyrillic}{0465}
+\pdfglyphtounicode{ekatakana}{30A8}
+\pdfglyphtounicode{ekatakanahalfwidth}{FF74}
+\pdfglyphtounicode{ekonkargurmukhi}{0A74}
+\pdfglyphtounicode{ekorean}{3154}
+\pdfglyphtounicode{elcyrillic}{043B}
+\pdfglyphtounicode{element}{2208}
+\pdfglyphtounicode{elevencircle}{246A}
+\pdfglyphtounicode{elevenparen}{247E}
+\pdfglyphtounicode{elevenperiod}{2492}
+\pdfglyphtounicode{elevenroman}{217A}
+\pdfglyphtounicode{ellipsis}{2026}
+\pdfglyphtounicode{ellipsisvertical}{22EE}
+\pdfglyphtounicode{emacron}{0113}
+\pdfglyphtounicode{emacronacute}{1E17}
+\pdfglyphtounicode{emacrongrave}{1E15}
+\pdfglyphtounicode{emcyrillic}{043C}
+\pdfglyphtounicode{emdash}{2014}
+\pdfglyphtounicode{emdashvertical}{FE31}
+\pdfglyphtounicode{emonospace}{FF45}
+\pdfglyphtounicode{emphasismarkarmenian}{055B}
+\pdfglyphtounicode{emptyset}{2205}
+\pdfglyphtounicode{enbopomofo}{3123}
+\pdfglyphtounicode{encyrillic}{043D}
+\pdfglyphtounicode{endash}{2013}
+\pdfglyphtounicode{endashvertical}{FE32}
+\pdfglyphtounicode{endescendercyrillic}{04A3}
+\pdfglyphtounicode{eng}{014B}
+\pdfglyphtounicode{engbopomofo}{3125}
+\pdfglyphtounicode{enghecyrillic}{04A5}
+\pdfglyphtounicode{enhookcyrillic}{04C8}
+\pdfglyphtounicode{enspace}{2002}
+\pdfglyphtounicode{eogonek}{0119}
+\pdfglyphtounicode{eokorean}{3153}
+\pdfglyphtounicode{eopen}{025B}
+\pdfglyphtounicode{eopenclosed}{029A}
+\pdfglyphtounicode{eopenreversed}{025C}
+\pdfglyphtounicode{eopenreversedclosed}{025E}
+\pdfglyphtounicode{eopenreversedhook}{025D}
+\pdfglyphtounicode{eparen}{24A0}
+\pdfglyphtounicode{epsilon}{03B5}
+\pdfglyphtounicode{epsilon1}{03F5}
+\pdfglyphtounicode{epsiloninv}{03F6}
+\pdfglyphtounicode{epsilontonos}{03AD}
+\pdfglyphtounicode{equal}{003D}
+\pdfglyphtounicode{equaldotleftright}{2252}
+\pdfglyphtounicode{equaldotrightleft}{2253}
+\pdfglyphtounicode{equalmonospace}{FF1D}
+\pdfglyphtounicode{equalorfollows}{22DF}
+\pdfglyphtounicode{equalorgreater}{2A96}
+\pdfglyphtounicode{equalorless}{2A95}
+\pdfglyphtounicode{equalorprecedes}{22DE}
+\pdfglyphtounicode{equalorsimilar}{2242}
+\pdfglyphtounicode{equalsdots}{2251}
+\pdfglyphtounicode{equalsmall}{FE66}
+\pdfglyphtounicode{equalsuperior}{207C}
+\pdfglyphtounicode{equivalence}{2261}
+\pdfglyphtounicode{equivasymptotic}{224D}
+\pdfglyphtounicode{erbopomofo}{3126}
+\pdfglyphtounicode{ercyrillic}{0440}
+\pdfglyphtounicode{ereversed}{0258}
+\pdfglyphtounicode{ereversedcyrillic}{044D}
+\pdfglyphtounicode{escyrillic}{0441}
+\pdfglyphtounicode{esdescendercyrillic}{04AB}
+\pdfglyphtounicode{esh}{0283}
+\pdfglyphtounicode{eshcurl}{0286}
+\pdfglyphtounicode{eshortdeva}{090E}
+\pdfglyphtounicode{eshortvowelsigndeva}{0946}
+\pdfglyphtounicode{eshreversedloop}{01AA}
+\pdfglyphtounicode{eshsquatreversed}{0285}
+\pdfglyphtounicode{esmallhiragana}{3047}
+\pdfglyphtounicode{esmallkatakana}{30A7}
+\pdfglyphtounicode{esmallkatakanahalfwidth}{FF6A}
+\pdfglyphtounicode{estimated}{212E}
+\pdfglyphtounicode{esuperior}{0065}
+\pdfglyphtounicode{eta}{03B7}
+\pdfglyphtounicode{etarmenian}{0568}
+\pdfglyphtounicode{etatonos}{03AE}
+\pdfglyphtounicode{eth}{00F0}
+\pdfglyphtounicode{etilde}{1EBD}
+\pdfglyphtounicode{etildebelow}{1E1B}
+\pdfglyphtounicode{etnahtafoukhhebrew}{0591}
+\pdfglyphtounicode{etnahtafoukhlefthebrew}{0591}
+\pdfglyphtounicode{etnahtahebrew}{0591}
+\pdfglyphtounicode{etnahtalefthebrew}{0591}
+\pdfglyphtounicode{eturned}{01DD}
+\pdfglyphtounicode{eukorean}{3161}
+\pdfglyphtounicode{euro}{20AC}
+\pdfglyphtounicode{evowelsignbengali}{09C7}
+\pdfglyphtounicode{evowelsigndeva}{0947}
+\pdfglyphtounicode{evowelsigngujarati}{0AC7}
+\pdfglyphtounicode{exclam}{0021}
+\pdfglyphtounicode{exclamarmenian}{055C}
+\pdfglyphtounicode{exclamdbl}{203C}
+\pdfglyphtounicode{exclamdown}{00A1}
+\pdfglyphtounicode{exclamdownsmall}{00A1}
+\pdfglyphtounicode{exclammonospace}{FF01}
+\pdfglyphtounicode{exclamsmall}{0021}
+\pdfglyphtounicode{existential}{2203}
+\pdfglyphtounicode{ezh}{0292}
+\pdfglyphtounicode{ezhcaron}{01EF}
+\pdfglyphtounicode{ezhcurl}{0293}
+\pdfglyphtounicode{ezhreversed}{01B9}
+\pdfglyphtounicode{ezhtail}{01BA}
+\pdfglyphtounicode{f}{0066}
+\pdfglyphtounicode{fadeva}{095E}
+\pdfglyphtounicode{fagurmukhi}{0A5E}
+\pdfglyphtounicode{fahrenheit}{2109}
+\pdfglyphtounicode{fathaarabic}{064E}
+\pdfglyphtounicode{fathalowarabic}{064E}
+\pdfglyphtounicode{fathatanarabic}{064B}
+\pdfglyphtounicode{fbopomofo}{3108}
+\pdfglyphtounicode{fcircle}{24D5}
+\pdfglyphtounicode{fdotaccent}{1E1F}
+\pdfglyphtounicode{feharabic}{0641}
+\pdfglyphtounicode{feharmenian}{0586}
+\pdfglyphtounicode{fehfinalarabic}{FED2}
+\pdfglyphtounicode{fehinitialarabic}{FED3}
+\pdfglyphtounicode{fehmedialarabic}{FED4}
+\pdfglyphtounicode{feicoptic}{03E5}
+\pdfglyphtounicode{female}{2640}
+\pdfglyphtounicode{ff}{0066 0066}
+\pdfglyphtounicode{ffi}{0066 0066 0069}
+\pdfglyphtounicode{ffl}{0066 0066 006C}
+\pdfglyphtounicode{fi}{0066 0069}
+\pdfglyphtounicode{fifteencircle}{246E}
+\pdfglyphtounicode{fifteenparen}{2482}
+\pdfglyphtounicode{fifteenperiod}{2496}
+\pdfglyphtounicode{figuredash}{2012}
+\pdfglyphtounicode{filledbox}{25A0}
+\pdfglyphtounicode{filledrect}{25AC}
+\pdfglyphtounicode{finalkaf}{05DA}
+\pdfglyphtounicode{finalkafdagesh}{FB3A}
+\pdfglyphtounicode{finalkafdageshhebrew}{FB3A}
+\pdfglyphtounicode{finalkafhebrew}{05DA}
+\pdfglyphtounicode{finalkafqamats}{05DA 05B8}
+\pdfglyphtounicode{finalkafqamatshebrew}{05DA 05B8}
+\pdfglyphtounicode{finalkafsheva}{05DA 05B0}
+\pdfglyphtounicode{finalkafshevahebrew}{05DA 05B0}
+\pdfglyphtounicode{finalmem}{05DD}
+\pdfglyphtounicode{finalmemhebrew}{05DD}
+\pdfglyphtounicode{finalnun}{05DF}
+\pdfglyphtounicode{finalnunhebrew}{05DF}
+\pdfglyphtounicode{finalpe}{05E3}
+\pdfglyphtounicode{finalpehebrew}{05E3}
+\pdfglyphtounicode{finaltsadi}{05E5}
+\pdfglyphtounicode{finaltsadihebrew}{05E5}
+\pdfglyphtounicode{firsttonechinese}{02C9}
+\pdfglyphtounicode{fisheye}{25C9}
+\pdfglyphtounicode{fitacyrillic}{0473}
+\pdfglyphtounicode{five}{0035}
+\pdfglyphtounicode{fivearabic}{0665}
+\pdfglyphtounicode{fivebengali}{09EB}
+\pdfglyphtounicode{fivecircle}{2464}
+\pdfglyphtounicode{fivecircleinversesansserif}{278E}
+\pdfglyphtounicode{fivedeva}{096B}
+\pdfglyphtounicode{fiveeighths}{215D}
+\pdfglyphtounicode{fivegujarati}{0AEB}
+\pdfglyphtounicode{fivegurmukhi}{0A6B}
+\pdfglyphtounicode{fivehackarabic}{0665}
+\pdfglyphtounicode{fivehangzhou}{3025}
+\pdfglyphtounicode{fiveideographicparen}{3224}
+\pdfglyphtounicode{fiveinferior}{2085}
+\pdfglyphtounicode{fivemonospace}{FF15}
+\pdfglyphtounicode{fiveoldstyle}{0035}
+\pdfglyphtounicode{fiveparen}{2478}
+\pdfglyphtounicode{fiveperiod}{248C}
+\pdfglyphtounicode{fivepersian}{06F5}
+\pdfglyphtounicode{fiveroman}{2174}
+\pdfglyphtounicode{fivesuperior}{2075}
+\pdfglyphtounicode{fivethai}{0E55}
+\pdfglyphtounicode{fl}{0066 006C}
+\pdfglyphtounicode{flat}{266D}
+\pdfglyphtounicode{floorleft}{230A}
+\pdfglyphtounicode{floorright}{230B}
+\pdfglyphtounicode{florin}{0192}
+\pdfglyphtounicode{fmonospace}{FF46}
+\pdfglyphtounicode{fmsquare}{3399}
+\pdfglyphtounicode{fofanthai}{0E1F}
+\pdfglyphtounicode{fofathai}{0E1D}
+\pdfglyphtounicode{follownotdbleqv}{2ABA}
+\pdfglyphtounicode{follownotslnteql}{2AB6}
+\pdfglyphtounicode{followornoteqvlnt}{22E9}
+\pdfglyphtounicode{follows}{227B}
+\pdfglyphtounicode{followsequal}{2AB0}
+\pdfglyphtounicode{followsorcurly}{227D}
+\pdfglyphtounicode{followsorequal}{227F}
+\pdfglyphtounicode{fongmanthai}{0E4F}
+\pdfglyphtounicode{forall}{2200}
+\pdfglyphtounicode{forces}{22A9}
+\pdfglyphtounicode{forcesbar}{22AA}
+\pdfglyphtounicode{fork}{22D4}
+\pdfglyphtounicode{four}{0034}
+\pdfglyphtounicode{fourarabic}{0664}
+\pdfglyphtounicode{fourbengali}{09EA}
+\pdfglyphtounicode{fourcircle}{2463}
+\pdfglyphtounicode{fourcircleinversesansserif}{278D}
+\pdfglyphtounicode{fourdeva}{096A}
+\pdfglyphtounicode{fourgujarati}{0AEA}
+\pdfglyphtounicode{fourgurmukhi}{0A6A}
+\pdfglyphtounicode{fourhackarabic}{0664}
+\pdfglyphtounicode{fourhangzhou}{3024}
+\pdfglyphtounicode{fourideographicparen}{3223}
+\pdfglyphtounicode{fourinferior}{2084}
+\pdfglyphtounicode{fourmonospace}{FF14}
+\pdfglyphtounicode{fournumeratorbengali}{09F7}
+\pdfglyphtounicode{fouroldstyle}{0034}
+\pdfglyphtounicode{fourparen}{2477}
+\pdfglyphtounicode{fourperiod}{248B}
+\pdfglyphtounicode{fourpersian}{06F4}
+\pdfglyphtounicode{fourroman}{2173}
+\pdfglyphtounicode{foursuperior}{2074}
+\pdfglyphtounicode{fourteencircle}{246D}
+\pdfglyphtounicode{fourteenparen}{2481}
+\pdfglyphtounicode{fourteenperiod}{2495}
+\pdfglyphtounicode{fourthai}{0E54}
+\pdfglyphtounicode{fourthtonechinese}{02CB}
+\pdfglyphtounicode{fparen}{24A1}
+\pdfglyphtounicode{fraction}{2044}
+\pdfglyphtounicode{franc}{20A3}
+\pdfglyphtounicode{frown}{2322}
+\pdfglyphtounicode{g}{0067}
+\pdfglyphtounicode{gabengali}{0997}
+\pdfglyphtounicode{gacute}{01F5}
+\pdfglyphtounicode{gadeva}{0917}
+\pdfglyphtounicode{gafarabic}{06AF}
+\pdfglyphtounicode{gaffinalarabic}{FB93}
+\pdfglyphtounicode{gafinitialarabic}{FB94}
+\pdfglyphtounicode{gafmedialarabic}{FB95}
+\pdfglyphtounicode{gagujarati}{0A97}
+\pdfglyphtounicode{gagurmukhi}{0A17}
+\pdfglyphtounicode{gahiragana}{304C}
+\pdfglyphtounicode{gakatakana}{30AC}
+\pdfglyphtounicode{gamma}{03B3}
+\pdfglyphtounicode{gammalatinsmall}{0263}
+\pdfglyphtounicode{gammasuperior}{02E0}
+\pdfglyphtounicode{gangiacoptic}{03EB}
+\pdfglyphtounicode{gbopomofo}{310D}
+\pdfglyphtounicode{gbreve}{011F}
+\pdfglyphtounicode{gcaron}{01E7}
+\pdfglyphtounicode{gcedilla}{0123}
+\pdfglyphtounicode{gcircle}{24D6}
+\pdfglyphtounicode{gcircumflex}{011D}
+\pdfglyphtounicode{gcommaaccent}{0123}
+\pdfglyphtounicode{gdot}{0121}
+\pdfglyphtounicode{gdotaccent}{0121}
+\pdfglyphtounicode{gecyrillic}{0433}
+\pdfglyphtounicode{gehiragana}{3052}
+\pdfglyphtounicode{gekatakana}{30B2}
+\pdfglyphtounicode{geomequivalent}{224E}
+\pdfglyphtounicode{geometricallyequal}{2251}
+\pdfglyphtounicode{gereshaccenthebrew}{059C}
+\pdfglyphtounicode{gereshhebrew}{05F3}
+\pdfglyphtounicode{gereshmuqdamhebrew}{059D}
+\pdfglyphtounicode{germandbls}{00DF}
+\pdfglyphtounicode{gershayimaccenthebrew}{059E}
+\pdfglyphtounicode{gershayimhebrew}{05F4}
+\pdfglyphtounicode{getamark}{3013}
+\pdfglyphtounicode{ghabengali}{0998}
+\pdfglyphtounicode{ghadarmenian}{0572}
+\pdfglyphtounicode{ghadeva}{0918}
+\pdfglyphtounicode{ghagujarati}{0A98}
+\pdfglyphtounicode{ghagurmukhi}{0A18}
+\pdfglyphtounicode{ghainarabic}{063A}
+\pdfglyphtounicode{ghainfinalarabic}{FECE}
+\pdfglyphtounicode{ghaininitialarabic}{FECF}
+\pdfglyphtounicode{ghainmedialarabic}{FED0}
+\pdfglyphtounicode{ghemiddlehookcyrillic}{0495}
+\pdfglyphtounicode{ghestrokecyrillic}{0493}
+\pdfglyphtounicode{gheupturncyrillic}{0491}
+\pdfglyphtounicode{ghhadeva}{095A}
+\pdfglyphtounicode{ghhagurmukhi}{0A5A}
+\pdfglyphtounicode{ghook}{0260}
+\pdfglyphtounicode{ghzsquare}{3393}
+\pdfglyphtounicode{gihiragana}{304E}
+\pdfglyphtounicode{gikatakana}{30AE}
+\pdfglyphtounicode{gimarmenian}{0563}
+\pdfglyphtounicode{gimel}{05D2}
+\pdfglyphtounicode{gimeldagesh}{FB32}
+\pdfglyphtounicode{gimeldageshhebrew}{FB32}
+\pdfglyphtounicode{gimelhebrew}{05D2}
+\pdfglyphtounicode{gjecyrillic}{0453}
+\pdfglyphtounicode{glottalinvertedstroke}{01BE}
+\pdfglyphtounicode{glottalstop}{0294}
+\pdfglyphtounicode{glottalstopinverted}{0296}
+\pdfglyphtounicode{glottalstopmod}{02C0}
+\pdfglyphtounicode{glottalstopreversed}{0295}
+\pdfglyphtounicode{glottalstopreversedmod}{02C1}
+\pdfglyphtounicode{glottalstopreversedsuperior}{02E4}
+\pdfglyphtounicode{glottalstopstroke}{02A1}
+\pdfglyphtounicode{glottalstopstrokereversed}{02A2}
+\pdfglyphtounicode{gmacron}{1E21}
+\pdfglyphtounicode{gmonospace}{FF47}
+\pdfglyphtounicode{gohiragana}{3054}
+\pdfglyphtounicode{gokatakana}{30B4}
+\pdfglyphtounicode{gparen}{24A2}
+\pdfglyphtounicode{gpasquare}{33AC}
+\pdfglyphtounicode{gradient}{2207}
+\pdfglyphtounicode{grave}{0060}
+\pdfglyphtounicode{gravebelowcmb}{0316}
+\pdfglyphtounicode{gravecmb}{0300}
+\pdfglyphtounicode{gravecomb}{0300}
+\pdfglyphtounicode{gravedeva}{0953}
+\pdfglyphtounicode{gravelowmod}{02CE}
+\pdfglyphtounicode{gravemonospace}{FF40}
+\pdfglyphtounicode{gravetonecmb}{0340}
+\pdfglyphtounicode{greater}{003E}
+\pdfglyphtounicode{greaterdbleqlless}{2A8C}
+\pdfglyphtounicode{greaterdblequal}{2267}
+\pdfglyphtounicode{greaterdot}{22D7}
+\pdfglyphtounicode{greaterequal}{2265}
+\pdfglyphtounicode{greaterequalorless}{22DB}
+\pdfglyphtounicode{greaterlessequal}{22DB}
+\pdfglyphtounicode{greatermonospace}{FF1E}
+\pdfglyphtounicode{greatermuch}{226B}
+\pdfglyphtounicode{greaternotdblequal}{2A8A}
+\pdfglyphtounicode{greaternotequal}{2A88}
+\pdfglyphtounicode{greaterorapproxeql}{2A86}
+\pdfglyphtounicode{greaterorequalslant}{2A7E}
+\pdfglyphtounicode{greaterorequivalent}{2273}
+\pdfglyphtounicode{greaterorless}{2277}
+\pdfglyphtounicode{greaterornotdbleql}{2269}
+\pdfglyphtounicode{greaterornotequal}{2269}
+\pdfglyphtounicode{greaterorsimilar}{2273}
+\pdfglyphtounicode{greateroverequal}{2267}
+\pdfglyphtounicode{greatersmall}{FE65}
+\pdfglyphtounicode{gscript}{0261}
+\pdfglyphtounicode{gstroke}{01E5}
+\pdfglyphtounicode{guhiragana}{3050}
+\pdfglyphtounicode{guillemotleft}{00AB}
+\pdfglyphtounicode{guillemotright}{00BB}
+\pdfglyphtounicode{guilsinglleft}{2039}
+\pdfglyphtounicode{guilsinglright}{203A}
+\pdfglyphtounicode{gukatakana}{30B0}
+\pdfglyphtounicode{guramusquare}{3318}
+\pdfglyphtounicode{gysquare}{33C9}
+\pdfglyphtounicode{h}{0068}
+\pdfglyphtounicode{haabkhasiancyrillic}{04A9}
+\pdfglyphtounicode{haaltonearabic}{06C1}
+\pdfglyphtounicode{habengali}{09B9}
+\pdfglyphtounicode{hadescendercyrillic}{04B3}
+\pdfglyphtounicode{hadeva}{0939}
+\pdfglyphtounicode{hagujarati}{0AB9}
+\pdfglyphtounicode{hagurmukhi}{0A39}
+\pdfglyphtounicode{haharabic}{062D}
+\pdfglyphtounicode{hahfinalarabic}{FEA2}
+\pdfglyphtounicode{hahinitialarabic}{FEA3}
+\pdfglyphtounicode{hahiragana}{306F}
+\pdfglyphtounicode{hahmedialarabic}{FEA4}
+\pdfglyphtounicode{haitusquare}{332A}
+\pdfglyphtounicode{hakatakana}{30CF}
+\pdfglyphtounicode{hakatakanahalfwidth}{FF8A}
+\pdfglyphtounicode{halantgurmukhi}{0A4D}
+\pdfglyphtounicode{hamzaarabic}{0621}
+\pdfglyphtounicode{hamzadammaarabic}{0621 064F}
+\pdfglyphtounicode{hamzadammatanarabic}{0621 064C}
+\pdfglyphtounicode{hamzafathaarabic}{0621 064E}
+\pdfglyphtounicode{hamzafathatanarabic}{0621 064B}
+\pdfglyphtounicode{hamzalowarabic}{0621}
+\pdfglyphtounicode{hamzalowkasraarabic}{0621 0650}
+\pdfglyphtounicode{hamzalowkasratanarabic}{0621 064D}
+\pdfglyphtounicode{hamzasukunarabic}{0621 0652}
+\pdfglyphtounicode{hangulfiller}{3164}
+\pdfglyphtounicode{hardsigncyrillic}{044A}
+\pdfglyphtounicode{harpoondownleft}{21C3}
+\pdfglyphtounicode{harpoondownright}{21C2}
+\pdfglyphtounicode{harpoonleftbarbup}{21BC}
+\pdfglyphtounicode{harpoonleftright}{21CC}
+\pdfglyphtounicode{harpoonrightbarbup}{21C0}
+\pdfglyphtounicode{harpoonrightleft}{21CB}
+\pdfglyphtounicode{harpoonupleft}{21BF}
+\pdfglyphtounicode{harpoonupright}{21BE}
+\pdfglyphtounicode{hasquare}{33CA}
+\pdfglyphtounicode{hatafpatah}{05B2}
+\pdfglyphtounicode{hatafpatah16}{05B2}
+\pdfglyphtounicode{hatafpatah23}{05B2}
+\pdfglyphtounicode{hatafpatah2f}{05B2}
+\pdfglyphtounicode{hatafpatahhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahnarrowhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahquarterhebrew}{05B2}
+\pdfglyphtounicode{hatafpatahwidehebrew}{05B2}
+\pdfglyphtounicode{hatafqamats}{05B3}
+\pdfglyphtounicode{hatafqamats1b}{05B3}
+\pdfglyphtounicode{hatafqamats28}{05B3}
+\pdfglyphtounicode{hatafqamats34}{05B3}
+\pdfglyphtounicode{hatafqamatshebrew}{05B3}
+\pdfglyphtounicode{hatafqamatsnarrowhebrew}{05B3}
+\pdfglyphtounicode{hatafqamatsquarterhebrew}{05B3}
+\pdfglyphtounicode{hatafqamatswidehebrew}{05B3}
+\pdfglyphtounicode{hatafsegol}{05B1}
+\pdfglyphtounicode{hatafsegol17}{05B1}
+\pdfglyphtounicode{hatafsegol24}{05B1}
+\pdfglyphtounicode{hatafsegol30}{05B1}
+\pdfglyphtounicode{hatafsegolhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolnarrowhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolquarterhebrew}{05B1}
+\pdfglyphtounicode{hatafsegolwidehebrew}{05B1}
+\pdfglyphtounicode{hbar}{0127}
+\pdfglyphtounicode{hbopomofo}{310F}
+\pdfglyphtounicode{hbrevebelow}{1E2B}
+\pdfglyphtounicode{hcedilla}{1E29}
+\pdfglyphtounicode{hcircle}{24D7}
+\pdfglyphtounicode{hcircumflex}{0125}
+\pdfglyphtounicode{hdieresis}{1E27}
+\pdfglyphtounicode{hdotaccent}{1E23}
+\pdfglyphtounicode{hdotbelow}{1E25}
+\pdfglyphtounicode{he}{05D4}
+\pdfglyphtounicode{heart}{2665}
+\pdfglyphtounicode{heartsuitblack}{2665}
+\pdfglyphtounicode{heartsuitwhite}{2661}
+\pdfglyphtounicode{hedagesh}{FB34}
+\pdfglyphtounicode{hedageshhebrew}{FB34}
+\pdfglyphtounicode{hehaltonearabic}{06C1}
+\pdfglyphtounicode{heharabic}{0647}
+\pdfglyphtounicode{hehebrew}{05D4}
+\pdfglyphtounicode{hehfinalaltonearabic}{FBA7}
+\pdfglyphtounicode{hehfinalalttwoarabic}{FEEA}
+\pdfglyphtounicode{hehfinalarabic}{FEEA}
+\pdfglyphtounicode{hehhamzaabovefinalarabic}{FBA5}
+\pdfglyphtounicode{hehhamzaaboveisolatedarabic}{FBA4}
+\pdfglyphtounicode{hehinitialaltonearabic}{FBA8}
+\pdfglyphtounicode{hehinitialarabic}{FEEB}
+\pdfglyphtounicode{hehiragana}{3078}
+\pdfglyphtounicode{hehmedialaltonearabic}{FBA9}
+\pdfglyphtounicode{hehmedialarabic}{FEEC}
+\pdfglyphtounicode{heiseierasquare}{337B}
+\pdfglyphtounicode{hekatakana}{30D8}
+\pdfglyphtounicode{hekatakanahalfwidth}{FF8D}
+\pdfglyphtounicode{hekutaarusquare}{3336}
+\pdfglyphtounicode{henghook}{0267}
+\pdfglyphtounicode{herutusquare}{3339}
+\pdfglyphtounicode{het}{05D7}
+\pdfglyphtounicode{hethebrew}{05D7}
+\pdfglyphtounicode{hhook}{0266}
+\pdfglyphtounicode{hhooksuperior}{02B1}
+\pdfglyphtounicode{hieuhacirclekorean}{327B}
+\pdfglyphtounicode{hieuhaparenkorean}{321B}
+\pdfglyphtounicode{hieuhcirclekorean}{326D}
+\pdfglyphtounicode{hieuhkorean}{314E}
+\pdfglyphtounicode{hieuhparenkorean}{320D}
+\pdfglyphtounicode{hihiragana}{3072}
+\pdfglyphtounicode{hikatakana}{30D2}
+\pdfglyphtounicode{hikatakanahalfwidth}{FF8B}
+\pdfglyphtounicode{hiriq}{05B4}
+\pdfglyphtounicode{hiriq14}{05B4}
+\pdfglyphtounicode{hiriq21}{05B4}
+\pdfglyphtounicode{hiriq2d}{05B4}
+\pdfglyphtounicode{hiriqhebrew}{05B4}
+\pdfglyphtounicode{hiriqnarrowhebrew}{05B4}
+\pdfglyphtounicode{hiriqquarterhebrew}{05B4}
+\pdfglyphtounicode{hiriqwidehebrew}{05B4}
+\pdfglyphtounicode{hlinebelow}{1E96}
+\pdfglyphtounicode{hmonospace}{FF48}
+\pdfglyphtounicode{hoarmenian}{0570}
+\pdfglyphtounicode{hohipthai}{0E2B}
+\pdfglyphtounicode{hohiragana}{307B}
+\pdfglyphtounicode{hokatakana}{30DB}
+\pdfglyphtounicode{hokatakanahalfwidth}{FF8E}
+\pdfglyphtounicode{holam}{05B9}
+\pdfglyphtounicode{holam19}{05B9}
+\pdfglyphtounicode{holam26}{05B9}
+\pdfglyphtounicode{holam32}{05B9}
+\pdfglyphtounicode{holamhebrew}{05B9}
+\pdfglyphtounicode{holamnarrowhebrew}{05B9}
+\pdfglyphtounicode{holamquarterhebrew}{05B9}
+\pdfglyphtounicode{holamwidehebrew}{05B9}
+\pdfglyphtounicode{honokhukthai}{0E2E}
+\pdfglyphtounicode{hookabovecomb}{0309}
+\pdfglyphtounicode{hookcmb}{0309}
+\pdfglyphtounicode{hookpalatalizedbelowcmb}{0321}
+\pdfglyphtounicode{hookretroflexbelowcmb}{0322}
+\pdfglyphtounicode{hoonsquare}{3342}
+\pdfglyphtounicode{horicoptic}{03E9}
+\pdfglyphtounicode{horizontalbar}{2015}
+\pdfglyphtounicode{horncmb}{031B}
+\pdfglyphtounicode{hotsprings}{2668}
+\pdfglyphtounicode{house}{2302}
+\pdfglyphtounicode{hparen}{24A3}
+\pdfglyphtounicode{hsuperior}{02B0}
+\pdfglyphtounicode{hturned}{0265}
+\pdfglyphtounicode{huhiragana}{3075}
+\pdfglyphtounicode{huiitosquare}{3333}
+\pdfglyphtounicode{hukatakana}{30D5}
+\pdfglyphtounicode{hukatakanahalfwidth}{FF8C}
+\pdfglyphtounicode{hungarumlaut}{02DD}
+\pdfglyphtounicode{hungarumlautcmb}{030B}
+\pdfglyphtounicode{hv}{0195}
+\pdfglyphtounicode{hyphen}{002D}
+\pdfglyphtounicode{hyphenchar}{002D}
+\pdfglyphtounicode{hypheninferior}{002D}
+\pdfglyphtounicode{hyphenmonospace}{FF0D}
+\pdfglyphtounicode{hyphensmall}{FE63}
+\pdfglyphtounicode{hyphensuperior}{002D}
+\pdfglyphtounicode{hyphentwo}{2010}
+\pdfglyphtounicode{i}{0069}
+\pdfglyphtounicode{iacute}{00ED}
+\pdfglyphtounicode{iacyrillic}{044F}
+\pdfglyphtounicode{ibengali}{0987}
+\pdfglyphtounicode{ibopomofo}{3127}
+\pdfglyphtounicode{ibreve}{012D}
+\pdfglyphtounicode{icaron}{01D0}
+\pdfglyphtounicode{icircle}{24D8}
+\pdfglyphtounicode{icircumflex}{00EE}
+\pdfglyphtounicode{icyrillic}{0456}
+\pdfglyphtounicode{idblgrave}{0209}
+\pdfglyphtounicode{ideographearthcircle}{328F}
+\pdfglyphtounicode{ideographfirecircle}{328B}
+\pdfglyphtounicode{ideographicallianceparen}{323F}
+\pdfglyphtounicode{ideographiccallparen}{323A}
+\pdfglyphtounicode{ideographiccentrecircle}{32A5}
+\pdfglyphtounicode{ideographicclose}{3006}
+\pdfglyphtounicode{ideographiccomma}{3001}
+\pdfglyphtounicode{ideographiccommaleft}{FF64}
+\pdfglyphtounicode{ideographiccongratulationparen}{3237}
+\pdfglyphtounicode{ideographiccorrectcircle}{32A3}
+\pdfglyphtounicode{ideographicearthparen}{322F}
+\pdfglyphtounicode{ideographicenterpriseparen}{323D}
+\pdfglyphtounicode{ideographicexcellentcircle}{329D}
+\pdfglyphtounicode{ideographicfestivalparen}{3240}
+\pdfglyphtounicode{ideographicfinancialcircle}{3296}
+\pdfglyphtounicode{ideographicfinancialparen}{3236}
+\pdfglyphtounicode{ideographicfireparen}{322B}
+\pdfglyphtounicode{ideographichaveparen}{3232}
+\pdfglyphtounicode{ideographichighcircle}{32A4}
+\pdfglyphtounicode{ideographiciterationmark}{3005}
+\pdfglyphtounicode{ideographiclaborcircle}{3298}
+\pdfglyphtounicode{ideographiclaborparen}{3238}
+\pdfglyphtounicode{ideographicleftcircle}{32A7}
+\pdfglyphtounicode{ideographiclowcircle}{32A6}
+\pdfglyphtounicode{ideographicmedicinecircle}{32A9}
+\pdfglyphtounicode{ideographicmetalparen}{322E}
+\pdfglyphtounicode{ideographicmoonparen}{322A}
+\pdfglyphtounicode{ideographicnameparen}{3234}
+\pdfglyphtounicode{ideographicperiod}{3002}
+\pdfglyphtounicode{ideographicprintcircle}{329E}
+\pdfglyphtounicode{ideographicreachparen}{3243}
+\pdfglyphtounicode{ideographicrepresentparen}{3239}
+\pdfglyphtounicode{ideographicresourceparen}{323E}
+\pdfglyphtounicode{ideographicrightcircle}{32A8}
+\pdfglyphtounicode{ideographicsecretcircle}{3299}
+\pdfglyphtounicode{ideographicselfparen}{3242}
+\pdfglyphtounicode{ideographicsocietyparen}{3233}
+\pdfglyphtounicode{ideographicspace}{3000}
+\pdfglyphtounicode{ideographicspecialparen}{3235}
+\pdfglyphtounicode{ideographicstockparen}{3231}
+\pdfglyphtounicode{ideographicstudyparen}{323B}
+\pdfglyphtounicode{ideographicsunparen}{3230}
+\pdfglyphtounicode{ideographicsuperviseparen}{323C}
+\pdfglyphtounicode{ideographicwaterparen}{322C}
+\pdfglyphtounicode{ideographicwoodparen}{322D}
+\pdfglyphtounicode{ideographiczero}{3007}
+\pdfglyphtounicode{ideographmetalcircle}{328E}
+\pdfglyphtounicode{ideographmooncircle}{328A}
+\pdfglyphtounicode{ideographnamecircle}{3294}
+\pdfglyphtounicode{ideographsuncircle}{3290}
+\pdfglyphtounicode{ideographwatercircle}{328C}
+\pdfglyphtounicode{ideographwoodcircle}{328D}
+\pdfglyphtounicode{ideva}{0907}
+\pdfglyphtounicode{idieresis}{00EF}
+\pdfglyphtounicode{idieresisacute}{1E2F}
+\pdfglyphtounicode{idieresiscyrillic}{04E5}
+\pdfglyphtounicode{idotbelow}{1ECB}
+\pdfglyphtounicode{iebrevecyrillic}{04D7}
+\pdfglyphtounicode{iecyrillic}{0435}
+\pdfglyphtounicode{ieungacirclekorean}{3275}
+\pdfglyphtounicode{ieungaparenkorean}{3215}
+\pdfglyphtounicode{ieungcirclekorean}{3267}
+\pdfglyphtounicode{ieungkorean}{3147}
+\pdfglyphtounicode{ieungparenkorean}{3207}
+\pdfglyphtounicode{igrave}{00EC}
+\pdfglyphtounicode{igujarati}{0A87}
+\pdfglyphtounicode{igurmukhi}{0A07}
+\pdfglyphtounicode{ihiragana}{3044}
+\pdfglyphtounicode{ihookabove}{1EC9}
+\pdfglyphtounicode{iibengali}{0988}
+\pdfglyphtounicode{iicyrillic}{0438}
+\pdfglyphtounicode{iideva}{0908}
+\pdfglyphtounicode{iigujarati}{0A88}
+\pdfglyphtounicode{iigurmukhi}{0A08}
+\pdfglyphtounicode{iimatragurmukhi}{0A40}
+\pdfglyphtounicode{iinvertedbreve}{020B}
+\pdfglyphtounicode{iishortcyrillic}{0439}
+\pdfglyphtounicode{iivowelsignbengali}{09C0}
+\pdfglyphtounicode{iivowelsigndeva}{0940}
+\pdfglyphtounicode{iivowelsigngujarati}{0AC0}
+\pdfglyphtounicode{ij}{0133}
+\pdfglyphtounicode{ikatakana}{30A4}
+\pdfglyphtounicode{ikatakanahalfwidth}{FF72}
+\pdfglyphtounicode{ikorean}{3163}
+\pdfglyphtounicode{ilde}{02DC}
+\pdfglyphtounicode{iluyhebrew}{05AC}
+\pdfglyphtounicode{imacron}{012B}
+\pdfglyphtounicode{imacroncyrillic}{04E3}
+\pdfglyphtounicode{imageorapproximatelyequal}{2253}
+\pdfglyphtounicode{imatragurmukhi}{0A3F}
+\pdfglyphtounicode{imonospace}{FF49}
+\pdfglyphtounicode{increment}{2206}
+\pdfglyphtounicode{infinity}{221E}
+\pdfglyphtounicode{iniarmenian}{056B}
+\pdfglyphtounicode{integerdivide}{2216}
+\pdfglyphtounicode{integral}{222B}
+\pdfglyphtounicode{integralbottom}{2321}
+\pdfglyphtounicode{integralbt}{2321}
+\pdfglyphtounicode{integralex}{F8F5}
+\pdfglyphtounicode{integraltop}{2320}
+\pdfglyphtounicode{integraltp}{2320}
+\pdfglyphtounicode{intercal}{22BA}
+\pdfglyphtounicode{interrobang}{203D}
+\pdfglyphtounicode{interrobangdown}{2E18}
+\pdfglyphtounicode{intersection}{2229}
+\pdfglyphtounicode{intersectiondbl}{22D2}
+\pdfglyphtounicode{intersectionsq}{2293}
+\pdfglyphtounicode{intisquare}{3305}
+\pdfglyphtounicode{invbullet}{25D8}
+\pdfglyphtounicode{invcircle}{25D9}
+\pdfglyphtounicode{invsmileface}{263B}
+\pdfglyphtounicode{iocyrillic}{0451}
+\pdfglyphtounicode{iogonek}{012F}
+\pdfglyphtounicode{iota}{03B9}
+\pdfglyphtounicode{iotadieresis}{03CA}
+\pdfglyphtounicode{iotadieresistonos}{0390}
+\pdfglyphtounicode{iotalatin}{0269}
+\pdfglyphtounicode{iotatonos}{03AF}
+\pdfglyphtounicode{iparen}{24A4}
+\pdfglyphtounicode{irigurmukhi}{0A72}
+\pdfglyphtounicode{ismallhiragana}{3043}
+\pdfglyphtounicode{ismallkatakana}{30A3}
+\pdfglyphtounicode{ismallkatakanahalfwidth}{FF68}
+\pdfglyphtounicode{issharbengali}{09FA}
+\pdfglyphtounicode{istroke}{0268}
+\pdfglyphtounicode{isuperior}{0069}
+\pdfglyphtounicode{iterationhiragana}{309D}
+\pdfglyphtounicode{iterationkatakana}{30FD}
+\pdfglyphtounicode{itilde}{0129}
+\pdfglyphtounicode{itildebelow}{1E2D}
+\pdfglyphtounicode{iubopomofo}{3129}
+\pdfglyphtounicode{iucyrillic}{044E}
+\pdfglyphtounicode{ivowelsignbengali}{09BF}
+\pdfglyphtounicode{ivowelsigndeva}{093F}
+\pdfglyphtounicode{ivowelsigngujarati}{0ABF}
+\pdfglyphtounicode{izhitsacyrillic}{0475}
+\pdfglyphtounicode{izhitsadblgravecyrillic}{0477}
+\pdfglyphtounicode{j}{006A}
+\pdfglyphtounicode{jaarmenian}{0571}
+\pdfglyphtounicode{jabengali}{099C}
+\pdfglyphtounicode{jadeva}{091C}
+\pdfglyphtounicode{jagujarati}{0A9C}
+\pdfglyphtounicode{jagurmukhi}{0A1C}
+\pdfglyphtounicode{jbopomofo}{3110}
+\pdfglyphtounicode{jcaron}{01F0}
+\pdfglyphtounicode{jcircle}{24D9}
+\pdfglyphtounicode{jcircumflex}{0135}
+\pdfglyphtounicode{jcrossedtail}{029D}
+\pdfglyphtounicode{jdotlessstroke}{025F}
+\pdfglyphtounicode{jecyrillic}{0458}
+\pdfglyphtounicode{jeemarabic}{062C}
+\pdfglyphtounicode{jeemfinalarabic}{FE9E}
+\pdfglyphtounicode{jeeminitialarabic}{FE9F}
+\pdfglyphtounicode{jeemmedialarabic}{FEA0}
+\pdfglyphtounicode{jeharabic}{0698}
+\pdfglyphtounicode{jehfinalarabic}{FB8B}
+\pdfglyphtounicode{jhabengali}{099D}
+\pdfglyphtounicode{jhadeva}{091D}
+\pdfglyphtounicode{jhagujarati}{0A9D}
+\pdfglyphtounicode{jhagurmukhi}{0A1D}
+\pdfglyphtounicode{jheharmenian}{057B}
+\pdfglyphtounicode{jis}{3004}
+\pdfglyphtounicode{jmonospace}{FF4A}
+\pdfglyphtounicode{jparen}{24A5}
+\pdfglyphtounicode{jsuperior}{02B2}
+\pdfglyphtounicode{k}{006B}
+\pdfglyphtounicode{kabashkircyrillic}{04A1}
+\pdfglyphtounicode{kabengali}{0995}
+\pdfglyphtounicode{kacute}{1E31}
+\pdfglyphtounicode{kacyrillic}{043A}
+\pdfglyphtounicode{kadescendercyrillic}{049B}
+\pdfglyphtounicode{kadeva}{0915}
+\pdfglyphtounicode{kaf}{05DB}
+\pdfglyphtounicode{kafarabic}{0643}
+\pdfglyphtounicode{kafdagesh}{FB3B}
+\pdfglyphtounicode{kafdageshhebrew}{FB3B}
+\pdfglyphtounicode{kaffinalarabic}{FEDA}
+\pdfglyphtounicode{kafhebrew}{05DB}
+\pdfglyphtounicode{kafinitialarabic}{FEDB}
+\pdfglyphtounicode{kafmedialarabic}{FEDC}
+\pdfglyphtounicode{kafrafehebrew}{FB4D}
+\pdfglyphtounicode{kagujarati}{0A95}
+\pdfglyphtounicode{kagurmukhi}{0A15}
+\pdfglyphtounicode{kahiragana}{304B}
+\pdfglyphtounicode{kahookcyrillic}{04C4}
+\pdfglyphtounicode{kakatakana}{30AB}
+\pdfglyphtounicode{kakatakanahalfwidth}{FF76}
+\pdfglyphtounicode{kappa}{03BA}
+\pdfglyphtounicode{kappasymbolgreek}{03F0}
+\pdfglyphtounicode{kapyeounmieumkorean}{3171}
+\pdfglyphtounicode{kapyeounphieuphkorean}{3184}
+\pdfglyphtounicode{kapyeounpieupkorean}{3178}
+\pdfglyphtounicode{kapyeounssangpieupkorean}{3179}
+\pdfglyphtounicode{karoriisquare}{330D}
+\pdfglyphtounicode{kashidaautoarabic}{0640}
+\pdfglyphtounicode{kashidaautonosidebearingarabic}{0640}
+\pdfglyphtounicode{kasmallkatakana}{30F5}
+\pdfglyphtounicode{kasquare}{3384}
+\pdfglyphtounicode{kasraarabic}{0650}
+\pdfglyphtounicode{kasratanarabic}{064D}
+\pdfglyphtounicode{kastrokecyrillic}{049F}
+\pdfglyphtounicode{katahiraprolongmarkhalfwidth}{FF70}
+\pdfglyphtounicode{kaverticalstrokecyrillic}{049D}
+\pdfglyphtounicode{kbopomofo}{310E}
+\pdfglyphtounicode{kcalsquare}{3389}
+\pdfglyphtounicode{kcaron}{01E9}
+\pdfglyphtounicode{kcedilla}{0137}
+\pdfglyphtounicode{kcircle}{24DA}
+\pdfglyphtounicode{kcommaaccent}{0137}
+\pdfglyphtounicode{kdotbelow}{1E33}
+\pdfglyphtounicode{keharmenian}{0584}
+\pdfglyphtounicode{kehiragana}{3051}
+\pdfglyphtounicode{kekatakana}{30B1}
+\pdfglyphtounicode{kekatakanahalfwidth}{FF79}
+\pdfglyphtounicode{kenarmenian}{056F}
+\pdfglyphtounicode{kesmallkatakana}{30F6}
+\pdfglyphtounicode{kgreenlandic}{0138}
+\pdfglyphtounicode{khabengali}{0996}
+\pdfglyphtounicode{khacyrillic}{0445}
+\pdfglyphtounicode{khadeva}{0916}
+\pdfglyphtounicode{khagujarati}{0A96}
+\pdfglyphtounicode{khagurmukhi}{0A16}
+\pdfglyphtounicode{khaharabic}{062E}
+\pdfglyphtounicode{khahfinalarabic}{FEA6}
+\pdfglyphtounicode{khahinitialarabic}{FEA7}
+\pdfglyphtounicode{khahmedialarabic}{FEA8}
+\pdfglyphtounicode{kheicoptic}{03E7}
+\pdfglyphtounicode{khhadeva}{0959}
+\pdfglyphtounicode{khhagurmukhi}{0A59}
+\pdfglyphtounicode{khieukhacirclekorean}{3278}
+\pdfglyphtounicode{khieukhaparenkorean}{3218}
+\pdfglyphtounicode{khieukhcirclekorean}{326A}
+\pdfglyphtounicode{khieukhkorean}{314B}
+\pdfglyphtounicode{khieukhparenkorean}{320A}
+\pdfglyphtounicode{khokhaithai}{0E02}
+\pdfglyphtounicode{khokhonthai}{0E05}
+\pdfglyphtounicode{khokhuatthai}{0E03}
+\pdfglyphtounicode{khokhwaithai}{0E04}
+\pdfglyphtounicode{khomutthai}{0E5B}
+\pdfglyphtounicode{khook}{0199}
+\pdfglyphtounicode{khorakhangthai}{0E06}
+\pdfglyphtounicode{khzsquare}{3391}
+\pdfglyphtounicode{kihiragana}{304D}
+\pdfglyphtounicode{kikatakana}{30AD}
+\pdfglyphtounicode{kikatakanahalfwidth}{FF77}
+\pdfglyphtounicode{kiroguramusquare}{3315}
+\pdfglyphtounicode{kiromeetorusquare}{3316}
+\pdfglyphtounicode{kirosquare}{3314}
+\pdfglyphtounicode{kiyeokacirclekorean}{326E}
+\pdfglyphtounicode{kiyeokaparenkorean}{320E}
+\pdfglyphtounicode{kiyeokcirclekorean}{3260}
+\pdfglyphtounicode{kiyeokkorean}{3131}
+\pdfglyphtounicode{kiyeokparenkorean}{3200}
+\pdfglyphtounicode{kiyeoksioskorean}{3133}
+\pdfglyphtounicode{kjecyrillic}{045C}
+\pdfglyphtounicode{klinebelow}{1E35}
+\pdfglyphtounicode{klsquare}{3398}
+\pdfglyphtounicode{kmcubedsquare}{33A6}
+\pdfglyphtounicode{kmonospace}{FF4B}
+\pdfglyphtounicode{kmsquaredsquare}{33A2}
+\pdfglyphtounicode{kohiragana}{3053}
+\pdfglyphtounicode{kohmsquare}{33C0}
+\pdfglyphtounicode{kokaithai}{0E01}
+\pdfglyphtounicode{kokatakana}{30B3}
+\pdfglyphtounicode{kokatakanahalfwidth}{FF7A}
+\pdfglyphtounicode{kooposquare}{331E}
+\pdfglyphtounicode{koppacyrillic}{0481}
+\pdfglyphtounicode{koreanstandardsymbol}{327F}
+\pdfglyphtounicode{koroniscmb}{0343}
+\pdfglyphtounicode{kparen}{24A6}
+\pdfglyphtounicode{kpasquare}{33AA}
+\pdfglyphtounicode{ksicyrillic}{046F}
+\pdfglyphtounicode{ktsquare}{33CF}
+\pdfglyphtounicode{kturned}{029E}
+\pdfglyphtounicode{kuhiragana}{304F}
+\pdfglyphtounicode{kukatakana}{30AF}
+\pdfglyphtounicode{kukatakanahalfwidth}{FF78}
+\pdfglyphtounicode{kvsquare}{33B8}
+\pdfglyphtounicode{kwsquare}{33BE}
+\pdfglyphtounicode{l}{006C}
+\pdfglyphtounicode{labengali}{09B2}
+\pdfglyphtounicode{lacute}{013A}
+\pdfglyphtounicode{ladeva}{0932}
+\pdfglyphtounicode{lagujarati}{0AB2}
+\pdfglyphtounicode{lagurmukhi}{0A32}
+\pdfglyphtounicode{lakkhangyaothai}{0E45}
+\pdfglyphtounicode{lamaleffinalarabic}{FEFC}
+\pdfglyphtounicode{lamalefhamzaabovefinalarabic}{FEF8}
+\pdfglyphtounicode{lamalefhamzaaboveisolatedarabic}{FEF7}
+\pdfglyphtounicode{lamalefhamzabelowfinalarabic}{FEFA}
+\pdfglyphtounicode{lamalefhamzabelowisolatedarabic}{FEF9}
+\pdfglyphtounicode{lamalefisolatedarabic}{FEFB}
+\pdfglyphtounicode{lamalefmaddaabovefinalarabic}{FEF6}
+\pdfglyphtounicode{lamalefmaddaaboveisolatedarabic}{FEF5}
+\pdfglyphtounicode{lamarabic}{0644}
+\pdfglyphtounicode{lambda}{03BB}
+\pdfglyphtounicode{lambdastroke}{019B}
+\pdfglyphtounicode{lamed}{05DC}
+\pdfglyphtounicode{lameddagesh}{FB3C}
+\pdfglyphtounicode{lameddageshhebrew}{FB3C}
+\pdfglyphtounicode{lamedhebrew}{05DC}
+\pdfglyphtounicode{lamedholam}{05DC 05B9}
+\pdfglyphtounicode{lamedholamdagesh}{05DC 05B9 05BC}
+\pdfglyphtounicode{lamedholamdageshhebrew}{05DC 05B9 05BC}
+\pdfglyphtounicode{lamedholamhebrew}{05DC 05B9}
+\pdfglyphtounicode{lamfinalarabic}{FEDE}
+\pdfglyphtounicode{lamhahinitialarabic}{FCCA}
+\pdfglyphtounicode{laminitialarabic}{FEDF}
+\pdfglyphtounicode{lamjeeminitialarabic}{FCC9}
+\pdfglyphtounicode{lamkhahinitialarabic}{FCCB}
+\pdfglyphtounicode{lamlamhehisolatedarabic}{FDF2}
+\pdfglyphtounicode{lammedialarabic}{FEE0}
+\pdfglyphtounicode{lammeemhahinitialarabic}{FD88}
+\pdfglyphtounicode{lammeeminitialarabic}{FCCC}
+\pdfglyphtounicode{lammeemjeeminitialarabic}{FEDF FEE4 FEA0}
+\pdfglyphtounicode{lammeemkhahinitialarabic}{FEDF FEE4 FEA8}
+\pdfglyphtounicode{largecircle}{25EF}
+\pdfglyphtounicode{latticetop}{22A4}
+\pdfglyphtounicode{lbar}{019A}
+\pdfglyphtounicode{lbelt}{026C}
+\pdfglyphtounicode{lbopomofo}{310C}
+\pdfglyphtounicode{lcaron}{013E}
+\pdfglyphtounicode{lcedilla}{013C}
+\pdfglyphtounicode{lcircle}{24DB}
+\pdfglyphtounicode{lcircumflexbelow}{1E3D}
+\pdfglyphtounicode{lcommaaccent}{013C}
+\pdfglyphtounicode{ldot}{0140}
+\pdfglyphtounicode{ldotaccent}{0140}
+\pdfglyphtounicode{ldotbelow}{1E37}
+\pdfglyphtounicode{ldotbelowmacron}{1E39}
+\pdfglyphtounicode{leftangleabovecmb}{031A}
+\pdfglyphtounicode{lefttackbelowcmb}{0318}
+\pdfglyphtounicode{less}{003C}
+\pdfglyphtounicode{lessdbleqlgreater}{2A8B}
+\pdfglyphtounicode{lessdblequal}{2266}
+\pdfglyphtounicode{lessdot}{22D6}
+\pdfglyphtounicode{lessequal}{2264}
+\pdfglyphtounicode{lessequalgreater}{22DA}
+\pdfglyphtounicode{lessequalorgreater}{22DA}
+\pdfglyphtounicode{lessmonospace}{FF1C}
+\pdfglyphtounicode{lessmuch}{226A}
+\pdfglyphtounicode{lessnotdblequal}{2A89}
+\pdfglyphtounicode{lessnotequal}{2A87}
+\pdfglyphtounicode{lessorapproxeql}{2A85}
+\pdfglyphtounicode{lessorequalslant}{2A7D}
+\pdfglyphtounicode{lessorequivalent}{2272}
+\pdfglyphtounicode{lessorgreater}{2276}
+\pdfglyphtounicode{lessornotdbleql}{2268}
+\pdfglyphtounicode{lessornotequal}{2268}
+\pdfglyphtounicode{lessorsimilar}{2272}
+\pdfglyphtounicode{lessoverequal}{2266}
+\pdfglyphtounicode{lesssmall}{FE64}
+\pdfglyphtounicode{lezh}{026E}
+\pdfglyphtounicode{lfblock}{258C}
+\pdfglyphtounicode{lhookretroflex}{026D}
+\pdfglyphtounicode{lira}{20A4}
+\pdfglyphtounicode{liwnarmenian}{056C}
+\pdfglyphtounicode{lj}{01C9}
+\pdfglyphtounicode{ljecyrillic}{0459}
+\pdfglyphtounicode{ll}{006C 006C}
+\pdfglyphtounicode{lladeva}{0933}
+\pdfglyphtounicode{llagujarati}{0AB3}
+\pdfglyphtounicode{llinebelow}{1E3B}
+\pdfglyphtounicode{llladeva}{0934}
+\pdfglyphtounicode{llvocalicbengali}{09E1}
+\pdfglyphtounicode{llvocalicdeva}{0961}
+\pdfglyphtounicode{llvocalicvowelsignbengali}{09E3}
+\pdfglyphtounicode{llvocalicvowelsigndeva}{0963}
+\pdfglyphtounicode{lmiddletilde}{026B}
+\pdfglyphtounicode{lmonospace}{FF4C}
+\pdfglyphtounicode{lmsquare}{33D0}
+\pdfglyphtounicode{lochulathai}{0E2C}
+\pdfglyphtounicode{logicaland}{2227}
+\pdfglyphtounicode{logicalnot}{00AC}
+\pdfglyphtounicode{logicalnotreversed}{2310}
+\pdfglyphtounicode{logicalor}{2228}
+\pdfglyphtounicode{lolingthai}{0E25}
+\pdfglyphtounicode{longdbls}{017F 017F}
+\pdfglyphtounicode{longs}{017F}
+\pdfglyphtounicode{longsh}{017F 0068}
+\pdfglyphtounicode{longsi}{017F 0069}
+\pdfglyphtounicode{longsl}{017F 006C}
+\pdfglyphtounicode{longst}{017F 0074}
+\pdfglyphtounicode{lowlinecenterline}{FE4E}
+\pdfglyphtounicode{lowlinecmb}{0332}
+\pdfglyphtounicode{lowlinedashed}{FE4D}
+\pdfglyphtounicode{lozenge}{25CA}
+\pdfglyphtounicode{lparen}{24A7}
+\pdfglyphtounicode{lscript}{2113}
+\pdfglyphtounicode{lslash}{0142}
+\pdfglyphtounicode{lsquare}{2113}
+\pdfglyphtounicode{lsuperior}{006C}
+\pdfglyphtounicode{ltshade}{2591}
+\pdfglyphtounicode{luthai}{0E26}
+\pdfglyphtounicode{lvocalicbengali}{098C}
+\pdfglyphtounicode{lvocalicdeva}{090C}
+\pdfglyphtounicode{lvocalicvowelsignbengali}{09E2}
+\pdfglyphtounicode{lvocalicvowelsigndeva}{0962}
+\pdfglyphtounicode{lxsquare}{33D3}
+\pdfglyphtounicode{m}{006D}
+\pdfglyphtounicode{mabengali}{09AE}
+\pdfglyphtounicode{macron}{00AF}
+\pdfglyphtounicode{macronbelowcmb}{0331}
+\pdfglyphtounicode{macroncmb}{0304}
+\pdfglyphtounicode{macronlowmod}{02CD}
+\pdfglyphtounicode{macronmonospace}{FFE3}
+\pdfglyphtounicode{macute}{1E3F}
+\pdfglyphtounicode{madeva}{092E}
+\pdfglyphtounicode{magujarati}{0AAE}
+\pdfglyphtounicode{magurmukhi}{0A2E}
+\pdfglyphtounicode{mahapakhhebrew}{05A4}
+\pdfglyphtounicode{mahapakhlefthebrew}{05A4}
+\pdfglyphtounicode{mahiragana}{307E}
+\pdfglyphtounicode{maichattawalowleftthai}{F895}
+\pdfglyphtounicode{maichattawalowrightthai}{F894}
+\pdfglyphtounicode{maichattawathai}{0E4B}
+\pdfglyphtounicode{maichattawaupperleftthai}{F893}
+\pdfglyphtounicode{maieklowleftthai}{F88C}
+\pdfglyphtounicode{maieklowrightthai}{F88B}
+\pdfglyphtounicode{maiekthai}{0E48}
+\pdfglyphtounicode{maiekupperleftthai}{F88A}
+\pdfglyphtounicode{maihanakatleftthai}{F884}
+\pdfglyphtounicode{maihanakatthai}{0E31}
+\pdfglyphtounicode{maitaikhuleftthai}{F889}
+\pdfglyphtounicode{maitaikhuthai}{0E47}
+\pdfglyphtounicode{maitholowleftthai}{F88F}
+\pdfglyphtounicode{maitholowrightthai}{F88E}
+\pdfglyphtounicode{maithothai}{0E49}
+\pdfglyphtounicode{maithoupperleftthai}{F88D}
+\pdfglyphtounicode{maitrilowleftthai}{F892}
+\pdfglyphtounicode{maitrilowrightthai}{F891}
+\pdfglyphtounicode{maitrithai}{0E4A}
+\pdfglyphtounicode{maitriupperleftthai}{F890}
+\pdfglyphtounicode{maiyamokthai}{0E46}
+\pdfglyphtounicode{makatakana}{30DE}
+\pdfglyphtounicode{makatakanahalfwidth}{FF8F}
+\pdfglyphtounicode{male}{2642}
+\pdfglyphtounicode{maltesecross}{2720}
+\pdfglyphtounicode{mansyonsquare}{3347}
+\pdfglyphtounicode{maqafhebrew}{05BE}
+\pdfglyphtounicode{mars}{2642}
+\pdfglyphtounicode{masoracirclehebrew}{05AF}
+\pdfglyphtounicode{masquare}{3383}
+\pdfglyphtounicode{mbopomofo}{3107}
+\pdfglyphtounicode{mbsquare}{33D4}
+\pdfglyphtounicode{mcircle}{24DC}
+\pdfglyphtounicode{mcubedsquare}{33A5}
+\pdfglyphtounicode{mdotaccent}{1E41}
+\pdfglyphtounicode{mdotbelow}{1E43}
+\pdfglyphtounicode{measuredangle}{2221}
+\pdfglyphtounicode{meemarabic}{0645}
+\pdfglyphtounicode{meemfinalarabic}{FEE2}
+\pdfglyphtounicode{meeminitialarabic}{FEE3}
+\pdfglyphtounicode{meemmedialarabic}{FEE4}
+\pdfglyphtounicode{meemmeeminitialarabic}{FCD1}
+\pdfglyphtounicode{meemmeemisolatedarabic}{FC48}
+\pdfglyphtounicode{meetorusquare}{334D}
+\pdfglyphtounicode{mehiragana}{3081}
+\pdfglyphtounicode{meizierasquare}{337E}
+\pdfglyphtounicode{mekatakana}{30E1}
+\pdfglyphtounicode{mekatakanahalfwidth}{FF92}
+\pdfglyphtounicode{mem}{05DE}
+\pdfglyphtounicode{memdagesh}{FB3E}
+\pdfglyphtounicode{memdageshhebrew}{FB3E}
+\pdfglyphtounicode{memhebrew}{05DE}
+\pdfglyphtounicode{menarmenian}{0574}
+\pdfglyphtounicode{merkhahebrew}{05A5}
+\pdfglyphtounicode{merkhakefulahebrew}{05A6}
+\pdfglyphtounicode{merkhakefulalefthebrew}{05A6}
+\pdfglyphtounicode{merkhalefthebrew}{05A5}
+\pdfglyphtounicode{mhook}{0271}
+\pdfglyphtounicode{mhzsquare}{3392}
+\pdfglyphtounicode{middledotkatakanahalfwidth}{FF65}
+\pdfglyphtounicode{middot}{00B7}
+\pdfglyphtounicode{mieumacirclekorean}{3272}
+\pdfglyphtounicode{mieumaparenkorean}{3212}
+\pdfglyphtounicode{mieumcirclekorean}{3264}
+\pdfglyphtounicode{mieumkorean}{3141}
+\pdfglyphtounicode{mieumpansioskorean}{3170}
+\pdfglyphtounicode{mieumparenkorean}{3204}
+\pdfglyphtounicode{mieumpieupkorean}{316E}
+\pdfglyphtounicode{mieumsioskorean}{316F}
+\pdfglyphtounicode{mihiragana}{307F}
+\pdfglyphtounicode{mikatakana}{30DF}
+\pdfglyphtounicode{mikatakanahalfwidth}{FF90}
+\pdfglyphtounicode{minus}{2212}
+\pdfglyphtounicode{minusbelowcmb}{0320}
+\pdfglyphtounicode{minuscircle}{2296}
+\pdfglyphtounicode{minusmod}{02D7}
+\pdfglyphtounicode{minusplus}{2213}
+\pdfglyphtounicode{minute}{2032}
+\pdfglyphtounicode{miribaarusquare}{334A}
+\pdfglyphtounicode{mirisquare}{3349}
+\pdfglyphtounicode{mlonglegturned}{0270}
+\pdfglyphtounicode{mlsquare}{3396}
+\pdfglyphtounicode{mmcubedsquare}{33A3}
+\pdfglyphtounicode{mmonospace}{FF4D}
+\pdfglyphtounicode{mmsquaredsquare}{339F}
+\pdfglyphtounicode{mohiragana}{3082}
+\pdfglyphtounicode{mohmsquare}{33C1}
+\pdfglyphtounicode{mokatakana}{30E2}
+\pdfglyphtounicode{mokatakanahalfwidth}{FF93}
+\pdfglyphtounicode{molsquare}{33D6}
+\pdfglyphtounicode{momathai}{0E21}
+\pdfglyphtounicode{moverssquare}{33A7}
+\pdfglyphtounicode{moverssquaredsquare}{33A8}
+\pdfglyphtounicode{mparen}{24A8}
+\pdfglyphtounicode{mpasquare}{33AB}
+\pdfglyphtounicode{mssquare}{33B3}
+\pdfglyphtounicode{msuperior}{006D}
+\pdfglyphtounicode{mturned}{026F}
+\pdfglyphtounicode{mu}{00B5}
+\pdfglyphtounicode{mu1}{00B5}
+\pdfglyphtounicode{muasquare}{3382}
+\pdfglyphtounicode{muchgreater}{226B}
+\pdfglyphtounicode{muchless}{226A}
+\pdfglyphtounicode{mufsquare}{338C}
+\pdfglyphtounicode{mugreek}{03BC}
+\pdfglyphtounicode{mugsquare}{338D}
+\pdfglyphtounicode{muhiragana}{3080}
+\pdfglyphtounicode{mukatakana}{30E0}
+\pdfglyphtounicode{mukatakanahalfwidth}{FF91}
+\pdfglyphtounicode{mulsquare}{3395}
+\pdfglyphtounicode{multicloseleft}{22C9}
+\pdfglyphtounicode{multicloseright}{22CA}
+\pdfglyphtounicode{multimap}{22B8}
+\pdfglyphtounicode{multiopenleft}{22CB}
+\pdfglyphtounicode{multiopenright}{22CC}
+\pdfglyphtounicode{multiply}{00D7}
+\pdfglyphtounicode{mumsquare}{339B}
+\pdfglyphtounicode{munahhebrew}{05A3}
+\pdfglyphtounicode{munahlefthebrew}{05A3}
+\pdfglyphtounicode{musicalnote}{266A}
+\pdfglyphtounicode{musicalnotedbl}{266B}
+\pdfglyphtounicode{musicflatsign}{266D}
+\pdfglyphtounicode{musicsharpsign}{266F}
+\pdfglyphtounicode{mussquare}{33B2}
+\pdfglyphtounicode{muvsquare}{33B6}
+\pdfglyphtounicode{muwsquare}{33BC}
+\pdfglyphtounicode{mvmegasquare}{33B9}
+\pdfglyphtounicode{mvsquare}{33B7}
+\pdfglyphtounicode{mwmegasquare}{33BF}
+\pdfglyphtounicode{mwsquare}{33BD}
+\pdfglyphtounicode{n}{006E}
+\pdfglyphtounicode{nabengali}{09A8}
+\pdfglyphtounicode{nabla}{2207}
+\pdfglyphtounicode{nacute}{0144}
+\pdfglyphtounicode{nadeva}{0928}
+\pdfglyphtounicode{nagujarati}{0AA8}
+\pdfglyphtounicode{nagurmukhi}{0A28}
+\pdfglyphtounicode{nahiragana}{306A}
+\pdfglyphtounicode{nakatakana}{30CA}
+\pdfglyphtounicode{nakatakanahalfwidth}{FF85}
+\pdfglyphtounicode{nand}{22BC}
+\pdfglyphtounicode{napostrophe}{0149}
+\pdfglyphtounicode{nasquare}{3381}
+\pdfglyphtounicode{natural}{266E}
+\pdfglyphtounicode{nbopomofo}{310B}
+\pdfglyphtounicode{nbspace}{00A0}
+\pdfglyphtounicode{ncaron}{0148}
+\pdfglyphtounicode{ncedilla}{0146}
+\pdfglyphtounicode{ncircle}{24DD}
+\pdfglyphtounicode{ncircumflexbelow}{1E4B}
+\pdfglyphtounicode{ncommaaccent}{0146}
+\pdfglyphtounicode{ndotaccent}{1E45}
+\pdfglyphtounicode{ndotbelow}{1E47}
+\pdfglyphtounicode{negationslash}{0338}
+\pdfglyphtounicode{nehiragana}{306D}
+\pdfglyphtounicode{nekatakana}{30CD}
+\pdfglyphtounicode{nekatakanahalfwidth}{FF88}
+\pdfglyphtounicode{newsheqelsign}{20AA}
+\pdfglyphtounicode{nfsquare}{338B}
+\pdfglyphtounicode{ng}{014B}
+\pdfglyphtounicode{ngabengali}{0999}
+\pdfglyphtounicode{ngadeva}{0919}
+\pdfglyphtounicode{ngagujarati}{0A99}
+\pdfglyphtounicode{ngagurmukhi}{0A19}
+\pdfglyphtounicode{ngonguthai}{0E07}
+\pdfglyphtounicode{nhiragana}{3093}
+\pdfglyphtounicode{nhookleft}{0272}
+\pdfglyphtounicode{nhookretroflex}{0273}
+\pdfglyphtounicode{nieunacirclekorean}{326F}
+\pdfglyphtounicode{nieunaparenkorean}{320F}
+\pdfglyphtounicode{nieuncieuckorean}{3135}
+\pdfglyphtounicode{nieuncirclekorean}{3261}
+\pdfglyphtounicode{nieunhieuhkorean}{3136}
+\pdfglyphtounicode{nieunkorean}{3134}
+\pdfglyphtounicode{nieunpansioskorean}{3168}
+\pdfglyphtounicode{nieunparenkorean}{3201}
+\pdfglyphtounicode{nieunsioskorean}{3167}
+\pdfglyphtounicode{nieuntikeutkorean}{3166}
+\pdfglyphtounicode{nihiragana}{306B}
+\pdfglyphtounicode{nikatakana}{30CB}
+\pdfglyphtounicode{nikatakanahalfwidth}{FF86}
+\pdfglyphtounicode{nikhahitleftthai}{F899}
+\pdfglyphtounicode{nikhahitthai}{0E4D}
+\pdfglyphtounicode{nine}{0039}
+\pdfglyphtounicode{ninearabic}{0669}
+\pdfglyphtounicode{ninebengali}{09EF}
+\pdfglyphtounicode{ninecircle}{2468}
+\pdfglyphtounicode{ninecircleinversesansserif}{2792}
+\pdfglyphtounicode{ninedeva}{096F}
+\pdfglyphtounicode{ninegujarati}{0AEF}
+\pdfglyphtounicode{ninegurmukhi}{0A6F}
+\pdfglyphtounicode{ninehackarabic}{0669}
+\pdfglyphtounicode{ninehangzhou}{3029}
+\pdfglyphtounicode{nineideographicparen}{3228}
+\pdfglyphtounicode{nineinferior}{2089}
+\pdfglyphtounicode{ninemonospace}{FF19}
+\pdfglyphtounicode{nineoldstyle}{0039}
+\pdfglyphtounicode{nineparen}{247C}
+\pdfglyphtounicode{nineperiod}{2490}
+\pdfglyphtounicode{ninepersian}{06F9}
+\pdfglyphtounicode{nineroman}{2178}
+\pdfglyphtounicode{ninesuperior}{2079}
+\pdfglyphtounicode{nineteencircle}{2472}
+\pdfglyphtounicode{nineteenparen}{2486}
+\pdfglyphtounicode{nineteenperiod}{249A}
+\pdfglyphtounicode{ninethai}{0E59}
+\pdfglyphtounicode{nj}{01CC}
+\pdfglyphtounicode{njecyrillic}{045A}
+\pdfglyphtounicode{nkatakana}{30F3}
+\pdfglyphtounicode{nkatakanahalfwidth}{FF9D}
+\pdfglyphtounicode{nlegrightlong}{019E}
+\pdfglyphtounicode{nlinebelow}{1E49}
+\pdfglyphtounicode{nmonospace}{FF4E}
+\pdfglyphtounicode{nmsquare}{339A}
+\pdfglyphtounicode{nnabengali}{09A3}
+\pdfglyphtounicode{nnadeva}{0923}
+\pdfglyphtounicode{nnagujarati}{0AA3}
+\pdfglyphtounicode{nnagurmukhi}{0A23}
+\pdfglyphtounicode{nnnadeva}{0929}
+\pdfglyphtounicode{nohiragana}{306E}
+\pdfglyphtounicode{nokatakana}{30CE}
+\pdfglyphtounicode{nokatakanahalfwidth}{FF89}
+\pdfglyphtounicode{nonbreakingspace}{00A0}
+\pdfglyphtounicode{nonenthai}{0E13}
+\pdfglyphtounicode{nonuthai}{0E19}
+\pdfglyphtounicode{noonarabic}{0646}
+\pdfglyphtounicode{noonfinalarabic}{FEE6}
+\pdfglyphtounicode{noonghunnaarabic}{06BA}
+\pdfglyphtounicode{noonghunnafinalarabic}{FB9F}
+\pdfglyphtounicode{noonhehinitialarabic}{FEE7 FEEC}
+\pdfglyphtounicode{nooninitialarabic}{FEE7}
+\pdfglyphtounicode{noonjeeminitialarabic}{FCD2}
+\pdfglyphtounicode{noonjeemisolatedarabic}{FC4B}
+\pdfglyphtounicode{noonmedialarabic}{FEE8}
+\pdfglyphtounicode{noonmeeminitialarabic}{FCD5}
+\pdfglyphtounicode{noonmeemisolatedarabic}{FC4E}
+\pdfglyphtounicode{noonnoonfinalarabic}{FC8D}
+\pdfglyphtounicode{notapproxequal}{2247}
+\pdfglyphtounicode{notarrowboth}{21AE}
+\pdfglyphtounicode{notarrowleft}{219A}
+\pdfglyphtounicode{notarrowright}{219B}
+\pdfglyphtounicode{notbar}{2224}
+\pdfglyphtounicode{notcontains}{220C}
+\pdfglyphtounicode{notdblarrowboth}{21CE}
+\pdfglyphtounicode{notdblarrowleft}{21CD}
+\pdfglyphtounicode{notdblarrowright}{21CF}
+\pdfglyphtounicode{notelement}{2209}
+\pdfglyphtounicode{notelementof}{2209}
+\pdfglyphtounicode{notequal}{2260}
+\pdfglyphtounicode{notexistential}{2204}
+\pdfglyphtounicode{notfollows}{2281}
+\pdfglyphtounicode{notfollowsoreql}{2AB0 0338}
+\pdfglyphtounicode{notforces}{22AE}
+\pdfglyphtounicode{notforcesextra}{22AF}
+\pdfglyphtounicode{notgreater}{226F}
+\pdfglyphtounicode{notgreaterdblequal}{2267 0338}
+\pdfglyphtounicode{notgreaterequal}{2271}
+\pdfglyphtounicode{notgreaternorequal}{2271}
+\pdfglyphtounicode{notgreaternorless}{2279}
+\pdfglyphtounicode{notgreaterorslnteql}{2A7E 0338}
+\pdfglyphtounicode{notidentical}{2262}
+\pdfglyphtounicode{notless}{226E}
+\pdfglyphtounicode{notlessdblequal}{2266 0338}
+\pdfglyphtounicode{notlessequal}{2270}
+\pdfglyphtounicode{notlessnorequal}{2270}
+\pdfglyphtounicode{notlessorslnteql}{2A7D 0338}
+\pdfglyphtounicode{notparallel}{2226}
+\pdfglyphtounicode{notprecedes}{2280}
+\pdfglyphtounicode{notprecedesoreql}{2AAF 0338}
+\pdfglyphtounicode{notsatisfies}{22AD}
+\pdfglyphtounicode{notsimilar}{2241}
+\pdfglyphtounicode{notsubset}{2284}
+\pdfglyphtounicode{notsubseteql}{2288}
+\pdfglyphtounicode{notsubsetordbleql}{2AC5 0338}
+\pdfglyphtounicode{notsubsetoreql}{228A}
+\pdfglyphtounicode{notsucceeds}{2281}
+\pdfglyphtounicode{notsuperset}{2285}
+\pdfglyphtounicode{notsuperseteql}{2289}
+\pdfglyphtounicode{notsupersetordbleql}{2AC6 0338}
+\pdfglyphtounicode{notsupersetoreql}{228B}
+\pdfglyphtounicode{nottriangeqlleft}{22EC}
+\pdfglyphtounicode{nottriangeqlright}{22ED}
+\pdfglyphtounicode{nottriangleleft}{22EA}
+\pdfglyphtounicode{nottriangleright}{22EB}
+\pdfglyphtounicode{notturnstile}{22AC}
+\pdfglyphtounicode{nowarmenian}{0576}
+\pdfglyphtounicode{nparen}{24A9}
+\pdfglyphtounicode{nssquare}{33B1}
+\pdfglyphtounicode{nsuperior}{207F}
+\pdfglyphtounicode{ntilde}{00F1}
+\pdfglyphtounicode{nu}{03BD}
+\pdfglyphtounicode{nuhiragana}{306C}
+\pdfglyphtounicode{nukatakana}{30CC}
+\pdfglyphtounicode{nukatakanahalfwidth}{FF87}
+\pdfglyphtounicode{nuktabengali}{09BC}
+\pdfglyphtounicode{nuktadeva}{093C}
+\pdfglyphtounicode{nuktagujarati}{0ABC}
+\pdfglyphtounicode{nuktagurmukhi}{0A3C}
+\pdfglyphtounicode{numbersign}{0023}
+\pdfglyphtounicode{numbersignmonospace}{FF03}
+\pdfglyphtounicode{numbersignsmall}{FE5F}
+\pdfglyphtounicode{numeralsigngreek}{0374}
+\pdfglyphtounicode{numeralsignlowergreek}{0375}
+\pdfglyphtounicode{numero}{2116}
+\pdfglyphtounicode{nun}{05E0}
+\pdfglyphtounicode{nundagesh}{FB40}
+\pdfglyphtounicode{nundageshhebrew}{FB40}
+\pdfglyphtounicode{nunhebrew}{05E0}
+\pdfglyphtounicode{nvsquare}{33B5}
+\pdfglyphtounicode{nwsquare}{33BB}
+\pdfglyphtounicode{nyabengali}{099E}
+\pdfglyphtounicode{nyadeva}{091E}
+\pdfglyphtounicode{nyagujarati}{0A9E}
+\pdfglyphtounicode{nyagurmukhi}{0A1E}
+\pdfglyphtounicode{o}{006F}
+\pdfglyphtounicode{oacute}{00F3}
+\pdfglyphtounicode{oangthai}{0E2D}
+\pdfglyphtounicode{obarred}{0275}
+\pdfglyphtounicode{obarredcyrillic}{04E9}
+\pdfglyphtounicode{obarreddieresiscyrillic}{04EB}
+\pdfglyphtounicode{obengali}{0993}
+\pdfglyphtounicode{obopomofo}{311B}
+\pdfglyphtounicode{obreve}{014F}
+\pdfglyphtounicode{ocandradeva}{0911}
+\pdfglyphtounicode{ocandragujarati}{0A91}
+\pdfglyphtounicode{ocandravowelsigndeva}{0949}
+\pdfglyphtounicode{ocandravowelsigngujarati}{0AC9}
+\pdfglyphtounicode{ocaron}{01D2}
+\pdfglyphtounicode{ocircle}{24DE}
+\pdfglyphtounicode{ocircumflex}{00F4}
+\pdfglyphtounicode{ocircumflexacute}{1ED1}
+\pdfglyphtounicode{ocircumflexdotbelow}{1ED9}
+\pdfglyphtounicode{ocircumflexgrave}{1ED3}
+\pdfglyphtounicode{ocircumflexhookabove}{1ED5}
+\pdfglyphtounicode{ocircumflextilde}{1ED7}
+\pdfglyphtounicode{ocyrillic}{043E}
+\pdfglyphtounicode{odblacute}{0151}
+\pdfglyphtounicode{odblgrave}{020D}
+\pdfglyphtounicode{odeva}{0913}
+\pdfglyphtounicode{odieresis}{00F6}
+\pdfglyphtounicode{odieresiscyrillic}{04E7}
+\pdfglyphtounicode{odotbelow}{1ECD}
+\pdfglyphtounicode{oe}{0153}
+\pdfglyphtounicode{oekorean}{315A}
+\pdfglyphtounicode{ogonek}{02DB}
+\pdfglyphtounicode{ogonekcmb}{0328}
+\pdfglyphtounicode{ograve}{00F2}
+\pdfglyphtounicode{ogujarati}{0A93}
+\pdfglyphtounicode{oharmenian}{0585}
+\pdfglyphtounicode{ohiragana}{304A}
+\pdfglyphtounicode{ohookabove}{1ECF}
+\pdfglyphtounicode{ohorn}{01A1}
+\pdfglyphtounicode{ohornacute}{1EDB}
+\pdfglyphtounicode{ohorndotbelow}{1EE3}
+\pdfglyphtounicode{ohorngrave}{1EDD}
+\pdfglyphtounicode{ohornhookabove}{1EDF}
+\pdfglyphtounicode{ohorntilde}{1EE1}
+\pdfglyphtounicode{ohungarumlaut}{0151}
+\pdfglyphtounicode{oi}{01A3}
+\pdfglyphtounicode{oinvertedbreve}{020F}
+\pdfglyphtounicode{okatakana}{30AA}
+\pdfglyphtounicode{okatakanahalfwidth}{FF75}
+\pdfglyphtounicode{okorean}{3157}
+\pdfglyphtounicode{olehebrew}{05AB}
+\pdfglyphtounicode{omacron}{014D}
+\pdfglyphtounicode{omacronacute}{1E53}
+\pdfglyphtounicode{omacrongrave}{1E51}
+\pdfglyphtounicode{omdeva}{0950}
+\pdfglyphtounicode{omega}{03C9}
+\pdfglyphtounicode{omega1}{03D6}
+\pdfglyphtounicode{omegacyrillic}{0461}
+\pdfglyphtounicode{omegalatinclosed}{0277}
+\pdfglyphtounicode{omegaroundcyrillic}{047B}
+\pdfglyphtounicode{omegatitlocyrillic}{047D}
+\pdfglyphtounicode{omegatonos}{03CE}
+\pdfglyphtounicode{omgujarati}{0AD0}
+\pdfglyphtounicode{omicron}{03BF}
+\pdfglyphtounicode{omicrontonos}{03CC}
+\pdfglyphtounicode{omonospace}{FF4F}
+\pdfglyphtounicode{one}{0031}
+\pdfglyphtounicode{onearabic}{0661}
+\pdfglyphtounicode{onebengali}{09E7}
+\pdfglyphtounicode{onecircle}{2460}
+\pdfglyphtounicode{onecircleinversesansserif}{278A}
+\pdfglyphtounicode{onedeva}{0967}
+\pdfglyphtounicode{onedotenleader}{2024}
+\pdfglyphtounicode{oneeighth}{215B}
+\pdfglyphtounicode{onefitted}{0031}
+\pdfglyphtounicode{onegujarati}{0AE7}
+\pdfglyphtounicode{onegurmukhi}{0A67}
+\pdfglyphtounicode{onehackarabic}{0661}
+\pdfglyphtounicode{onehalf}{00BD}
+\pdfglyphtounicode{onehangzhou}{3021}
+\pdfglyphtounicode{oneideographicparen}{3220}
+\pdfglyphtounicode{oneinferior}{2081}
+\pdfglyphtounicode{onemonospace}{FF11}
+\pdfglyphtounicode{onenumeratorbengali}{09F4}
+\pdfglyphtounicode{oneoldstyle}{0031}
+\pdfglyphtounicode{oneparen}{2474}
+\pdfglyphtounicode{oneperiod}{2488}
+\pdfglyphtounicode{onepersian}{06F1}
+\pdfglyphtounicode{onequarter}{00BC}
+\pdfglyphtounicode{oneroman}{2170}
+\pdfglyphtounicode{onesuperior}{00B9}
+\pdfglyphtounicode{onethai}{0E51}
+\pdfglyphtounicode{onethird}{2153}
+\pdfglyphtounicode{oogonek}{01EB}
+\pdfglyphtounicode{oogonekmacron}{01ED}
+\pdfglyphtounicode{oogurmukhi}{0A13}
+\pdfglyphtounicode{oomatragurmukhi}{0A4B}
+\pdfglyphtounicode{oopen}{0254}
+\pdfglyphtounicode{oparen}{24AA}
+\pdfglyphtounicode{openbullet}{25E6}
+\pdfglyphtounicode{option}{2325}
+\pdfglyphtounicode{ordfeminine}{00AA}
+\pdfglyphtounicode{ordmasculine}{00BA}
+\pdfglyphtounicode{orthogonal}{221F}
+\pdfglyphtounicode{orunderscore}{22BB}
+\pdfglyphtounicode{oshortdeva}{0912}
+\pdfglyphtounicode{oshortvowelsigndeva}{094A}
+\pdfglyphtounicode{oslash}{00F8}
+\pdfglyphtounicode{oslashacute}{01FF}
+\pdfglyphtounicode{osmallhiragana}{3049}
+\pdfglyphtounicode{osmallkatakana}{30A9}
+\pdfglyphtounicode{osmallkatakanahalfwidth}{FF6B}
+\pdfglyphtounicode{ostrokeacute}{01FF}
+\pdfglyphtounicode{osuperior}{006F}
+\pdfglyphtounicode{otcyrillic}{047F}
+\pdfglyphtounicode{otilde}{00F5}
+\pdfglyphtounicode{otildeacute}{1E4D}
+\pdfglyphtounicode{otildedieresis}{1E4F}
+\pdfglyphtounicode{oubopomofo}{3121}
+\pdfglyphtounicode{overline}{203E}
+\pdfglyphtounicode{overlinecenterline}{FE4A}
+\pdfglyphtounicode{overlinecmb}{0305}
+\pdfglyphtounicode{overlinedashed}{FE49}
+\pdfglyphtounicode{overlinedblwavy}{FE4C}
+\pdfglyphtounicode{overlinewavy}{FE4B}
+\pdfglyphtounicode{overscore}{00AF}
+\pdfglyphtounicode{ovowelsignbengali}{09CB}
+\pdfglyphtounicode{ovowelsigndeva}{094B}
+\pdfglyphtounicode{ovowelsigngujarati}{0ACB}
+\pdfglyphtounicode{owner}{220B}
+\pdfglyphtounicode{p}{0070}
+\pdfglyphtounicode{paampssquare}{3380}
+\pdfglyphtounicode{paasentosquare}{332B}
+\pdfglyphtounicode{pabengali}{09AA}
+\pdfglyphtounicode{pacute}{1E55}
+\pdfglyphtounicode{padeva}{092A}
+\pdfglyphtounicode{pagedown}{21DF}
+\pdfglyphtounicode{pageup}{21DE}
+\pdfglyphtounicode{pagujarati}{0AAA}
+\pdfglyphtounicode{pagurmukhi}{0A2A}
+\pdfglyphtounicode{pahiragana}{3071}
+\pdfglyphtounicode{paiyannoithai}{0E2F}
+\pdfglyphtounicode{pakatakana}{30D1}
+\pdfglyphtounicode{palatalizationcyrilliccmb}{0484}
+\pdfglyphtounicode{palochkacyrillic}{04C0}
+\pdfglyphtounicode{pansioskorean}{317F}
+\pdfglyphtounicode{paragraph}{00B6}
+\pdfglyphtounicode{parallel}{2225}
+\pdfglyphtounicode{parenleft}{0028}
+\pdfglyphtounicode{parenleftaltonearabic}{FD3E}
+\pdfglyphtounicode{parenleftbt}{F8ED}
+\pdfglyphtounicode{parenleftex}{F8EC}
+\pdfglyphtounicode{parenleftinferior}{208D}
+\pdfglyphtounicode{parenleftmonospace}{FF08}
+\pdfglyphtounicode{parenleftsmall}{FE59}
+\pdfglyphtounicode{parenleftsuperior}{207D}
+\pdfglyphtounicode{parenlefttp}{F8EB}
+\pdfglyphtounicode{parenleftvertical}{FE35}
+\pdfglyphtounicode{parenright}{0029}
+\pdfglyphtounicode{parenrightaltonearabic}{FD3F}
+\pdfglyphtounicode{parenrightbt}{F8F8}
+\pdfglyphtounicode{parenrightex}{F8F7}
+\pdfglyphtounicode{parenrightinferior}{208E}
+\pdfglyphtounicode{parenrightmonospace}{FF09}
+\pdfglyphtounicode{parenrightsmall}{FE5A}
+\pdfglyphtounicode{parenrightsuperior}{207E}
+\pdfglyphtounicode{parenrighttp}{F8F6}
+\pdfglyphtounicode{parenrightvertical}{FE36}
+\pdfglyphtounicode{partialdiff}{2202}
+\pdfglyphtounicode{paseqhebrew}{05C0}
+\pdfglyphtounicode{pashtahebrew}{0599}
+\pdfglyphtounicode{pasquare}{33A9}
+\pdfglyphtounicode{patah}{05B7}
+\pdfglyphtounicode{patah11}{05B7}
+\pdfglyphtounicode{patah1d}{05B7}
+\pdfglyphtounicode{patah2a}{05B7}
+\pdfglyphtounicode{patahhebrew}{05B7}
+\pdfglyphtounicode{patahnarrowhebrew}{05B7}
+\pdfglyphtounicode{patahquarterhebrew}{05B7}
+\pdfglyphtounicode{patahwidehebrew}{05B7}
+\pdfglyphtounicode{pazerhebrew}{05A1}
+\pdfglyphtounicode{pbopomofo}{3106}
+\pdfglyphtounicode{pcircle}{24DF}
+\pdfglyphtounicode{pdotaccent}{1E57}
+\pdfglyphtounicode{pe}{05E4}
+\pdfglyphtounicode{pecyrillic}{043F}
+\pdfglyphtounicode{pedagesh}{FB44}
+\pdfglyphtounicode{pedageshhebrew}{FB44}
+\pdfglyphtounicode{peezisquare}{333B}
+\pdfglyphtounicode{pefinaldageshhebrew}{FB43}
+\pdfglyphtounicode{peharabic}{067E}
+\pdfglyphtounicode{peharmenian}{057A}
+\pdfglyphtounicode{pehebrew}{05E4}
+\pdfglyphtounicode{pehfinalarabic}{FB57}
+\pdfglyphtounicode{pehinitialarabic}{FB58}
+\pdfglyphtounicode{pehiragana}{307A}
+\pdfglyphtounicode{pehmedialarabic}{FB59}
+\pdfglyphtounicode{pekatakana}{30DA}
+\pdfglyphtounicode{pemiddlehookcyrillic}{04A7}
+\pdfglyphtounicode{perafehebrew}{FB4E}
+\pdfglyphtounicode{percent}{0025}
+\pdfglyphtounicode{percentarabic}{066A}
+\pdfglyphtounicode{percentmonospace}{FF05}
+\pdfglyphtounicode{percentsmall}{FE6A}
+\pdfglyphtounicode{period}{002E}
+\pdfglyphtounicode{periodarmenian}{0589}
+\pdfglyphtounicode{periodcentered}{00B7}
+\pdfglyphtounicode{periodhalfwidth}{FF61}
+\pdfglyphtounicode{periodinferior}{002E}
+\pdfglyphtounicode{periodmonospace}{FF0E}
+\pdfglyphtounicode{periodsmall}{FE52}
+\pdfglyphtounicode{periodsuperior}{002E}
+\pdfglyphtounicode{perispomenigreekcmb}{0342}
+\pdfglyphtounicode{perpcorrespond}{2A5E}
+\pdfglyphtounicode{perpendicular}{22A5}
+\pdfglyphtounicode{pertenthousand}{2031}
+\pdfglyphtounicode{perthousand}{2030}
+\pdfglyphtounicode{peseta}{20A7}
+\pdfglyphtounicode{pfsquare}{338A}
+\pdfglyphtounicode{phabengali}{09AB}
+\pdfglyphtounicode{phadeva}{092B}
+\pdfglyphtounicode{phagujarati}{0AAB}
+\pdfglyphtounicode{phagurmukhi}{0A2B}
+\pdfglyphtounicode{phi}{03C6}
+\pdfglyphtounicode{phi1}{03D5}
+\pdfglyphtounicode{phieuphacirclekorean}{327A}
+\pdfglyphtounicode{phieuphaparenkorean}{321A}
+\pdfglyphtounicode{phieuphcirclekorean}{326C}
+\pdfglyphtounicode{phieuphkorean}{314D}
+\pdfglyphtounicode{phieuphparenkorean}{320C}
+\pdfglyphtounicode{philatin}{0278}
+\pdfglyphtounicode{phinthuthai}{0E3A}
+\pdfglyphtounicode{phisymbolgreek}{03D5}
+\pdfglyphtounicode{phook}{01A5}
+\pdfglyphtounicode{phophanthai}{0E1E}
+\pdfglyphtounicode{phophungthai}{0E1C}
+\pdfglyphtounicode{phosamphaothai}{0E20}
+\pdfglyphtounicode{pi}{03C0}
+\pdfglyphtounicode{pi1}{03D6}
+\pdfglyphtounicode{pieupacirclekorean}{3273}
+\pdfglyphtounicode{pieupaparenkorean}{3213}
+\pdfglyphtounicode{pieupcieuckorean}{3176}
+\pdfglyphtounicode{pieupcirclekorean}{3265}
+\pdfglyphtounicode{pieupkiyeokkorean}{3172}
+\pdfglyphtounicode{pieupkorean}{3142}
+\pdfglyphtounicode{pieupparenkorean}{3205}
+\pdfglyphtounicode{pieupsioskiyeokkorean}{3174}
+\pdfglyphtounicode{pieupsioskorean}{3144}
+\pdfglyphtounicode{pieupsiostikeutkorean}{3175}
+\pdfglyphtounicode{pieupthieuthkorean}{3177}
+\pdfglyphtounicode{pieuptikeutkorean}{3173}
+\pdfglyphtounicode{pihiragana}{3074}
+\pdfglyphtounicode{pikatakana}{30D4}
+\pdfglyphtounicode{pisymbolgreek}{03D6}
+\pdfglyphtounicode{piwrarmenian}{0583}
+\pdfglyphtounicode{planckover2pi}{210F}
+\pdfglyphtounicode{planckover2pi1}{210F}
+\pdfglyphtounicode{plus}{002B}
+\pdfglyphtounicode{plusbelowcmb}{031F}
+\pdfglyphtounicode{pluscircle}{2295}
+\pdfglyphtounicode{plusminus}{00B1}
+\pdfglyphtounicode{plusmod}{02D6}
+\pdfglyphtounicode{plusmonospace}{FF0B}
+\pdfglyphtounicode{plussmall}{FE62}
+\pdfglyphtounicode{plussuperior}{207A}
+\pdfglyphtounicode{pmonospace}{FF50}
+\pdfglyphtounicode{pmsquare}{33D8}
+\pdfglyphtounicode{pohiragana}{307D}
+\pdfglyphtounicode{pointingindexdownwhite}{261F}
+\pdfglyphtounicode{pointingindexleftwhite}{261C}
+\pdfglyphtounicode{pointingindexrightwhite}{261E}
+\pdfglyphtounicode{pointingindexupwhite}{261D}
+\pdfglyphtounicode{pokatakana}{30DD}
+\pdfglyphtounicode{poplathai}{0E1B}
+\pdfglyphtounicode{postalmark}{3012}
+\pdfglyphtounicode{postalmarkface}{3020}
+\pdfglyphtounicode{pparen}{24AB}
+\pdfglyphtounicode{precedenotdbleqv}{2AB9}
+\pdfglyphtounicode{precedenotslnteql}{2AB5}
+\pdfglyphtounicode{precedeornoteqvlnt}{22E8}
+\pdfglyphtounicode{precedes}{227A}
+\pdfglyphtounicode{precedesequal}{2AAF}
+\pdfglyphtounicode{precedesorcurly}{227C}
+\pdfglyphtounicode{precedesorequal}{227E}
+\pdfglyphtounicode{prescription}{211E}
+\pdfglyphtounicode{prime}{2032}
+\pdfglyphtounicode{primemod}{02B9}
+\pdfglyphtounicode{primereverse}{2035}
+\pdfglyphtounicode{primereversed}{2035}
+\pdfglyphtounicode{product}{220F}
+\pdfglyphtounicode{projective}{2305}
+\pdfglyphtounicode{prolongedkana}{30FC}
+\pdfglyphtounicode{propellor}{2318}
+\pdfglyphtounicode{propersubset}{2282}
+\pdfglyphtounicode{propersuperset}{2283}
+\pdfglyphtounicode{proportion}{2237}
+\pdfglyphtounicode{proportional}{221D}
+\pdfglyphtounicode{psi}{03C8}
+\pdfglyphtounicode{psicyrillic}{0471}
+\pdfglyphtounicode{psilipneumatacyrilliccmb}{0486}
+\pdfglyphtounicode{pssquare}{33B0}
+\pdfglyphtounicode{puhiragana}{3077}
+\pdfglyphtounicode{pukatakana}{30D7}
+\pdfglyphtounicode{punctdash}{2014}
+\pdfglyphtounicode{pvsquare}{33B4}
+\pdfglyphtounicode{pwsquare}{33BA}
+\pdfglyphtounicode{q}{0071}
+\pdfglyphtounicode{qadeva}{0958}
+\pdfglyphtounicode{qadmahebrew}{05A8}
+\pdfglyphtounicode{qafarabic}{0642}
+\pdfglyphtounicode{qaffinalarabic}{FED6}
+\pdfglyphtounicode{qafinitialarabic}{FED7}
+\pdfglyphtounicode{qafmedialarabic}{FED8}
+\pdfglyphtounicode{qamats}{05B8}
+\pdfglyphtounicode{qamats10}{05B8}
+\pdfglyphtounicode{qamats1a}{05B8}
+\pdfglyphtounicode{qamats1c}{05B8}
+\pdfglyphtounicode{qamats27}{05B8}
+\pdfglyphtounicode{qamats29}{05B8}
+\pdfglyphtounicode{qamats33}{05B8}
+\pdfglyphtounicode{qamatsde}{05B8}
+\pdfglyphtounicode{qamatshebrew}{05B8}
+\pdfglyphtounicode{qamatsnarrowhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatannarrowhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanquarterhebrew}{05B8}
+\pdfglyphtounicode{qamatsqatanwidehebrew}{05B8}
+\pdfglyphtounicode{qamatsquarterhebrew}{05B8}
+\pdfglyphtounicode{qamatswidehebrew}{05B8}
+\pdfglyphtounicode{qarneyparahebrew}{059F}
+\pdfglyphtounicode{qbopomofo}{3111}
+\pdfglyphtounicode{qcircle}{24E0}
+\pdfglyphtounicode{qhook}{02A0}
+\pdfglyphtounicode{qmonospace}{FF51}
+\pdfglyphtounicode{qof}{05E7}
+\pdfglyphtounicode{qofdagesh}{FB47}
+\pdfglyphtounicode{qofdageshhebrew}{FB47}
+\pdfglyphtounicode{qofhatafpatah}{05E7 05B2}
+\pdfglyphtounicode{qofhatafpatahhebrew}{05E7 05B2}
+\pdfglyphtounicode{qofhatafsegol}{05E7 05B1}
+\pdfglyphtounicode{qofhatafsegolhebrew}{05E7 05B1}
+\pdfglyphtounicode{qofhebrew}{05E7}
+\pdfglyphtounicode{qofhiriq}{05E7 05B4}
+\pdfglyphtounicode{qofhiriqhebrew}{05E7 05B4}
+\pdfglyphtounicode{qofholam}{05E7 05B9}
+\pdfglyphtounicode{qofholamhebrew}{05E7 05B9}
+\pdfglyphtounicode{qofpatah}{05E7 05B7}
+\pdfglyphtounicode{qofpatahhebrew}{05E7 05B7}
+\pdfglyphtounicode{qofqamats}{05E7 05B8}
+\pdfglyphtounicode{qofqamatshebrew}{05E7 05B8}
+\pdfglyphtounicode{qofqubuts}{05E7 05BB}
+\pdfglyphtounicode{qofqubutshebrew}{05E7 05BB}
+\pdfglyphtounicode{qofsegol}{05E7 05B6}
+\pdfglyphtounicode{qofsegolhebrew}{05E7 05B6}
+\pdfglyphtounicode{qofsheva}{05E7 05B0}
+\pdfglyphtounicode{qofshevahebrew}{05E7 05B0}
+\pdfglyphtounicode{qoftsere}{05E7 05B5}
+\pdfglyphtounicode{qoftserehebrew}{05E7 05B5}
+\pdfglyphtounicode{qparen}{24AC}
+\pdfglyphtounicode{quarternote}{2669}
+\pdfglyphtounicode{qubuts}{05BB}
+\pdfglyphtounicode{qubuts18}{05BB}
+\pdfglyphtounicode{qubuts25}{05BB}
+\pdfglyphtounicode{qubuts31}{05BB}
+\pdfglyphtounicode{qubutshebrew}{05BB}
+\pdfglyphtounicode{qubutsnarrowhebrew}{05BB}
+\pdfglyphtounicode{qubutsquarterhebrew}{05BB}
+\pdfglyphtounicode{qubutswidehebrew}{05BB}
+\pdfglyphtounicode{question}{003F}
+\pdfglyphtounicode{questionarabic}{061F}
+\pdfglyphtounicode{questionarmenian}{055E}
+\pdfglyphtounicode{questiondown}{00BF}
+\pdfglyphtounicode{questiondownsmall}{00BF}
+\pdfglyphtounicode{questiongreek}{037E}
+\pdfglyphtounicode{questionmonospace}{FF1F}
+\pdfglyphtounicode{questionsmall}{003F}
+\pdfglyphtounicode{quotedbl}{0022}
+\pdfglyphtounicode{quotedblbase}{201E}
+\pdfglyphtounicode{quotedblleft}{201C}
+\pdfglyphtounicode{quotedblmonospace}{FF02}
+\pdfglyphtounicode{quotedblprime}{301E}
+\pdfglyphtounicode{quotedblprimereversed}{301D}
+\pdfglyphtounicode{quotedblright}{201D}
+\pdfglyphtounicode{quoteleft}{2018}
+\pdfglyphtounicode{quoteleftreversed}{201B}
+\pdfglyphtounicode{quotereversed}{201B}
+\pdfglyphtounicode{quoteright}{2019}
+\pdfglyphtounicode{quoterightn}{0149}
+\pdfglyphtounicode{quotesinglbase}{201A}
+\pdfglyphtounicode{quotesingle}{0027}
+\pdfglyphtounicode{quotesinglemonospace}{FF07}
+\pdfglyphtounicode{r}{0072}
+\pdfglyphtounicode{raarmenian}{057C}
+\pdfglyphtounicode{rabengali}{09B0}
+\pdfglyphtounicode{racute}{0155}
+\pdfglyphtounicode{radeva}{0930}
+\pdfglyphtounicode{radical}{221A}
+\pdfglyphtounicode{radicalex}{F8E5}
+\pdfglyphtounicode{radoverssquare}{33AE}
+\pdfglyphtounicode{radoverssquaredsquare}{33AF}
+\pdfglyphtounicode{radsquare}{33AD}
+\pdfglyphtounicode{rafe}{05BF}
+\pdfglyphtounicode{rafehebrew}{05BF}
+\pdfglyphtounicode{ragujarati}{0AB0}
+\pdfglyphtounicode{ragurmukhi}{0A30}
+\pdfglyphtounicode{rahiragana}{3089}
+\pdfglyphtounicode{rakatakana}{30E9}
+\pdfglyphtounicode{rakatakanahalfwidth}{FF97}
+\pdfglyphtounicode{ralowerdiagonalbengali}{09F1}
+\pdfglyphtounicode{ramiddlediagonalbengali}{09F0}
+\pdfglyphtounicode{ramshorn}{0264}
+\pdfglyphtounicode{rangedash}{2013}
+\pdfglyphtounicode{ratio}{2236}
+\pdfglyphtounicode{rbopomofo}{3116}
+\pdfglyphtounicode{rcaron}{0159}
+\pdfglyphtounicode{rcedilla}{0157}
+\pdfglyphtounicode{rcircle}{24E1}
+\pdfglyphtounicode{rcommaaccent}{0157}
+\pdfglyphtounicode{rdblgrave}{0211}
+\pdfglyphtounicode{rdotaccent}{1E59}
+\pdfglyphtounicode{rdotbelow}{1E5B}
+\pdfglyphtounicode{rdotbelowmacron}{1E5D}
+\pdfglyphtounicode{referencemark}{203B}
+\pdfglyphtounicode{reflexsubset}{2286}
+\pdfglyphtounicode{reflexsuperset}{2287}
+\pdfglyphtounicode{registered}{00AE}
+\pdfglyphtounicode{registersans}{00AE}
+\pdfglyphtounicode{registerserif}{00AE}
+\pdfglyphtounicode{reharabic}{0631}
+\pdfglyphtounicode{reharmenian}{0580}
+\pdfglyphtounicode{rehfinalarabic}{FEAE}
+\pdfglyphtounicode{rehiragana}{308C}
+\pdfglyphtounicode{rehyehaleflamarabic}{0631 FEF3 FE8E 0644}
+\pdfglyphtounicode{rekatakana}{30EC}
+\pdfglyphtounicode{rekatakanahalfwidth}{FF9A}
+\pdfglyphtounicode{resh}{05E8}
+\pdfglyphtounicode{reshdageshhebrew}{FB48}
+\pdfglyphtounicode{reshhatafpatah}{05E8 05B2}
+\pdfglyphtounicode{reshhatafpatahhebrew}{05E8 05B2}
+\pdfglyphtounicode{reshhatafsegol}{05E8 05B1}
+\pdfglyphtounicode{reshhatafsegolhebrew}{05E8 05B1}
+\pdfglyphtounicode{reshhebrew}{05E8}
+\pdfglyphtounicode{reshhiriq}{05E8 05B4}
+\pdfglyphtounicode{reshhiriqhebrew}{05E8 05B4}
+\pdfglyphtounicode{reshholam}{05E8 05B9}
+\pdfglyphtounicode{reshholamhebrew}{05E8 05B9}
+\pdfglyphtounicode{reshpatah}{05E8 05B7}
+\pdfglyphtounicode{reshpatahhebrew}{05E8 05B7}
+\pdfglyphtounicode{reshqamats}{05E8 05B8}
+\pdfglyphtounicode{reshqamatshebrew}{05E8 05B8}
+\pdfglyphtounicode{reshqubuts}{05E8 05BB}
+\pdfglyphtounicode{reshqubutshebrew}{05E8 05BB}
+\pdfglyphtounicode{reshsegol}{05E8 05B6}
+\pdfglyphtounicode{reshsegolhebrew}{05E8 05B6}
+\pdfglyphtounicode{reshsheva}{05E8 05B0}
+\pdfglyphtounicode{reshshevahebrew}{05E8 05B0}
+\pdfglyphtounicode{reshtsere}{05E8 05B5}
+\pdfglyphtounicode{reshtserehebrew}{05E8 05B5}
+\pdfglyphtounicode{revasymptequal}{22CD}
+\pdfglyphtounicode{reversedtilde}{223D}
+\pdfglyphtounicode{reviahebrew}{0597}
+\pdfglyphtounicode{reviamugrashhebrew}{0597}
+\pdfglyphtounicode{revlogicalnot}{2310}
+\pdfglyphtounicode{revsimilar}{223D}
+\pdfglyphtounicode{rfishhook}{027E}
+\pdfglyphtounicode{rfishhookreversed}{027F}
+\pdfglyphtounicode{rhabengali}{09DD}
+\pdfglyphtounicode{rhadeva}{095D}
+\pdfglyphtounicode{rho}{03C1}
+\pdfglyphtounicode{rho1}{03F1}
+\pdfglyphtounicode{rhook}{027D}
+\pdfglyphtounicode{rhookturned}{027B}
+\pdfglyphtounicode{rhookturnedsuperior}{02B5}
+\pdfglyphtounicode{rhosymbolgreek}{03F1}
+\pdfglyphtounicode{rhotichookmod}{02DE}
+\pdfglyphtounicode{rieulacirclekorean}{3271}
+\pdfglyphtounicode{rieulaparenkorean}{3211}
+\pdfglyphtounicode{rieulcirclekorean}{3263}
+\pdfglyphtounicode{rieulhieuhkorean}{3140}
+\pdfglyphtounicode{rieulkiyeokkorean}{313A}
+\pdfglyphtounicode{rieulkiyeoksioskorean}{3169}
+\pdfglyphtounicode{rieulkorean}{3139}
+\pdfglyphtounicode{rieulmieumkorean}{313B}
+\pdfglyphtounicode{rieulpansioskorean}{316C}
+\pdfglyphtounicode{rieulparenkorean}{3203}
+\pdfglyphtounicode{rieulphieuphkorean}{313F}
+\pdfglyphtounicode{rieulpieupkorean}{313C}
+\pdfglyphtounicode{rieulpieupsioskorean}{316B}
+\pdfglyphtounicode{rieulsioskorean}{313D}
+\pdfglyphtounicode{rieulthieuthkorean}{313E}
+\pdfglyphtounicode{rieultikeutkorean}{316A}
+\pdfglyphtounicode{rieulyeorinhieuhkorean}{316D}
+\pdfglyphtounicode{rightangle}{221F}
+\pdfglyphtounicode{rightanglene}{231D}
+\pdfglyphtounicode{rightanglenw}{231C}
+\pdfglyphtounicode{rightanglese}{231F}
+\pdfglyphtounicode{rightanglesw}{231E}
+\pdfglyphtounicode{righttackbelowcmb}{0319}
+\pdfglyphtounicode{righttriangle}{22BF}
+\pdfglyphtounicode{rihiragana}{308A}
+\pdfglyphtounicode{rikatakana}{30EA}
+\pdfglyphtounicode{rikatakanahalfwidth}{FF98}
+\pdfglyphtounicode{ring}{02DA}
+\pdfglyphtounicode{ringbelowcmb}{0325}
+\pdfglyphtounicode{ringcmb}{030A}
+\pdfglyphtounicode{ringhalfleft}{02BF}
+\pdfglyphtounicode{ringhalfleftarmenian}{0559}
+\pdfglyphtounicode{ringhalfleftbelowcmb}{031C}
+\pdfglyphtounicode{ringhalfleftcentered}{02D3}
+\pdfglyphtounicode{ringhalfright}{02BE}
+\pdfglyphtounicode{ringhalfrightbelowcmb}{0339}
+\pdfglyphtounicode{ringhalfrightcentered}{02D2}
+\pdfglyphtounicode{ringinequal}{2256}
+\pdfglyphtounicode{rinvertedbreve}{0213}
+\pdfglyphtounicode{rittorusquare}{3351}
+\pdfglyphtounicode{rlinebelow}{1E5F}
+\pdfglyphtounicode{rlongleg}{027C}
+\pdfglyphtounicode{rlonglegturned}{027A}
+\pdfglyphtounicode{rmonospace}{FF52}
+\pdfglyphtounicode{rohiragana}{308D}
+\pdfglyphtounicode{rokatakana}{30ED}
+\pdfglyphtounicode{rokatakanahalfwidth}{FF9B}
+\pdfglyphtounicode{roruathai}{0E23}
+\pdfglyphtounicode{rparen}{24AD}
+\pdfglyphtounicode{rrabengali}{09DC}
+\pdfglyphtounicode{rradeva}{0931}
+\pdfglyphtounicode{rragurmukhi}{0A5C}
+\pdfglyphtounicode{rreharabic}{0691}
+\pdfglyphtounicode{rrehfinalarabic}{FB8D}
+\pdfglyphtounicode{rrvocalicbengali}{09E0}
+\pdfglyphtounicode{rrvocalicdeva}{0960}
+\pdfglyphtounicode{rrvocalicgujarati}{0AE0}
+\pdfglyphtounicode{rrvocalicvowelsignbengali}{09C4}
+\pdfglyphtounicode{rrvocalicvowelsigndeva}{0944}
+\pdfglyphtounicode{rrvocalicvowelsigngujarati}{0AC4}
+\pdfglyphtounicode{rsuperior}{0072}
+\pdfglyphtounicode{rtblock}{2590}
+\pdfglyphtounicode{rturned}{0279}
+\pdfglyphtounicode{rturnedsuperior}{02B4}
+\pdfglyphtounicode{ruhiragana}{308B}
+\pdfglyphtounicode{rukatakana}{30EB}
+\pdfglyphtounicode{rukatakanahalfwidth}{FF99}
+\pdfglyphtounicode{rupeemarkbengali}{09F2}
+\pdfglyphtounicode{rupeesignbengali}{09F3}
+\pdfglyphtounicode{rupiah}{20A8}
+\pdfglyphtounicode{ruthai}{0E24}
+\pdfglyphtounicode{rvocalicbengali}{098B}
+\pdfglyphtounicode{rvocalicdeva}{090B}
+\pdfglyphtounicode{rvocalicgujarati}{0A8B}
+\pdfglyphtounicode{rvocalicvowelsignbengali}{09C3}
+\pdfglyphtounicode{rvocalicvowelsigndeva}{0943}
+\pdfglyphtounicode{rvocalicvowelsigngujarati}{0AC3}
+\pdfglyphtounicode{s}{0073}
+\pdfglyphtounicode{sabengali}{09B8}
+\pdfglyphtounicode{sacute}{015B}
+\pdfglyphtounicode{sacutedotaccent}{1E65}
+\pdfglyphtounicode{sadarabic}{0635}
+\pdfglyphtounicode{sadeva}{0938}
+\pdfglyphtounicode{sadfinalarabic}{FEBA}
+\pdfglyphtounicode{sadinitialarabic}{FEBB}
+\pdfglyphtounicode{sadmedialarabic}{FEBC}
+\pdfglyphtounicode{sagujarati}{0AB8}
+\pdfglyphtounicode{sagurmukhi}{0A38}
+\pdfglyphtounicode{sahiragana}{3055}
+\pdfglyphtounicode{sakatakana}{30B5}
+\pdfglyphtounicode{sakatakanahalfwidth}{FF7B}
+\pdfglyphtounicode{sallallahoualayhewasallamarabic}{FDFA}
+\pdfglyphtounicode{samekh}{05E1}
+\pdfglyphtounicode{samekhdagesh}{FB41}
+\pdfglyphtounicode{samekhdageshhebrew}{FB41}
+\pdfglyphtounicode{samekhhebrew}{05E1}
+\pdfglyphtounicode{saraaathai}{0E32}
+\pdfglyphtounicode{saraaethai}{0E41}
+\pdfglyphtounicode{saraaimaimalaithai}{0E44}
+\pdfglyphtounicode{saraaimaimuanthai}{0E43}
+\pdfglyphtounicode{saraamthai}{0E33}
+\pdfglyphtounicode{saraathai}{0E30}
+\pdfglyphtounicode{saraethai}{0E40}
+\pdfglyphtounicode{saraiileftthai}{F886}
+\pdfglyphtounicode{saraiithai}{0E35}
+\pdfglyphtounicode{saraileftthai}{F885}
+\pdfglyphtounicode{saraithai}{0E34}
+\pdfglyphtounicode{saraothai}{0E42}
+\pdfglyphtounicode{saraueeleftthai}{F888}
+\pdfglyphtounicode{saraueethai}{0E37}
+\pdfglyphtounicode{saraueleftthai}{F887}
+\pdfglyphtounicode{sarauethai}{0E36}
+\pdfglyphtounicode{sarauthai}{0E38}
+\pdfglyphtounicode{sarauuthai}{0E39}
+\pdfglyphtounicode{satisfies}{22A8}
+\pdfglyphtounicode{sbopomofo}{3119}
+\pdfglyphtounicode{scaron}{0161}
+\pdfglyphtounicode{scarondotaccent}{1E67}
+\pdfglyphtounicode{scedilla}{015F}
+\pdfglyphtounicode{schwa}{0259}
+\pdfglyphtounicode{schwacyrillic}{04D9}
+\pdfglyphtounicode{schwadieresiscyrillic}{04DB}
+\pdfglyphtounicode{schwahook}{025A}
+\pdfglyphtounicode{scircle}{24E2}
+\pdfglyphtounicode{scircumflex}{015D}
+\pdfglyphtounicode{scommaaccent}{0219}
+\pdfglyphtounicode{sdotaccent}{1E61}
+\pdfglyphtounicode{sdotbelow}{1E63}
+\pdfglyphtounicode{sdotbelowdotaccent}{1E69}
+\pdfglyphtounicode{seagullbelowcmb}{033C}
+\pdfglyphtounicode{second}{2033}
+\pdfglyphtounicode{secondtonechinese}{02CA}
+\pdfglyphtounicode{section}{00A7}
+\pdfglyphtounicode{seenarabic}{0633}
+\pdfglyphtounicode{seenfinalarabic}{FEB2}
+\pdfglyphtounicode{seeninitialarabic}{FEB3}
+\pdfglyphtounicode{seenmedialarabic}{FEB4}
+\pdfglyphtounicode{segol}{05B6}
+\pdfglyphtounicode{segol13}{05B6}
+\pdfglyphtounicode{segol1f}{05B6}
+\pdfglyphtounicode{segol2c}{05B6}
+\pdfglyphtounicode{segolhebrew}{05B6}
+\pdfglyphtounicode{segolnarrowhebrew}{05B6}
+\pdfglyphtounicode{segolquarterhebrew}{05B6}
+\pdfglyphtounicode{segoltahebrew}{0592}
+\pdfglyphtounicode{segolwidehebrew}{05B6}
+\pdfglyphtounicode{seharmenian}{057D}
+\pdfglyphtounicode{sehiragana}{305B}
+\pdfglyphtounicode{sekatakana}{30BB}
+\pdfglyphtounicode{sekatakanahalfwidth}{FF7E}
+\pdfglyphtounicode{semicolon}{003B}
+\pdfglyphtounicode{semicolonarabic}{061B}
+\pdfglyphtounicode{semicolonmonospace}{FF1B}
+\pdfglyphtounicode{semicolonsmall}{FE54}
+\pdfglyphtounicode{semivoicedmarkkana}{309C}
+\pdfglyphtounicode{semivoicedmarkkanahalfwidth}{FF9F}
+\pdfglyphtounicode{sentisquare}{3322}
+\pdfglyphtounicode{sentosquare}{3323}
+\pdfglyphtounicode{seven}{0037}
+\pdfglyphtounicode{sevenarabic}{0667}
+\pdfglyphtounicode{sevenbengali}{09ED}
+\pdfglyphtounicode{sevencircle}{2466}
+\pdfglyphtounicode{sevencircleinversesansserif}{2790}
+\pdfglyphtounicode{sevendeva}{096D}
+\pdfglyphtounicode{seveneighths}{215E}
+\pdfglyphtounicode{sevengujarati}{0AED}
+\pdfglyphtounicode{sevengurmukhi}{0A6D}
+\pdfglyphtounicode{sevenhackarabic}{0667}
+\pdfglyphtounicode{sevenhangzhou}{3027}
+\pdfglyphtounicode{sevenideographicparen}{3226}
+\pdfglyphtounicode{seveninferior}{2087}
+\pdfglyphtounicode{sevenmonospace}{FF17}
+\pdfglyphtounicode{sevenoldstyle}{0037}
+\pdfglyphtounicode{sevenparen}{247A}
+\pdfglyphtounicode{sevenperiod}{248E}
+\pdfglyphtounicode{sevenpersian}{06F7}
+\pdfglyphtounicode{sevenroman}{2176}
+\pdfglyphtounicode{sevensuperior}{2077}
+\pdfglyphtounicode{seventeencircle}{2470}
+\pdfglyphtounicode{seventeenparen}{2484}
+\pdfglyphtounicode{seventeenperiod}{2498}
+\pdfglyphtounicode{seventhai}{0E57}
+\pdfglyphtounicode{sfthyphen}{00AD}
+\pdfglyphtounicode{shaarmenian}{0577}
+\pdfglyphtounicode{shabengali}{09B6}
+\pdfglyphtounicode{shacyrillic}{0448}
+\pdfglyphtounicode{shaddaarabic}{0651}
+\pdfglyphtounicode{shaddadammaarabic}{FC61}
+\pdfglyphtounicode{shaddadammatanarabic}{FC5E}
+\pdfglyphtounicode{shaddafathaarabic}{FC60}
+\pdfglyphtounicode{shaddafathatanarabic}{0651 064B}
+\pdfglyphtounicode{shaddakasraarabic}{FC62}
+\pdfglyphtounicode{shaddakasratanarabic}{FC5F}
+\pdfglyphtounicode{shade}{2592}
+\pdfglyphtounicode{shadedark}{2593}
+\pdfglyphtounicode{shadelight}{2591}
+\pdfglyphtounicode{shademedium}{2592}
+\pdfglyphtounicode{shadeva}{0936}
+\pdfglyphtounicode{shagujarati}{0AB6}
+\pdfglyphtounicode{shagurmukhi}{0A36}
+\pdfglyphtounicode{shalshelethebrew}{0593}
+\pdfglyphtounicode{sharp}{266F}
+\pdfglyphtounicode{shbopomofo}{3115}
+\pdfglyphtounicode{shchacyrillic}{0449}
+\pdfglyphtounicode{sheenarabic}{0634}
+\pdfglyphtounicode{sheenfinalarabic}{FEB6}
+\pdfglyphtounicode{sheeninitialarabic}{FEB7}
+\pdfglyphtounicode{sheenmedialarabic}{FEB8}
+\pdfglyphtounicode{sheicoptic}{03E3}
+\pdfglyphtounicode{sheqel}{20AA}
+\pdfglyphtounicode{sheqelhebrew}{20AA}
+\pdfglyphtounicode{sheva}{05B0}
+\pdfglyphtounicode{sheva115}{05B0}
+\pdfglyphtounicode{sheva15}{05B0}
+\pdfglyphtounicode{sheva22}{05B0}
+\pdfglyphtounicode{sheva2e}{05B0}
+\pdfglyphtounicode{shevahebrew}{05B0}
+\pdfglyphtounicode{shevanarrowhebrew}{05B0}
+\pdfglyphtounicode{shevaquarterhebrew}{05B0}
+\pdfglyphtounicode{shevawidehebrew}{05B0}
+\pdfglyphtounicode{shhacyrillic}{04BB}
+\pdfglyphtounicode{shiftleft}{21B0}
+\pdfglyphtounicode{shiftright}{21B1}
+\pdfglyphtounicode{shimacoptic}{03ED}
+\pdfglyphtounicode{shin}{05E9}
+\pdfglyphtounicode{shindagesh}{FB49}
+\pdfglyphtounicode{shindageshhebrew}{FB49}
+\pdfglyphtounicode{shindageshshindot}{FB2C}
+\pdfglyphtounicode{shindageshshindothebrew}{FB2C}
+\pdfglyphtounicode{shindageshsindot}{FB2D}
+\pdfglyphtounicode{shindageshsindothebrew}{FB2D}
+\pdfglyphtounicode{shindothebrew}{05C1}
+\pdfglyphtounicode{shinhebrew}{05E9}
+\pdfglyphtounicode{shinshindot}{FB2A}
+\pdfglyphtounicode{shinshindothebrew}{FB2A}
+\pdfglyphtounicode{shinsindot}{FB2B}
+\pdfglyphtounicode{shinsindothebrew}{FB2B}
+\pdfglyphtounicode{shook}{0282}
+\pdfglyphtounicode{sigma}{03C3}
+\pdfglyphtounicode{sigma1}{03C2}
+\pdfglyphtounicode{sigmafinal}{03C2}
+\pdfglyphtounicode{sigmalunatesymbolgreek}{03F2}
+\pdfglyphtounicode{sihiragana}{3057}
+\pdfglyphtounicode{sikatakana}{30B7}
+\pdfglyphtounicode{sikatakanahalfwidth}{FF7C}
+\pdfglyphtounicode{siluqhebrew}{05BD}
+\pdfglyphtounicode{siluqlefthebrew}{05BD}
+\pdfglyphtounicode{similar}{223C}
+\pdfglyphtounicode{similarequal}{2243}
+\pdfglyphtounicode{sindothebrew}{05C2}
+\pdfglyphtounicode{siosacirclekorean}{3274}
+\pdfglyphtounicode{siosaparenkorean}{3214}
+\pdfglyphtounicode{sioscieuckorean}{317E}
+\pdfglyphtounicode{sioscirclekorean}{3266}
+\pdfglyphtounicode{sioskiyeokkorean}{317A}
+\pdfglyphtounicode{sioskorean}{3145}
+\pdfglyphtounicode{siosnieunkorean}{317B}
+\pdfglyphtounicode{siosparenkorean}{3206}
+\pdfglyphtounicode{siospieupkorean}{317D}
+\pdfglyphtounicode{siostikeutkorean}{317C}
+\pdfglyphtounicode{six}{0036}
+\pdfglyphtounicode{sixarabic}{0666}
+\pdfglyphtounicode{sixbengali}{09EC}
+\pdfglyphtounicode{sixcircle}{2465}
+\pdfglyphtounicode{sixcircleinversesansserif}{278F}
+\pdfglyphtounicode{sixdeva}{096C}
+\pdfglyphtounicode{sixgujarati}{0AEC}
+\pdfglyphtounicode{sixgurmukhi}{0A6C}
+\pdfglyphtounicode{sixhackarabic}{0666}
+\pdfglyphtounicode{sixhangzhou}{3026}
+\pdfglyphtounicode{sixideographicparen}{3225}
+\pdfglyphtounicode{sixinferior}{2086}
+\pdfglyphtounicode{sixmonospace}{FF16}
+\pdfglyphtounicode{sixoldstyle}{0036}
+\pdfglyphtounicode{sixparen}{2479}
+\pdfglyphtounicode{sixperiod}{248D}
+\pdfglyphtounicode{sixpersian}{06F6}
+\pdfglyphtounicode{sixroman}{2175}
+\pdfglyphtounicode{sixsuperior}{2076}
+\pdfglyphtounicode{sixteencircle}{246F}
+\pdfglyphtounicode{sixteencurrencydenominatorbengali}{09F9}
+\pdfglyphtounicode{sixteenparen}{2483}
+\pdfglyphtounicode{sixteenperiod}{2497}
+\pdfglyphtounicode{sixthai}{0E56}
+\pdfglyphtounicode{slash}{002F}
+\pdfglyphtounicode{slashmonospace}{FF0F}
+\pdfglyphtounicode{slong}{017F}
+\pdfglyphtounicode{slongdotaccent}{1E9B}
+\pdfglyphtounicode{slurabove}{2322}
+\pdfglyphtounicode{slurbelow}{2323}
+\pdfglyphtounicode{smile}{2323}
+\pdfglyphtounicode{smileface}{263A}
+\pdfglyphtounicode{smonospace}{FF53}
+\pdfglyphtounicode{sofpasuqhebrew}{05C3}
+\pdfglyphtounicode{softhyphen}{00AD}
+\pdfglyphtounicode{softsigncyrillic}{044C}
+\pdfglyphtounicode{sohiragana}{305D}
+\pdfglyphtounicode{sokatakana}{30BD}
+\pdfglyphtounicode{sokatakanahalfwidth}{FF7F}
+\pdfglyphtounicode{soliduslongoverlaycmb}{0338}
+\pdfglyphtounicode{solidusshortoverlaycmb}{0337}
+\pdfglyphtounicode{sorusithai}{0E29}
+\pdfglyphtounicode{sosalathai}{0E28}
+\pdfglyphtounicode{sosothai}{0E0B}
+\pdfglyphtounicode{sosuathai}{0E2A}
+\pdfglyphtounicode{space}{0020}
+\pdfglyphtounicode{spacehackarabic}{0020}
+\pdfglyphtounicode{spade}{2660}
+\pdfglyphtounicode{spadesuitblack}{2660}
+\pdfglyphtounicode{spadesuitwhite}{2664}
+\pdfglyphtounicode{sparen}{24AE}
+\pdfglyphtounicode{sphericalangle}{2222}
+\pdfglyphtounicode{square}{25A1}
+\pdfglyphtounicode{squarebelowcmb}{033B}
+\pdfglyphtounicode{squarecc}{33C4}
+\pdfglyphtounicode{squarecm}{339D}
+\pdfglyphtounicode{squarediagonalcrosshatchfill}{25A9}
+\pdfglyphtounicode{squaredot}{22A1}
+\pdfglyphtounicode{squarehorizontalfill}{25A4}
+\pdfglyphtounicode{squareimage}{228F}
+\pdfglyphtounicode{squarekg}{338F}
+\pdfglyphtounicode{squarekm}{339E}
+\pdfglyphtounicode{squarekmcapital}{33CE}
+\pdfglyphtounicode{squareln}{33D1}
+\pdfglyphtounicode{squarelog}{33D2}
+\pdfglyphtounicode{squaremg}{338E}
+\pdfglyphtounicode{squaremil}{33D5}
+\pdfglyphtounicode{squareminus}{229F}
+\pdfglyphtounicode{squaremm}{339C}
+\pdfglyphtounicode{squaremsquared}{33A1}
+\pdfglyphtounicode{squaremultiply}{22A0}
+\pdfglyphtounicode{squareoriginal}{2290}
+\pdfglyphtounicode{squareorthogonalcrosshatchfill}{25A6}
+\pdfglyphtounicode{squareplus}{229E}
+\pdfglyphtounicode{squaresolid}{25A0}
+\pdfglyphtounicode{squareupperlefttolowerrightfill}{25A7}
+\pdfglyphtounicode{squareupperrighttolowerleftfill}{25A8}
+\pdfglyphtounicode{squareverticalfill}{25A5}
+\pdfglyphtounicode{squarewhitewithsmallblack}{25A3}
+\pdfglyphtounicode{squiggleleftright}{21AD}
+\pdfglyphtounicode{squiggleright}{21DD}
+\pdfglyphtounicode{srsquare}{33DB}
+\pdfglyphtounicode{ssabengali}{09B7}
+\pdfglyphtounicode{ssadeva}{0937}
+\pdfglyphtounicode{ssagujarati}{0AB7}
+\pdfglyphtounicode{ssangcieuckorean}{3149}
+\pdfglyphtounicode{ssanghieuhkorean}{3185}
+\pdfglyphtounicode{ssangieungkorean}{3180}
+\pdfglyphtounicode{ssangkiyeokkorean}{3132}
+\pdfglyphtounicode{ssangnieunkorean}{3165}
+\pdfglyphtounicode{ssangpieupkorean}{3143}
+\pdfglyphtounicode{ssangsioskorean}{3146}
+\pdfglyphtounicode{ssangtikeutkorean}{3138}
+\pdfglyphtounicode{ssuperior}{0073}
+\pdfglyphtounicode{st}{0073 0074}
+\pdfglyphtounicode{star}{22C6}
+\pdfglyphtounicode{sterling}{00A3}
+\pdfglyphtounicode{sterlingmonospace}{FFE1}
+\pdfglyphtounicode{strokelongoverlaycmb}{0336}
+\pdfglyphtounicode{strokeshortoverlaycmb}{0335}
+\pdfglyphtounicode{subset}{2282}
+\pdfglyphtounicode{subsetdbl}{22D0}
+\pdfglyphtounicode{subsetdblequal}{2AC5}
+\pdfglyphtounicode{subsetnoteql}{228A}
+\pdfglyphtounicode{subsetnotequal}{228A}
+\pdfglyphtounicode{subsetorequal}{2286}
+\pdfglyphtounicode{subsetornotdbleql}{2ACB}
+\pdfglyphtounicode{subsetsqequal}{2291}
+\pdfglyphtounicode{succeeds}{227B}
+\pdfglyphtounicode{suchthat}{220B}
+\pdfglyphtounicode{suhiragana}{3059}
+\pdfglyphtounicode{sukatakana}{30B9}
+\pdfglyphtounicode{sukatakanahalfwidth}{FF7D}
+\pdfglyphtounicode{sukunarabic}{0652}
+\pdfglyphtounicode{summation}{2211}
+\pdfglyphtounicode{sun}{263C}
+\pdfglyphtounicode{superset}{2283}
+\pdfglyphtounicode{supersetdbl}{22D1}
+\pdfglyphtounicode{supersetdblequal}{2AC6}
+\pdfglyphtounicode{supersetnoteql}{228B}
+\pdfglyphtounicode{supersetnotequal}{228B}
+\pdfglyphtounicode{supersetorequal}{2287}
+\pdfglyphtounicode{supersetornotdbleql}{2ACC}
+\pdfglyphtounicode{supersetsqequal}{2292}
+\pdfglyphtounicode{svsquare}{33DC}
+\pdfglyphtounicode{syouwaerasquare}{337C}
+\pdfglyphtounicode{t}{0074}
+\pdfglyphtounicode{tabengali}{09A4}
+\pdfglyphtounicode{tackdown}{22A4}
+\pdfglyphtounicode{tackleft}{22A3}
+\pdfglyphtounicode{tadeva}{0924}
+\pdfglyphtounicode{tagujarati}{0AA4}
+\pdfglyphtounicode{tagurmukhi}{0A24}
+\pdfglyphtounicode{taharabic}{0637}
+\pdfglyphtounicode{tahfinalarabic}{FEC2}
+\pdfglyphtounicode{tahinitialarabic}{FEC3}
+\pdfglyphtounicode{tahiragana}{305F}
+\pdfglyphtounicode{tahmedialarabic}{FEC4}
+\pdfglyphtounicode{taisyouerasquare}{337D}
+\pdfglyphtounicode{takatakana}{30BF}
+\pdfglyphtounicode{takatakanahalfwidth}{FF80}
+\pdfglyphtounicode{tatweelarabic}{0640}
+\pdfglyphtounicode{tau}{03C4}
+\pdfglyphtounicode{tav}{05EA}
+\pdfglyphtounicode{tavdages}{FB4A}
+\pdfglyphtounicode{tavdagesh}{FB4A}
+\pdfglyphtounicode{tavdageshhebrew}{FB4A}
+\pdfglyphtounicode{tavhebrew}{05EA}
+\pdfglyphtounicode{tbar}{0167}
+\pdfglyphtounicode{tbopomofo}{310A}
+\pdfglyphtounicode{tcaron}{0165}
+\pdfglyphtounicode{tccurl}{02A8}
+\pdfglyphtounicode{tcedilla}{0163}
+\pdfglyphtounicode{tcheharabic}{0686}
+\pdfglyphtounicode{tchehfinalarabic}{FB7B}
+\pdfglyphtounicode{tchehinitialarabic}{FB7C}
+\pdfglyphtounicode{tchehmedialarabic}{FB7D}
+\pdfglyphtounicode{tchehmeeminitialarabic}{FB7C FEE4}
+\pdfglyphtounicode{tcircle}{24E3}
+\pdfglyphtounicode{tcircumflexbelow}{1E71}
+\pdfglyphtounicode{tcommaaccent}{0163}
+\pdfglyphtounicode{tdieresis}{1E97}
+\pdfglyphtounicode{tdotaccent}{1E6B}
+\pdfglyphtounicode{tdotbelow}{1E6D}
+\pdfglyphtounicode{tecyrillic}{0442}
+\pdfglyphtounicode{tedescendercyrillic}{04AD}
+\pdfglyphtounicode{teharabic}{062A}
+\pdfglyphtounicode{tehfinalarabic}{FE96}
+\pdfglyphtounicode{tehhahinitialarabic}{FCA2}
+\pdfglyphtounicode{tehhahisolatedarabic}{FC0C}
+\pdfglyphtounicode{tehinitialarabic}{FE97}
+\pdfglyphtounicode{tehiragana}{3066}
+\pdfglyphtounicode{tehjeeminitialarabic}{FCA1}
+\pdfglyphtounicode{tehjeemisolatedarabic}{FC0B}
+\pdfglyphtounicode{tehmarbutaarabic}{0629}
+\pdfglyphtounicode{tehmarbutafinalarabic}{FE94}
+\pdfglyphtounicode{tehmedialarabic}{FE98}
+\pdfglyphtounicode{tehmeeminitialarabic}{FCA4}
+\pdfglyphtounicode{tehmeemisolatedarabic}{FC0E}
+\pdfglyphtounicode{tehnoonfinalarabic}{FC73}
+\pdfglyphtounicode{tekatakana}{30C6}
+\pdfglyphtounicode{tekatakanahalfwidth}{FF83}
+\pdfglyphtounicode{telephone}{2121}
+\pdfglyphtounicode{telephoneblack}{260E}
+\pdfglyphtounicode{telishagedolahebrew}{05A0}
+\pdfglyphtounicode{telishaqetanahebrew}{05A9}
+\pdfglyphtounicode{tencircle}{2469}
+\pdfglyphtounicode{tenideographicparen}{3229}
+\pdfglyphtounicode{tenparen}{247D}
+\pdfglyphtounicode{tenperiod}{2491}
+\pdfglyphtounicode{tenroman}{2179}
+\pdfglyphtounicode{tesh}{02A7}
+\pdfglyphtounicode{tet}{05D8}
+\pdfglyphtounicode{tetdagesh}{FB38}
+\pdfglyphtounicode{tetdageshhebrew}{FB38}
+\pdfglyphtounicode{tethebrew}{05D8}
+\pdfglyphtounicode{tetsecyrillic}{04B5}
+\pdfglyphtounicode{tevirhebrew}{059B}
+\pdfglyphtounicode{tevirlefthebrew}{059B}
+\pdfglyphtounicode{tfm:cmbsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy10/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy5/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy6/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy7/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy8/heart}{2661}
+\pdfglyphtounicode{tfm:cmbsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:cmbsy9/heart}{2661}
+\pdfglyphtounicode{tfm:cmmi10/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi10/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi12/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi12/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi5/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi5/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi6/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi6/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi7/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi7/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi8/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi8/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmi9/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmi9/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib10/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib10/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib5/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib5/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib6/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib6/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib7/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib7/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib8/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib8/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmmib9/phi}{03D5}
+\pdfglyphtounicode{tfm:cmmib9/phi1}{03C6}
+\pdfglyphtounicode{tfm:cmsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy10/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy5/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy6/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy7/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy8/heart}{2661}
+\pdfglyphtounicode{tfm:cmsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:cmsy9/heart}{2661}
+\pdfglyphtounicode{tfm:eurb10/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb10/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb5/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb5/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb6/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb6/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb7/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb7/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb8/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb8/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurb9/phi}{03D5}
+\pdfglyphtounicode{tfm:eurb9/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm10/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm10/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm5/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm5/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm6/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm6/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm7/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm7/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm8/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm8/phi1}{03C6}
+\pdfglyphtounicode{tfm:eurm9/phi}{03D5}
+\pdfglyphtounicode{tfm:eurm9/phi1}{03C6}
+\pdfglyphtounicode{tfm:fplmbi/phi}{03D5}
+\pdfglyphtounicode{tfm:fplmbi/phi1}{03C6}
+\pdfglyphtounicode{tfm:fplmri/phi}{03D5}
+\pdfglyphtounicode{tfm:fplmri/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmbsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy10/heart}{2661}
+\pdfglyphtounicode{tfm:lmbsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy5/heart}{2661}
+\pdfglyphtounicode{tfm:lmbsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:lmbsy7/heart}{2661}
+\pdfglyphtounicode{tfm:lmmi10/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi10/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi12/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi12/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi5/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi5/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi6/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi6/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi7/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi7/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi8/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi8/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmi9/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmi9/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib10/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib10/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib5/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib5/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmmib7/phi}{03D5}
+\pdfglyphtounicode{tfm:lmmib7/phi1}{03C6}
+\pdfglyphtounicode{tfm:lmsy10/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy10/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy5/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy5/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy6/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy6/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy7/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy7/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy8/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy8/heart}{2661}
+\pdfglyphtounicode{tfm:lmsy9/diamond}{2662}
+\pdfglyphtounicode{tfm:lmsy9/heart}{2661}
+\pdfglyphtounicode{tfm:msam10/diamond}{2662}
+\pdfglyphtounicode{tfm:msam5/diamond}{2662}
+\pdfglyphtounicode{tfm:msam6/diamond}{2662}
+\pdfglyphtounicode{tfm:msam7/diamond}{2662}
+\pdfglyphtounicode{tfm:msam8/diamond}{2662}
+\pdfglyphtounicode{tfm:msam9/diamond}{2662}
+\pdfglyphtounicode{tfm:pxbmia/phi}{03D5}
+\pdfglyphtounicode{tfm:pxbmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:pxbsy/diamond}{2662}
+\pdfglyphtounicode{tfm:pxbsy/heart}{2661}
+\pdfglyphtounicode{tfm:pxbsya/diamond}{2662}
+\pdfglyphtounicode{tfm:pxmia/phi}{03D5}
+\pdfglyphtounicode{tfm:pxmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:pxsy/diamond}{2662}
+\pdfglyphtounicode{tfm:pxsy/heart}{2661}
+\pdfglyphtounicode{tfm:pxsya/diamond}{2662}
+\pdfglyphtounicode{tfm:pzdr/a1}{2701}
+\pdfglyphtounicode{tfm:pzdr/a10}{2721}
+\pdfglyphtounicode{tfm:pzdr/a100}{275E}
+\pdfglyphtounicode{tfm:pzdr/a101}{2761}
+\pdfglyphtounicode{tfm:pzdr/a102}{2762}
+\pdfglyphtounicode{tfm:pzdr/a103}{2763}
+\pdfglyphtounicode{tfm:pzdr/a104}{2764}
+\pdfglyphtounicode{tfm:pzdr/a105}{2710}
+\pdfglyphtounicode{tfm:pzdr/a106}{2765}
+\pdfglyphtounicode{tfm:pzdr/a107}{2766}
+\pdfglyphtounicode{tfm:pzdr/a108}{2767}
+\pdfglyphtounicode{tfm:pzdr/a109}{2660}
+\pdfglyphtounicode{tfm:pzdr/a11}{261B}
+\pdfglyphtounicode{tfm:pzdr/a110}{2665}
+\pdfglyphtounicode{tfm:pzdr/a111}{2666}
+\pdfglyphtounicode{tfm:pzdr/a112}{2663}
+\pdfglyphtounicode{tfm:pzdr/a117}{2709}
+\pdfglyphtounicode{tfm:pzdr/a118}{2708}
+\pdfglyphtounicode{tfm:pzdr/a119}{2707}
+\pdfglyphtounicode{tfm:pzdr/a12}{261E}
+\pdfglyphtounicode{tfm:pzdr/a120}{2460}
+\pdfglyphtounicode{tfm:pzdr/a121}{2461}
+\pdfglyphtounicode{tfm:pzdr/a122}{2462}
+\pdfglyphtounicode{tfm:pzdr/a123}{2463}
+\pdfglyphtounicode{tfm:pzdr/a124}{2464}
+\pdfglyphtounicode{tfm:pzdr/a125}{2465}
+\pdfglyphtounicode{tfm:pzdr/a126}{2466}
+\pdfglyphtounicode{tfm:pzdr/a127}{2467}
+\pdfglyphtounicode{tfm:pzdr/a128}{2468}
+\pdfglyphtounicode{tfm:pzdr/a129}{2469}
+\pdfglyphtounicode{tfm:pzdr/a13}{270C}
+\pdfglyphtounicode{tfm:pzdr/a130}{2776}
+\pdfglyphtounicode{tfm:pzdr/a131}{2777}
+\pdfglyphtounicode{tfm:pzdr/a132}{2778}
+\pdfglyphtounicode{tfm:pzdr/a133}{2779}
+\pdfglyphtounicode{tfm:pzdr/a134}{277A}
+\pdfglyphtounicode{tfm:pzdr/a135}{277B}
+\pdfglyphtounicode{tfm:pzdr/a136}{277C}
+\pdfglyphtounicode{tfm:pzdr/a137}{277D}
+\pdfglyphtounicode{tfm:pzdr/a138}{277E}
+\pdfglyphtounicode{tfm:pzdr/a139}{277F}
+\pdfglyphtounicode{tfm:pzdr/a14}{270D}
+\pdfglyphtounicode{tfm:pzdr/a140}{2780}
+\pdfglyphtounicode{tfm:pzdr/a141}{2781}
+\pdfglyphtounicode{tfm:pzdr/a142}{2782}
+\pdfglyphtounicode{tfm:pzdr/a143}{2783}
+\pdfglyphtounicode{tfm:pzdr/a144}{2784}
+\pdfglyphtounicode{tfm:pzdr/a145}{2785}
+\pdfglyphtounicode{tfm:pzdr/a146}{2786}
+\pdfglyphtounicode{tfm:pzdr/a147}{2787}
+\pdfglyphtounicode{tfm:pzdr/a148}{2788}
+\pdfglyphtounicode{tfm:pzdr/a149}{2789}
+\pdfglyphtounicode{tfm:pzdr/a15}{270E}
+\pdfglyphtounicode{tfm:pzdr/a150}{278A}
+\pdfglyphtounicode{tfm:pzdr/a151}{278B}
+\pdfglyphtounicode{tfm:pzdr/a152}{278C}
+\pdfglyphtounicode{tfm:pzdr/a153}{278D}
+\pdfglyphtounicode{tfm:pzdr/a154}{278E}
+\pdfglyphtounicode{tfm:pzdr/a155}{278F}
+\pdfglyphtounicode{tfm:pzdr/a156}{2790}
+\pdfglyphtounicode{tfm:pzdr/a157}{2791}
+\pdfglyphtounicode{tfm:pzdr/a158}{2792}
+\pdfglyphtounicode{tfm:pzdr/a159}{2793}
+\pdfglyphtounicode{tfm:pzdr/a16}{270F}
+\pdfglyphtounicode{tfm:pzdr/a160}{2794}
+\pdfglyphtounicode{tfm:pzdr/a161}{2192}
+\pdfglyphtounicode{tfm:pzdr/a162}{27A3}
+\pdfglyphtounicode{tfm:pzdr/a163}{2194}
+\pdfglyphtounicode{tfm:pzdr/a164}{2195}
+\pdfglyphtounicode{tfm:pzdr/a165}{2799}
+\pdfglyphtounicode{tfm:pzdr/a166}{279B}
+\pdfglyphtounicode{tfm:pzdr/a167}{279C}
+\pdfglyphtounicode{tfm:pzdr/a168}{279D}
+\pdfglyphtounicode{tfm:pzdr/a169}{279E}
+\pdfglyphtounicode{tfm:pzdr/a17}{2711}
+\pdfglyphtounicode{tfm:pzdr/a170}{279F}
+\pdfglyphtounicode{tfm:pzdr/a171}{27A0}
+\pdfglyphtounicode{tfm:pzdr/a172}{27A1}
+\pdfglyphtounicode{tfm:pzdr/a173}{27A2}
+\pdfglyphtounicode{tfm:pzdr/a174}{27A4}
+\pdfglyphtounicode{tfm:pzdr/a175}{27A5}
+\pdfglyphtounicode{tfm:pzdr/a176}{27A6}
+\pdfglyphtounicode{tfm:pzdr/a177}{27A7}
+\pdfglyphtounicode{tfm:pzdr/a178}{27A8}
+\pdfglyphtounicode{tfm:pzdr/a179}{27A9}
+\pdfglyphtounicode{tfm:pzdr/a18}{2712}
+\pdfglyphtounicode{tfm:pzdr/a180}{27AB}
+\pdfglyphtounicode{tfm:pzdr/a181}{27AD}
+\pdfglyphtounicode{tfm:pzdr/a182}{27AF}
+\pdfglyphtounicode{tfm:pzdr/a183}{27B2}
+\pdfglyphtounicode{tfm:pzdr/a184}{27B3}
+\pdfglyphtounicode{tfm:pzdr/a185}{27B5}
+\pdfglyphtounicode{tfm:pzdr/a186}{27B8}
+\pdfglyphtounicode{tfm:pzdr/a187}{27BA}
+\pdfglyphtounicode{tfm:pzdr/a188}{27BB}
+\pdfglyphtounicode{tfm:pzdr/a189}{27BC}
+\pdfglyphtounicode{tfm:pzdr/a19}{2713}
+\pdfglyphtounicode{tfm:pzdr/a190}{27BD}
+\pdfglyphtounicode{tfm:pzdr/a191}{27BE}
+\pdfglyphtounicode{tfm:pzdr/a192}{279A}
+\pdfglyphtounicode{tfm:pzdr/a193}{27AA}
+\pdfglyphtounicode{tfm:pzdr/a194}{27B6}
+\pdfglyphtounicode{tfm:pzdr/a195}{27B9}
+\pdfglyphtounicode{tfm:pzdr/a196}{2798}
+\pdfglyphtounicode{tfm:pzdr/a197}{27B4}
+\pdfglyphtounicode{tfm:pzdr/a198}{27B7}
+\pdfglyphtounicode{tfm:pzdr/a199}{27AC}
+\pdfglyphtounicode{tfm:pzdr/a2}{2702}
+\pdfglyphtounicode{tfm:pzdr/a20}{2714}
+\pdfglyphtounicode{tfm:pzdr/a200}{27AE}
+\pdfglyphtounicode{tfm:pzdr/a201}{27B1}
+\pdfglyphtounicode{tfm:pzdr/a202}{2703}
+\pdfglyphtounicode{tfm:pzdr/a203}{2750}
+\pdfglyphtounicode{tfm:pzdr/a204}{2752}
+\pdfglyphtounicode{tfm:pzdr/a205}{276E}
+\pdfglyphtounicode{tfm:pzdr/a206}{2770}
+\pdfglyphtounicode{tfm:pzdr/a21}{2715}
+\pdfglyphtounicode{tfm:pzdr/a22}{2716}
+\pdfglyphtounicode{tfm:pzdr/a23}{2717}
+\pdfglyphtounicode{tfm:pzdr/a24}{2718}
+\pdfglyphtounicode{tfm:pzdr/a25}{2719}
+\pdfglyphtounicode{tfm:pzdr/a26}{271A}
+\pdfglyphtounicode{tfm:pzdr/a27}{271B}
+\pdfglyphtounicode{tfm:pzdr/a28}{271C}
+\pdfglyphtounicode{tfm:pzdr/a29}{2722}
+\pdfglyphtounicode{tfm:pzdr/a3}{2704}
+\pdfglyphtounicode{tfm:pzdr/a30}{2723}
+\pdfglyphtounicode{tfm:pzdr/a31}{2724}
+\pdfglyphtounicode{tfm:pzdr/a32}{2725}
+\pdfglyphtounicode{tfm:pzdr/a33}{2726}
+\pdfglyphtounicode{tfm:pzdr/a34}{2727}
+\pdfglyphtounicode{tfm:pzdr/a35}{2605}
+\pdfglyphtounicode{tfm:pzdr/a36}{2729}
+\pdfglyphtounicode{tfm:pzdr/a37}{272A}
+\pdfglyphtounicode{tfm:pzdr/a38}{272B}
+\pdfglyphtounicode{tfm:pzdr/a39}{272C}
+\pdfglyphtounicode{tfm:pzdr/a4}{260E}
+\pdfglyphtounicode{tfm:pzdr/a40}{272D}
+\pdfglyphtounicode{tfm:pzdr/a41}{272E}
+\pdfglyphtounicode{tfm:pzdr/a42}{272F}
+\pdfglyphtounicode{tfm:pzdr/a43}{2730}
+\pdfglyphtounicode{tfm:pzdr/a44}{2731}
+\pdfglyphtounicode{tfm:pzdr/a45}{2732}
+\pdfglyphtounicode{tfm:pzdr/a46}{2733}
+\pdfglyphtounicode{tfm:pzdr/a47}{2734}
+\pdfglyphtounicode{tfm:pzdr/a48}{2735}
+\pdfglyphtounicode{tfm:pzdr/a49}{2736}
+\pdfglyphtounicode{tfm:pzdr/a5}{2706}
+\pdfglyphtounicode{tfm:pzdr/a50}{2737}
+\pdfglyphtounicode{tfm:pzdr/a51}{2738}
+\pdfglyphtounicode{tfm:pzdr/a52}{2739}
+\pdfglyphtounicode{tfm:pzdr/a53}{273A}
+\pdfglyphtounicode{tfm:pzdr/a54}{273B}
+\pdfglyphtounicode{tfm:pzdr/a55}{273C}
+\pdfglyphtounicode{tfm:pzdr/a56}{273D}
+\pdfglyphtounicode{tfm:pzdr/a57}{273E}
+\pdfglyphtounicode{tfm:pzdr/a58}{273F}
+\pdfglyphtounicode{tfm:pzdr/a59}{2740}
+\pdfglyphtounicode{tfm:pzdr/a6}{271D}
+\pdfglyphtounicode{tfm:pzdr/a60}{2741}
+\pdfglyphtounicode{tfm:pzdr/a61}{2742}
+\pdfglyphtounicode{tfm:pzdr/a62}{2743}
+\pdfglyphtounicode{tfm:pzdr/a63}{2744}
+\pdfglyphtounicode{tfm:pzdr/a64}{2745}
+\pdfglyphtounicode{tfm:pzdr/a65}{2746}
+\pdfglyphtounicode{tfm:pzdr/a66}{2747}
+\pdfglyphtounicode{tfm:pzdr/a67}{2748}
+\pdfglyphtounicode{tfm:pzdr/a68}{2749}
+\pdfglyphtounicode{tfm:pzdr/a69}{274A}
+\pdfglyphtounicode{tfm:pzdr/a7}{271E}
+\pdfglyphtounicode{tfm:pzdr/a70}{274B}
+\pdfglyphtounicode{tfm:pzdr/a71}{25CF}
+\pdfglyphtounicode{tfm:pzdr/a72}{274D}
+\pdfglyphtounicode{tfm:pzdr/a73}{25A0}
+\pdfglyphtounicode{tfm:pzdr/a74}{274F}
+\pdfglyphtounicode{tfm:pzdr/a75}{2751}
+\pdfglyphtounicode{tfm:pzdr/a76}{25B2}
+\pdfglyphtounicode{tfm:pzdr/a77}{25BC}
+\pdfglyphtounicode{tfm:pzdr/a78}{25C6}
+\pdfglyphtounicode{tfm:pzdr/a79}{2756}
+\pdfglyphtounicode{tfm:pzdr/a8}{271F}
+\pdfglyphtounicode{tfm:pzdr/a81}{25D7}
+\pdfglyphtounicode{tfm:pzdr/a82}{2758}
+\pdfglyphtounicode{tfm:pzdr/a83}{2759}
+\pdfglyphtounicode{tfm:pzdr/a84}{275A}
+\pdfglyphtounicode{tfm:pzdr/a85}{276F}
+\pdfglyphtounicode{tfm:pzdr/a86}{2771}
+\pdfglyphtounicode{tfm:pzdr/a87}{2772}
+\pdfglyphtounicode{tfm:pzdr/a88}{2773}
+\pdfglyphtounicode{tfm:pzdr/a89}{2768}
+\pdfglyphtounicode{tfm:pzdr/a9}{2720}
+\pdfglyphtounicode{tfm:pzdr/a90}{2769}
+\pdfglyphtounicode{tfm:pzdr/a91}{276C}
+\pdfglyphtounicode{tfm:pzdr/a92}{276D}
+\pdfglyphtounicode{tfm:pzdr/a93}{276A}
+\pdfglyphtounicode{tfm:pzdr/a94}{276B}
+\pdfglyphtounicode{tfm:pzdr/a95}{2774}
+\pdfglyphtounicode{tfm:pzdr/a96}{2775}
+\pdfglyphtounicode{tfm:pzdr/a97}{275B}
+\pdfglyphtounicode{tfm:pzdr/a98}{275C}
+\pdfglyphtounicode{tfm:pzdr/a99}{275D}
+\pdfglyphtounicode{tfm:rpxbmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rpxbmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rpxmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rpxmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rpzdr/a1}{2701}
+\pdfglyphtounicode{tfm:rpzdr/a10}{2721}
+\pdfglyphtounicode{tfm:rpzdr/a100}{275E}
+\pdfglyphtounicode{tfm:rpzdr/a101}{2761}
+\pdfglyphtounicode{tfm:rpzdr/a102}{2762}
+\pdfglyphtounicode{tfm:rpzdr/a103}{2763}
+\pdfglyphtounicode{tfm:rpzdr/a104}{2764}
+\pdfglyphtounicode{tfm:rpzdr/a105}{2710}
+\pdfglyphtounicode{tfm:rpzdr/a106}{2765}
+\pdfglyphtounicode{tfm:rpzdr/a107}{2766}
+\pdfglyphtounicode{tfm:rpzdr/a108}{2767}
+\pdfglyphtounicode{tfm:rpzdr/a109}{2660}
+\pdfglyphtounicode{tfm:rpzdr/a11}{261B}
+\pdfglyphtounicode{tfm:rpzdr/a110}{2665}
+\pdfglyphtounicode{tfm:rpzdr/a111}{2666}
+\pdfglyphtounicode{tfm:rpzdr/a112}{2663}
+\pdfglyphtounicode{tfm:rpzdr/a117}{2709}
+\pdfglyphtounicode{tfm:rpzdr/a118}{2708}
+\pdfglyphtounicode{tfm:rpzdr/a119}{2707}
+\pdfglyphtounicode{tfm:rpzdr/a12}{261E}
+\pdfglyphtounicode{tfm:rpzdr/a120}{2460}
+\pdfglyphtounicode{tfm:rpzdr/a121}{2461}
+\pdfglyphtounicode{tfm:rpzdr/a122}{2462}
+\pdfglyphtounicode{tfm:rpzdr/a123}{2463}
+\pdfglyphtounicode{tfm:rpzdr/a124}{2464}
+\pdfglyphtounicode{tfm:rpzdr/a125}{2465}
+\pdfglyphtounicode{tfm:rpzdr/a126}{2466}
+\pdfglyphtounicode{tfm:rpzdr/a127}{2467}
+\pdfglyphtounicode{tfm:rpzdr/a128}{2468}
+\pdfglyphtounicode{tfm:rpzdr/a129}{2469}
+\pdfglyphtounicode{tfm:rpzdr/a13}{270C}
+\pdfglyphtounicode{tfm:rpzdr/a130}{2776}
+\pdfglyphtounicode{tfm:rpzdr/a131}{2777}
+\pdfglyphtounicode{tfm:rpzdr/a132}{2778}
+\pdfglyphtounicode{tfm:rpzdr/a133}{2779}
+\pdfglyphtounicode{tfm:rpzdr/a134}{277A}
+\pdfglyphtounicode{tfm:rpzdr/a135}{277B}
+\pdfglyphtounicode{tfm:rpzdr/a136}{277C}
+\pdfglyphtounicode{tfm:rpzdr/a137}{277D}
+\pdfglyphtounicode{tfm:rpzdr/a138}{277E}
+\pdfglyphtounicode{tfm:rpzdr/a139}{277F}
+\pdfglyphtounicode{tfm:rpzdr/a14}{270D}
+\pdfglyphtounicode{tfm:rpzdr/a140}{2780}
+\pdfglyphtounicode{tfm:rpzdr/a141}{2781}
+\pdfglyphtounicode{tfm:rpzdr/a142}{2782}
+\pdfglyphtounicode{tfm:rpzdr/a143}{2783}
+\pdfglyphtounicode{tfm:rpzdr/a144}{2784}
+\pdfglyphtounicode{tfm:rpzdr/a145}{2785}
+\pdfglyphtounicode{tfm:rpzdr/a146}{2786}
+\pdfglyphtounicode{tfm:rpzdr/a147}{2787}
+\pdfglyphtounicode{tfm:rpzdr/a148}{2788}
+\pdfglyphtounicode{tfm:rpzdr/a149}{2789}
+\pdfglyphtounicode{tfm:rpzdr/a15}{270E}
+\pdfglyphtounicode{tfm:rpzdr/a150}{278A}
+\pdfglyphtounicode{tfm:rpzdr/a151}{278B}
+\pdfglyphtounicode{tfm:rpzdr/a152}{278C}
+\pdfglyphtounicode{tfm:rpzdr/a153}{278D}
+\pdfglyphtounicode{tfm:rpzdr/a154}{278E}
+\pdfglyphtounicode{tfm:rpzdr/a155}{278F}
+\pdfglyphtounicode{tfm:rpzdr/a156}{2790}
+\pdfglyphtounicode{tfm:rpzdr/a157}{2791}
+\pdfglyphtounicode{tfm:rpzdr/a158}{2792}
+\pdfglyphtounicode{tfm:rpzdr/a159}{2793}
+\pdfglyphtounicode{tfm:rpzdr/a16}{270F}
+\pdfglyphtounicode{tfm:rpzdr/a160}{2794}
+\pdfglyphtounicode{tfm:rpzdr/a161}{2192}
+\pdfglyphtounicode{tfm:rpzdr/a162}{27A3}
+\pdfglyphtounicode{tfm:rpzdr/a163}{2194}
+\pdfglyphtounicode{tfm:rpzdr/a164}{2195}
+\pdfglyphtounicode{tfm:rpzdr/a165}{2799}
+\pdfglyphtounicode{tfm:rpzdr/a166}{279B}
+\pdfglyphtounicode{tfm:rpzdr/a167}{279C}
+\pdfglyphtounicode{tfm:rpzdr/a168}{279D}
+\pdfglyphtounicode{tfm:rpzdr/a169}{279E}
+\pdfglyphtounicode{tfm:rpzdr/a17}{2711}
+\pdfglyphtounicode{tfm:rpzdr/a170}{279F}
+\pdfglyphtounicode{tfm:rpzdr/a171}{27A0}
+\pdfglyphtounicode{tfm:rpzdr/a172}{27A1}
+\pdfglyphtounicode{tfm:rpzdr/a173}{27A2}
+\pdfglyphtounicode{tfm:rpzdr/a174}{27A4}
+\pdfglyphtounicode{tfm:rpzdr/a175}{27A5}
+\pdfglyphtounicode{tfm:rpzdr/a176}{27A6}
+\pdfglyphtounicode{tfm:rpzdr/a177}{27A7}
+\pdfglyphtounicode{tfm:rpzdr/a178}{27A8}
+\pdfglyphtounicode{tfm:rpzdr/a179}{27A9}
+\pdfglyphtounicode{tfm:rpzdr/a18}{2712}
+\pdfglyphtounicode{tfm:rpzdr/a180}{27AB}
+\pdfglyphtounicode{tfm:rpzdr/a181}{27AD}
+\pdfglyphtounicode{tfm:rpzdr/a182}{27AF}
+\pdfglyphtounicode{tfm:rpzdr/a183}{27B2}
+\pdfglyphtounicode{tfm:rpzdr/a184}{27B3}
+\pdfglyphtounicode{tfm:rpzdr/a185}{27B5}
+\pdfglyphtounicode{tfm:rpzdr/a186}{27B8}
+\pdfglyphtounicode{tfm:rpzdr/a187}{27BA}
+\pdfglyphtounicode{tfm:rpzdr/a188}{27BB}
+\pdfglyphtounicode{tfm:rpzdr/a189}{27BC}
+\pdfglyphtounicode{tfm:rpzdr/a19}{2713}
+\pdfglyphtounicode{tfm:rpzdr/a190}{27BD}
+\pdfglyphtounicode{tfm:rpzdr/a191}{27BE}
+\pdfglyphtounicode{tfm:rpzdr/a192}{279A}
+\pdfglyphtounicode{tfm:rpzdr/a193}{27AA}
+\pdfglyphtounicode{tfm:rpzdr/a194}{27B6}
+\pdfglyphtounicode{tfm:rpzdr/a195}{27B9}
+\pdfglyphtounicode{tfm:rpzdr/a196}{2798}
+\pdfglyphtounicode{tfm:rpzdr/a197}{27B4}
+\pdfglyphtounicode{tfm:rpzdr/a198}{27B7}
+\pdfglyphtounicode{tfm:rpzdr/a199}{27AC}
+\pdfglyphtounicode{tfm:rpzdr/a2}{2702}
+\pdfglyphtounicode{tfm:rpzdr/a20}{2714}
+\pdfglyphtounicode{tfm:rpzdr/a200}{27AE}
+\pdfglyphtounicode{tfm:rpzdr/a201}{27B1}
+\pdfglyphtounicode{tfm:rpzdr/a202}{2703}
+\pdfglyphtounicode{tfm:rpzdr/a203}{2750}
+\pdfglyphtounicode{tfm:rpzdr/a204}{2752}
+\pdfglyphtounicode{tfm:rpzdr/a205}{276E}
+\pdfglyphtounicode{tfm:rpzdr/a206}{2770}
+\pdfglyphtounicode{tfm:rpzdr/a21}{2715}
+\pdfglyphtounicode{tfm:rpzdr/a22}{2716}
+\pdfglyphtounicode{tfm:rpzdr/a23}{2717}
+\pdfglyphtounicode{tfm:rpzdr/a24}{2718}
+\pdfglyphtounicode{tfm:rpzdr/a25}{2719}
+\pdfglyphtounicode{tfm:rpzdr/a26}{271A}
+\pdfglyphtounicode{tfm:rpzdr/a27}{271B}
+\pdfglyphtounicode{tfm:rpzdr/a28}{271C}
+\pdfglyphtounicode{tfm:rpzdr/a29}{2722}
+\pdfglyphtounicode{tfm:rpzdr/a3}{2704}
+\pdfglyphtounicode{tfm:rpzdr/a30}{2723}
+\pdfglyphtounicode{tfm:rpzdr/a31}{2724}
+\pdfglyphtounicode{tfm:rpzdr/a32}{2725}
+\pdfglyphtounicode{tfm:rpzdr/a33}{2726}
+\pdfglyphtounicode{tfm:rpzdr/a34}{2727}
+\pdfglyphtounicode{tfm:rpzdr/a35}{2605}
+\pdfglyphtounicode{tfm:rpzdr/a36}{2729}
+\pdfglyphtounicode{tfm:rpzdr/a37}{272A}
+\pdfglyphtounicode{tfm:rpzdr/a38}{272B}
+\pdfglyphtounicode{tfm:rpzdr/a39}{272C}
+\pdfglyphtounicode{tfm:rpzdr/a4}{260E}
+\pdfglyphtounicode{tfm:rpzdr/a40}{272D}
+\pdfglyphtounicode{tfm:rpzdr/a41}{272E}
+\pdfglyphtounicode{tfm:rpzdr/a42}{272F}
+\pdfglyphtounicode{tfm:rpzdr/a43}{2730}
+\pdfglyphtounicode{tfm:rpzdr/a44}{2731}
+\pdfglyphtounicode{tfm:rpzdr/a45}{2732}
+\pdfglyphtounicode{tfm:rpzdr/a46}{2733}
+\pdfglyphtounicode{tfm:rpzdr/a47}{2734}
+\pdfglyphtounicode{tfm:rpzdr/a48}{2735}
+\pdfglyphtounicode{tfm:rpzdr/a49}{2736}
+\pdfglyphtounicode{tfm:rpzdr/a5}{2706}
+\pdfglyphtounicode{tfm:rpzdr/a50}{2737}
+\pdfglyphtounicode{tfm:rpzdr/a51}{2738}
+\pdfglyphtounicode{tfm:rpzdr/a52}{2739}
+\pdfglyphtounicode{tfm:rpzdr/a53}{273A}
+\pdfglyphtounicode{tfm:rpzdr/a54}{273B}
+\pdfglyphtounicode{tfm:rpzdr/a55}{273C}
+\pdfglyphtounicode{tfm:rpzdr/a56}{273D}
+\pdfglyphtounicode{tfm:rpzdr/a57}{273E}
+\pdfglyphtounicode{tfm:rpzdr/a58}{273F}
+\pdfglyphtounicode{tfm:rpzdr/a59}{2740}
+\pdfglyphtounicode{tfm:rpzdr/a6}{271D}
+\pdfglyphtounicode{tfm:rpzdr/a60}{2741}
+\pdfglyphtounicode{tfm:rpzdr/a61}{2742}
+\pdfglyphtounicode{tfm:rpzdr/a62}{2743}
+\pdfglyphtounicode{tfm:rpzdr/a63}{2744}
+\pdfglyphtounicode{tfm:rpzdr/a64}{2745}
+\pdfglyphtounicode{tfm:rpzdr/a65}{2746}
+\pdfglyphtounicode{tfm:rpzdr/a66}{2747}
+\pdfglyphtounicode{tfm:rpzdr/a67}{2748}
+\pdfglyphtounicode{tfm:rpzdr/a68}{2749}
+\pdfglyphtounicode{tfm:rpzdr/a69}{274A}
+\pdfglyphtounicode{tfm:rpzdr/a7}{271E}
+\pdfglyphtounicode{tfm:rpzdr/a70}{274B}
+\pdfglyphtounicode{tfm:rpzdr/a71}{25CF}
+\pdfglyphtounicode{tfm:rpzdr/a72}{274D}
+\pdfglyphtounicode{tfm:rpzdr/a73}{25A0}
+\pdfglyphtounicode{tfm:rpzdr/a74}{274F}
+\pdfglyphtounicode{tfm:rpzdr/a75}{2751}
+\pdfglyphtounicode{tfm:rpzdr/a76}{25B2}
+\pdfglyphtounicode{tfm:rpzdr/a77}{25BC}
+\pdfglyphtounicode{tfm:rpzdr/a78}{25C6}
+\pdfglyphtounicode{tfm:rpzdr/a79}{2756}
+\pdfglyphtounicode{tfm:rpzdr/a8}{271F}
+\pdfglyphtounicode{tfm:rpzdr/a81}{25D7}
+\pdfglyphtounicode{tfm:rpzdr/a82}{2758}
+\pdfglyphtounicode{tfm:rpzdr/a83}{2759}
+\pdfglyphtounicode{tfm:rpzdr/a84}{275A}
+\pdfglyphtounicode{tfm:rpzdr/a85}{276F}
+\pdfglyphtounicode{tfm:rpzdr/a86}{2771}
+\pdfglyphtounicode{tfm:rpzdr/a87}{2772}
+\pdfglyphtounicode{tfm:rpzdr/a88}{2773}
+\pdfglyphtounicode{tfm:rpzdr/a89}{2768}
+\pdfglyphtounicode{tfm:rpzdr/a9}{2720}
+\pdfglyphtounicode{tfm:rpzdr/a90}{2769}
+\pdfglyphtounicode{tfm:rpzdr/a91}{276C}
+\pdfglyphtounicode{tfm:rpzdr/a92}{276D}
+\pdfglyphtounicode{tfm:rpzdr/a93}{276A}
+\pdfglyphtounicode{tfm:rpzdr/a94}{276B}
+\pdfglyphtounicode{tfm:rpzdr/a95}{2774}
+\pdfglyphtounicode{tfm:rpzdr/a96}{2775}
+\pdfglyphtounicode{tfm:rpzdr/a97}{275B}
+\pdfglyphtounicode{tfm:rpzdr/a98}{275C}
+\pdfglyphtounicode{tfm:rpzdr/a99}{275D}
+\pdfglyphtounicode{tfm:rtxbmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rtxbmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:rtxmi/phi}{03D5}
+\pdfglyphtounicode{tfm:rtxmi/phi1}{03C6}
+\pdfglyphtounicode{tfm:txbmia/phi}{03D5}
+\pdfglyphtounicode{tfm:txbmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:txbsy/diamond}{2662}
+\pdfglyphtounicode{tfm:txbsy/heart}{2661}
+\pdfglyphtounicode{tfm:txbsya/diamond}{2662}
+\pdfglyphtounicode{tfm:txmia/phi}{03D5}
+\pdfglyphtounicode{tfm:txmia/phi1}{03C6}
+\pdfglyphtounicode{tfm:txsy/diamond}{2662}
+\pdfglyphtounicode{tfm:txsy/heart}{2661}
+\pdfglyphtounicode{tfm:txsya/diamond}{2662}
+\pdfglyphtounicode{tfm:zd/a1}{2701}
+\pdfglyphtounicode{tfm:zd/a10}{2721}
+\pdfglyphtounicode{tfm:zd/a100}{275E}
+\pdfglyphtounicode{tfm:zd/a101}{2761}
+\pdfglyphtounicode{tfm:zd/a102}{2762}
+\pdfglyphtounicode{tfm:zd/a103}{2763}
+\pdfglyphtounicode{tfm:zd/a104}{2764}
+\pdfglyphtounicode{tfm:zd/a105}{2710}
+\pdfglyphtounicode{tfm:zd/a106}{2765}
+\pdfglyphtounicode{tfm:zd/a107}{2766}
+\pdfglyphtounicode{tfm:zd/a108}{2767}
+\pdfglyphtounicode{tfm:zd/a109}{2660}
+\pdfglyphtounicode{tfm:zd/a11}{261B}
+\pdfglyphtounicode{tfm:zd/a110}{2665}
+\pdfglyphtounicode{tfm:zd/a111}{2666}
+\pdfglyphtounicode{tfm:zd/a112}{2663}
+\pdfglyphtounicode{tfm:zd/a117}{2709}
+\pdfglyphtounicode{tfm:zd/a118}{2708}
+\pdfglyphtounicode{tfm:zd/a119}{2707}
+\pdfglyphtounicode{tfm:zd/a12}{261E}
+\pdfglyphtounicode{tfm:zd/a120}{2460}
+\pdfglyphtounicode{tfm:zd/a121}{2461}
+\pdfglyphtounicode{tfm:zd/a122}{2462}
+\pdfglyphtounicode{tfm:zd/a123}{2463}
+\pdfglyphtounicode{tfm:zd/a124}{2464}
+\pdfglyphtounicode{tfm:zd/a125}{2465}
+\pdfglyphtounicode{tfm:zd/a126}{2466}
+\pdfglyphtounicode{tfm:zd/a127}{2467}
+\pdfglyphtounicode{tfm:zd/a128}{2468}
+\pdfglyphtounicode{tfm:zd/a129}{2469}
+\pdfglyphtounicode{tfm:zd/a13}{270C}
+\pdfglyphtounicode{tfm:zd/a130}{2776}
+\pdfglyphtounicode{tfm:zd/a131}{2777}
+\pdfglyphtounicode{tfm:zd/a132}{2778}
+\pdfglyphtounicode{tfm:zd/a133}{2779}
+\pdfglyphtounicode{tfm:zd/a134}{277A}
+\pdfglyphtounicode{tfm:zd/a135}{277B}
+\pdfglyphtounicode{tfm:zd/a136}{277C}
+\pdfglyphtounicode{tfm:zd/a137}{277D}
+\pdfglyphtounicode{tfm:zd/a138}{277E}
+\pdfglyphtounicode{tfm:zd/a139}{277F}
+\pdfglyphtounicode{tfm:zd/a14}{270D}
+\pdfglyphtounicode{tfm:zd/a140}{2780}
+\pdfglyphtounicode{tfm:zd/a141}{2781}
+\pdfglyphtounicode{tfm:zd/a142}{2782}
+\pdfglyphtounicode{tfm:zd/a143}{2783}
+\pdfglyphtounicode{tfm:zd/a144}{2784}
+\pdfglyphtounicode{tfm:zd/a145}{2785}
+\pdfglyphtounicode{tfm:zd/a146}{2786}
+\pdfglyphtounicode{tfm:zd/a147}{2787}
+\pdfglyphtounicode{tfm:zd/a148}{2788}
+\pdfglyphtounicode{tfm:zd/a149}{2789}
+\pdfglyphtounicode{tfm:zd/a15}{270E}
+\pdfglyphtounicode{tfm:zd/a150}{278A}
+\pdfglyphtounicode{tfm:zd/a151}{278B}
+\pdfglyphtounicode{tfm:zd/a152}{278C}
+\pdfglyphtounicode{tfm:zd/a153}{278D}
+\pdfglyphtounicode{tfm:zd/a154}{278E}
+\pdfglyphtounicode{tfm:zd/a155}{278F}
+\pdfglyphtounicode{tfm:zd/a156}{2790}
+\pdfglyphtounicode{tfm:zd/a157}{2791}
+\pdfglyphtounicode{tfm:zd/a158}{2792}
+\pdfglyphtounicode{tfm:zd/a159}{2793}
+\pdfglyphtounicode{tfm:zd/a16}{270F}
+\pdfglyphtounicode{tfm:zd/a160}{2794}
+\pdfglyphtounicode{tfm:zd/a161}{2192}
+\pdfglyphtounicode{tfm:zd/a162}{27A3}
+\pdfglyphtounicode{tfm:zd/a163}{2194}
+\pdfglyphtounicode{tfm:zd/a164}{2195}
+\pdfglyphtounicode{tfm:zd/a165}{2799}
+\pdfglyphtounicode{tfm:zd/a166}{279B}
+\pdfglyphtounicode{tfm:zd/a167}{279C}
+\pdfglyphtounicode{tfm:zd/a168}{279D}
+\pdfglyphtounicode{tfm:zd/a169}{279E}
+\pdfglyphtounicode{tfm:zd/a17}{2711}
+\pdfglyphtounicode{tfm:zd/a170}{279F}
+\pdfglyphtounicode{tfm:zd/a171}{27A0}
+\pdfglyphtounicode{tfm:zd/a172}{27A1}
+\pdfglyphtounicode{tfm:zd/a173}{27A2}
+\pdfglyphtounicode{tfm:zd/a174}{27A4}
+\pdfglyphtounicode{tfm:zd/a175}{27A5}
+\pdfglyphtounicode{tfm:zd/a176}{27A6}
+\pdfglyphtounicode{tfm:zd/a177}{27A7}
+\pdfglyphtounicode{tfm:zd/a178}{27A8}
+\pdfglyphtounicode{tfm:zd/a179}{27A9}
+\pdfglyphtounicode{tfm:zd/a18}{2712}
+\pdfglyphtounicode{tfm:zd/a180}{27AB}
+\pdfglyphtounicode{tfm:zd/a181}{27AD}
+\pdfglyphtounicode{tfm:zd/a182}{27AF}
+\pdfglyphtounicode{tfm:zd/a183}{27B2}
+\pdfglyphtounicode{tfm:zd/a184}{27B3}
+\pdfglyphtounicode{tfm:zd/a185}{27B5}
+\pdfglyphtounicode{tfm:zd/a186}{27B8}
+\pdfglyphtounicode{tfm:zd/a187}{27BA}
+\pdfglyphtounicode{tfm:zd/a188}{27BB}
+\pdfglyphtounicode{tfm:zd/a189}{27BC}
+\pdfglyphtounicode{tfm:zd/a19}{2713}
+\pdfglyphtounicode{tfm:zd/a190}{27BD}
+\pdfglyphtounicode{tfm:zd/a191}{27BE}
+\pdfglyphtounicode{tfm:zd/a192}{279A}
+\pdfglyphtounicode{tfm:zd/a193}{27AA}
+\pdfglyphtounicode{tfm:zd/a194}{27B6}
+\pdfglyphtounicode{tfm:zd/a195}{27B9}
+\pdfglyphtounicode{tfm:zd/a196}{2798}
+\pdfglyphtounicode{tfm:zd/a197}{27B4}
+\pdfglyphtounicode{tfm:zd/a198}{27B7}
+\pdfglyphtounicode{tfm:zd/a199}{27AC}
+\pdfglyphtounicode{tfm:zd/a2}{2702}
+\pdfglyphtounicode{tfm:zd/a20}{2714}
+\pdfglyphtounicode{tfm:zd/a200}{27AE}
+\pdfglyphtounicode{tfm:zd/a201}{27B1}
+\pdfglyphtounicode{tfm:zd/a202}{2703}
+\pdfglyphtounicode{tfm:zd/a203}{2750}
+\pdfglyphtounicode{tfm:zd/a204}{2752}
+\pdfglyphtounicode{tfm:zd/a205}{276E}
+\pdfglyphtounicode{tfm:zd/a206}{2770}
+\pdfglyphtounicode{tfm:zd/a21}{2715}
+\pdfglyphtounicode{tfm:zd/a22}{2716}
+\pdfglyphtounicode{tfm:zd/a23}{2717}
+\pdfglyphtounicode{tfm:zd/a24}{2718}
+\pdfglyphtounicode{tfm:zd/a25}{2719}
+\pdfglyphtounicode{tfm:zd/a26}{271A}
+\pdfglyphtounicode{tfm:zd/a27}{271B}
+\pdfglyphtounicode{tfm:zd/a28}{271C}
+\pdfglyphtounicode{tfm:zd/a29}{2722}
+\pdfglyphtounicode{tfm:zd/a3}{2704}
+\pdfglyphtounicode{tfm:zd/a30}{2723}
+\pdfglyphtounicode{tfm:zd/a31}{2724}
+\pdfglyphtounicode{tfm:zd/a32}{2725}
+\pdfglyphtounicode{tfm:zd/a33}{2726}
+\pdfglyphtounicode{tfm:zd/a34}{2727}
+\pdfglyphtounicode{tfm:zd/a35}{2605}
+\pdfglyphtounicode{tfm:zd/a36}{2729}
+\pdfglyphtounicode{tfm:zd/a37}{272A}
+\pdfglyphtounicode{tfm:zd/a38}{272B}
+\pdfglyphtounicode{tfm:zd/a39}{272C}
+\pdfglyphtounicode{tfm:zd/a4}{260E}
+\pdfglyphtounicode{tfm:zd/a40}{272D}
+\pdfglyphtounicode{tfm:zd/a41}{272E}
+\pdfglyphtounicode{tfm:zd/a42}{272F}
+\pdfglyphtounicode{tfm:zd/a43}{2730}
+\pdfglyphtounicode{tfm:zd/a44}{2731}
+\pdfglyphtounicode{tfm:zd/a45}{2732}
+\pdfglyphtounicode{tfm:zd/a46}{2733}
+\pdfglyphtounicode{tfm:zd/a47}{2734}
+\pdfglyphtounicode{tfm:zd/a48}{2735}
+\pdfglyphtounicode{tfm:zd/a49}{2736}
+\pdfglyphtounicode{tfm:zd/a5}{2706}
+\pdfglyphtounicode{tfm:zd/a50}{2737}
+\pdfglyphtounicode{tfm:zd/a51}{2738}
+\pdfglyphtounicode{tfm:zd/a52}{2739}
+\pdfglyphtounicode{tfm:zd/a53}{273A}
+\pdfglyphtounicode{tfm:zd/a54}{273B}
+\pdfglyphtounicode{tfm:zd/a55}{273C}
+\pdfglyphtounicode{tfm:zd/a56}{273D}
+\pdfglyphtounicode{tfm:zd/a57}{273E}
+\pdfglyphtounicode{tfm:zd/a58}{273F}
+\pdfglyphtounicode{tfm:zd/a59}{2740}
+\pdfglyphtounicode{tfm:zd/a6}{271D}
+\pdfglyphtounicode{tfm:zd/a60}{2741}
+\pdfglyphtounicode{tfm:zd/a61}{2742}
+\pdfglyphtounicode{tfm:zd/a62}{2743}
+\pdfglyphtounicode{tfm:zd/a63}{2744}
+\pdfglyphtounicode{tfm:zd/a64}{2745}
+\pdfglyphtounicode{tfm:zd/a65}{2746}
+\pdfglyphtounicode{tfm:zd/a66}{2747}
+\pdfglyphtounicode{tfm:zd/a67}{2748}
+\pdfglyphtounicode{tfm:zd/a68}{2749}
+\pdfglyphtounicode{tfm:zd/a69}{274A}
+\pdfglyphtounicode{tfm:zd/a7}{271E}
+\pdfglyphtounicode{tfm:zd/a70}{274B}
+\pdfglyphtounicode{tfm:zd/a71}{25CF}
+\pdfglyphtounicode{tfm:zd/a72}{274D}
+\pdfglyphtounicode{tfm:zd/a73}{25A0}
+\pdfglyphtounicode{tfm:zd/a74}{274F}
+\pdfglyphtounicode{tfm:zd/a75}{2751}
+\pdfglyphtounicode{tfm:zd/a76}{25B2}
+\pdfglyphtounicode{tfm:zd/a77}{25BC}
+\pdfglyphtounicode{tfm:zd/a78}{25C6}
+\pdfglyphtounicode{tfm:zd/a79}{2756}
+\pdfglyphtounicode{tfm:zd/a8}{271F}
+\pdfglyphtounicode{tfm:zd/a81}{25D7}
+\pdfglyphtounicode{tfm:zd/a82}{2758}
+\pdfglyphtounicode{tfm:zd/a83}{2759}
+\pdfglyphtounicode{tfm:zd/a84}{275A}
+\pdfglyphtounicode{tfm:zd/a85}{276F}
+\pdfglyphtounicode{tfm:zd/a86}{2771}
+\pdfglyphtounicode{tfm:zd/a87}{2772}
+\pdfglyphtounicode{tfm:zd/a88}{2773}
+\pdfglyphtounicode{tfm:zd/a89}{2768}
+\pdfglyphtounicode{tfm:zd/a9}{2720}
+\pdfglyphtounicode{tfm:zd/a90}{2769}
+\pdfglyphtounicode{tfm:zd/a91}{276C}
+\pdfglyphtounicode{tfm:zd/a92}{276D}
+\pdfglyphtounicode{tfm:zd/a93}{276A}
+\pdfglyphtounicode{tfm:zd/a94}{276B}
+\pdfglyphtounicode{tfm:zd/a95}{2774}
+\pdfglyphtounicode{tfm:zd/a96}{2775}
+\pdfglyphtounicode{tfm:zd/a97}{275B}
+\pdfglyphtounicode{tfm:zd/a98}{275C}
+\pdfglyphtounicode{tfm:zd/a99}{275D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a1}{2701}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a10}{2721}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a100}{275E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a101}{2761}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a102}{2762}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a103}{2763}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a104}{2764}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a105}{2710}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a106}{2765}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a107}{2766}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a108}{2767}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a109}{2660}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a11}{261B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a110}{2665}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a111}{2666}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a112}{2663}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a117}{2709}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a118}{2708}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a119}{2707}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a12}{261E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a120}{2460}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a121}{2461}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a122}{2462}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a123}{2463}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a124}{2464}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a125}{2465}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a126}{2466}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a127}{2467}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a128}{2468}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a129}{2469}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a13}{270C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a130}{2776}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a131}{2777}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a132}{2778}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a133}{2779}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a134}{277A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a135}{277B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a136}{277C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a137}{277D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a138}{277E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a139}{277F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a14}{270D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a140}{2780}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a141}{2781}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a142}{2782}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a143}{2783}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a144}{2784}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a145}{2785}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a146}{2786}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a147}{2787}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a148}{2788}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a149}{2789}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a15}{270E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a150}{278A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a151}{278B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a152}{278C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a153}{278D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a154}{278E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a155}{278F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a156}{2790}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a157}{2791}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a158}{2792}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a159}{2793}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a16}{270F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a160}{2794}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a161}{2192}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a162}{27A3}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a163}{2194}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a164}{2195}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a165}{2799}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a166}{279B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a167}{279C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a168}{279D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a169}{279E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a17}{2711}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a170}{279F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a171}{27A0}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a172}{27A1}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a173}{27A2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a174}{27A4}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a175}{27A5}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a176}{27A6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a177}{27A7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a178}{27A8}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a179}{27A9}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a18}{2712}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a180}{27AB}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a181}{27AD}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a182}{27AF}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a183}{27B2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a184}{27B3}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a185}{27B5}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a186}{27B8}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a187}{27BA}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a188}{27BB}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a189}{27BC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a19}{2713}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a190}{27BD}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a191}{27BE}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a192}{279A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a193}{27AA}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a194}{27B6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a195}{27B9}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a196}{2798}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a197}{27B4}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a198}{27B7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a199}{27AC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a2}{2702}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a20}{2714}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a200}{27AE}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a201}{27B1}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a202}{2703}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a203}{2750}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a204}{2752}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a205}{276E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a206}{2770}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a21}{2715}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a22}{2716}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a23}{2717}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a24}{2718}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a25}{2719}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a26}{271A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a27}{271B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a28}{271C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a29}{2722}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a3}{2704}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a30}{2723}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a31}{2724}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a32}{2725}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a33}{2726}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a34}{2727}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a35}{2605}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a36}{2729}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a37}{272A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a38}{272B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a39}{272C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a4}{260E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a40}{272D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a41}{272E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a42}{272F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a43}{2730}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a44}{2731}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a45}{2732}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a46}{2733}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a47}{2734}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a48}{2735}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a49}{2736}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a5}{2706}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a50}{2737}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a51}{2738}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a52}{2739}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a53}{273A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a54}{273B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a55}{273C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a56}{273D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a57}{273E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a58}{273F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a59}{2740}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a6}{271D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a60}{2741}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a61}{2742}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a62}{2743}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a63}{2744}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a64}{2745}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a65}{2746}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a66}{2747}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a67}{2748}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a68}{2749}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a69}{274A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a7}{271E}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a70}{274B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a71}{25CF}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a72}{274D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a73}{25A0}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a74}{274F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a75}{2751}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a76}{25B2}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a77}{25BC}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a78}{25C6}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a79}{2756}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a8}{271F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a81}{25D7}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a82}{2758}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a83}{2759}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a84}{275A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a85}{276F}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a86}{2771}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a87}{2772}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a88}{2773}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a89}{2768}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a9}{2720}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a90}{2769}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a91}{276C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a92}{276D}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a93}{276A}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a94}{276B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a95}{2774}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a96}{2775}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a97}{275B}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a98}{275C}
+\pdfglyphtounicode{tfm:zpzdr-reversed/a99}{275D}
+\pdfglyphtounicode{thabengali}{09A5}
+\pdfglyphtounicode{thadeva}{0925}
+\pdfglyphtounicode{thagujarati}{0AA5}
+\pdfglyphtounicode{thagurmukhi}{0A25}
+\pdfglyphtounicode{thalarabic}{0630}
+\pdfglyphtounicode{thalfinalarabic}{FEAC}
+\pdfglyphtounicode{thanthakhatlowleftthai}{F898}
+\pdfglyphtounicode{thanthakhatlowrightthai}{F897}
+\pdfglyphtounicode{thanthakhatthai}{0E4C}
+\pdfglyphtounicode{thanthakhatupperleftthai}{F896}
+\pdfglyphtounicode{theharabic}{062B}
+\pdfglyphtounicode{thehfinalarabic}{FE9A}
+\pdfglyphtounicode{thehinitialarabic}{FE9B}
+\pdfglyphtounicode{thehmedialarabic}{FE9C}
+\pdfglyphtounicode{thereexists}{2203}
+\pdfglyphtounicode{therefore}{2234}
+\pdfglyphtounicode{theta}{03B8}
+\pdfglyphtounicode{theta1}{03D1}
+\pdfglyphtounicode{thetasymbolgreek}{03D1}
+\pdfglyphtounicode{thieuthacirclekorean}{3279}
+\pdfglyphtounicode{thieuthaparenkorean}{3219}
+\pdfglyphtounicode{thieuthcirclekorean}{326B}
+\pdfglyphtounicode{thieuthkorean}{314C}
+\pdfglyphtounicode{thieuthparenkorean}{320B}
+\pdfglyphtounicode{thirteencircle}{246C}
+\pdfglyphtounicode{thirteenparen}{2480}
+\pdfglyphtounicode{thirteenperiod}{2494}
+\pdfglyphtounicode{thonangmonthothai}{0E11}
+\pdfglyphtounicode{thook}{01AD}
+\pdfglyphtounicode{thophuthaothai}{0E12}
+\pdfglyphtounicode{thorn}{00FE}
+\pdfglyphtounicode{thothahanthai}{0E17}
+\pdfglyphtounicode{thothanthai}{0E10}
+\pdfglyphtounicode{thothongthai}{0E18}
+\pdfglyphtounicode{thothungthai}{0E16}
+\pdfglyphtounicode{thousandcyrillic}{0482}
+\pdfglyphtounicode{thousandsseparatorarabic}{066C}
+\pdfglyphtounicode{thousandsseparatorpersian}{066C}
+\pdfglyphtounicode{three}{0033}
+\pdfglyphtounicode{threearabic}{0663}
+\pdfglyphtounicode{threebengali}{09E9}
+\pdfglyphtounicode{threecircle}{2462}
+\pdfglyphtounicode{threecircleinversesansserif}{278C}
+\pdfglyphtounicode{threedeva}{0969}
+\pdfglyphtounicode{threeeighths}{215C}
+\pdfglyphtounicode{threegujarati}{0AE9}
+\pdfglyphtounicode{threegurmukhi}{0A69}
+\pdfglyphtounicode{threehackarabic}{0663}
+\pdfglyphtounicode{threehangzhou}{3023}
+\pdfglyphtounicode{threeideographicparen}{3222}
+\pdfglyphtounicode{threeinferior}{2083}
+\pdfglyphtounicode{threemonospace}{FF13}
+\pdfglyphtounicode{threenumeratorbengali}{09F6}
+\pdfglyphtounicode{threeoldstyle}{0033}
+\pdfglyphtounicode{threeparen}{2476}
+\pdfglyphtounicode{threeperiod}{248A}
+\pdfglyphtounicode{threepersian}{06F3}
+\pdfglyphtounicode{threequarters}{00BE}
+\pdfglyphtounicode{threequartersemdash}{F6DE}
+\pdfglyphtounicode{threeroman}{2172}
+\pdfglyphtounicode{threesuperior}{00B3}
+\pdfglyphtounicode{threethai}{0E53}
+\pdfglyphtounicode{thzsquare}{3394}
+\pdfglyphtounicode{tihiragana}{3061}
+\pdfglyphtounicode{tikatakana}{30C1}
+\pdfglyphtounicode{tikatakanahalfwidth}{FF81}
+\pdfglyphtounicode{tikeutacirclekorean}{3270}
+\pdfglyphtounicode{tikeutaparenkorean}{3210}
+\pdfglyphtounicode{tikeutcirclekorean}{3262}
+\pdfglyphtounicode{tikeutkorean}{3137}
+\pdfglyphtounicode{tikeutparenkorean}{3202}
+\pdfglyphtounicode{tilde}{02DC}
+\pdfglyphtounicode{tildebelowcmb}{0330}
+\pdfglyphtounicode{tildecmb}{0303}
+\pdfglyphtounicode{tildecomb}{0303}
+\pdfglyphtounicode{tildedoublecmb}{0360}
+\pdfglyphtounicode{tildeoperator}{223C}
+\pdfglyphtounicode{tildeoverlaycmb}{0334}
+\pdfglyphtounicode{tildeverticalcmb}{033E}
+\pdfglyphtounicode{timescircle}{2297}
+\pdfglyphtounicode{tipehahebrew}{0596}
+\pdfglyphtounicode{tipehalefthebrew}{0596}
+\pdfglyphtounicode{tippigurmukhi}{0A70}
+\pdfglyphtounicode{titlocyrilliccmb}{0483}
+\pdfglyphtounicode{tiwnarmenian}{057F}
+\pdfglyphtounicode{tlinebelow}{1E6F}
+\pdfglyphtounicode{tmonospace}{FF54}
+\pdfglyphtounicode{toarmenian}{0569}
+\pdfglyphtounicode{tohiragana}{3068}
+\pdfglyphtounicode{tokatakana}{30C8}
+\pdfglyphtounicode{tokatakanahalfwidth}{FF84}
+\pdfglyphtounicode{tonebarextrahighmod}{02E5}
+\pdfglyphtounicode{tonebarextralowmod}{02E9}
+\pdfglyphtounicode{tonebarhighmod}{02E6}
+\pdfglyphtounicode{tonebarlowmod}{02E8}
+\pdfglyphtounicode{tonebarmidmod}{02E7}
+\pdfglyphtounicode{tonefive}{01BD}
+\pdfglyphtounicode{tonesix}{0185}
+\pdfglyphtounicode{tonetwo}{01A8}
+\pdfglyphtounicode{tonos}{0384}
+\pdfglyphtounicode{tonsquare}{3327}
+\pdfglyphtounicode{topatakthai}{0E0F}
+\pdfglyphtounicode{tortoiseshellbracketleft}{3014}
+\pdfglyphtounicode{tortoiseshellbracketleftsmall}{FE5D}
+\pdfglyphtounicode{tortoiseshellbracketleftvertical}{FE39}
+\pdfglyphtounicode{tortoiseshellbracketright}{3015}
+\pdfglyphtounicode{tortoiseshellbracketrightsmall}{FE5E}
+\pdfglyphtounicode{tortoiseshellbracketrightvertical}{FE3A}
+\pdfglyphtounicode{totaothai}{0E15}
+\pdfglyphtounicode{tpalatalhook}{01AB}
+\pdfglyphtounicode{tparen}{24AF}
+\pdfglyphtounicode{trademark}{2122}
+\pdfglyphtounicode{trademarksans}{2122}
+\pdfglyphtounicode{trademarkserif}{2122}
+\pdfglyphtounicode{tretroflexhook}{0288}
+\pdfglyphtounicode{triagdn}{25BC}
+\pdfglyphtounicode{triaglf}{25C4}
+\pdfglyphtounicode{triagrt}{25BA}
+\pdfglyphtounicode{triagup}{25B2}
+\pdfglyphtounicode{triangle}{25B3}
+\pdfglyphtounicode{triangledownsld}{25BC}
+\pdfglyphtounicode{triangleinv}{25BD}
+\pdfglyphtounicode{triangleleft}{25C1}
+\pdfglyphtounicode{triangleleftequal}{22B4}
+\pdfglyphtounicode{triangleleftsld}{25C0}
+\pdfglyphtounicode{triangleright}{25B7}
+\pdfglyphtounicode{trianglerightequal}{22B5}
+\pdfglyphtounicode{trianglerightsld}{25B6}
+\pdfglyphtounicode{trianglesolid}{25B2}
+\pdfglyphtounicode{ts}{02A6}
+\pdfglyphtounicode{tsadi}{05E6}
+\pdfglyphtounicode{tsadidagesh}{FB46}
+\pdfglyphtounicode{tsadidageshhebrew}{FB46}
+\pdfglyphtounicode{tsadihebrew}{05E6}
+\pdfglyphtounicode{tsecyrillic}{0446}
+\pdfglyphtounicode{tsere}{05B5}
+\pdfglyphtounicode{tsere12}{05B5}
+\pdfglyphtounicode{tsere1e}{05B5}
+\pdfglyphtounicode{tsere2b}{05B5}
+\pdfglyphtounicode{tserehebrew}{05B5}
+\pdfglyphtounicode{tserenarrowhebrew}{05B5}
+\pdfglyphtounicode{tserequarterhebrew}{05B5}
+\pdfglyphtounicode{tserewidehebrew}{05B5}
+\pdfglyphtounicode{tshecyrillic}{045B}
+\pdfglyphtounicode{tsuperior}{0074}
+\pdfglyphtounicode{ttabengali}{099F}
+\pdfglyphtounicode{ttadeva}{091F}
+\pdfglyphtounicode{ttagujarati}{0A9F}
+\pdfglyphtounicode{ttagurmukhi}{0A1F}
+\pdfglyphtounicode{tteharabic}{0679}
+\pdfglyphtounicode{ttehfinalarabic}{FB67}
+\pdfglyphtounicode{ttehinitialarabic}{FB68}
+\pdfglyphtounicode{ttehmedialarabic}{FB69}
+\pdfglyphtounicode{tthabengali}{09A0}
+\pdfglyphtounicode{tthadeva}{0920}
+\pdfglyphtounicode{tthagujarati}{0AA0}
+\pdfglyphtounicode{tthagurmukhi}{0A20}
+\pdfglyphtounicode{tturned}{0287}
+\pdfglyphtounicode{tuhiragana}{3064}
+\pdfglyphtounicode{tukatakana}{30C4}
+\pdfglyphtounicode{tukatakanahalfwidth}{FF82}
+\pdfglyphtounicode{turnstileleft}{22A2}
+\pdfglyphtounicode{turnstileright}{22A3}
+\pdfglyphtounicode{tusmallhiragana}{3063}
+\pdfglyphtounicode{tusmallkatakana}{30C3}
+\pdfglyphtounicode{tusmallkatakanahalfwidth}{FF6F}
+\pdfglyphtounicode{twelvecircle}{246B}
+\pdfglyphtounicode{twelveparen}{247F}
+\pdfglyphtounicode{twelveperiod}{2493}
+\pdfglyphtounicode{twelveroman}{217B}
+\pdfglyphtounicode{twentycircle}{2473}
+\pdfglyphtounicode{twentyhangzhou}{5344}
+\pdfglyphtounicode{twentyparen}{2487}
+\pdfglyphtounicode{twentyperiod}{249B}
+\pdfglyphtounicode{two}{0032}
+\pdfglyphtounicode{twoarabic}{0662}
+\pdfglyphtounicode{twobengali}{09E8}
+\pdfglyphtounicode{twocircle}{2461}
+\pdfglyphtounicode{twocircleinversesansserif}{278B}
+\pdfglyphtounicode{twodeva}{0968}
+\pdfglyphtounicode{twodotenleader}{2025}
+\pdfglyphtounicode{twodotleader}{2025}
+\pdfglyphtounicode{twodotleadervertical}{FE30}
+\pdfglyphtounicode{twogujarati}{0AE8}
+\pdfglyphtounicode{twogurmukhi}{0A68}
+\pdfglyphtounicode{twohackarabic}{0662}
+\pdfglyphtounicode{twohangzhou}{3022}
+\pdfglyphtounicode{twoideographicparen}{3221}
+\pdfglyphtounicode{twoinferior}{2082}
+\pdfglyphtounicode{twomonospace}{FF12}
+\pdfglyphtounicode{twonumeratorbengali}{09F5}
+\pdfglyphtounicode{twooldstyle}{0032}
+\pdfglyphtounicode{twoparen}{2475}
+\pdfglyphtounicode{twoperiod}{2489}
+\pdfglyphtounicode{twopersian}{06F2}
+\pdfglyphtounicode{tworoman}{2171}
+\pdfglyphtounicode{twostroke}{01BB}
+\pdfglyphtounicode{twosuperior}{00B2}
+\pdfglyphtounicode{twothai}{0E52}
+\pdfglyphtounicode{twothirds}{2154}
+\pdfglyphtounicode{u}{0075}
+\pdfglyphtounicode{uacute}{00FA}
+\pdfglyphtounicode{ubar}{0289}
+\pdfglyphtounicode{ubengali}{0989}
+\pdfglyphtounicode{ubopomofo}{3128}
+\pdfglyphtounicode{ubreve}{016D}
+\pdfglyphtounicode{ucaron}{01D4}
+\pdfglyphtounicode{ucircle}{24E4}
+\pdfglyphtounicode{ucircumflex}{00FB}
+\pdfglyphtounicode{ucircumflexbelow}{1E77}
+\pdfglyphtounicode{ucyrillic}{0443}
+\pdfglyphtounicode{udattadeva}{0951}
+\pdfglyphtounicode{udblacute}{0171}
+\pdfglyphtounicode{udblgrave}{0215}
+\pdfglyphtounicode{udeva}{0909}
+\pdfglyphtounicode{udieresis}{00FC}
+\pdfglyphtounicode{udieresisacute}{01D8}
+\pdfglyphtounicode{udieresisbelow}{1E73}
+\pdfglyphtounicode{udieresiscaron}{01DA}
+\pdfglyphtounicode{udieresiscyrillic}{04F1}
+\pdfglyphtounicode{udieresisgrave}{01DC}
+\pdfglyphtounicode{udieresismacron}{01D6}
+\pdfglyphtounicode{udotbelow}{1EE5}
+\pdfglyphtounicode{ugrave}{00F9}
+\pdfglyphtounicode{ugujarati}{0A89}
+\pdfglyphtounicode{ugurmukhi}{0A09}
+\pdfglyphtounicode{uhiragana}{3046}
+\pdfglyphtounicode{uhookabove}{1EE7}
+\pdfglyphtounicode{uhorn}{01B0}
+\pdfglyphtounicode{uhornacute}{1EE9}
+\pdfglyphtounicode{uhorndotbelow}{1EF1}
+\pdfglyphtounicode{uhorngrave}{1EEB}
+\pdfglyphtounicode{uhornhookabove}{1EED}
+\pdfglyphtounicode{uhorntilde}{1EEF}
+\pdfglyphtounicode{uhungarumlaut}{0171}
+\pdfglyphtounicode{uhungarumlautcyrillic}{04F3}
+\pdfglyphtounicode{uinvertedbreve}{0217}
+\pdfglyphtounicode{ukatakana}{30A6}
+\pdfglyphtounicode{ukatakanahalfwidth}{FF73}
+\pdfglyphtounicode{ukcyrillic}{0479}
+\pdfglyphtounicode{ukorean}{315C}
+\pdfglyphtounicode{umacron}{016B}
+\pdfglyphtounicode{umacroncyrillic}{04EF}
+\pdfglyphtounicode{umacrondieresis}{1E7B}
+\pdfglyphtounicode{umatragurmukhi}{0A41}
+\pdfglyphtounicode{umonospace}{FF55}
+\pdfglyphtounicode{underscore}{005F}
+\pdfglyphtounicode{underscoredbl}{2017}
+\pdfglyphtounicode{underscoremonospace}{FF3F}
+\pdfglyphtounicode{underscorevertical}{FE33}
+\pdfglyphtounicode{underscorewavy}{FE4F}
+\pdfglyphtounicode{union}{222A}
+\pdfglyphtounicode{uniondbl}{22D3}
+\pdfglyphtounicode{unionmulti}{228E}
+\pdfglyphtounicode{unionsq}{2294}
+\pdfglyphtounicode{universal}{2200}
+\pdfglyphtounicode{uogonek}{0173}
+\pdfglyphtounicode{uparen}{24B0}
+\pdfglyphtounicode{upblock}{2580}
+\pdfglyphtounicode{upperdothebrew}{05C4}
+\pdfglyphtounicode{uprise}{22CF}
+\pdfglyphtounicode{upsilon}{03C5}
+\pdfglyphtounicode{upsilondieresis}{03CB}
+\pdfglyphtounicode{upsilondieresistonos}{03B0}
+\pdfglyphtounicode{upsilonlatin}{028A}
+\pdfglyphtounicode{upsilontonos}{03CD}
+\pdfglyphtounicode{upslope}{29F8}
+\pdfglyphtounicode{uptackbelowcmb}{031D}
+\pdfglyphtounicode{uptackmod}{02D4}
+\pdfglyphtounicode{uragurmukhi}{0A73}
+\pdfglyphtounicode{uring}{016F}
+\pdfglyphtounicode{ushortcyrillic}{045E}
+\pdfglyphtounicode{usmallhiragana}{3045}
+\pdfglyphtounicode{usmallkatakana}{30A5}
+\pdfglyphtounicode{usmallkatakanahalfwidth}{FF69}
+\pdfglyphtounicode{ustraightcyrillic}{04AF}
+\pdfglyphtounicode{ustraightstrokecyrillic}{04B1}
+\pdfglyphtounicode{utilde}{0169}
+\pdfglyphtounicode{utildeacute}{1E79}
+\pdfglyphtounicode{utildebelow}{1E75}
+\pdfglyphtounicode{uubengali}{098A}
+\pdfglyphtounicode{uudeva}{090A}
+\pdfglyphtounicode{uugujarati}{0A8A}
+\pdfglyphtounicode{uugurmukhi}{0A0A}
+\pdfglyphtounicode{uumatragurmukhi}{0A42}
+\pdfglyphtounicode{uuvowelsignbengali}{09C2}
+\pdfglyphtounicode{uuvowelsigndeva}{0942}
+\pdfglyphtounicode{uuvowelsigngujarati}{0AC2}
+\pdfglyphtounicode{uvowelsignbengali}{09C1}
+\pdfglyphtounicode{uvowelsigndeva}{0941}
+\pdfglyphtounicode{uvowelsigngujarati}{0AC1}
+\pdfglyphtounicode{v}{0076}
+\pdfglyphtounicode{vadeva}{0935}
+\pdfglyphtounicode{vagujarati}{0AB5}
+\pdfglyphtounicode{vagurmukhi}{0A35}
+\pdfglyphtounicode{vakatakana}{30F7}
+\pdfglyphtounicode{vav}{05D5}
+\pdfglyphtounicode{vavdagesh}{FB35}
+\pdfglyphtounicode{vavdagesh65}{FB35}
+\pdfglyphtounicode{vavdageshhebrew}{FB35}
+\pdfglyphtounicode{vavhebrew}{05D5}
+\pdfglyphtounicode{vavholam}{FB4B}
+\pdfglyphtounicode{vavholamhebrew}{FB4B}
+\pdfglyphtounicode{vavvavhebrew}{05F0}
+\pdfglyphtounicode{vavyodhebrew}{05F1}
+\pdfglyphtounicode{vcircle}{24E5}
+\pdfglyphtounicode{vdotbelow}{1E7F}
+\pdfglyphtounicode{vector}{20D7}
+\pdfglyphtounicode{vecyrillic}{0432}
+\pdfglyphtounicode{veharabic}{06A4}
+\pdfglyphtounicode{vehfinalarabic}{FB6B}
+\pdfglyphtounicode{vehinitialarabic}{FB6C}
+\pdfglyphtounicode{vehmedialarabic}{FB6D}
+\pdfglyphtounicode{vekatakana}{30F9}
+\pdfglyphtounicode{venus}{2640}
+\pdfglyphtounicode{verticalbar}{007C}
+\pdfglyphtounicode{verticallineabovecmb}{030D}
+\pdfglyphtounicode{verticallinebelowcmb}{0329}
+\pdfglyphtounicode{verticallinelowmod}{02CC}
+\pdfglyphtounicode{verticallinemod}{02C8}
+\pdfglyphtounicode{vewarmenian}{057E}
+\pdfglyphtounicode{vhook}{028B}
+\pdfglyphtounicode{vikatakana}{30F8}
+\pdfglyphtounicode{viramabengali}{09CD}
+\pdfglyphtounicode{viramadeva}{094D}
+\pdfglyphtounicode{viramagujarati}{0ACD}
+\pdfglyphtounicode{visargabengali}{0983}
+\pdfglyphtounicode{visargadeva}{0903}
+\pdfglyphtounicode{visargagujarati}{0A83}
+\pdfglyphtounicode{visiblespace}{2423}
+\pdfglyphtounicode{visualspace}{2423}
+\pdfglyphtounicode{vmonospace}{FF56}
+\pdfglyphtounicode{voarmenian}{0578}
+\pdfglyphtounicode{voicediterationhiragana}{309E}
+\pdfglyphtounicode{voicediterationkatakana}{30FE}
+\pdfglyphtounicode{voicedmarkkana}{309B}
+\pdfglyphtounicode{voicedmarkkanahalfwidth}{FF9E}
+\pdfglyphtounicode{vokatakana}{30FA}
+\pdfglyphtounicode{vparen}{24B1}
+\pdfglyphtounicode{vtilde}{1E7D}
+\pdfglyphtounicode{vturned}{028C}
+\pdfglyphtounicode{vuhiragana}{3094}
+\pdfglyphtounicode{vukatakana}{30F4}
+\pdfglyphtounicode{w}{0077}
+\pdfglyphtounicode{wacute}{1E83}
+\pdfglyphtounicode{waekorean}{3159}
+\pdfglyphtounicode{wahiragana}{308F}
+\pdfglyphtounicode{wakatakana}{30EF}
+\pdfglyphtounicode{wakatakanahalfwidth}{FF9C}
+\pdfglyphtounicode{wakorean}{3158}
+\pdfglyphtounicode{wasmallhiragana}{308E}
+\pdfglyphtounicode{wasmallkatakana}{30EE}
+\pdfglyphtounicode{wattosquare}{3357}
+\pdfglyphtounicode{wavedash}{301C}
+\pdfglyphtounicode{wavyunderscorevertical}{FE34}
+\pdfglyphtounicode{wawarabic}{0648}
+\pdfglyphtounicode{wawfinalarabic}{FEEE}
+\pdfglyphtounicode{wawhamzaabovearabic}{0624}
+\pdfglyphtounicode{wawhamzaabovefinalarabic}{FE86}
+\pdfglyphtounicode{wbsquare}{33DD}
+\pdfglyphtounicode{wcircle}{24E6}
+\pdfglyphtounicode{wcircumflex}{0175}
+\pdfglyphtounicode{wdieresis}{1E85}
+\pdfglyphtounicode{wdotaccent}{1E87}
+\pdfglyphtounicode{wdotbelow}{1E89}
+\pdfglyphtounicode{wehiragana}{3091}
+\pdfglyphtounicode{weierstrass}{2118}
+\pdfglyphtounicode{wekatakana}{30F1}
+\pdfglyphtounicode{wekorean}{315E}
+\pdfglyphtounicode{weokorean}{315D}
+\pdfglyphtounicode{wgrave}{1E81}
+\pdfglyphtounicode{whitebullet}{25E6}
+\pdfglyphtounicode{whitecircle}{25CB}
+\pdfglyphtounicode{whitecircleinverse}{25D9}
+\pdfglyphtounicode{whitecornerbracketleft}{300E}
+\pdfglyphtounicode{whitecornerbracketleftvertical}{FE43}
+\pdfglyphtounicode{whitecornerbracketright}{300F}
+\pdfglyphtounicode{whitecornerbracketrightvertical}{FE44}
+\pdfglyphtounicode{whitediamond}{25C7}
+\pdfglyphtounicode{whitediamondcontainingblacksmalldiamond}{25C8}
+\pdfglyphtounicode{whitedownpointingsmalltriangle}{25BF}
+\pdfglyphtounicode{whitedownpointingtriangle}{25BD}
+\pdfglyphtounicode{whiteleftpointingsmalltriangle}{25C3}
+\pdfglyphtounicode{whiteleftpointingtriangle}{25C1}
+\pdfglyphtounicode{whitelenticularbracketleft}{3016}
+\pdfglyphtounicode{whitelenticularbracketright}{3017}
+\pdfglyphtounicode{whiterightpointingsmalltriangle}{25B9}
+\pdfglyphtounicode{whiterightpointingtriangle}{25B7}
+\pdfglyphtounicode{whitesmallsquare}{25AB}
+\pdfglyphtounicode{whitesmilingface}{263A}
+\pdfglyphtounicode{whitesquare}{25A1}
+\pdfglyphtounicode{whitestar}{2606}
+\pdfglyphtounicode{whitetelephone}{260F}
+\pdfglyphtounicode{whitetortoiseshellbracketleft}{3018}
+\pdfglyphtounicode{whitetortoiseshellbracketright}{3019}
+\pdfglyphtounicode{whiteuppointingsmalltriangle}{25B5}
+\pdfglyphtounicode{whiteuppointingtriangle}{25B3}
+\pdfglyphtounicode{wihiragana}{3090}
+\pdfglyphtounicode{wikatakana}{30F0}
+\pdfglyphtounicode{wikorean}{315F}
+\pdfglyphtounicode{wmonospace}{FF57}
+\pdfglyphtounicode{wohiragana}{3092}
+\pdfglyphtounicode{wokatakana}{30F2}
+\pdfglyphtounicode{wokatakanahalfwidth}{FF66}
+\pdfglyphtounicode{won}{20A9}
+\pdfglyphtounicode{wonmonospace}{FFE6}
+\pdfglyphtounicode{wowaenthai}{0E27}
+\pdfglyphtounicode{wparen}{24B2}
+\pdfglyphtounicode{wreathproduct}{2240}
+\pdfglyphtounicode{wring}{1E98}
+\pdfglyphtounicode{wsuperior}{02B7}
+\pdfglyphtounicode{wturned}{028D}
+\pdfglyphtounicode{wynn}{01BF}
+\pdfglyphtounicode{x}{0078}
+\pdfglyphtounicode{xabovecmb}{033D}
+\pdfglyphtounicode{xbopomofo}{3112}
+\pdfglyphtounicode{xcircle}{24E7}
+\pdfglyphtounicode{xdieresis}{1E8D}
+\pdfglyphtounicode{xdotaccent}{1E8B}
+\pdfglyphtounicode{xeharmenian}{056D}
+\pdfglyphtounicode{xi}{03BE}
+\pdfglyphtounicode{xmonospace}{FF58}
+\pdfglyphtounicode{xparen}{24B3}
+\pdfglyphtounicode{xsuperior}{02E3}
+\pdfglyphtounicode{y}{0079}
+\pdfglyphtounicode{yaadosquare}{334E}
+\pdfglyphtounicode{yabengali}{09AF}
+\pdfglyphtounicode{yacute}{00FD}
+\pdfglyphtounicode{yadeva}{092F}
+\pdfglyphtounicode{yaekorean}{3152}
+\pdfglyphtounicode{yagujarati}{0AAF}
+\pdfglyphtounicode{yagurmukhi}{0A2F}
+\pdfglyphtounicode{yahiragana}{3084}
+\pdfglyphtounicode{yakatakana}{30E4}
+\pdfglyphtounicode{yakatakanahalfwidth}{FF94}
+\pdfglyphtounicode{yakorean}{3151}
+\pdfglyphtounicode{yamakkanthai}{0E4E}
+\pdfglyphtounicode{yasmallhiragana}{3083}
+\pdfglyphtounicode{yasmallkatakana}{30E3}
+\pdfglyphtounicode{yasmallkatakanahalfwidth}{FF6C}
+\pdfglyphtounicode{yatcyrillic}{0463}
+\pdfglyphtounicode{ycircle}{24E8}
+\pdfglyphtounicode{ycircumflex}{0177}
+\pdfglyphtounicode{ydieresis}{00FF}
+\pdfglyphtounicode{ydotaccent}{1E8F}
+\pdfglyphtounicode{ydotbelow}{1EF5}
+\pdfglyphtounicode{yeharabic}{064A}
+\pdfglyphtounicode{yehbarreearabic}{06D2}
+\pdfglyphtounicode{yehbarreefinalarabic}{FBAF}
+\pdfglyphtounicode{yehfinalarabic}{FEF2}
+\pdfglyphtounicode{yehhamzaabovearabic}{0626}
+\pdfglyphtounicode{yehhamzaabovefinalarabic}{FE8A}
+\pdfglyphtounicode{yehhamzaaboveinitialarabic}{FE8B}
+\pdfglyphtounicode{yehhamzaabovemedialarabic}{FE8C}
+\pdfglyphtounicode{yehinitialarabic}{FEF3}
+\pdfglyphtounicode{yehmedialarabic}{FEF4}
+\pdfglyphtounicode{yehmeeminitialarabic}{FCDD}
+\pdfglyphtounicode{yehmeemisolatedarabic}{FC58}
+\pdfglyphtounicode{yehnoonfinalarabic}{FC94}
+\pdfglyphtounicode{yehthreedotsbelowarabic}{06D1}
+\pdfglyphtounicode{yekorean}{3156}
+\pdfglyphtounicode{yen}{00A5}
+\pdfglyphtounicode{yenmonospace}{FFE5}
+\pdfglyphtounicode{yeokorean}{3155}
+\pdfglyphtounicode{yeorinhieuhkorean}{3186}
+\pdfglyphtounicode{yerahbenyomohebrew}{05AA}
+\pdfglyphtounicode{yerahbenyomolefthebrew}{05AA}
+\pdfglyphtounicode{yericyrillic}{044B}
+\pdfglyphtounicode{yerudieresiscyrillic}{04F9}
+\pdfglyphtounicode{yesieungkorean}{3181}
+\pdfglyphtounicode{yesieungpansioskorean}{3183}
+\pdfglyphtounicode{yesieungsioskorean}{3182}
+\pdfglyphtounicode{yetivhebrew}{059A}
+\pdfglyphtounicode{ygrave}{1EF3}
+\pdfglyphtounicode{yhook}{01B4}
+\pdfglyphtounicode{yhookabove}{1EF7}
+\pdfglyphtounicode{yiarmenian}{0575}
+\pdfglyphtounicode{yicyrillic}{0457}
+\pdfglyphtounicode{yikorean}{3162}
+\pdfglyphtounicode{yinyang}{262F}
+\pdfglyphtounicode{yiwnarmenian}{0582}
+\pdfglyphtounicode{ymonospace}{FF59}
+\pdfglyphtounicode{yod}{05D9}
+\pdfglyphtounicode{yoddagesh}{FB39}
+\pdfglyphtounicode{yoddageshhebrew}{FB39}
+\pdfglyphtounicode{yodhebrew}{05D9}
+\pdfglyphtounicode{yodyodhebrew}{05F2}
+\pdfglyphtounicode{yodyodpatahhebrew}{FB1F}
+\pdfglyphtounicode{yohiragana}{3088}
+\pdfglyphtounicode{yoikorean}{3189}
+\pdfglyphtounicode{yokatakana}{30E8}
+\pdfglyphtounicode{yokatakanahalfwidth}{FF96}
+\pdfglyphtounicode{yokorean}{315B}
+\pdfglyphtounicode{yosmallhiragana}{3087}
+\pdfglyphtounicode{yosmallkatakana}{30E7}
+\pdfglyphtounicode{yosmallkatakanahalfwidth}{FF6E}
+\pdfglyphtounicode{yotgreek}{03F3}
+\pdfglyphtounicode{yoyaekorean}{3188}
+\pdfglyphtounicode{yoyakorean}{3187}
+\pdfglyphtounicode{yoyakthai}{0E22}
+\pdfglyphtounicode{yoyingthai}{0E0D}
+\pdfglyphtounicode{yparen}{24B4}
+\pdfglyphtounicode{ypogegrammeni}{037A}
+\pdfglyphtounicode{ypogegrammenigreekcmb}{0345}
+\pdfglyphtounicode{yr}{01A6}
+\pdfglyphtounicode{yring}{1E99}
+\pdfglyphtounicode{ysuperior}{02B8}
+\pdfglyphtounicode{ytilde}{1EF9}
+\pdfglyphtounicode{yturned}{028E}
+\pdfglyphtounicode{yuhiragana}{3086}
+\pdfglyphtounicode{yuikorean}{318C}
+\pdfglyphtounicode{yukatakana}{30E6}
+\pdfglyphtounicode{yukatakanahalfwidth}{FF95}
+\pdfglyphtounicode{yukorean}{3160}
+\pdfglyphtounicode{yusbigcyrillic}{046B}
+\pdfglyphtounicode{yusbigiotifiedcyrillic}{046D}
+\pdfglyphtounicode{yuslittlecyrillic}{0467}
+\pdfglyphtounicode{yuslittleiotifiedcyrillic}{0469}
+\pdfglyphtounicode{yusmallhiragana}{3085}
+\pdfglyphtounicode{yusmallkatakana}{30E5}
+\pdfglyphtounicode{yusmallkatakanahalfwidth}{FF6D}
+\pdfglyphtounicode{yuyekorean}{318B}
+\pdfglyphtounicode{yuyeokorean}{318A}
+\pdfglyphtounicode{yyabengali}{09DF}
+\pdfglyphtounicode{yyadeva}{095F}
+\pdfglyphtounicode{z}{007A}
+\pdfglyphtounicode{zaarmenian}{0566}
+\pdfglyphtounicode{zacute}{017A}
+\pdfglyphtounicode{zadeva}{095B}
+\pdfglyphtounicode{zagurmukhi}{0A5B}
+\pdfglyphtounicode{zaharabic}{0638}
+\pdfglyphtounicode{zahfinalarabic}{FEC6}
+\pdfglyphtounicode{zahinitialarabic}{FEC7}
+\pdfglyphtounicode{zahiragana}{3056}
+\pdfglyphtounicode{zahmedialarabic}{FEC8}
+\pdfglyphtounicode{zainarabic}{0632}
+\pdfglyphtounicode{zainfinalarabic}{FEB0}
+\pdfglyphtounicode{zakatakana}{30B6}
+\pdfglyphtounicode{zaqefgadolhebrew}{0595}
+\pdfglyphtounicode{zaqefqatanhebrew}{0594}
+\pdfglyphtounicode{zarqahebrew}{0598}
+\pdfglyphtounicode{zayin}{05D6}
+\pdfglyphtounicode{zayindagesh}{FB36}
+\pdfglyphtounicode{zayindageshhebrew}{FB36}
+\pdfglyphtounicode{zayinhebrew}{05D6}
+\pdfglyphtounicode{zbopomofo}{3117}
+\pdfglyphtounicode{zcaron}{017E}
+\pdfglyphtounicode{zcircle}{24E9}
+\pdfglyphtounicode{zcircumflex}{1E91}
+\pdfglyphtounicode{zcurl}{0291}
+\pdfglyphtounicode{zdot}{017C}
+\pdfglyphtounicode{zdotaccent}{017C}
+\pdfglyphtounicode{zdotbelow}{1E93}
+\pdfglyphtounicode{zecyrillic}{0437}
+\pdfglyphtounicode{zedescendercyrillic}{0499}
+\pdfglyphtounicode{zedieresiscyrillic}{04DF}
+\pdfglyphtounicode{zehiragana}{305C}
+\pdfglyphtounicode{zekatakana}{30BC}
+\pdfglyphtounicode{zero}{0030}
+\pdfglyphtounicode{zeroarabic}{0660}
+\pdfglyphtounicode{zerobengali}{09E6}
+\pdfglyphtounicode{zerodeva}{0966}
+\pdfglyphtounicode{zerogujarati}{0AE6}
+\pdfglyphtounicode{zerogurmukhi}{0A66}
+\pdfglyphtounicode{zerohackarabic}{0660}
+\pdfglyphtounicode{zeroinferior}{2080}
+\pdfglyphtounicode{zeromonospace}{FF10}
+\pdfglyphtounicode{zerooldstyle}{0030}
+\pdfglyphtounicode{zeropersian}{06F0}
+\pdfglyphtounicode{zerosuperior}{2070}
+\pdfglyphtounicode{zerothai}{0E50}
+\pdfglyphtounicode{zerowidthjoiner}{FEFF}
+\pdfglyphtounicode{zerowidthnonjoiner}{200C}
+\pdfglyphtounicode{zerowidthspace}{200B}
+\pdfglyphtounicode{zeta}{03B6}
+\pdfglyphtounicode{zhbopomofo}{3113}
+\pdfglyphtounicode{zhearmenian}{056A}
+\pdfglyphtounicode{zhebrevecyrillic}{04C2}
+\pdfglyphtounicode{zhecyrillic}{0436}
+\pdfglyphtounicode{zhedescendercyrillic}{0497}
+\pdfglyphtounicode{zhedieresiscyrillic}{04DD}
+\pdfglyphtounicode{zihiragana}{3058}
+\pdfglyphtounicode{zikatakana}{30B8}
+\pdfglyphtounicode{zinorhebrew}{05AE}
+\pdfglyphtounicode{zlinebelow}{1E95}
+\pdfglyphtounicode{zmonospace}{FF5A}
+\pdfglyphtounicode{zohiragana}{305E}
+\pdfglyphtounicode{zokatakana}{30BE}
+\pdfglyphtounicode{zparen}{24B5}
+\pdfglyphtounicode{zretroflexhook}{0290}
+\pdfglyphtounicode{zstroke}{01B6}
+\pdfglyphtounicode{zuhiragana}{305A}
+\pdfglyphtounicode{zukatakana}{30BA}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h
new file mode 100644
index 00000000000..a65d3d75e7b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/config.h
@@ -0,0 +1,49 @@
+#ifndef LCDF_TYPETOOLS_CONFIG_H
+#define LCDF_TYPETOOLS_CONFIG_H 1
+
+#include <autoconf.h>
+
+/* Allow compilation on Windows (thanks, Fabrice Popineau). */
+#ifdef WIN32
+# ifdef __MINGW32__
+# include <winsock2.h>
+# include <windows.h>
+# else
+# include <win32lib.h>
+# endif
+#else
+# include <stddef.h>
+# define CDECL /* nothing */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Prototype strerror if necessary. */
+#if !HAVE_STRERROR
+char *strerror(int errno);
+#endif
+
+/* Prototype strnlen if necessary. */
+#if !HAVE_DECL_STRNLEN
+size_t strnlen(const char *s, size_t maxlen);
+#endif
+
+/* Prototype good_strtod if necessary. */
+#if HAVE_BROKEN_STRTOD
+double good_strtod(const char *s, char **endptr);
+#endif
+
+#ifdef __cplusplus
+}
+/* Get rid of a possible inline macro under C++. */
+# define inline inline
+
+/* Ignore `noexcept` if compiler is too old. */
+#if __cplusplus < 201103L
+#define noexcept
+#endif
+#endif
+
+#endif /* LCDF_TYPETOOLS_CONFIG_H */
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afm.hh
new file mode 100644
index 00000000000..5c37d1e942e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afm.hh
@@ -0,0 +1,59 @@
+// -*- related-file-name: "../../libefont/afm.cc" -*-
+#ifndef EFONT_AFM_HH
+#define EFONT_AFM_HH
+#include <efont/metrics.hh>
+class Slurper;
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class AfmParser;
+
+struct AfmMetricsXt: public MetricsXt {
+
+ Vector<PermString> opening_comments;
+ PermString notice;
+ PermString encoding_scheme;
+
+ PermString kind() const { return "AFM"; }
+
+};
+
+class AfmReader { public:
+
+ static Metrics *read(const Filename &, ErrorHandler *);
+ static Metrics *read(Slurper &, ErrorHandler *);
+
+ private:
+
+ Metrics *_afm;
+ AfmMetricsXt *_afm_xt;
+ AfmParser &_l;
+ ErrorHandler *_errh;
+
+ mutable bool _composite_warned;
+ mutable bool _metrics_sets_warned;
+ mutable int _y_width_warned;
+
+ void lwarning(const char *, ...) const;
+ void lerror(const char *, ...) const;
+ void composite_warning() const;
+ void metrics_sets_warning() const;
+ void y_width_warning() const;
+ void no_match_warning(const char *context = 0) const;
+
+ double &fd(int i) { return _afm->fd(i); }
+ GlyphIndex find_err(PermString, const char *) const;
+
+ void read_char_metric_data() const;
+ void read_char_metrics() const;
+ void read_kerns() const;
+ void read_composites() const;
+
+ bool read();
+
+ AfmReader(AfmParser &, Metrics *, AfmMetricsXt *, ErrorHandler *);
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmparse.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmparse.hh
new file mode 100644
index 00000000000..c97c4949b0c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmparse.hh
@@ -0,0 +1,64 @@
+// -*- related-file-name: "../../libefont/afmparse.cc" -*-
+#ifndef EFONT_AFMPARSE_HH
+#define EFONT_AFMPARSE_HH
+#include <lcdf/slurper.hh>
+#include <lcdf/permstr.hh>
+#include <stdarg.h>
+namespace Efont {
+
+class AfmParser { public:
+
+ AfmParser(Slurper &);
+
+ bool ok() const { return _slurper.ok(); }
+ operator Landmark() const { return _slurper.landmark(); }
+ Landmark landmark() const { return _slurper.landmark(); }
+ unsigned lineno() const { return _slurper.lineno(); }
+ const Filename &filename() const { return _slurper.filename(); }
+
+ bool key_matched() const { return _fail_field >= 0; }
+ int fail_field() const { return _fail_field; }
+ PermString message() const { return _message; }
+ void clear_message() { _message = PermString(); }
+
+ PermString keyword() const;
+ bool is(const char *, ...);
+ bool isall(const char *, ...);
+
+ inline bool next_line();
+ void save_line() { _slurper.save_line(); }
+ void skip_until(unsigned char);
+
+ unsigned char *cur_line() const { return _pos; }
+ unsigned char first() const { return _pos[0]; }
+ unsigned char operator[](int i) const { return _pos[i]; }
+ bool left() const { return *_pos != 0; }
+
+ private:
+
+ Slurper &_slurper;
+ bool _save_line;
+
+ unsigned char *_line;
+ unsigned char *_pos;
+ int _length;
+
+ PermString _message;
+ int _fail_field;
+
+ void static_initialize();
+ void trim_end();
+ unsigned char *vis(const char *, va_list);
+
+};
+
+
+inline bool AfmParser::next_line()
+{
+ _pos = _line = (unsigned char *)_slurper.next_line();
+ _length = _slurper.cur_line_length();
+ return _line != 0;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmw.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmw.hh
new file mode 100644
index 00000000000..d901b3cd3c2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/afmw.hh
@@ -0,0 +1,29 @@
+#ifndef EFONT_AFMW_HH
+#define EFONT_AFMW_HH
+#include <efont/afm.hh>
+#include <stdio.h>
+namespace Efont {
+
+class AfmWriter { public:
+
+ static void write(Metrics *, FILE *);
+
+ private:
+
+ Metrics *_m;
+ AfmMetricsXt *_afm_xt;
+ FILE *_f;
+
+ void write_prologue() const;
+ void write_char_metric_data(GlyphIndex, int) const;
+ void write_kerns() const;
+ void write();
+
+ double fd(int i) const { return _m->fd(i); }
+
+ AfmWriter(Metrics *, FILE *);
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/amfm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/amfm.hh
new file mode 100644
index 00000000000..55cf1909546
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/amfm.hh
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../../libefont/amfm.cc" -*-
+#ifndef EFONT_AMFM_HH
+#define EFONT_AMFM_HH
+#include <efont/metrics.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/hashmap.hh>
+class Slurper;
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class AfmParser;
+class MetricsFinder;
+class Type1Charstring;
+
+
+struct AmfmMaster {
+
+ PermString font_name;
+ PermString family;
+ PermString full_name;
+ PermString version;
+ Vector<double> weight_vector;
+
+ bool loaded;
+ Metrics *afm;
+
+ AmfmMaster() : loaded(0), afm(0) { }
+
+};
+
+
+struct AmfmPrimaryFont {
+
+ Vector<int> design_vector;
+ Vector<PermString> labels;
+ PermString name;
+ AmfmPrimaryFont *next;
+
+};
+
+
+class AmfmMetrics { public:
+
+ AmfmMetrics(MetricsFinder *);
+ ~AmfmMetrics();
+
+ void use() { _uses++; }
+ void unuse() { if (--_uses == 0) delete this; }
+
+ bool sanity(ErrorHandler *) const;
+
+ double fd(int i) const { return _fdv[i]; }
+ double &fd(int i) { return _fdv[i]; }
+
+ PermString font_name() const { return _font_name; }
+ PermString directory() const { return _directory; }
+
+ int naxes() const { return _naxes; }
+ int nmasters() const { return _nmasters; }
+ MultipleMasterSpace *mmspace() const { return _mmspace; }
+
+ int primary_label_value(int, PermString) const;
+
+ Metrics *interpolate(const Vector<double> &design,
+ const Vector<double> &weight, ErrorHandler *);
+
+ private:
+
+ MetricsFinder *_finder;
+ PermString _directory;
+
+ Vector<double> _fdv;
+
+ PermString _font_name;
+ PermString _family;
+ PermString _full_name;
+ PermString _weight;
+
+ PermString _version;
+ PermString _notice;
+ Vector<PermString> _opening_comments;
+
+ PermString _encoding_scheme;
+ Vector<double> _weight_vector;
+
+ int _nmasters;
+ int _naxes;
+ AmfmMaster *_masters;
+ MultipleMasterSpace *_mmspace;
+
+ AmfmPrimaryFont *_primary_fonts;
+
+ Metrics *_sanity_afm;
+
+ unsigned _uses;
+
+ friend class AmfmReader;
+
+ AmfmMetrics(const AmfmMetrics &) { assert(0); }
+ AmfmMetrics &operator=(const AmfmMetrics &) { assert(0); return *this; }
+
+ AmfmPrimaryFont *find_primary_font(const Vector<double> &design) const;
+
+ Metrics *master(int, ErrorHandler *);
+
+};
+
+
+class AmfmReader { public:
+
+ static AmfmMetrics *read(const Filename &, MetricsFinder *, ErrorHandler*);
+ static AmfmMetrics *read(Slurper &, MetricsFinder *, ErrorHandler *);
+ static void add_amcp_file(Slurper &, AmfmMetrics *, ErrorHandler *);
+
+ private:
+
+ typedef Vector<double> NumVector;
+
+ AmfmMetrics *_amfm;
+ MetricsFinder *_finder;
+ AfmParser &_l;
+ MultipleMasterSpace *_mmspace;
+ ErrorHandler *_errh;
+
+ double &fd(int i) const { return _amfm->fd(i); }
+ int naxes() const { return _amfm->_naxes; }
+ int nmasters() const { return _amfm->_nmasters; }
+
+ void check_mmspace();
+
+ void lwarning(const char *, ...) const;
+ void lerror(const char *, ...) const;
+ void no_match_warning(const char *context = 0) const;
+
+ bool read_simple_array(Vector<double> &) const;
+ void read_positions() const;
+ void read_normalize() const;
+ void read_axis_types() const;
+ void read_axis(int axis) const;
+ void read_master(int master) const;
+ void read_primary_fonts() const;
+ void read_one_primary_font() const;
+ void read_conversion_programs() const;
+ bool read();
+
+ void read_amcp_file();
+
+ AmfmReader(AfmParser &, AmfmMetrics *, ErrorHandler *);
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh
new file mode 100644
index 00000000000..494d93dcbfc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/cff.hh
@@ -0,0 +1,461 @@
+// -*- related-file-name: "../../libefont/cff.cc" -*-
+#ifndef EFONT_CFF_HH
+#define EFONT_CFF_HH
+#include <lcdf/hashmap.hh>
+#include <efont/t1cs.hh>
+class ErrorHandler;
+namespace Efont {
+class Type1Encoding;
+
+class Cff { public:
+
+ class Dict;
+ class IndexIterator;
+ class Charset;
+ class FDSelect;
+ class FontParent;
+ class Font;
+ class CIDFont;
+ class ChildFont;
+
+ explicit Cff(const String& str, unsigned units_per_em,
+ ErrorHandler* errh = 0);
+ ~Cff();
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ const String &data_string() const { return _data_string; }
+ const uint8_t *data() const { return _data; }
+ int length() const { return _len; }
+
+ int nfonts() const { return _name_index.size(); }
+ PermString font_name(int i) const { return _name_index[i]; }
+ FontParent* font(PermString = PermString(), ErrorHandler* = 0);
+
+ enum { NSTANDARD_STRINGS = 391, MAX_SID = 64999 };
+ int max_sid() const { return NSTANDARD_STRINGS - 1 + _strings.size(); }
+ int sid(PermString);
+ String sid_string(int sid) const;
+ PermString sid_permstring(int sid) const;
+
+ int ngsubrs() const { return _gsubrs_index.nitems(); }
+ Charstring *gsubr(int i);
+
+ unsigned units_per_em() const { return _units_per_em; }
+
+ enum DictOperator {
+ oVersion = 0, oNotice = 1, oFullName = 2, oFamilyName = 3,
+ oWeight = 4, oFontBBox = 5, oBlueValues = 6, oOtherBlues = 7,
+ oFamilyBlues = 8, oFamilyOtherBlues = 9, oStdHW = 10, oStdVW = 11,
+ oUniqueID = 13, oXUID = 14, oCharset = 15, oEncoding = 16,
+ oCharStrings = 17, oPrivate = 18, oSubrs = 19, oDefaultWidthX = 20,
+ oNominalWidthX = 21,
+ oCopyright = 32 + 0, oIsFixedPitch = 32 + 1, oItalicAngle = 32 + 2,
+ oUnderlinePosition = 32 + 3, oUnderlineThickness = 32 + 4,
+ oPaintType = 32 + 5, oCharstringType = 32 + 6, oFontMatrix = 32 + 7,
+ oStrokeWidth = 32 + 8, oBlueScale = 32 + 9, oBlueShift = 32 + 10,
+ oBlueFuzz = 32 + 11, oStemSnapH = 32 + 12, oStemSnapV = 32 + 13,
+ oForceBold = 32 + 14, oLanguageGroup = 32 + 17,
+ oExpansionFactor = 32 + 18, oInitialRandomSeed = 32 + 19,
+ oSyntheticBase = 32 + 20, oPostScript = 32 + 21,
+ oBaseFontName = 32 + 22, oBaseFontBlend = 32 + 23,
+ oROS = 32 + 30, oCIDFontVersion = 32 + 31, oCIDFontRevision = 32 + 32,
+ oCIDFontType = 32 + 33, oCIDCount = 32 + 34, oUIDBase = 32 + 35,
+ oFDArray = 32 + 36, oFDSelect = 32 + 37, oFontName = 32 + 38,
+ oLastOperator = oFontName
+ };
+
+ enum DictType {
+ tNone = 0, tSID, tFontNumber, tBoolean, tNumber, tOffset, tLocalOffset,
+ tArray, tArray2, tArray3, tArray4, tArray5, tArray6, tPrivateType,
+ tTypeMask = 0x7F, tPrivate = 0x80, tP = tPrivate
+ };
+
+ static const char * const operator_names[];
+ static const int operator_types[];
+
+
+ class IndexIterator { public:
+
+ IndexIterator() : _offset(0), _last_offset(0), _offsize(-1) { }
+ IndexIterator(const uint8_t *, int, int, ErrorHandler * = 0, const char *index_name = "INDEX");
+
+ int error() const { return (_offsize < 0 ? _offsize : 0); }
+
+ typedef bool (IndexIterator::*unspecified_bool_type)() const;
+ bool live() const { return _offset < _last_offset; }
+ operator unspecified_bool_type() const {
+ return live() ? &IndexIterator::live : 0;
+ }
+ int nitems() const;
+
+ inline const uint8_t *operator*() const;
+ inline const uint8_t *operator[](int) const;
+ const uint8_t *index_end() const;
+
+ void operator++() { _offset += _offsize; }
+ void operator++(int) { ++(*this); }
+
+ private:
+
+ const uint8_t *_contents;
+ const uint8_t *_offset;
+ const uint8_t *_last_offset;
+ int _offsize;
+
+ inline uint32_t offset_at(const uint8_t *) const;
+
+ };
+
+ private:
+
+ String _data_string;
+ const uint8_t *_data;
+ int _len;
+
+ int _error;
+
+ Vector<PermString> _name_index;
+
+ IndexIterator _top_dict_index;
+
+ IndexIterator _strings_index;
+ mutable Vector<PermString> _strings;
+ mutable HashMap<PermString, int> _strings_map;
+
+ IndexIterator _gsubrs_index;
+ Vector<Charstring*> _gsubrs_cs;
+ Vector<FontParent*> _fonts;
+
+ unsigned _units_per_em;
+
+ int parse_header(ErrorHandler *);
+
+ enum { HEADER_SIZE = 4 };
+
+};
+
+
+class Cff::Dict { public:
+
+ Dict();
+ Dict(Cff *, int pos, int dict_len, ErrorHandler * = 0, const char *dict_name = "DICT");
+ int assign(Cff *, int pos, int dict_len, ErrorHandler * = 0, const char *dict_name = "DICT");
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ int check(bool is_private, ErrorHandler * = 0, const char *dict_name = "DICT") const;
+
+ bool has(DictOperator) const;
+ inline bool has_first(DictOperator) const;
+ bool xvalue(DictOperator, Vector<double> &) const;
+ bool xvalue(DictOperator, int *) const;
+ bool xvalue(DictOperator, double *) const;
+ bool value(DictOperator, Vector<double> &) const;
+ bool value(DictOperator, int *) const;
+ bool value(DictOperator, double *) const;
+
+ void unparse(ErrorHandler *, const char *) const;
+
+ private:
+
+ Cff *_cff;
+ int _pos;
+ Vector<int> _operators;
+ Vector<int> _pointers;
+ Vector<double> _operands;
+ int _error;
+
+};
+
+class Cff::Charset { public:
+
+ Charset() : _error(-1) { }
+ Charset(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler * = 0);
+ void assign(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler * = 0);
+
+ int error() const { return _error; }
+
+ int nglyphs() const { return _sids.size(); }
+ int nsids() const { return _gids.size(); }
+
+ inline int gid_to_sid(int gid) const;
+ inline int sid_to_gid(int sid) const;
+
+ private:
+
+ Vector<int> _sids;
+ Vector<int> _gids;
+ int _error;
+
+ void assign(const int *, int, int);
+ int parse(const Cff *, int pos, int nglyphs, int max_sid, ErrorHandler *);
+
+};
+
+class Cff::FDSelect { public:
+
+ FDSelect() : _fds(0), _my_fds(false), _nglyphs(0), _error(-1) { }
+ ~FDSelect();
+ void assign(const Cff *, int pos, int nglyphs, ErrorHandler * = 0);
+
+ int error() const { return _error; }
+
+ int nglyphs() const { return _nglyphs; }
+ inline int gid_to_fd(int gid) const;
+
+ private:
+
+ const uint8_t *_fds;
+ bool _my_fds;
+ int _nglyphs;
+ int _error;
+
+ FDSelect(const FDSelect &);
+ FDSelect &operator=(const FDSelect &);
+ int parse(const Cff *, int pos, int nglyphs, ErrorHandler *);
+
+};
+
+
+class Cff::FontParent : public CharstringProgram { public:
+
+ FontParent(Cff* cff);
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ int ngsubrs_x() const { return _cff->ngsubrs(); }
+ int ngsubrs() const { return ngsubrs_x(); }
+ Charstring *gsubr(int) const;
+ int gsubr_bias() const;
+
+ private:
+
+ Cff* _cff;
+ int _charstring_type;
+ int _error;
+ int _font_index;
+
+ FontParent(const FontParent &);
+ FontParent &operator=(const FontParent &);
+
+ Charstring *charstring(const IndexIterator &, int) const;
+
+ friend class Cff;
+ friend class Cff::Font;
+ friend class Cff::CIDFont;
+ friend class Cff::ChildFont;
+
+};
+
+class Cff::CIDFont : public Cff::FontParent { public:
+
+ CIDFont(Cff* cff, PermString, const Dict &, ErrorHandler *);
+ ~CIDFont();
+
+ PermString font_name() const { return _font_name; }
+ void font_matrix(double[6]) const;
+
+ int nglyphs() const { return _charstrings_index.nitems(); }
+ PermString glyph_name(int) const;
+ void glyph_names(Vector<PermString> &) const;
+ Charstring *glyph(int) const;
+ Charstring *glyph(PermString) const;
+ int glyphid(PermString) const;
+ const CharstringProgram *child_program(int) const;
+
+ bool dict_has(DictOperator) const;
+ String dict_string(DictOperator) const;
+ bool dict_value(DictOperator, double *) const;
+ bool dict_xvalue(DictOperator, double, double *) const;
+ bool dict_value(DictOperator, Vector<double> &) const;
+
+ private:
+
+ PermString _font_name;
+
+ Dict _top_dict;
+ Dict _private_dict;
+
+ Cff::Charset _charset;
+
+ IndexIterator _charstrings_index;
+ mutable Vector<Charstring *> _charstrings_cs;
+
+ Vector<ChildFont *> _child_fonts;
+ Cff::FDSelect _fdselect;
+
+ const Dict &dict_of(DictOperator) const;
+
+};
+
+class Cff::ChildFont : public Cff::FontParent { public:
+
+ ChildFont(Cff* cff, Cff::CIDFont *, int charstring_type, const Dict &, ErrorHandler * = 0);
+ ~ChildFont();
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ PermString font_name() const { return _parent->font_name(); }
+ void font_matrix(double m[6]) const { _parent->font_matrix(m); }
+
+ inline bool cid() const;
+
+ int nsubrs_x() const { return _subrs_index.nitems(); }
+ int nsubrs() const { return nsubrs_x(); }
+ Charstring *subr(int) const;
+ int subr_bias() const;
+
+ int nglyphs() const { return _parent->nglyphs(); }
+ PermString glyph_name(int gi) const { return _parent->glyph_name(gi); }
+ void glyph_names(Vector<PermString> &v) const { _parent->glyph_names(v); }
+ Charstring *glyph(int gi) const { return _parent->glyph(gi); }
+ Charstring *glyph(PermString n) const { return _parent->glyph(n); }
+
+ double global_width_x(bool) const;
+
+ private:
+
+ Cff::CIDFont *_parent;
+
+ Dict _top_dict;
+ Dict _private_dict;
+
+ IndexIterator _subrs_index;
+ mutable Vector<Charstring *> _subrs_cs;
+
+ double _default_width_x;
+ double _nominal_width_x;
+
+ ChildFont(const ChildFont &); // does not exist
+ ChildFont &operator=(const ChildFont &); // does not exist
+
+ Charstring *charstring(const IndexIterator &, int) const;
+
+ friend class Cff::Font;
+
+};
+
+class Cff::Font : public Cff::ChildFont { public:
+
+ Font(Cff* cff, PermString, const Dict &, ErrorHandler *);
+ ~Font();
+
+ PermString font_name() const { return _font_name; }
+ void font_matrix(double[6]) const;
+
+ int nglyphs() const { return _charstrings_index.nitems(); }
+ PermString glyph_name(int) const;
+ void glyph_names(Vector<PermString> &) const;
+ Charstring *glyph(int) const;
+ Charstring *glyph(PermString) const;
+ int glyphid(PermString) const;
+
+ Type1Encoding *type1_encoding() const;
+ Type1Encoding *type1_encoding_copy() const;
+
+ bool dict_has(DictOperator) const;
+ String dict_string(DictOperator) const;
+ inline bool dict_value(DictOperator, double *) const;
+ inline bool dict_value(DictOperator, Vector<double> &) const;
+ const Dict &top_dict() const { return _top_dict; }
+
+ private:
+
+ PermString _font_name;
+
+ Cff::Charset _charset;
+
+ IndexIterator _charstrings_index;
+ mutable Vector<Charstring *> _charstrings_cs;
+
+ int _encoding_pos;
+ int _encoding[256];
+ mutable Type1Encoding *_t1encoding;
+
+ int parse_encoding(int pos, ErrorHandler *);
+ int assign_standard_encoding(const int *standard_encoding);
+
+ inline const Dict &dict_of(DictOperator) const;
+
+};
+
+
+inline uint32_t Cff::IndexIterator::offset_at(const uint8_t *x) const
+{
+ switch (_offsize) {
+ case 0:
+ return 0;
+ case 1:
+ return x[0];
+ case 2:
+ return (x[0] << 8) | x[1];
+ case 3:
+ return (x[0] << 16) | (x[1] << 8) | x[2];
+ default:
+ return (x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3];
+ }
+}
+
+inline const uint8_t *Cff::IndexIterator::operator*() const
+{
+ assert(live());
+ return _contents + offset_at(_offset);
+}
+
+inline const uint8_t *Cff::IndexIterator::operator[](int which) const
+{
+ assert(live() && _offset + which * _offsize <= _last_offset);
+ return _contents + offset_at(_offset + which * _offsize);
+}
+
+inline int Cff::Charset::gid_to_sid(int gid) const
+{
+ if (gid >= 0 && gid < _sids.size())
+ return _sids[gid];
+ else
+ return -1;
+}
+
+inline int Cff::Charset::sid_to_gid(int sid) const
+{
+ if (sid >= 0 && sid < _gids.size())
+ return _gids[sid];
+ else
+ return -1;
+}
+
+inline int Cff::FDSelect::gid_to_fd(int gid) const
+{
+ if (gid >= 0 && gid < _nglyphs)
+ return _fds[gid];
+ else
+ return -1;
+}
+
+inline bool Cff::Dict::has_first(DictOperator op) const
+{
+ return _operators.size() && _operators[0] == op;
+}
+
+inline const Cff::Dict &Cff::Font::dict_of(DictOperator op) const
+{
+ return (op >= 0 && op <= oLastOperator && (operator_types[op] & tP) ? _private_dict : _top_dict);
+}
+
+inline bool Cff::Font::dict_value(DictOperator op, double *val) const
+{
+ return dict_of(op).value(op, val);
+}
+
+inline bool Cff::Font::dict_value(DictOperator op, Vector<double> &val) const
+{
+ return dict_of(op).value(op, val);
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/encoding.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/encoding.hh
new file mode 100644
index 00000000000..eb7aa004f28
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/encoding.hh
@@ -0,0 +1,27 @@
+// -*- related-file-name: "../../libefont/encoding.cc" -*-
+#ifndef EFONT_ENCODING_HH
+#define EFONT_ENCODING_HH
+#include <lcdf/vector.hh>
+namespace Efont {
+typedef int GlyphIndex;
+
+class Encoding8 {
+
+ Vector<GlyphIndex> _codes;
+ Vector<int> _code_map;
+
+ public:
+
+ Encoding8() : _code_map(256, -1) { }
+
+ void reserve_glyphs(int);
+
+ int code(GlyphIndex gi) const { return _codes[gi]; }
+ GlyphIndex find_code(int c) const { return _code_map[c]; }
+
+ void set_code(GlyphIndex gi, int c) { _codes[gi] = c; _code_map[c] = gi; }
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/findmet.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/findmet.hh
new file mode 100644
index 00000000000..542ed6dddc6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/findmet.hh
@@ -0,0 +1,114 @@
+// -*- related-file-name: "../../libefont/findmet.cc" -*-
+#ifndef EFONT_FINDMET_HH
+#define EFONT_FINDMET_HH
+#include <lcdf/hashmap.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/permstr.hh>
+class Filename;
+class ErrorHandler;
+namespace Efont {
+class Metrics;
+class AmfmMetrics;
+class PsresDatabase;
+
+class MetricsFinder { public:
+
+ MetricsFinder() : _next(0), _prev(0) { }
+ virtual ~MetricsFinder();
+
+ MetricsFinder *next() const { return _next; }
+
+ void add_finder(MetricsFinder *);
+
+ Metrics *find_metrics(PermString, ErrorHandler * = 0);
+ AmfmMetrics *find_amfm(PermString, ErrorHandler * = 0);
+
+ virtual Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ virtual AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ void record(Metrics *m);
+ virtual void record(Metrics *, PermString);
+ virtual void record(AmfmMetrics *);
+
+ private:
+
+ MetricsFinder *_next;
+ MetricsFinder *_prev;
+
+ MetricsFinder(const MetricsFinder &) { }
+ MetricsFinder &operator=(const MetricsFinder &) { return *this; }
+
+ protected:
+
+ Metrics *try_metrics_file(const Filename &, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *try_amfm_file(const Filename &, MetricsFinder *, ErrorHandler *);
+
+};
+
+
+class CacheMetricsFinder: public MetricsFinder { public:
+
+ CacheMetricsFinder();
+ ~CacheMetricsFinder();
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+ void record(Metrics *, PermString);
+ void record(AmfmMetrics *);
+
+ void clear();
+
+ private:
+
+ HashMap<PermString, int> _metrics_map;
+ Vector<Metrics *> _metrics;
+ HashMap<PermString, int> _amfm_map;
+ Vector<AmfmMetrics *> _amfm;
+
+};
+
+
+class InstanceMetricsFinder: public MetricsFinder { public:
+
+ InstanceMetricsFinder(bool call_mmpfb = true);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ bool _call_mmpfb;
+
+ Metrics *find_metrics_instance(PermString, MetricsFinder *, ErrorHandler *);
+
+};
+
+
+class PsresMetricsFinder: public MetricsFinder { public:
+
+ PsresMetricsFinder(PsresDatabase *);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ PsresDatabase *_psres;
+
+};
+
+
+class DirectoryMetricsFinder: public MetricsFinder { public:
+
+ DirectoryMetricsFinder(PermString);
+
+ Metrics *find_metrics_x(PermString, MetricsFinder *, ErrorHandler *);
+ AmfmMetrics *find_amfm_x(PermString, MetricsFinder *, ErrorHandler *);
+
+ private:
+
+ PermString _directory;
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/metrics.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/metrics.hh
new file mode 100644
index 00000000000..82c5eb0d26f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/metrics.hh
@@ -0,0 +1,177 @@
+// -*- related-file-name: "../../libefont/metrics.cc" -*-
+#ifndef EFONT_METRICS_HH
+#define EFONT_METRICS_HH
+#include <lcdf/permstr.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/hashmap.hh>
+#include <efont/encoding.hh>
+#include <efont/pairop.hh>
+namespace Efont {
+class MetricsXt;
+
+class Metrics { public:
+
+ Metrics();
+ Metrics(PermString font_name, PermString full_name, const Metrics &);
+ ~Metrics();
+
+ void use() { _uses++; }
+ void unuse() { if (--_uses == 0) delete this; }
+
+ // GLOBALS
+
+ PermString font_name() const { return _font_name; }
+ PermString family() const { return _family; }
+ PermString full_name() const { return _full_name; }
+ PermString weight() const { return _weight; }
+ PermString version() const { return _version; }
+
+ void set_font_name(PermString);
+ void set_family(PermString s) { _family = s; }
+ void set_full_name(PermString s) { _full_name = s; }
+ void set_weight(PermString s) { _weight = s; }
+ void set_version(PermString s) { _version = s; }
+
+ // GLYPHS
+
+ int nglyphs() const { return _names.size(); }
+ PermString name(GlyphIndex gi) const { return _names[gi]; }
+ GlyphIndex find(PermString n) const { return _name_map[n]; }
+
+ int code(GlyphIndex gi) const { return _encoding.code(gi); }
+ GlyphIndex find_code(int c) const { return _encoding.find_code(c); }
+ void set_code(GlyphIndex gi, int c) { _encoding.set_code(gi, c); }
+
+ GlyphIndex add_glyph(PermString);
+ void reserve_glyphs(int);
+
+ // DIMENSIONS
+
+ double scale() const { return _scale; }
+ void set_scale(double d) { _scale = d; }
+
+ int nfd() const { return _fdv.size(); }
+ int nkv() const { return _kernv.size(); }
+
+ double fd(int i) const { return _fdv[i]; }
+ double wd(int i) const { return _wdv[i]; }
+ double lf(int i) const { return _lfv[i]; }
+ double rt(int i) const { return _rtv[i]; }
+ double tp(int i) const { return _tpv[i]; }
+ double bt(int i) const { return _btv[i]; }
+ double kv(int i) const { return _kernv[i]; }
+
+ double &fd(int i) { return _fdv[i]; }
+ double &wd(int i) { return _wdv[i]; }
+ double &lf(int i) { return _lfv[i]; }
+ double &rt(int i) { return _rtv[i]; }
+ double &tp(int i) { return _tpv[i]; }
+ double &bt(int i) { return _btv[i]; }
+ double &kv(int i) { return _kernv[i]; }
+
+ inline int add_kv(double d);
+
+ void interpolate_dimens(const Metrics &, double, bool increment);
+
+ // PAIR PROGRAM
+
+ PairProgram *pair_program() { return &_pairp; }
+ const PairProgram *pair_program() const { return &_pairp; }
+ inline bool add_kern(GlyphIndex, GlyphIndex, int);
+ inline bool add_lig(GlyphIndex, GlyphIndex, GlyphIndex, int = opLigSimple);
+
+ // EXTENSIONS
+
+ MetricsXt *find_xt(PermString name) const { return _xt[_xt_map[name]]; }
+ void add_xt(MetricsXt *);
+
+ private:
+
+ PermString _font_name;
+
+ PermString _family;
+ PermString _full_name;
+ PermString _weight;
+ PermString _version;
+
+ HashMap<PermString, GlyphIndex> _name_map;
+ Vector<PermString> _names;
+ Encoding8 _encoding;
+
+ double _scale;
+
+ Vector<double> _fdv;
+ Vector<double> _wdv;
+ Vector<double> _lfv;
+ Vector<double> _rtv;
+ Vector<double> _tpv;
+ Vector<double> _btv;
+
+ PairProgram _pairp;
+ Vector<double> _kernv;
+
+ HashMap<PermString, int> _xt_map;
+ Vector<MetricsXt *> _xt;
+
+ unsigned _uses;
+
+};
+
+
+class MetricsXt {
+
+ public:
+
+ MetricsXt() { }
+ virtual ~MetricsXt() { }
+
+ virtual PermString kind() const = 0;
+
+ virtual void reserve_glyphs(int) { }
+
+};
+
+
+enum FontDimensionDefs {
+
+ fdCapHeight = 0,
+ fdXHeight,
+ fdAscender,
+ fdDescender,
+
+ fdItalicAngle,
+ fdUnderlinePosition,
+ fdUnderlineThickness,
+
+ fdFontBBllx,
+ fdFontBBlly,
+ fdFontBBurx,
+ fdFontBBury,
+
+ fdStdHW,
+ fdStdVW,
+
+ fdLast
+
+};
+
+
+inline bool Metrics::add_kern(GlyphIndex g1, GlyphIndex g2, int ki)
+{
+ return _pairp.add_kern(g1, g2, ki);
+}
+
+inline bool Metrics::add_lig(GlyphIndex g1, GlyphIndex g2, GlyphIndex gr, int kind)
+{
+ return _pairp.add_lig(g1, g2, gr, kind);
+}
+
+inline int Metrics::add_kv(double d)
+{
+ int k = _kernv.size();
+ _kernv.push_back(d);
+ return k;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh
new file mode 100644
index 00000000000..cdf7a58daca
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otf.hh
@@ -0,0 +1,371 @@
+// -*- related-file-name: "../../libefont/otf.cc" -*-
+#ifndef EFONT_OTF_HH
+#define EFONT_OTF_HH
+#include <efont/otfdata.hh>
+#include <lcdf/hashcode.hh>
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+class Post;
+class Name;
+
+typedef int Glyph; // 16-bit integer
+
+class Tag {
+ public:
+ Tag() : _tag(0U) { }
+ explicit Tag(uint32_t tag) : _tag(tag) { }
+ Tag(const char *name);
+ Tag(const String &name);
+ // default destructor
+
+ static Tag head_tag() { return Tag(0x68656164U); }
+
+ typedef bool (Tag::*unspecified_bool_type)() const;
+ bool null() const { return _tag == 0; }
+ operator unspecified_bool_type() const {
+ return _tag != 0 ? &Tag::null : 0;
+ }
+ bool valid() const;
+
+ uint32_t value() const { return _tag; }
+
+ String text() const;
+ static String langsys_text(Tag script, Tag langsys = Tag());
+
+ const uint8_t* table_entry(const uint8_t* table, int n, int entry_size) const;
+
+ const char* script_description() const;
+ const char* language_description() const;
+ const char* feature_description() const;
+
+ private:
+ uint32_t _tag;
+};
+
+inline hashcode_t hashcode(const Tag& t) {
+ return t.value();
+}
+
+class Font {
+ public:
+ Font(const String& str, ErrorHandler* errh = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ bool check_checksums(ErrorHandler* errh = 0) const;
+ int error() const { return _error; }
+
+ const String& data_string() const { return _str; }
+ const uint8_t* data() const { return _str.udata(); }
+ int length() const { return _str.length(); }
+
+ unsigned units_per_em() const { return _units_per_em; }
+
+ int ntables() const;
+ bool has_table(Tag tag) const;
+ String table(Tag tag) const;
+ uint32_t table_checksum(Tag tag) const;
+ Tag table_tag(int i) const;
+
+ static uint32_t checksum(const uint8_t *, const uint8_t *);
+ static uint32_t checksum(const String &);
+ static Font make(bool truetype, const Vector<Tag>& tags, const Vector<String>& data);
+
+ enum { HEADER_SIZE = 12, TABLE_DIR_ENTRY_SIZE = 16 };
+
+ private:
+ String _str;
+ int _error;
+ unsigned _units_per_em;
+
+ int parse_header(ErrorHandler*);
+};
+
+class ScriptList {
+ public:
+ ScriptList() { }
+ inline ScriptList(const String&, ErrorHandler* = 0);
+ int assign(const String&, ErrorHandler* = 0);
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+
+ int language_systems(Vector<Tag>& scripts, Vector<Tag>& langsys, ErrorHandler* = 0) const;
+ int features(Tag script, Tag langsys, int& required_fid, Vector<int>& fids, ErrorHandler* = 0, bool clear_fids = true) const;
+
+ private:
+ enum { SCRIPTLIST_HEADERSIZE = 2, SCRIPT_RECSIZE = 6,
+ SCRIPT_HEADERSIZE = 4, LANGSYS_RECSIZE = 6,
+ LANGSYS_HEADERSIZE = 6, FEATURE_RECSIZE = 2 };
+
+ String _str;
+
+ int check_header(ErrorHandler*);
+ int script_offset(Tag) const;
+ int check_script(Tag, int, ErrorHandler*) const;
+ int langsys_offset(Tag, Tag, ErrorHandler* = 0) const;
+};
+
+class FeatureList {
+ public:
+ FeatureList() { }
+ inline FeatureList(const String&, ErrorHandler* = 0);
+ int assign(const String&, ErrorHandler* = 0);
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+
+ Tag tag(int fid) const;
+ String params(int fid, int length, ErrorHandler* = 0, bool old_style_offset = false) const;
+ String size_params(int fid, const Name& name, ErrorHandler* = 0) const;
+ int lookups(int fid, Vector<int>& results, ErrorHandler* = 0, bool clear_results = true) const;
+
+ int find(Tag, const Vector<int>& fids) const;
+ void filter(Vector<int>& fids, const Vector<Tag>& sorted_ftags) const;
+ inline void filter(Vector<int>& fids, Tag ftag) const;
+
+ int lookups(const Vector<int>& fids, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(const Vector<int>& required_fids, const Vector<int>& fids, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(int required_fid, const Vector<int>& fids, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+ int lookups(const ScriptList&, Tag script, Tag langsys, const Vector<Tag>& sorted_ftags, Vector<int>& results, ErrorHandler* = 0) const;
+
+ private:
+ enum { FEATURELIST_HEADERSIZE = 2, FEATURE_RECSIZE = 6,
+ FEATURE_HEADERSIZE = 4, LOOKUPLIST_RECSIZE = 2 };
+
+ String _str;
+
+ int check_header(ErrorHandler*);
+ int script_offset(Tag) const;
+ int langsys_offset(Tag, Tag, ErrorHandler* = 0) const;
+};
+
+class Coverage {
+ public:
+ Coverage() noexcept; // empty coverage
+ Coverage(Glyph first, Glyph last) noexcept; // range coverage
+ Coverage(const Vector<bool> &gmap) noexcept; // used-bytemap coverage
+ Coverage(const String &str, ErrorHandler *errh = 0, bool check = true) noexcept;
+ // default destructor
+
+ bool ok() const noexcept { return _str.length() > 0; }
+ int size() const noexcept;
+ bool has_fast_covers() const noexcept {
+ return _str.length() > 0 && _str.data()[1] == T_X_BYTEMAP;
+ }
+
+ int coverage_index(Glyph) const noexcept;
+ bool covers(Glyph g) const noexcept { return coverage_index(g) >= 0; }
+
+ void unparse(StringAccum&) const noexcept;
+ String unparse() const noexcept;
+
+ class iterator { public:
+ iterator() : _pos(0), _value(0) { }
+ // private constructor
+ // default destructor
+
+ bool ok() const { return _pos < _str.length(); }
+ operator bool() const { return ok(); }
+
+ Glyph operator*() const { return _value; }
+ Glyph value() const { return _value; }
+ int coverage_index() const;
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+ bool forward_to(Glyph);
+
+ // XXX should check iterators are of same type
+ bool operator<(const iterator& o) { return _value < o._value; }
+ bool operator<=(const iterator& o) { return _value <= o._value; }
+ bool operator>=(const iterator& o) { return _value >= o._value; }
+ bool operator>(const iterator& o) { return _value > o._value; }
+ bool operator==(const iterator& o) { return _value == o._value; }
+ bool operator!=(const iterator& o) { return _value != o._value; }
+
+ private:
+ String _str;
+ int _pos;
+ Glyph _value;
+ friend class Coverage;
+ iterator(const String &str, bool is_end);
+ };
+
+ iterator begin() const { return iterator(_str, false); }
+ iterator end() const { return iterator(_str, true); }
+ Glyph operator[](int) const noexcept;
+
+ enum { T_LIST = 1, T_RANGES = 2, T_X_BYTEMAP = 3,
+ HEADERSIZE = 4, LIST_RECSIZE = 2, RANGES_RECSIZE = 6 };
+
+ private:
+ String _str;
+
+ int check(ErrorHandler*);
+};
+
+Coverage operator&(const Coverage&, const Coverage&);
+bool operator<=(const Coverage&, const Coverage&);
+
+inline bool operator>=(const Coverage& a, const Coverage& b) {
+ return b <= a;
+}
+
+class GlyphSet {
+ public:
+ GlyphSet();
+ GlyphSet(const GlyphSet&);
+ ~GlyphSet();
+
+ inline bool covers(Glyph g) const;
+ inline bool operator[](Glyph g) const;
+ int change(Glyph, bool);
+ void insert(Glyph g) { change(g, true); }
+ void remove(Glyph g) { change(g, false); }
+
+ GlyphSet& operator=(const GlyphSet&);
+
+ private:
+ enum { GLYPHBITS = 16, SHIFT = 8,
+ MAXGLYPH = (1 << GLYPHBITS) - 1, UNSHIFT = GLYPHBITS - SHIFT,
+ MASK = (1 << UNSHIFT) - 1, VLEN = (1 << SHIFT),
+ VULEN = (1 << UNSHIFT) >> 5
+ };
+
+ uint32_t* _v[VLEN];
+};
+
+class ClassDef {
+ public:
+ ClassDef(const String&, ErrorHandler* = 0) noexcept;
+ // default destructor
+
+ bool ok() const { return _str.length() > 0; }
+ int nclass() const noexcept;
+
+ int lookup(Glyph) const noexcept;
+ int operator[](Glyph g) const noexcept { return lookup(g); }
+
+ void unparse(StringAccum&) const noexcept;
+ String unparse() const noexcept;
+
+ class class_iterator {
+ public:
+ // private constructor
+ // default destructor
+
+ bool ok() const { return _pos < _str.length(); }
+ operator bool() const { return ok(); }
+
+ Glyph operator*() const { return *_coviter; }
+ Glyph value() const { return *_coviter; }
+ int class_value() const { return _class; }
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+
+ // XXX should check iterators are of same type
+ bool operator<(const class_iterator& o) { return _coviter < o._coviter; }
+ bool operator<=(const class_iterator& o) { return _coviter <= o._coviter; }
+ bool operator>=(const class_iterator& o) { return _coviter >= o._coviter; }
+ bool operator>(const class_iterator& o) { return _coviter > o._coviter; }
+ bool operator==(const class_iterator& o) { return _coviter == o._coviter; }
+ bool operator!=(const class_iterator& o) { return _coviter != o._coviter; }
+
+ private:
+ String _str;
+ int _pos;
+ int _class;
+ Coverage::iterator _coviter;
+ friend class ClassDef;
+ class_iterator(const String&, int, int, const Coverage::iterator&);
+ void increment_class0();
+ enum { FIRST_POS = -1, LAST_POS = -2 };
+ };
+
+ // XXX does not work correctly for class 0
+ class_iterator begin(int c) const { return class_iterator(_str, 0, c, Coverage::iterator()); }
+ class_iterator begin(int c, const Coverage& coverage) const { return class_iterator(_str, 0, c, coverage.begin()); }
+ class_iterator end(int c) const { return class_iterator(_str, _str.length(), c, Coverage::iterator()); }
+
+ enum { T_LIST = 1, T_RANGES = 2,
+ LIST_HEADERSIZE = 6, LIST_RECSIZE = 2,
+ RANGES_HEADERSIZE = 4, RANGES_RECSIZE = 6 };
+
+ private:
+ String _str;
+
+ int check(ErrorHandler*);
+};
+
+extern Vector<PermString> debug_glyph_names;
+
+
+inline bool operator==(Tag t1, uint32_t t2) {
+ return t1.value() == t2;
+}
+
+inline bool operator!=(Tag t1, uint32_t t2) {
+ return t1.value() != t2;
+}
+
+inline bool operator<(Tag t1, uint32_t t2) {
+ return t1.value() < t2;
+}
+
+inline bool operator>(Tag t1, uint32_t t2) {
+ return t1.value() > t2;
+}
+
+inline bool operator<=(Tag t1, uint32_t t2) {
+ return t1.value() <= t2;
+}
+
+inline bool operator>=(Tag t1, uint32_t t2) {
+ return t1.value() >= t2;
+}
+
+inline bool operator==(Tag t1, Tag t2) {
+ return t1.value() == t2.value();
+}
+
+inline bool operator!=(Tag t1, Tag t2) {
+ return t1.value() != t2.value();
+}
+
+inline bool operator<(Tag t1, Tag t2) {
+ return t1.value() < t2.value();
+}
+
+inline ScriptList::ScriptList(const String& str, ErrorHandler* errh) {
+ assign(str, errh);
+}
+
+inline FeatureList::FeatureList(const String& str, ErrorHandler* errh) {
+ assign(str, errh);
+}
+
+inline void FeatureList::filter(Vector<int>& fids, Tag ftag) const {
+ Vector<Tag> tags;
+ tags.push_back(ftag);
+ filter(fids, tags);
+}
+
+inline bool GlyphSet::covers(Glyph g) const {
+ if ((unsigned)g > MAXGLYPH)
+ return false;
+ else if (const uint32_t* u = _v[g >> SHIFT])
+ return (u[(g & MASK) >> 5] & (1 << (g & 0x1F))) != 0;
+ else
+ return false;
+}
+
+inline bool GlyphSet::operator[](Glyph g) const {
+ return covers(g);
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfcmap.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfcmap.hh
new file mode 100644
index 00000000000..1fdce99802d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfcmap.hh
@@ -0,0 +1,60 @@
+// -*- related-file-name: "../../libefont/otfcmap.cc" -*-
+#ifndef EFONT_OTFCMAP_HH
+#define EFONT_OTFCMAP_HH
+#include <efont/otf.hh>
+#include <lcdf/error.hh>
+#include <utility>
+namespace Efont { namespace OpenType {
+
+class Cmap { public:
+
+ Cmap(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ inline Glyph map_uni(uint32_t c) const;
+ int map_uni(const Vector<uint32_t> &in, Vector<Glyph> &out) const;
+ inline void unmap_all(Vector<std::pair<uint32_t, Glyph> > &ugp) const;
+
+ private:
+
+ String _str;
+ int _error;
+ int _ntables;
+ mutable int _first_unicode_table;
+ mutable Vector<int> _table_error;
+
+ enum { HEADER_SIZE = 4, ENCODING_SIZE = 8,
+ HIBYTE_SUBHEADERS = 524 };
+ enum Format { F_BYTE = 0, F_HIBYTE = 2, F_SEGMENTED = 4, F_TRIMMED = 6,
+ F_HIBYTE32 = 8, F_TRIMMED32 = 10, F_SEGMENTED32 = 12 };
+ enum { USE_FIRST_UNICODE_TABLE = -2 };
+
+ int parse_header(ErrorHandler *);
+ int first_unicode_table() const { return _first_unicode_table; }
+ int first_table(int platform, int encoding) const;
+ int check_table(int t, ErrorHandler * = 0) const;
+ Glyph map_table(int t, uint32_t, ErrorHandler * = 0) const;
+ void dump_table(int t, Vector<std::pair<uint32_t, Glyph> > &ugp, ErrorHandler * = 0) const;
+ inline const uint8_t* table_data(int t) const;
+
+};
+
+
+inline Glyph Cmap::map_uni(uint32_t c) const {
+ return map_table(USE_FIRST_UNICODE_TABLE, c, ErrorHandler::default_handler());
+}
+
+inline void Cmap::unmap_all(Vector<std::pair<uint32_t, Glyph> > &ugp) const {
+ dump_table(USE_FIRST_UNICODE_TABLE, ugp, ErrorHandler::default_handler());
+}
+
+inline const uint8_t* Cmap::table_data(int t) const {
+ const uint8_t* data = _str.udata();
+ return data + Data::u32_aligned(data + HEADER_SIZE + t * ENCODING_SIZE + 4);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh
new file mode 100644
index 00000000000..2dfe24a1c18
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfdata.hh
@@ -0,0 +1,216 @@
+// -*- related-file-name: "../../libefont/otfdata.cc" -*-
+#ifndef EFONT_OTFDATA_HH
+#define EFONT_OTFDATA_HH
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/inttypes.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if NEED_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#if HAVE_BYTEORDER_H
+# include <byteorder.h>
+#elif HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#elif !defined(WIN32)
+# error "configury disaster! Report this error to ekohler@gmail.com"
+#endif
+#ifdef WIN32
+# ifdef __MSC_VER
+# pragma warning (disable: 4290)
+# endif
+# include <winsock2.h>
+#endif
+class ErrorHandler;
+namespace Efont { namespace OpenType {
+
+#if HAVE_PRECONDITION_CHECKING
+#define efont_precondition(x) assert((x))
+#else
+#define efont_precondition(x)
+#endif
+
+class Error {
+ public:
+ String description;
+ Error() : description(String::make_stable("unspecified error")) { }
+ Error(const String &d) : description(d) { }
+};
+
+class Bounds : public Error {
+ public:
+ Bounds() : Error(String::make_stable("bounds error")) { }
+};
+
+class Format : public Error {
+ public:
+ Format(const String& name) : Error(name + " format error") { }
+ Format(const String& name, const String& type)
+ : Error(name + " " + type + " format error") { }
+};
+
+class BlankTable : public Format {
+ public:
+ BlankTable(const String& name) : Format(name, "blank table") { }
+};
+
+class Data {
+ public:
+ Data() { }
+ Data(const String& str) : _str(str) { _str.align(2); }
+ // default copy constructor
+ // default destructor
+
+ const String& string() const { return _str; }
+ operator const String&() const { return _str; }
+
+ operator String::unspecified_bool_type() const { return _str; }
+ const uint8_t *udata() const { return _str.udata(); }
+ int length() const { return _str.length(); }
+
+ static inline uint16_t u16(const unsigned char* s);
+ static inline uint16_t u16_aligned(const unsigned char* s);
+ static inline int16_t s16(const unsigned char* s);
+ static inline int16_t s16_aligned(const unsigned char* s);
+ static inline uint32_t u32(const unsigned char* s);
+ static inline uint32_t u32_aligned16(const unsigned char* s);
+ static inline uint32_t u32_aligned(const unsigned char* s);
+ static inline int32_t s32(const unsigned char* s);
+ static inline int32_t s32_aligned16(const unsigned char* s);
+ static inline int32_t s32_aligned(const unsigned char* s);
+
+ inline uint8_t operator[](unsigned offset) const;
+ inline uint16_t u16(unsigned offset) const;
+ inline int16_t s16(unsigned offset) const;
+ inline uint32_t u32(unsigned offset) const;
+ inline int32_t s32(unsigned offset) const;
+ inline uint8_t operator[](int offset) const;
+ inline uint16_t u16(int offset) const;
+ inline int16_t s16(int offset) const;
+ inline uint32_t u32(int offset) const;
+ inline int32_t s32(int offset) const;
+
+ Data subtable(unsigned offset) const;
+ Data offset_subtable(unsigned offset_offset) const;
+ inline Data substring(int left, int len = -1) const noexcept;
+
+ void align_long() { _str.align(4); }
+
+ private:
+
+ String _str;
+
+};
+
+inline uint8_t Data::operator[](unsigned offset) const {
+ if (offset >= static_cast<unsigned>(_str.length()))
+ throw Bounds();
+ else
+ return _str[offset];
+}
+
+inline uint16_t Data::u16(const unsigned char* s) {
+ return (s[0] << 8) + s[1];
+}
+
+inline uint16_t Data::u16_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return ntohs(*reinterpret_cast<const uint16_t*>(s));
+}
+
+inline int16_t Data::s16(const unsigned char* s) {
+ return (int16_t) ((s[0] << 8) + s[1]);
+}
+
+inline int16_t Data::s16_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return ntohs(*reinterpret_cast<const int16_t*>(s));
+}
+
+inline uint32_t Data::u32(const unsigned char* s) {
+ return ((unsigned) s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+}
+
+inline uint32_t Data::u32_aligned16(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return ((unsigned) u16_aligned(s) << 16) + u16_aligned(s + 2);
+}
+
+inline uint32_t Data::u32_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 3) == 0);
+ return ntohl(*reinterpret_cast<const uint32_t*>(s));
+}
+
+inline int32_t Data::s32(const unsigned char* s) {
+ return (int32_t) (((unsigned) s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]);
+}
+
+inline int32_t Data::s32_aligned16(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 1) == 0);
+ return (int32_t) (((unsigned) u16_aligned(s) << 16) + u16_aligned(s + 2));
+}
+
+inline int32_t Data::s32_aligned(const unsigned char* s) {
+ efont_precondition((reinterpret_cast<uintptr_t>(s) & 3) == 0);
+ return ntohl(*reinterpret_cast<const int32_t*>(s));
+}
+
+inline uint16_t Data::u16(unsigned offset) const {
+ if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
+ throw Bounds();
+ else
+ return u16_aligned(_str.udata() + offset);
+}
+
+inline int16_t Data::s16(unsigned offset) const {
+ if (offset + 1 >= static_cast<unsigned>(_str.length()) || offset + 1 == 0)
+ throw Bounds();
+ else
+ return s16_aligned(_str.udata() + offset);
+}
+
+inline uint32_t Data::u32(unsigned offset) const {
+ if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
+ throw Bounds();
+ else
+ return u32_aligned16(_str.udata() + offset);
+}
+
+inline int32_t Data::s32(unsigned offset) const {
+ if (offset + 3 >= static_cast<unsigned>(_str.length()) || offset + 3 < 3)
+ throw Bounds();
+ else
+ return s32_aligned16(_str.udata() + offset);
+}
+
+inline uint8_t Data::operator[](int offset) const {
+ return (*this)[unsigned(offset)];
+}
+
+inline uint16_t Data::u16(int offset) const {
+ return u16(unsigned(offset));
+}
+
+inline int16_t Data::s16(int offset) const {
+ return s16(unsigned(offset));
+}
+
+inline uint32_t Data::u32(int offset) const {
+ return u32(unsigned(offset));
+}
+
+inline int32_t Data::s32(int offset) const {
+ return s32(unsigned(offset));
+}
+
+inline Data Data::substring(int left, int len) const noexcept {
+ return Data(_str.substring(left, len));
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh
new file mode 100644
index 00000000000..6d1088a97fa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgpos.hh
@@ -0,0 +1,249 @@
+// -*- related-file-name: "../../libefont/otfgpos.cc" -*-
+#ifndef EFONT_OTFGPOS_HH
+#define EFONT_OTFGPOS_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont { namespace OpenType {
+class GposLookup;
+class Positioning;
+
+class Gpos { public:
+
+ Gpos(const Data &, ErrorHandler * = 0);
+ // default destructor
+
+ const ScriptList &script_list() const { return _script_list; }
+ const FeatureList &feature_list() const { return _feature_list; }
+
+ int nlookups() const;
+ GposLookup lookup(unsigned) const;
+
+ enum { HEADERSIZE = 10 };
+
+ private:
+
+ ScriptList _script_list;
+ FeatureList _feature_list;
+ Data _lookup_list;
+
+};
+
+class GposLookup { public:
+ GposLookup(const Data &);
+ int type() const { return _type; }
+ uint16_t flags() const { return _d.u16(2); }
+ bool unparse_automatics(Vector<Positioning> &, ErrorHandler * = 0) const;
+ enum {
+ HEADERSIZE = 6, RECSIZE = 2,
+ L_SINGLE = 1, L_PAIR = 2, L_CURSIVE = 3, L_MARKTOBASE = 4,
+ L_MARKTOLIGATURE = 5, L_MARKTOMARK = 6, L_CONTEXT = 7,
+ L_CHAIN = 8, L_EXTENSION = 9
+ };
+ private:
+ Data _d;
+ int _type;
+ Data subtable(int i) const;
+};
+
+class GposValue { public:
+ static inline int size(uint16_t format);
+ static inline int16_t xplacement(uint16_t format, const Data &);
+ static inline int16_t yplacement(uint16_t format, const Data &);
+ static inline int16_t xadvance(uint16_t format, const Data &);
+ static inline int16_t yadvance(uint16_t format, const Data &);
+ enum {
+ F_XPLACEMENT = 0x0001,
+ F_YPLACEMENT = 0x0002,
+ F_XADVANCE = 0x0004,
+ F_YADVANCE = 0x0008,
+ F_XPLACEMENT_DEVICE = 0x0010,
+ F_YPLACEMENT_DEVICE = 0x0020,
+ F_XADVANCE_DEVICE = 0x0040,
+ F_YADVANCE_DEVICE = 0x0080
+ };
+ private:
+ static const int nibble_bitcount_x2[];
+};
+
+class GposSingle { public:
+ GposSingle(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ void unparse(Vector<Positioning> &) const;
+ enum { F2_HEADERSIZE = 8 };
+ private:
+ Data _d;
+};
+
+class GposPair { public:
+ GposPair(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ void unparse(Vector<Positioning> &) const;
+ enum { F1_HEADERSIZE = 10, F1_RECSIZE = 2,
+ PAIRSET_HEADERSIZE = 2, PAIRVALUE_HEADERSIZE = 2,
+ F2_HEADERSIZE = 16 };
+ private:
+ Data _d;
+};
+
+struct Position {
+ Glyph g;
+ int pdx, pdy; // placement
+ int adx, ady; // advance
+ inline Position();
+ inline Position(Glyph, uint16_t format, const Data &);
+ inline Position(uint16_t format, const Data &);
+ inline Position(Glyph, const Position &);
+ inline Position(Glyph g, int pdx, int pdy, int adx, int ady);
+ bool empty() const { return pdx == 0 && pdy == 0 && adx == 0 && ady == 0; }
+ operator bool() const { return !empty(); }
+ bool h_empty() const { return pdx == 0 && pdy == 0 && adx == 0; }
+ bool placed() const { return pdx != 0 || pdy != 0; }
+ void unparse(StringAccum &, const Vector<PermString> * = 0) const;
+ String unparse(const Vector<PermString> * = 0) const;
+};
+
+class Positioning { public:
+
+ Positioning();
+
+ // single positioning
+ inline Positioning(const Position &);
+
+ // pair positioning
+ inline Positioning(const Position &, const Position &);
+
+ bool context_in(const Coverage &) const;
+ bool context_in(const GlyphSet &) const;
+
+ // types
+ inline operator bool() const;
+ inline bool is_single() const;
+ inline bool is_pair() const;
+ inline bool is_pairkern() const;
+
+ // extract data
+ const Position &left() const { return _left; }
+ Glyph left_glyph() const { return _left.g; }
+ const Position &right() const { return _right; }
+ Glyph right_glyph() const { return _right.g; }
+ inline void all_in_glyphs(Vector<Glyph> &gs) const;
+
+ void unparse(StringAccum &, const Vector<PermString> * = 0) const;
+ String unparse(const Vector<PermString> * = 0) const;
+
+ private:
+
+ Position _left;
+ Position _right;
+
+};
+
+inline int GposValue::size(uint16_t format)
+{
+ return (nibble_bitcount_x2[format & 15] + nibble_bitcount_x2[(format>>4) & 15]);
+}
+
+inline int16_t GposValue::xplacement(uint16_t format, const Data &d)
+{
+ if (format & F_XPLACEMENT)
+ return d.s16(0);
+ else
+ return 0;
+}
+
+inline int16_t GposValue::yplacement(uint16_t format, const Data &d)
+{
+ if (format & F_YPLACEMENT)
+ return d.s16((format & F_XPLACEMENT ? 2 : 0));
+ else
+ return 0;
+}
+
+inline int16_t GposValue::xadvance(uint16_t format, const Data &d)
+{
+ if (format & F_XADVANCE)
+ return d.s16(nibble_bitcount_x2[format & (F_XADVANCE - 1)]);
+ else
+ return 0;
+}
+
+inline int16_t GposValue::yadvance(uint16_t format, const Data &d)
+{
+ if (format & F_YADVANCE)
+ return d.s16(nibble_bitcount_x2[format & (F_YADVANCE - 1)]);
+ else
+ return 0;
+}
+
+inline Position::Position()
+ : g(0)
+{
+}
+
+inline Position::Position(Glyph g_, uint16_t format, const Data &value)
+ : g(g_),
+ pdx(GposValue::xplacement(format, value)), pdy(GposValue::yplacement(format, value)),
+ adx(GposValue::xadvance(format, value)), ady(GposValue::yadvance(format, value))
+{
+}
+
+inline Position::Position(uint16_t format, const Data &value)
+ : g(0),
+ pdx(GposValue::xplacement(format, value)), pdy(GposValue::yplacement(format, value)),
+ adx(GposValue::xadvance(format, value)), ady(GposValue::yadvance(format, value))
+{
+}
+
+inline Position::Position(Glyph g_, const Position &p)
+ : g(g_), pdx(p.pdx), pdy(p.pdy), adx(p.adx), ady(p.ady)
+{
+}
+
+inline Position::Position(Glyph g_, int pdx_, int pdy_, int adx_, int ady_)
+ : g(g_), pdx(pdx_), pdy(pdy_), adx(adx_), ady(ady_)
+{
+}
+
+inline Positioning::Positioning(const Position &left)
+ : _left(left)
+{
+}
+
+inline Positioning::Positioning(const Position &left, const Position &right)
+ : _left(left), _right(right)
+{
+}
+
+inline Positioning::operator bool() const
+{
+ return _left.g != 0;
+}
+
+inline bool Positioning::is_single() const
+{
+ return _left.g != 0 && _right.g == 0;
+}
+
+inline bool Positioning::is_pair() const
+{
+ return _left.g != 0 && _right.g != 0;
+}
+
+inline bool Positioning::is_pairkern() const
+{
+ return _left.g != 0 && !_left.placed() && _right.g != 0 && _right.h_empty();
+}
+
+inline void Positioning::all_in_glyphs(Vector<Glyph> &gs) const
+{
+ gs.clear();
+ if (_left.g != 0)
+ gs.push_back(_left.g);
+ if (_right.g != 0)
+ gs.push_back(_right.g);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh
new file mode 100644
index 00000000000..79c1e9edd89
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfgsub.hh
@@ -0,0 +1,415 @@
+// -*- related-file-name: "../../libefont/otfgsub.cc" -*-
+#ifndef EFONT_OTFGSUB_HH
+#define EFONT_OTFGSUB_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont { namespace OpenType {
+class GsubLookup;
+class Substitution;
+
+class Gsub { public:
+
+ Gsub(const Data &, const Font *, ErrorHandler * = 0);
+ // default destructor
+
+ const ScriptList &script_list() const { return _script_list; }
+ const FeatureList &feature_list() const { return _feature_list; }
+ bool chaincontext_reverse_backtrack() const { return _chaincontext_reverse_backtrack; }
+
+ int nlookups() const;
+ GsubLookup lookup(unsigned) const;
+
+ enum { HEADERSIZE = 10 };
+
+ private:
+
+ ScriptList _script_list;
+ FeatureList _feature_list;
+ Data _lookup_list;
+ bool _chaincontext_reverse_backtrack;
+
+};
+
+class GsubLookup { public:
+ GsubLookup(const Data &);
+ int type() const { return _type; }
+ uint16_t flags() const { return _d.u16(2); }
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse_automatics(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum {
+ HEADERSIZE = 6, RECSIZE = 2,
+ L_SINGLE = 1, L_MULTIPLE = 2, L_ALTERNATE = 3, L_LIGATURE = 4,
+ L_CONTEXT = 5, L_CHAIN = 6, L_EXTENSION = 7, L_REVCHAIN = 8
+ };
+ private:
+ Data _d;
+ int _type;
+ Data subtable(int i) const;
+};
+
+class GsubSingle { public:
+ GsubSingle(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ Glyph map(Glyph) const;
+ void mark_out_glyphs(Vector<bool> &gmap) const;
+ void unparse(Vector<Substitution> &subs, const Coverage &limit) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum { HEADERSIZE = 6, FORMAT2_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubMultiple { public:
+ GsubMultiple(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ bool map(Glyph, Vector<Glyph> &) const;
+ void mark_out_glyphs(Vector<bool> &gmap) const;
+ void unparse(Vector<Substitution> &, bool alternate = false) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &, bool alternate = false) const;
+ enum { HEADERSIZE = 6, RECSIZE = 2,
+ SEQ_HEADERSIZE = 2, SEQ_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubLigature { public:
+ GsubLigature(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ bool map(const Vector<Glyph> &, Glyph &, int &) const;
+ void mark_out_glyphs(Vector<bool> &gmap) const;
+ void unparse(Vector<Substitution> &) const;
+ bool apply(const Glyph *, int pos, int n, Substitution &) const;
+ enum { HEADERSIZE = 6, RECSIZE = 2,
+ SET_HEADERSIZE = 2, SET_RECSIZE = 2,
+ LIG_HEADERSIZE = 4, LIG_RECSIZE = 2 };
+ private:
+ Data _d;
+};
+
+class GsubContext { public:
+ GsubContext(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse(const Gsub &gsub, Vector<Substitution> &out_subs, const Coverage &limit) const;
+ enum { F3_HSIZE = 6, SUBRECSIZE = 4 };
+ private:
+ Data _d;
+ static void subruleset_mark_out_glyphs(const Data &data, int nsub, int subtab_offset, const Gsub &gsub, Vector<bool> &gmap);
+ static bool f1_unparse(const Data& data,
+ int nsub, int subtab_offset,
+ const Gsub& gsub, Vector<Substitution>& outsubs,
+ Substitution prototype_sub);
+ static bool f3_unparse(const Data &data,
+ int nglyph, int glyphtab_offset, const Coverage &limit,
+ int nsub, int subtab_offset,
+ const Gsub &gsub, Vector<Substitution> &outsubs,
+ const Substitution &prototype_sub);
+ friend class GsubChainContext;
+};
+
+class GsubChainContext { public:
+ GsubChainContext(const Data &);
+ // default destructor
+ Coverage coverage() const noexcept;
+ void mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const;
+ bool unparse(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) const;
+ enum { F1_HEADERSIZE = 6, F1_RECSIZE = 2,
+ F1_SRS_HSIZE = 2, F1_SRS_RSIZE = 2,
+ F3_HSIZE = 4, F3_INPUT_HSIZE = 2, F3_LOOKAHEAD_HSIZE = 2, F3_SUBST_HSIZE = 2 };
+ private:
+ Data _d;
+ bool f1_unparse(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) const;
+ bool f3_unparse(const Gsub &gsub, Vector<Substitution> &subs, const Coverage &limit) const;
+};
+
+class Substitution { public:
+
+ Substitution();
+ Substitution(const Substitution &);
+
+ // single substitution
+ Substitution(Glyph in, Glyph out);
+
+ // multiple substitution
+ Substitution(Glyph in, const Vector<Glyph> &out, bool is_alternate = false);
+
+ // ligature substitution
+ Substitution(Glyph in1, Glyph in2, Glyph out);
+ Substitution(const Vector<Glyph> &in, Glyph out);
+ Substitution(int nin, const Glyph *in, Glyph out);
+
+ // space
+ Substitution(int nleft, int nin, int nout, int nright);
+
+ ~Substitution();
+
+ Substitution &operator=(const Substitution &);
+
+ bool context_in(const Coverage &) const;
+ bool context_in(const GlyphSet &) const;
+
+ // types
+ inline operator bool() const;
+ bool is_noop() const;
+ inline bool is_single() const;
+ inline bool is_multiple() const;
+ inline bool is_alternate() const;
+ inline bool is_ligature() const;
+ inline bool is_simple_context() const;
+ inline bool is_single_lcontext() const;
+ inline bool is_single_rcontext() const;
+ inline bool is_lcontext() const;
+ inline bool is_rcontext() const;
+
+ // extract data
+ inline Glyph left_glyph() const;
+ inline int left_nglyphs() const;
+ inline Glyph *left_glyphptr();
+ inline const Glyph *left_glyphptr() const;
+
+ inline Glyph in_glyph() const;
+ inline Glyph in_glyph(int pos) const;
+ inline bool in_glyphs(Vector<Glyph> &) const;
+ inline int in_nglyphs() const;
+ inline Glyph *in_glyphptr();
+ inline const Glyph *in_glyphptr() const;
+
+ inline bool in_matches(int pos, Glyph) const;
+
+ inline Glyph out_glyph() const;
+ inline Glyph out_glyph(int pos) const;
+ inline bool out_glyphs(Vector<Glyph> &) const;
+ inline Glyph *out_glyphptr();
+ inline const Glyph *out_glyphptr() const;
+
+ inline int out_nglyphs() const;
+ inline Glyph right_glyph() const;
+ inline Glyph *right_glyphptr();
+ inline const Glyph *right_glyphptr() const;
+
+ bool all_in_glyphs(Vector<Glyph> &gs) const;
+ bool all_out_glyphs(Vector<Glyph> &gs) const;
+
+ // alter
+ void add_outer_left(Glyph);
+ void remove_outer_left();
+ Substitution in_out_append_glyph(Glyph) const;
+ bool out_alter(const Substitution &, int) noexcept;
+ void add_outer_right(Glyph);
+ void remove_outer_right();
+
+ void unparse(StringAccum &, const Vector<PermString> * = &debug_glyph_names) const;
+ String unparse(const Vector<PermString> * = &debug_glyph_names) const;
+
+ private:
+
+ enum { T_NONE = 0, T_GLYPH, T_GLYPHS, T_COVERAGE };
+ typedef union {
+ Glyph gid;
+ Glyph *gids; // first entry is a count
+ Coverage *coverage;
+ } Substitute;
+
+ Substitute _left;
+ Substitute _in;
+ Substitute _out;
+ Substitute _right;
+
+ uint8_t _left_is;
+ uint8_t _in_is;
+ uint8_t _out_is;
+ uint8_t _right_is;
+
+ bool _alternate : 1;
+
+ static void clear(Substitute &, uint8_t &);
+ static void assign_space(Substitute &, uint8_t &, int);
+ static void assign(Substitute &, uint8_t &, Glyph);
+ static void assign(Substitute &, uint8_t &, int, const Glyph *);
+ static void assign(Substitute &, uint8_t &, const Coverage &);
+ static void assign(Substitute &, uint8_t &, const Substitute &, uint8_t);
+ static void assign_append(Substitute &, uint8_t &, const Substitute &, uint8_t, const Substitute &, uint8_t);
+ static void assign_append(Substitute &, uint8_t &, const Substitute &, uint8_t, Glyph);
+ static bool substitute_in(const Substitute &, uint8_t, const Coverage &);
+ static bool substitute_in(const Substitute &, uint8_t, const GlyphSet &);
+
+ static Glyph extract_glyph(const Substitute &, uint8_t) noexcept;
+ static Glyph extract_glyph(const Substitute &, int which, uint8_t) noexcept;
+ static bool extract_glyphs(const Substitute &, uint8_t, Vector<Glyph> &, bool coverage_ok) noexcept;
+ static Glyph *extract_glyphptr(const Substitute &, uint8_t) noexcept;
+ static int extract_nglyphs(const Substitute &, uint8_t, bool coverage_ok) noexcept;
+ static bool matches(const Substitute &, uint8_t, int pos, Glyph) noexcept;
+
+ static void unparse_glyphids(StringAccum &, const Substitute &, uint8_t, const Vector<PermString> *) noexcept;
+
+};
+
+inline Substitution::Substitution()
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE)
+{
+}
+
+/* Single 1: u16 format, offset coverage, u16 glyphdelta
+ Single 2: u16 format, offset coverage, u16 count, glyph subst[]
+ Multiple 1: u16 format, offset coverage, u16 count, offset sequence[];
+ sequence is: u16 count, glyph subst[]
+ Alternate 1: u16 format, offset coverage, u16 count, offset alternates[];
+ alternate is: u16 count, glyph alts[]
+ Ligature 1: u16 format, offset coverage, u16 count, offset sets[];
+ set is: u16 count, offset ligatures[];
+ ligature is: glyph result, u16 count, glyph components[]
+*/
+
+inline Substitution::operator bool() const
+{
+ return !(_left_is == T_NONE && _in_is == T_NONE && _out_is == T_NONE && _right_is == T_NONE);
+}
+
+inline bool Substitution::is_single() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_multiple() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPHS && _right_is == T_NONE && !_alternate;
+}
+
+inline bool Substitution::is_alternate() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPHS && _right_is == T_NONE && _alternate;
+}
+
+inline bool Substitution::is_ligature() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPHS && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_simple_context() const
+{
+ return _left_is != T_COVERAGE && (_in_is == T_GLYPH || _in_is == T_GLYPHS) && (_out_is == T_GLYPH || _out_is == T_GLYPHS) && _right_is != T_COVERAGE;
+}
+
+inline bool Substitution::is_single_lcontext() const
+{
+ return _left_is == T_GLYPH && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_NONE;
+}
+
+inline bool Substitution::is_single_rcontext() const
+{
+ return _left_is == T_NONE && _in_is == T_GLYPH && _out_is == T_GLYPH && _right_is == T_GLYPH;
+}
+
+inline Glyph Substitution::left_glyph() const
+{
+ return extract_glyph(_left, _left_is);
+}
+
+inline int Substitution::left_nglyphs() const
+{
+ return extract_nglyphs(_left, _left_is, false);
+}
+
+inline Glyph Substitution::in_glyph() const
+{
+ return extract_glyph(_in, _in_is);
+}
+
+inline Glyph Substitution::in_glyph(int which) const
+{
+ return extract_glyph(_in, which, _in_is);
+}
+
+inline bool Substitution::in_glyphs(Vector<Glyph> &v) const
+{
+ return extract_glyphs(_in, _in_is, v, true);
+}
+
+inline int Substitution::in_nglyphs() const
+{
+ return extract_nglyphs(_in, _in_is, true);
+}
+
+inline bool Substitution::in_matches(int pos, Glyph g) const
+{
+ return matches(_in, _in_is, pos, g);
+}
+
+inline Glyph Substitution::out_glyph() const
+{
+ return extract_glyph(_out, _out_is);
+}
+
+inline Glyph Substitution::out_glyph(int which) const
+{
+ return extract_glyph(_out, which, _out_is);
+}
+
+inline bool Substitution::out_glyphs(Vector<Glyph> &v) const
+{
+ return extract_glyphs(_out, _out_is, v, false);
+}
+
+inline int Substitution::out_nglyphs() const
+{
+ return extract_nglyphs(_out, _out_is, false);
+}
+
+inline Glyph Substitution::right_glyph() const
+{
+ return extract_glyph(_right, _right_is);
+}
+
+inline const Glyph *Substitution::left_glyphptr() const
+{
+ return extract_glyphptr(_left, _left_is);
+}
+
+inline Glyph *Substitution::left_glyphptr()
+{
+ return extract_glyphptr(_left, _left_is);
+}
+
+inline const Glyph *Substitution::in_glyphptr() const
+{
+ return extract_glyphptr(_in, _in_is);
+}
+
+inline Glyph *Substitution::in_glyphptr()
+{
+ return extract_glyphptr(_in, _in_is);
+}
+
+inline const Glyph *Substitution::out_glyphptr() const
+{
+ return extract_glyphptr(_out, _out_is);
+}
+
+inline Glyph *Substitution::out_glyphptr()
+{
+ return extract_glyphptr(_out, _out_is);
+}
+
+inline const Glyph *Substitution::right_glyphptr() const
+{
+ return extract_glyphptr(_right, _right_is);
+}
+
+inline Glyph *Substitution::right_glyphptr()
+{
+ return extract_glyphptr(_right, _right_is);
+}
+
+inline StringAccum &operator<<(StringAccum &sa, const Substitution &sub)
+{
+ sub.unparse(sa);
+ return sa;
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfname.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfname.hh
new file mode 100644
index 00000000000..692354f0f97
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfname.hh
@@ -0,0 +1,122 @@
+// -*- related-file-name: "../../libefont/otfname.cc" -*-
+#ifndef EFONT_OTFNAME_HH
+#define EFONT_OTFNAME_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh> // for ntohl()
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Name { public:
+
+ Name(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ enum NameID { N_COPYRIGHT = 0, N_FAMILY = 1, N_SUBFAMILY = 2,
+ N_UNIQUEID = 3, N_FULLNAME = 4, N_VERSION = 5,
+ N_POSTSCRIPT = 6, N_TRADEMARK = 7, N_MANUFACTURER = 8,
+ N_DESIGNER = 9, N_DESCRIPTION = 10, N_VENDOR_URL = 11,
+ N_DESIGNER_URL = 12, N_LICENSE_DESCRIPTION = 13,
+ N_LICENSE_URL = 14, N_PREF_FAMILY = 16,
+ N_PREF_SUBFAMILY = 17, N_MAC_COMPAT_FULLNAME = 18,
+ N_SAMPLE_TEXT = 19, N_POSTSCRIPT_CID = 20 };
+ enum Platform { P_UNICODE = 0, P_MACINTOSH = 1, P_MICROSOFT = 3,
+ E_MS_UNICODE_BMP = 1, E_MAC_ROMAN = 0,
+ L_MS_ENGLISH_AMERICAN = 0x409 };
+ enum { HEADER_SIZE = 6, NAMEREC_SIZE = 12 };
+
+ typedef uint8_t namerecord_t[NAMEREC_SIZE];
+ typedef const namerecord_t *const_iterator;
+
+ inline static int nameid(const namerecord_t &);
+ inline static int platform(const namerecord_t &);
+ inline static int encoding(const namerecord_t &);
+ inline static int language(const namerecord_t &);
+
+ inline const_iterator begin() const;
+ inline const_iterator end() const;
+ String name(const_iterator) const;
+ String utf8_name(const_iterator) const;
+ String english_name(int nameid) const;
+
+ // check version string for backwards compatibility
+ bool version_chaincontext_reverse_backtrack() const;
+
+ struct PlatformPred {
+ inline PlatformPred(int nameid, int platform = -1, int encoding = -1, int language = -1);
+ inline bool operator()(const namerecord_t &) const;
+ private:
+ int _nameid, _platform, _encoding, _language;
+ };
+
+ struct EnglishPlatformPred {
+ EnglishPlatformPred(int nameid) : _nameid(nameid) { }
+ inline bool operator()(const namerecord_t &) const;
+ private:
+ int _nameid;
+ };
+
+ private:
+
+ String _str;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+inline int Name::nameid(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr) + 6);
+}
+
+inline int Name::platform(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr));
+}
+
+inline int Name::encoding(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr) + 2);
+}
+
+inline int Name::language(const namerecord_t &nr) {
+ return Data::u16_aligned(reinterpret_cast<const unsigned char*>(&nr) + 4);
+}
+
+inline Name::const_iterator Name::begin() const {
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE);
+}
+
+inline Name::const_iterator Name::end() const {
+ if (_error >= 0) {
+ int count = Data::u16_aligned(_str.udata() + 2);
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE + NAMEREC_SIZE * count);
+ } else
+ return reinterpret_cast<const_iterator>(_str.udata() + HEADER_SIZE);
+}
+
+
+inline Name::PlatformPred::PlatformPred(int nid, int p, int e, int l)
+ : _nameid(nid), _platform(p), _encoding(e), _language(l) {
+}
+
+inline bool Name::PlatformPred::operator()(const namerecord_t &i) const {
+ return (_nameid == nameid(i))
+ && (_platform < 0 || _platform == platform(i))
+ && (_encoding < 0 || _encoding == encoding(i))
+ && (_language < 0 || _language == language(i));
+}
+
+inline bool Name::EnglishPlatformPred::operator()(const namerecord_t &i) const {
+ if (_nameid == nameid(i)) {
+ int p = platform(i), e = encoding(i), l = language(i);
+ return (p == P_MACINTOSH && e == E_MAC_ROMAN && l == 0)
+ || (p == P_MICROSOFT && e == E_MS_UNICODE_BMP && l == L_MS_ENGLISH_AMERICAN);
+ } else
+ return false;
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh
new file mode 100644
index 00000000000..c6bb5208aca
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfos2.hh
@@ -0,0 +1,94 @@
+// -*- related-file-name: "../../libefont/otfos2.cc" -*-
+#ifndef EFONT_OTFOS2_HH
+#define EFONT_OTFOS2_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Os2 { public:
+
+ Os2(const Data &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ enum Offsets { O_AVGCHARWIDTH = 2, O_SUBSCRIPTXSIZE = 10,
+ O_SUBSCRIPTYSIZE = 12, O_SUBSCRIPTXOFFSET = 14,
+ O_SUBSCRIPTYOFFSET = 16, O_SUPERSCRIPTXSIZE = 18,
+ O_SUPERSCRIPTYSIZE = 20, O_SUPERSCRIPTXOFFSET = 22,
+ O_SUPERSCRIPTYOFFSET = 24, O_STRIKEOUTSIZE = 26,
+ O_STRIKEOUTPOSITION = 28, O_VENDORID = 58,
+ O_TYPOASCENDER = 68, O_TYPODESCENDER = 70,
+ O_TYPOLINEGAP = 72, O_XHEIGHT = 86, O_CAPHEIGHT = 88,
+ O_LOWEROPTICALPOINTSIZE = 96, O_UPPEROPTICALPOINTSIZE = 98 };
+ enum { HEADER_SIZE = 2 };
+
+ inline int16_t typo_ascender() const;
+ inline int16_t typo_descender() const;
+ inline int16_t typo_line_gap() const;
+ inline int16_t x_height() const;
+ inline int16_t cap_height() const;
+ inline double lower_optical_point_size() const;
+ inline double upper_optical_point_size() const;
+ inline bool has_optical_point_size() const noexcept;
+ inline String vendor_id() const noexcept;
+
+ private:
+
+ Data _data;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+inline int16_t Os2::typo_ascender() const
+{
+ return _data.s16(O_TYPOASCENDER);
+}
+
+inline int16_t Os2::typo_descender() const
+{
+ return _data.s16(O_TYPODESCENDER);
+}
+
+inline int16_t Os2::typo_line_gap() const
+{
+ return _data.s16(O_TYPOLINEGAP);
+}
+
+inline int16_t Os2::x_height() const
+{
+ return _data.s16(O_XHEIGHT);
+}
+
+inline int16_t Os2::cap_height() const
+{
+ return _data.s16(O_CAPHEIGHT);
+}
+
+inline double Os2::lower_optical_point_size() const
+{
+ return _data.u16(O_LOWEROPTICALPOINTSIZE) / 20.;
+}
+
+inline double Os2::upper_optical_point_size() const
+{
+ return _data.u16(O_UPPEROPTICALPOINTSIZE) / 20.;
+}
+
+inline bool Os2::has_optical_point_size() const noexcept
+{
+ return _data.length() >= O_UPPEROPTICALPOINTSIZE + 2;
+}
+
+inline String Os2::vendor_id() const noexcept
+{
+ return _data.substring(O_VENDORID, 4).string();
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfpost.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfpost.hh
new file mode 100644
index 00000000000..57564efc6a3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/otfpost.hh
@@ -0,0 +1,62 @@
+// -*- related-file-name: "../../libefont/otfpost.cc" -*-
+#ifndef EFONT_OTFPOST_HH
+#define EFONT_OTFPOST_HH
+#include <efont/otfdata.hh>
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Post { public:
+
+ Post(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ double italic_angle() const;
+ bool is_fixed_pitch() const;
+ inline int underline_position() const;
+ inline int underline_thickness() const;
+ inline uint32_t mem_type42(bool ismax) const;
+ int nglyphs() const { return _nglyphs; }
+ bool glyph_names(Vector<PermString> &gnames) const;
+
+ private:
+
+ Data _str;
+ int _error;
+ uint32_t _version;
+ int _nglyphs;
+ Vector<int> _extend_glyph_names;
+
+ enum { HEADER_SIZE = 32, N_MAC_GLYPHS = 258 };
+ int parse_header(ErrorHandler *);
+
+};
+
+inline int
+Post::underline_position() const
+{
+ // NB: "This is the suggested distance of the top of the underline from
+ // the baseline (negative values indicate below baseline). The PostScript
+ // definition of this FontInfo dictionary key (the y coordinate of the
+ // center of the stroke) is not used for historical reasons. The value of
+ // the PostScript key may be calculated by subtracting half the
+ // underlineThickness from the value of this field." -- OpenType spec
+ return ok() ? _str.s16(8) : 0;
+}
+
+inline int
+Post::underline_thickness() const
+{
+ return ok() ? _str.s16(10) : 0;
+}
+
+inline uint32_t
+Post::mem_type42(bool ismax) const
+{
+ return ok() ? _str.u32(ismax ? 20 : 16) : 0;
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/pairop.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/pairop.hh
new file mode 100644
index 00000000000..360912a00d1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/pairop.hh
@@ -0,0 +1,113 @@
+// -*- related-file-name: "../../libefont/pairop.cc" -*-
+#ifndef PAIROP_HH
+#define PAIROP_HH
+#include <efont/encoding.hh> /* get GlyphIndex */
+namespace Efont {
+
+enum PairOpDefs {
+
+ opNoop = -1,
+ opLigature = -2,
+
+ opLigSimple = 0,
+ opLigSaveLeft = 1,
+ opLigSaveRight = 2,
+ opLigPast1 = 4,
+ opLigPast2 = 8,
+
+ opAllblock = 0
+
+};
+
+
+typedef int PairOpIndex;
+
+
+class PairOp { public:
+
+ PairOp() { }
+ inline PairOp(GlyphIndex l, GlyphIndex r, int v, PairOpIndex nl);
+ inline PairOp(GlyphIndex l, GlyphIndex r, GlyphIndex x, int kind, PairOpIndex nl);
+
+ void noopify() { _val = opNoop; }
+ void set_value(int val) { _val = val; }
+
+ inline void set_next(PairOpIndex);
+
+ bool is_lig() const { return _val <= opLigature; }
+ bool is_kern() const { return _val >= 0; }
+ bool is_noop() const { return _val == opNoop; }
+ int lig_kind() const { assert(is_lig()); return -_val+opLigature; }
+
+ GlyphIndex left() const { return _left; }
+ GlyphIndex right() const { return _right; }
+ GlyphIndex result() const { assert(is_lig()); return _result; }
+ int value() const { return _val; }
+ PairOpIndex next_left() const { return _next_left; }
+
+ private:
+
+ GlyphIndex _left;
+ GlyphIndex _right;
+ GlyphIndex _result;
+ int _val;
+
+ PairOpIndex _next_left;
+
+};
+
+
+class PairProgram { public:
+
+ PairProgram() : _reversed(false) { }
+ PairProgram(const PairProgram &);
+
+ void reserve_glyphs(int);
+
+ PairOpIndex find_left(GlyphIndex gi) const { return _left_map[gi]; }
+ PairOpIndex find(GlyphIndex leftgi, GlyphIndex rightgi) const;
+
+ int op_count() const { return _op.size(); }
+ const PairOp &op(PairOpIndex i) const { return _op[i]; }
+
+ // Return true if it's a duplicate.
+ bool add_kern(GlyphIndex, GlyphIndex, int);
+ bool add_lig(GlyphIndex, GlyphIndex, GlyphIndex, int kind = opLigSimple);
+
+ void set_reversed(bool r) { _reversed = r; }
+ void unreverse();
+ void optimize();
+
+ void print() const;
+
+ private:
+
+ bool _reversed;
+ Vector<PairOpIndex> _left_map;
+ Vector<PairOp> _op;
+
+ inline const char *print_name(GlyphIndex) const;
+
+ PairProgram &operator=(const PairProgram &) { assert(0); return *this; }
+
+};
+
+
+inline PairOp::PairOp(GlyphIndex l, GlyphIndex r, int v, PairOpIndex nl)
+ : _left(l), _right(r), _result(), _val(v), _next_left(nl)
+{
+}
+
+inline PairOp::PairOp(GlyphIndex l, GlyphIndex r, GlyphIndex x, int kind,
+ PairOpIndex nl)
+ : _left(l), _right(r), _result(x), _val(opLigature - kind), _next_left(nl)
+{
+}
+
+inline void PairOp::set_next(PairOpIndex nl)
+{
+ _next_left = nl;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/psres.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/psres.hh
new file mode 100644
index 00000000000..f33ee8ab0e8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/psres.hh
@@ -0,0 +1,74 @@
+// -*- related-file-name: "../../libefont/psres.cc" -*-
+#ifndef EFONT_PSRES_HH
+#define EFONT_PSRES_HH
+#include <lcdf/vector.hh>
+#include <lcdf/hashmap.hh>
+#include <lcdf/string.hh>
+#include <lcdf/filename.hh>
+class Slurper;
+namespace Efont {
+class PsresDatabaseSection;
+
+class PsresDatabase { public:
+
+ PsresDatabase();
+ ~PsresDatabase();
+
+ void add_psres_path(const char* path, const char* defaults, bool override);
+ bool add_psres_file(Filename&, bool override);
+ void add_database(PsresDatabase*, bool override);
+
+ inline PsresDatabaseSection* section(PermString section) const;
+ const String& value(PermString section, PermString key) const;
+ const String& unescaped_value(PermString section, PermString key) const;
+ Filename filename_value(PermString section, PermString key) const;
+
+ private:
+
+ HashMap<PermString, int> _section_map;
+ Vector<PsresDatabaseSection*> _sections;
+
+ PsresDatabaseSection* force_section(PermString);
+ bool add_one_psres_file(Slurper&, bool override);
+ void add_psres_directory(PermString);
+
+};
+
+class PsresDatabaseSection { public:
+
+ PsresDatabaseSection(PermString);
+
+ PermString section_name() const { return _section_name; }
+
+ void add_psres_file_section(Slurper&, PermString, bool);
+ void add_section(PsresDatabaseSection*, bool override);
+
+ const String& value(PermString key) { return value(_map[key]); }
+ inline const String& unescaped_value(PermString key) const;
+ Filename filename_value(PermString key);
+
+ private:
+
+ PermString _section_name;
+ HashMap<PermString, int> _map;
+ Vector<PermString> _directories;
+ Vector<String> _values;
+ Vector<int> _value_escaped;
+
+ const String& value(int index);
+
+};
+
+inline PsresDatabaseSection* PsresDatabase::section(PermString n) const
+{
+ return _sections[_section_map[n]];
+}
+
+inline const String& PsresDatabaseSection::unescaped_value(PermString key) const
+{
+ assert(!_value_escaped[_map[key]]);
+ return _values[_map[key]];
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh
new file mode 100644
index 00000000000..dff5514772a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1bounds.hh
@@ -0,0 +1,96 @@
+// -*- related-file-name: "../../libefont/t1bounds.cc" -*-
+#ifndef EFONT_T1BOUNDS_HH
+#define EFONT_T1BOUNDS_HH
+#include <efont/t1interp.hh>
+#include <lcdf/transform.hh>
+namespace Efont {
+
+class CharstringBounds : public CharstringInterp { public:
+
+ CharstringBounds();
+ CharstringBounds(const Transform&);
+ CharstringBounds(const Transform&, const Vector<double>& weight_vec);
+ ~CharstringBounds() { }
+
+ const Point& width() const { return _width; }
+ double x_width() const { return _width.x; }
+ bool bb_known() const { return KNOWN(_lb.x); }
+ double bb_left() const { return _lb.x; }
+ double bb_top() const { return _rt.y; }
+ double bb_right() const { return _rt.x; }
+ double bb_bottom() const { return _lb.y; }
+ const Point& bb_bottom_left() const { return _lb; }
+ const Point& bb_top_right() const { return _rt; }
+
+ void act_width(int, const Point&);
+ void act_line(int, const Point&, const Point&);
+ void act_curve(int, const Point&, const Point&, const Point&, const Point&);
+ inline void mark(const Point&);
+
+ void clear();
+ bool char_bounds(const CharstringContext&, bool shift = true);
+ void translate(double dx, double dy);
+ inline Point transform(const Point& p) const;
+
+ // output: [left, bottom, right, top]
+ bool output(double bb[4], double& width, bool use_cur_width = false) const;
+ static bool bounds(const CharstringContext&,
+ double bounds[4], double& width);
+ static bool bounds(const Transform&, const CharstringContext&,
+ double bounds[4], double& width);
+
+ private:
+
+ Point _lb;
+ Point _rt;
+ Point _width;
+ Transform _xf;
+ Transform _nonfont_xf;
+ const CharstringProgram* _last_xf_program;
+
+ void set_xf(const CharstringProgram*);
+
+ inline void xf_mark(const Point&);
+ void xf_mark(const Bezier&);
+
+ inline bool xf_inside(const Point&) const;
+ inline bool xf_controls_inside(const Bezier&) const;
+
+};
+
+inline void CharstringBounds::xf_mark(const Point& p)
+{
+ if (!KNOWN(_lb.x))
+ _lb = _rt = p;
+ if (p.x < _lb.x)
+ _lb.x = p.x;
+ else if (p.x > _rt.x)
+ _rt.x = p.x;
+ if (p.y < _lb.y)
+ _lb.y = p.y;
+ else if (p.y > _rt.y)
+ _rt.y = p.y;
+}
+
+inline void CharstringBounds::mark(const Point& p)
+{
+ xf_mark(p * _xf);
+}
+
+inline bool CharstringBounds::xf_inside(const Point& p) const
+{
+ return p.x >= _lb.x && p.x <= _rt.x && p.y >= _lb.y && p.y <= _rt.y;
+}
+
+inline bool CharstringBounds::xf_controls_inside(const Bezier& b) const
+{
+ return xf_inside(b.point(1)) && xf_inside(b.point(2));
+}
+
+inline Point CharstringBounds::transform(const Point& p) const
+{
+ return p * _xf;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1cs.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1cs.hh
new file mode 100644
index 00000000000..d9f36db6cd9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1cs.hh
@@ -0,0 +1,345 @@
+// -*- related-file-name: "../../libefont/t1cs.cc" -*-
+#ifndef EFONT_T1CS_HH
+#define EFONT_T1CS_HH
+#include <lcdf/permstr.hh>
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/inttypes.h>
+namespace Efont {
+
+// Allow unknown doubles to have some `fuzz' -- so if an unknown double
+// is a bit off from the canonical UNKDOUBLE value, we'll still recognize
+// it as unknown. (Useful for interpolation.)
+#define UNKDOUBLE -9.79797e97
+#define MIN_KNOWN_DOUBLE -9.69696e97
+#define KNOWN(d) ((d) >= MIN_KNOWN_DOUBLE)
+
+class CharstringProgram;
+class CharstringInterp;
+struct CharstringContext;
+class MultipleMasterSpace;
+class Type1Encoding;
+
+class Charstring { public:
+
+ Charstring() { }
+ virtual ~Charstring();
+
+ virtual bool process(CharstringInterp &) const = 0;
+
+ enum Commands {
+ cError = 0,
+ cHstem = 1,
+ cVstem = 3,
+ cVmoveto = 4,
+ cRlineto = 5,
+ cHlineto = 6,
+ cVlineto = 7,
+ cRrcurveto = 8,
+ cClosepath = 9,
+ cCallsubr = 10,
+ cReturn = 11,
+ cEscape = 12,
+ cHsbw = 13,
+ cEndchar = 14,
+ cBlend = 16,
+ cHstemhm = 18,
+ cHintmask = 19,
+ cCntrmask = 20,
+ cRmoveto = 21,
+ cHmoveto = 22,
+ cVstemhm = 23,
+ cRcurveline = 24,
+ cRlinecurve = 25,
+ cVvcurveto = 26,
+ cHhcurveto = 27,
+ cShortint = 28,
+ cCallgsubr = 29,
+ cVhcurveto = 30,
+ cHvcurveto = 31,
+
+ cEscapeDelta = 32,
+ cDotsection = 32 + 0,
+ cVstem3 = 32 + 1,
+ cHstem3 = 32 + 2,
+ cAnd = 32 + 3,
+ cOr = 32 + 4,
+ cNot = 32 + 5,
+ cSeac = 32 + 6,
+ cSbw = 32 + 7,
+ cStore = 32 + 8,
+ cAbs = 32 + 9,
+ cAdd = 32 + 10,
+ cSub = 32 + 11,
+ cDiv = 32 + 12,
+ cLoad = 32 + 13,
+ cNeg = 32 + 14,
+ cEq = 32 + 15,
+ cCallothersubr = 32 + 16,
+ cPop = 32 + 17,
+ cDrop = 32 + 18,
+ cPut = 32 + 20,
+ cGet = 32 + 21,
+ cIfelse = 32 + 22,
+ cRandom = 32 + 23,
+ cMul = 32 + 24,
+ cSqrt = 32 + 26,
+ cDup = 32 + 27,
+ cExch = 32 + 28,
+ cIndex = 32 + 29,
+ cRoll = 32 + 30,
+ cSetcurrentpoint = 32 + 33,
+ cHflex = 32 + 34,
+ cFlex = 32 + 35,
+ cHflex1 = 32 + 36,
+ cFlex1 = 32 + 37,
+
+ cLastCommand = cFlex1
+ };
+
+ enum OthersubrCommands {
+ othcFlexend = 0,
+ othcFlexbegin = 1,
+ othcFlexmiddle = 2,
+ othcReplacehints = 3,
+ othcCountercontrolpart = 12,
+ othcCountercontrol = 13,
+ othcMM1 = 14,
+ othcMM2 = 15,
+ othcMM3 = 16,
+ othcMM4 = 17,
+ othcMM6 = 18,
+ othcITC_load = 19,
+ othcITC_add = 20,
+ othcITC_sub = 21,
+ othcITC_mul = 22,
+ othcITC_div = 23,
+ othcITC_put = 24,
+ othcITC_get = 25,
+ othcITC_unknown = 26,
+ othcITC_ifelse = 27,
+ othcITC_random = 28
+ };
+
+ static String command_name(int);
+ static const char * const command_names[];
+
+ static const char * const standard_encoding[256];
+
+};
+
+
+class Type1Charstring : public Charstring { public:
+
+ Type1Charstring() { }
+ inline Type1Charstring(const String &); // unencrypted
+ Type1Charstring(int lenIV, const String &); // encrypted
+ // default copy constructor
+ // default destructor
+ // default assignment operator
+
+ inline const uint8_t *data() const;
+ int length() const { return _s.length(); }
+ operator String::unspecified_bool_type() const { return _s; }
+
+ inline const String &data_string() const;
+ inline String substring(int pos, int len) const;
+ int first_caret_after(int pos) const;
+
+ inline void assign(const String &);
+ void prepend(const Type1Charstring &);
+ void assign_substring(int pos, int len, const String &);
+
+ bool process(CharstringInterp &) const;
+
+ private:
+
+ mutable String _s;
+ mutable int _key;
+
+ void decrypt() const;
+
+};
+
+
+class Type2Charstring : public Charstring { public:
+
+ Type2Charstring() { }
+ inline Type2Charstring(const String &);
+ // default copy constructor
+ // default destructor
+ // default assignment operator
+
+ inline const uint8_t *data() const;
+ int length() const { return _s.length(); }
+
+ bool process(CharstringInterp &) const;
+
+ private:
+
+ String _s;
+
+};
+
+
+struct CharstringContext {
+
+ CharstringContext(const CharstringProgram *program_, const Charstring *cs_) : program(program_), cs(cs_) { }
+
+ operator String::unspecified_bool_type() const {
+ return cs != 0 ? &String::length : 0;
+ }
+
+ const CharstringProgram *program;
+ const Charstring *cs;
+
+};
+
+
+class CharstringProgram { public:
+
+ explicit CharstringProgram(unsigned units_per_em);
+ virtual ~CharstringProgram() { }
+
+ virtual PermString font_name() const { return PermString(); }
+ virtual void font_matrix(double[6]) const;
+ unsigned units_per_em() const { return _units_per_em; }
+
+ inline const CharstringProgram *program(int) const;
+ virtual const CharstringProgram *child_program(int) const;
+ bool parent_program() const { return _parent_program; }
+ void set_parent_program(bool pp) { _parent_program = pp; }
+
+ virtual int nsubrs() const { return 0; }
+ virtual Charstring *subr(int) const { return 0; }
+ virtual int subr_bias() const { return 0; }
+
+ virtual int ngsubrs() const { return 0; }
+ virtual Charstring *gsubr(int) const { return 0; }
+ virtual int gsubr_bias() const { return 0; }
+
+ inline int nxsubrs(bool g) const;
+ inline Charstring *xsubr(bool g, int) const;
+ inline int xsubr_bias(bool g) const;
+
+ virtual int nglyphs() const { return 0; }
+ virtual PermString glyph_name(int) const { return PermString(); }
+ virtual void glyph_names(Vector<PermString> &) const;
+ virtual Charstring *glyph(int) const { return 0; }
+ virtual Charstring *glyph(PermString) const { return 0; }
+
+ inline CharstringContext glyph_context(int) const;
+ inline CharstringContext glyph_context(PermString) const;
+
+ virtual bool is_mm() const { return mmspace() != 0; }
+ virtual MultipleMasterSpace *mmspace() const { return 0; }
+ enum VectorType { VEC_WEIGHT = 0, VEC_NORM_DESIGN = 1, VEC_DESIGN = 2 };
+ virtual Vector<double> *mm_vector(VectorType, bool writable) const;
+
+ virtual Type1Encoding *type1_encoding() const { return 0; }
+
+ virtual double global_width_x(bool is_nominal) const;
+
+ private:
+
+ bool _parent_program;
+ uint16_t _units_per_em;
+
+};
+
+
+enum Type1Defs {
+ t1Warmup_ee = 4,
+ t1R_ee = 55665,
+ t1R_cs = 4330,
+ t1C1 = 52845,
+ t1C2 = 22719
+};
+
+
+inline Type1Charstring::Type1Charstring(const String &s)
+ : Charstring(), _s(s), _key(-1)
+{
+}
+
+inline void Type1Charstring::assign(const String &s)
+{
+ _s = s;
+ _key = -1;
+}
+
+inline const uint8_t *Type1Charstring::data() const
+{
+ if (_key >= 0)
+ decrypt();
+ return reinterpret_cast<const uint8_t *>(_s.data());
+}
+
+inline const String &Type1Charstring::data_string() const
+{
+ if (_key >= 0)
+ decrypt();
+ return _s;
+}
+
+inline String Type1Charstring::substring(int pos, int len) const
+{
+ if (_key >= 0)
+ decrypt();
+ return _s.substring(pos, len);
+}
+
+inline bool operator==(const Type1Charstring &a, const Type1Charstring &b)
+{
+ return a.data_string() == b.data_string();
+}
+
+
+inline Type2Charstring::Type2Charstring(const String &s)
+ : _s(s)
+{
+}
+
+inline const uint8_t *Type2Charstring::data() const
+{
+ return reinterpret_cast<const uint8_t *>(_s.data());
+}
+
+
+inline int CharstringProgram::nxsubrs(bool g) const
+{
+ return (g ? ngsubrs() : nsubrs());
+}
+
+inline Charstring *CharstringProgram::xsubr(bool g, int i) const
+{
+ return (g ? gsubr(i) : subr(i));
+}
+
+inline int CharstringProgram::xsubr_bias(bool g) const
+{
+ return (g ? gsubr_bias() : subr_bias());
+}
+
+inline const CharstringProgram *CharstringProgram::program(int gi) const
+{
+ return (_parent_program ? child_program(gi) : this);
+}
+
+inline CharstringContext CharstringProgram::glyph_context(int gi) const
+{
+ if (!_parent_program)
+ return CharstringContext(this, glyph(gi));
+ else if (const CharstringProgram *p = child_program(gi))
+ return CharstringContext(p, p->glyph(gi));
+ else
+ return CharstringContext(0, 0);
+}
+
+inline CharstringContext CharstringProgram::glyph_context(PermString gn) const
+{
+ return CharstringContext(this, glyph(gn));
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1csgen.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1csgen.hh
new file mode 100644
index 00000000000..6f3fd4cd97e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1csgen.hh
@@ -0,0 +1,127 @@
+// -*- related-file-name: "../../libefont/t1csgen.cc" -*-
+#ifndef EFONT_T1CSGEN_HH
+#define EFONT_T1CSGEN_HH
+#include <efont/t1interp.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+class Type1Font;
+
+class Type1CharstringGen { public:
+
+ Type1CharstringGen(int precision = 5);
+
+ int precision() const { return _precision; }
+
+ void clear();
+ char *data() { return _ncs.data(); }
+ const char *data() const { return _ncs.data(); }
+ int length() const { return _ncs.length(); }
+
+ void gen_number(double, int kind = 0);
+ void gen_command(int);
+ void gen_stack(CharstringInterp &, int for_cmd);
+
+ void append_charstring(const String &);
+
+ const Point &current_point(bool real) const { return (real ? _true : _false); }
+ void gen_moveto(const Point &, bool closepath, bool always);
+
+ inline String take_string();
+ Type1Charstring *output();
+ void output(Type1Charstring &);
+
+ static String callsubr_string(int subr);
+
+ private:
+
+ StringAccum _ncs;
+ int _precision;
+ double _f_precision;
+
+ Point _true;
+ Point _false;
+
+ enum State { S_INITIAL, S_GEN };
+ State _state;
+
+ void gen_rational(int big_val, int divisor);
+ bool gen_stem3_stack(CharstringInterp &interp);
+
+};
+
+class Type1CharstringGenInterp : public CharstringInterp { public:
+
+ Type1CharstringGenInterp(int precision);
+
+ int precision() const { return _csgen.precision(); }
+ void set_direct_hint_replacement(bool dhr) { _direct_hr = dhr; }
+ void set_hint_replacement_storage(Type1Font *);
+
+ int nhints() const { return _stem_hstem.size(); }
+ double max_flex_height() const { return _max_flex_height; }
+ bool had_flex() const { return _had_flex; }
+ bool had_bad_flex() const { return _had_bad_flex; }
+ bool had_hr() const { return _had_hr; }
+
+ const Type1CharstringGen &csgen() const { return _csgen; }
+
+ void act_width(int, const Point &);
+ void act_seac(int, double, double, double, int, int);
+
+ void act_hstem(int, double, double);
+ void act_vstem(int, double, double);
+ void act_hintmask(int, const unsigned char *, int);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+ void act_flex(int, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, double);
+
+ void intermediate_output(Type1Charstring &out);
+ void run(const CharstringContext &g, Type1Charstring &out);
+
+ private:
+
+ // output
+ Type1CharstringGen _csgen;
+ mutable Type1CharstringGen _hint_csgen;
+
+ // current glyph
+ Point _width;
+ enum State { S_INITIAL, S_OPEN, S_CLOSED, S_SEAC };
+ State _state;
+
+ // hints and hint replacement
+ Vector<double> _stem_pos;
+ Vector<double> _stem_width;
+ Vector<int> _stem_hstem;
+ String _last_hints;
+
+ bool _in_hr;
+ bool _direct_hr;
+ int _hr_firstsubr;
+ Type1Font *_hr_storage;
+
+ // Flex
+ double _max_flex_height;
+ bool _had_flex;
+ bool _had_bad_flex;
+ bool _had_hr;
+
+ inline void gen_number(double, int = 0);
+ inline void gen_command(int);
+ void gen_sbw(bool hints_follow);
+ String gen_hints(const unsigned char *, int) const;
+ void swap_stem_hints();
+
+};
+
+inline String Type1CharstringGen::take_string()
+{
+ String s = _ncs.take_string();
+ clear();
+ return s;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1font.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1font.hh
new file mode 100644
index 00000000000..a879a11e9ab
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1font.hh
@@ -0,0 +1,167 @@
+// -*- related-file-name: "../../libefont/t1font.cc" -*-
+#ifndef EFONT_T1FONT_HH
+#define EFONT_T1FONT_HH
+#include <efont/t1cs.hh>
+#include <lcdf/hashmap.hh>
+class StringAccum;
+class ErrorHandler;
+namespace Efont {
+class Type1Item;
+class Type1Definition;
+class Type1Encoding;
+class Type1IncludedFont;
+class Type1Subr;
+class Type1Reader;
+class Type1Writer;
+class MultipleMasterSpace;
+
+class Type1Font : public CharstringProgram { public:
+
+ Type1Font(Type1Reader &);
+ ~Type1Font();
+
+ int read(Type1Reader &);
+
+ bool ok() const;
+
+ inline PermString font_name() const;
+ void font_matrix(double[6]) const;
+
+ int nitems() const { return _items.size(); }
+ Type1Item *item(int i) const { return _items[i]; }
+ void add_item(Type1Item *it) { _items.push_back(it); }
+ void add_definition(int dict, Type1Definition *);
+ void add_type1_encoding(Type1Encoding *);
+
+ int nsubrs() const { return _subrs.size(); }
+ Type1Charstring *subr(int) const;
+
+ int nglyphs() const { return _glyphs.size(); }
+ PermString glyph_name(int) const;
+ Type1Charstring *glyph(int) const;
+ Type1Charstring *glyph(PermString) const;
+ void add_glyph(Type1Subr *);
+
+ Type1Subr *subr_x(int i) const { return _subrs[i]; }
+ bool set_subr(int, const Type1Charstring &, PermString definer = PermString());
+ bool remove_subr(int);
+ void fill_in_subrs();
+ void renumber_subrs(const Vector<int> &); // dangerous!
+
+ Type1Subr *glyph_x(int i) const { return _glyphs[i]; }
+
+ Type1Encoding *type1_encoding() const { return _encoding; }
+
+ // note: the order is relevant
+ enum Dict {
+ dFont = 0, dF = dFont,
+ dFontInfo = 1, dFI = dFontInfo,
+ dPrivate = 2, dP = dPrivate,
+ dBlend = 3, dB = dBlend,
+ dBlendFontInfo = dB+dFI, dBFI = dBlendFontInfo,
+ dBlendPrivate = dB+dP, dBP = dBlendPrivate,
+ dLast
+ };
+
+ Type1Definition *dict(int d, PermString s) const { return _dict[d][s]; }
+ Type1Definition *dict(PermString s) const { return _dict[dF][s]; }
+ Type1Definition *p_dict(PermString s) const { return _dict[dP][s]; }
+ Type1Definition *b_dict(PermString s) const { return _dict[dB][s]; }
+ Type1Definition *bp_dict(PermString s) const { return _dict[dBP][s];}
+ Type1Definition *fi_dict(PermString s) const { return _dict[dFI][s];}
+
+ typedef HashMap<PermString, Type1Definition *> DictHashMap;
+ inline DictHashMap::const_iterator dict_begin(int dict) const;
+ inline DictHashMap::iterator dict_begin(int dict);
+ int first_dict_item(int d) const { return _index[d]; }
+
+ Type1Definition *ensure(Dict, PermString);
+ void add_header_comment(const String &);
+
+ MultipleMasterSpace *create_mmspace(ErrorHandler * = 0) const;
+ MultipleMasterSpace *mmspace() const;
+
+ void undo_synthetic();
+
+ void set_charstring_definer(PermString d) { _charstring_definer = d; }
+
+ void write(Type1Writer &);
+
+ // font skeletons
+ static Type1Font *skeleton_make(PermString, const String &version = String());
+ static Type1Font *skeleton_make_copy(const Type1Font *, PermString, const Vector<double> *xuid_extension);
+ void skeleton_comments_end();
+ void skeleton_fontinfo_end();
+ void skeleton_fontdict_end();
+ void skeleton_private_end();
+ void skeleton_common_subrs();
+
+ // for experts only
+ void set_item(int, Type1Item *);
+ inline void set_dict(int dict, PermString, Type1Definition *);
+ void uncache_defs();
+
+ private:
+
+ mutable bool _cached_defs;
+ bool _built;
+ mutable PermString _font_name;
+
+ Vector<Type1Item *> _items;
+
+ HashMap<PermString, Type1Definition *> *_dict;
+ int _index[dLast];
+ int _dict_deltas[dLast];
+
+ Vector<Type1Subr *> _subrs;
+ Vector<Type1Subr *> _glyphs;
+ HashMap<PermString, int> _glyph_map;
+
+ PermString _charstring_definer;
+ Type1Encoding *_encoding;
+
+ mutable bool _cached_mmspace;
+ mutable MultipleMasterSpace *_mmspace;
+
+ Type1IncludedFont *_synthetic_item;
+
+ Type1Font(PermString);
+ Type1Font(const Type1Font &);
+ Type1Font &operator=(const Type1Font &);
+
+ void read_encoding(Type1Reader &, const char *);
+ bool read_synthetic_font(Type1Reader &, const char *, StringAccum &);
+ void cache_defs() const;
+ void shift_indices(int, int);
+
+ Type1Item *dict_size_item(int) const;
+ int get_dict_size(int) const;
+ void set_dict_size(int, int);
+
+};
+
+
+inline Type1Font::DictHashMap::const_iterator Type1Font::dict_begin(int dict) const
+{
+ return _dict[dict].begin();
+}
+
+inline Type1Font::DictHashMap::iterator Type1Font::dict_begin(int dict)
+{
+ return _dict[dict].begin();
+}
+
+inline void Type1Font::set_dict(int dict, PermString name, Type1Definition *t1d)
+{
+ _dict[dict].insert(name, t1d);
+}
+
+inline PermString Type1Font::font_name() const
+{
+ if (!_cached_defs)
+ cache_defs();
+ return _font_name;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1interp.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1interp.hh
new file mode 100644
index 00000000000..16c878a3677
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1interp.hh
@@ -0,0 +1,239 @@
+// -*- related-file-name: "../../libefont/t1interp.cc" -*-
+#ifndef EFONT_T1INTERP_HH
+#define EFONT_T1INTERP_HH
+#include <efont/t1cs.hh>
+#include <lcdf/point.hh>
+#include <stdio.h>
+namespace Efont {
+
+class CharstringInterp { public:
+
+ CharstringInterp();
+ CharstringInterp(const Vector<double> &weight_vec);
+ virtual ~CharstringInterp() { }
+
+ int error() const { return _error; }
+ int error_data() const { return _error_data; }
+ static String error_string(int error, int error_data);
+ inline String error_string() const;
+
+ bool careful() const { return _careful; }
+ void set_careful(bool c) { _careful = c; }
+
+ bool done() const { return _done; }
+ void set_done() { _done = true; }
+
+ int size() const { return _sp; }
+ double &at(unsigned i) { return _s[i]; }
+ double &top(unsigned i = 0) { return _s[_sp - i - 1]; }
+ double pop(unsigned n = 1) { _sp -= n; return _s[_sp]; }
+ inline void push(double);
+ void clear() { _sp = 0; }
+
+ int ps_size() const { return _ps_sp; }
+ double ps_at(unsigned i) const { return _ps_s[i]; }
+ double ps_pop() { return _ps_s[--_ps_sp]; }
+ inline void ps_push(double);
+ void ps_clear() { _ps_sp = 0; }
+
+ int subr_depth() const { return _subr_depth; }
+
+ inline double &vec(Vector<double> *, int);
+ const Vector<double> &weight_vector() const { return _weight_vector; }
+ Vector<double> *scratch_vector() { return &_scratch_vector; }
+
+ const CharstringProgram *program() const { return _program; }
+ inline Charstring *get_subr(int) const;
+ inline Charstring *get_gsubr(int) const;
+ inline Charstring *get_xsubr(bool g, int) const;
+ inline Charstring *get_glyph(PermString) const;
+
+ bool interpret(const CharstringProgram *, const Charstring *);
+ inline bool interpret(const CharstringContext &);
+
+ //virtual void init(const CharstringProgram *);
+ bool error(int c) { return error(c, 0); }
+ virtual bool error(int, int);
+ virtual bool number(double);
+
+ bool arith_command(int);
+ bool vector_command(int);
+ bool blend_command();
+ bool callsubr_command();
+ bool callgsubr_command();
+ inline bool callxsubr_command(bool g);
+ bool mm_command(int, int);
+ bool itc_command(int, int);
+
+ const Point &left_sidebearing() const { return _lsb; }
+ const Point &currentpoint() const { return _cp; }
+ void set_state_path() { _state = S_PATH; }
+
+ virtual bool callothersubr_command(int, int);
+ virtual bool type1_command(int);
+ virtual bool type2_command(int, const uint8_t *, int *);
+
+ virtual void act_sidebearing(int cmd, const Point &lsb);
+ virtual void act_width(int cmd, const Point &width);
+ virtual void act_default_width(int cmd);
+ virtual void act_nominal_width_delta(int cmd, double delta);
+ virtual void act_seac(int cmd, double asb, double adx, double ady, int bchar, int achar);
+
+ virtual void act_line(int cmd, const Point &p0, const Point &p1);
+ virtual void act_curve(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3);
+ virtual void act_closepath(int cmd);
+
+ virtual void act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth);
+
+ virtual void act_hstem(int cmd, double y, double dy);
+ virtual void act_vstem(int cmd, double x, double dx);
+ virtual void act_hstem3(int cmd, double y0, double dy0, double y1, double dy1, double y2, double dy2);
+ virtual void act_vstem3(int cmd, double x0, double dx0, double x1, double dx1, double x2, double dx2);
+ virtual void act_hintmask(int cmd, const uint8_t *data, int nhints);
+
+ typedef Charstring Cs;
+
+ enum Errors {
+ errOK = 0,
+ errInternal = -1,
+ errRunoff = -2,
+ errUnimplemented = -3,
+ errOverflow = -4,
+ errUnderflow = -5,
+ errVector = -6,
+ errValue = -7,
+ errSubr = -8,
+ errGlyph = -9,
+ errCurrentPoint = -10,
+ errFlex = -11,
+ errMultipleMaster = -12,
+ errOpenStroke = -13,
+ errLateSidebearing = -14,
+ errOthersubr = -15,
+ errOrdering = -16,
+ errHintmask = -17,
+ errSubrDepth = -18,
+ errLastError = -18
+ };
+
+ enum { STACK_SIZE = 48, PS_STACK_SIZE = 24, MAX_SUBR_DEPTH = 10,
+ SCRATCH_SIZE = 32 };
+
+ private:
+
+ int _error;
+ int _error_data;
+ bool _done;
+ bool _careful;
+
+ double _s[STACK_SIZE];
+ int _sp;
+ double _ps_s[PS_STACK_SIZE];
+ int _ps_sp;
+
+ int _subr_depth;
+
+ Vector<double> _weight_vector;
+ Vector<double> _scratch_vector;
+
+ Point _lsb;
+ Point _cp;
+ Point _seac_origin;
+
+ const CharstringProgram *_program;
+
+ enum State {
+ S_INITIAL, S_SEAC, S_SBW, S_HSTEM, S_VSTEM, S_HINTMASK, S_IPATH, S_PATH
+ };
+ State _state;
+ bool _flex;
+
+ // for processing Type 2 charstrings
+ int _t2nhints;
+
+ static double double_for_error;
+
+ void initialize();
+
+ inline void ensure_weight_vector();
+ void fetch_weight_vector();
+
+ bool roll_command();
+ int type2_handle_width(int, bool);
+
+ inline void actp_rmoveto(int, double, double);
+ inline void actp_rlineto(int, double, double);
+ void actp_rrcurveto(int, double, double, double, double, double, double);
+ void actp_rrflex(int, double, double, double, double, double, double, double, double, double, double, double, double, double);
+
+};
+
+
+inline String CharstringInterp::error_string() const
+{
+ return error_string(_error, _error_data);
+}
+
+inline void CharstringInterp::push(double d)
+{
+ if (_sp < STACK_SIZE)
+ _s[_sp++] = d;
+ else
+ error(errOverflow);
+}
+
+inline void CharstringInterp::ps_push(double d)
+{
+ if (_ps_sp < PS_STACK_SIZE)
+ _ps_s[_ps_sp++] = d;
+ else
+ error(errOverflow);
+}
+
+inline double &CharstringInterp::vec(Vector<double> *v, int i)
+{
+ if (i < 0 || i >= v->size()) {
+ error(errVector);
+ return double_for_error;
+ } else
+ return v->at_u(i);
+}
+
+inline Charstring *CharstringInterp::get_subr(int n) const
+{
+ return _program ? _program->subr(n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_gsubr(int n) const
+{
+ return _program ? _program->gsubr(n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_xsubr(bool g, int n) const
+{
+ return _program ? _program->xsubr(g, n) : 0;
+}
+
+inline Charstring *CharstringInterp::get_glyph(PermString n) const
+{
+ return _program ? _program->glyph(n) : 0;
+}
+
+inline void CharstringInterp::ensure_weight_vector()
+{
+ if (!_weight_vector.size())
+ fetch_weight_vector();
+}
+
+inline bool CharstringInterp::callxsubr_command(bool g)
+{
+ return (g ? callgsubr_command() : callsubr_command());
+}
+
+inline bool CharstringInterp::interpret(const CharstringContext &g)
+{
+ return interpret(g.program, g.cs);
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1item.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1item.hh
new file mode 100644
index 00000000000..8b5bfb8f8cb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1item.hh
@@ -0,0 +1,268 @@
+// -*- related-file-name: "../../libefont/t1item.cc" -*-
+#ifndef EFONT_T1ITEM_HH
+#define EFONT_T1ITEM_HH
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+class Type1Reader;
+class Type1Writer;
+class CharstringInterp;
+class Type1Font;
+class Type1CopyItem;
+class Type1Subr;
+class Type1SubrGroupItem;
+class Type1Definition;
+
+class Type1Item { public:
+
+ Type1Item() { }
+ virtual ~Type1Item() { }
+
+ virtual void gen(Type1Writer &) = 0;
+
+ virtual Type1CopyItem *cast_copy() { return 0; }
+ virtual Type1Subr *cast_subr() { return 0; }
+ virtual Type1Definition *cast_definition() { return 0; }
+ virtual Type1SubrGroupItem *cast_subr_group() { return 0; }
+
+ private:
+
+ Type1Item(const Type1Item &);
+ Type1Item &operator=(const Type1Item &);
+
+};
+
+class Type1NullItem : public Type1Item { public:
+
+ Type1NullItem() { }
+
+ void gen(Type1Writer &);
+
+};
+
+class Type1CopyItem : public Type1Item { public:
+
+ Type1CopyItem(const String &s) : _value(s) { }
+ ~Type1CopyItem() { }
+
+ const String &value() const { return _value; }
+ int length() const { return _value.length(); }
+
+ void set_value(const String &s) { _value = s; }
+
+ void gen(Type1Writer &);
+
+ Type1CopyItem *cast_copy() { return this; }
+
+ private:
+
+ String _value;
+
+};
+
+class Type1EexecItem : public Type1Item { public:
+
+ Type1EexecItem(bool on) : _eexec_on(on) { }
+
+ void gen(Type1Writer &w);
+
+ private:
+
+ bool _eexec_on;
+
+};
+
+class Type1Definition : public Type1Item { public:
+
+ typedef Vector<double> NumVector;
+
+ Type1Definition(PermString, const String &, PermString);
+ ~Type1Definition() { }
+ static Type1Definition *make(StringAccum &, Type1Reader * = 0, bool force = false);
+ static Type1Definition *make_string(PermString, const String &, PermString);
+ static inline Type1Definition *make_literal(PermString, const String &, PermString);
+ static inline Type1Definition *make(PermString, double, PermString);
+
+ PermString name() const { return _name; }
+ const String &value() const { return _val; }
+ PermString definer() const { return _definer; }
+
+ bool value_bool(bool &) const;
+ bool value_int(int &) const;
+ bool value_num(double &) const;
+ bool value_string(String &) const;
+ bool value_name(PermString &) const;
+ bool value_numvec(NumVector &) const;
+ bool value_numvec_vec(Vector<NumVector> &) const;
+ bool value_normalize(Vector<NumVector> &in, Vector<NumVector> &out) const;
+ bool value_namevec(Vector<PermString> &) const;
+
+ void set_bool(bool);
+ void set_int(int);
+ void set_num(double);
+ void set_string(const String &);
+ void set_name(PermString, bool name = true);
+ void set_code(const char *s) { set_val(s); }
+ void set_numvec(const NumVector &, bool executable = false);
+ void set_numvec_vec(const Vector<NumVector> &);
+ void set_normalize(const Vector<NumVector> &, const Vector<NumVector> &);
+ void set_namevec(const Vector<PermString> &, bool executable = true);
+
+ void gen(Type1Writer &);
+ void gen(StringAccum &);
+
+ Type1Definition *cast_definition() { return this; }
+
+ private:
+
+ PermString _name;
+ String _val;
+ PermString _definer;
+
+ static int slurp_string(StringAccum &, int, Type1Reader *);
+ static int slurp_proc(StringAccum &, int, Type1Reader *);
+
+ inline void set_val(const String &);
+ inline void set_val(StringAccum &);
+
+};
+
+class Type1Encoding : public Type1Item { public:
+
+ Type1Encoding();
+ Type1Encoding(const Type1Encoding &);
+ ~Type1Encoding();
+
+ void clear();
+ void unshare();
+
+ PermString operator[](int e) const { assert(e>=0&&e<256); return _v[e]; }
+ PermString elt(int e) const { return (*this)[e]; }
+ PermString operator[](unsigned char e) const { return _v[e]; }
+ PermString elt(unsigned char e) const { return operator[](e); }
+ inline void put(int e, PermString p);
+
+ void set_definer(PermString s) { _definer = s; }
+
+ static Type1Encoding *standard_encoding();
+
+ void gen(Type1Writer &);
+
+ private:
+
+ PermString *_v;
+ Type1Encoding *_copy_of;
+ PermString _definer;
+
+ Type1Encoding(Type1Encoding *);
+ Type1Encoding &operator=(const Type1Encoding &);
+
+};
+
+class Type1Subr : public Type1Item { public:
+
+ static Type1Subr *make(const char *, int, int cs_start, int cs_len, int lenIV);
+ static Type1Subr *make_subr(int, const Type1Charstring &, PermString);
+ static Type1Subr *make_glyph(PermString, const Type1Charstring &, PermString);
+
+ bool is_subr() const { return !_name; }
+ PermString name() const { return _name; }
+ int subrno() const { return _subrno; }
+ PermString definer() const { return _definer; }
+
+ Type1Charstring &t1cs() { return _cs; }
+ const Type1Charstring &t1cs() const { return _cs; }
+ operator Type1Charstring &() { return _cs; }
+ operator const Type1Charstring &() const { return _cs; }
+
+ void gen(Type1Writer &);
+
+ virtual Type1Subr *cast_subr() { return this; }
+
+ private:
+
+ PermString _name;
+ int _subrno;
+ PermString _definer;
+
+ Type1Charstring _cs;
+
+ static PermString cached_definer;
+
+ Type1Subr(PermString, int, PermString, int, const String &);
+ Type1Subr(PermString, int, PermString, const Type1Charstring &);
+
+};
+
+class Type1SubrGroupItem : public Type1Item { public:
+
+ Type1SubrGroupItem(Type1Font *, bool, const String &);
+ Type1SubrGroupItem(const Type1SubrGroupItem &, Type1Font *);
+ ~Type1SubrGroupItem() { }
+
+ void set_end_text(const String &s) { _end_text = s; }
+ void add_end_text(const String &);
+
+ bool is_subrs() const { return _is_subrs; }
+ const String &end_text() const { return _end_text; }
+
+ void gen(Type1Writer &);
+
+ Type1SubrGroupItem *cast_subr_group() { return this; }
+
+ private:
+
+ Type1Font *_font;
+ bool _is_subrs;
+ String _value;
+ String _end_text;
+
+};
+
+class Type1IncludedFont : public Type1Item { public:
+
+ Type1IncludedFont(Type1Font *, int);
+ ~Type1IncludedFont();
+
+ Type1Font *included_font() const { return _included_font; }
+
+ void gen(Type1Writer &);
+
+ private:
+
+ Type1Font *_included_font;
+ int _unique_id;
+
+};
+
+
+inline Type1Definition *Type1Definition::make_literal(PermString n, const String &v, PermString d)
+{
+ return new Type1Definition(n, v, d);
+}
+
+inline Type1Definition *Type1Definition::make(PermString n, double v, PermString d)
+{
+ return new Type1Definition(n, String(v), d);
+}
+
+inline void Type1Definition::set_val(const String &v)
+{
+ _val = v;
+}
+
+inline void Type1Definition::set_val(StringAccum &sa)
+{
+ _val = sa.take_string();
+}
+
+inline void Type1Encoding::put(int e, PermString glyph)
+{
+ if (_copy_of)
+ unshare();
+ assert(e >= 0 && e < 256);
+ _v[e] = glyph;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1mm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1mm.hh
new file mode 100644
index 00000000000..8564f46cf67
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1mm.hh
@@ -0,0 +1,108 @@
+// -*- related-file-name: "../../libefont/t1mm.cc" -*-
+#ifndef EFONT_T1MM_HH
+#define EFONT_T1MM_HH
+#include <efont/t1cs.hh>
+class ErrorHandler;
+namespace Efont {
+class Type1Font;
+
+class MultipleMasterSpace : public CharstringProgram { public:
+
+ MultipleMasterSpace(PermString, int naxes, int nmasters);
+ // default destructor
+
+ typedef Vector<double> NumVector;
+
+ PermString font_name() const { return _font_name; }
+ int naxes() const { return _naxes; }
+ int nmasters() const { return _nmasters; }
+
+ int axis(PermString) const;
+ double axis_low(int) const;
+ double axis_high(int) const;
+
+ PermString axis_type(int a) const { return _axis_types[a]; }
+ PermString axis_label(int a) const { return _axis_labels[a]; }
+ inline PermString axis_abbreviation(int a) const;
+ static PermString axis_abbreviation(PermString);
+
+ const Type1Charstring &ndv() const { return _ndv; }
+ const Type1Charstring &cdv() const { return _cdv; }
+
+ void set_master_positions(const Vector<NumVector> &);
+ void set_normalize(const Vector<NumVector> &, const Vector<NumVector> &);
+ void set_axis_type(int, PermString);
+ void set_axis_label(int, PermString);
+ void set_ndv(const Type1Charstring &cs) { _ndv = cs; }
+ void set_cdv(const Type1Charstring &cs) { _cdv = cs; }
+ void set_design_vector(const NumVector &);
+ void set_weight_vector(const NumVector &);
+
+ bool check(ErrorHandler * = 0);
+ bool check_intermediate(ErrorHandler * = 0);
+
+ NumVector empty_design_vector() const;
+ inline const NumVector &default_design_vector() const;
+ bool set_design(NumVector &, int, double, ErrorHandler * = 0) const;
+ bool set_design(NumVector &, PermString, double, ErrorHandler * = 0) const;
+
+ inline const NumVector &default_weight_vector() const;
+
+ bool design_to_norm_design(const NumVector &, NumVector &, ErrorHandler * = 0) const;
+ bool design_to_weight(const NumVector &, NumVector &, ErrorHandler * = 0) const;
+
+ NumVector *mm_vector(VectorType, bool writable) const;
+
+ private:
+
+ mutable bool _ok;
+
+ PermString _font_name;
+ int _naxes;
+ int _nmasters;
+
+ Vector<NumVector> _master_positions;
+ Vector<NumVector> _normalize_in;
+ Vector<NumVector> _normalize_out;
+
+ Vector<PermString> _axis_types;
+ Vector<PermString> _axis_labels;
+
+ Type1Charstring _ndv;
+ Type1Charstring _cdv;
+
+ NumVector _default_design_vector;
+ NumVector _default_weight_vector;
+
+ mutable NumVector *_design_vector;
+ mutable NumVector *_norm_design_vector;
+ mutable NumVector *_weight_vector;
+
+ bool error(ErrorHandler *, const char *, ...) const;
+
+ MultipleMasterSpace(const MultipleMasterSpace &);
+ MultipleMasterSpace &operator=(const MultipleMasterSpace &);
+
+ bool normalize_vector(ErrorHandler *) const;
+ bool convert_vector(ErrorHandler *) const;
+
+};
+
+
+inline const Vector<double> &MultipleMasterSpace::default_design_vector() const
+{
+ return _default_design_vector;
+}
+
+inline const Vector<double> &MultipleMasterSpace::default_weight_vector() const
+{
+ return _default_weight_vector;
+}
+
+inline PermString MultipleMasterSpace::axis_abbreviation(int a) const
+{
+ return axis_abbreviation(_axis_types[a]);
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1rw.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1rw.hh
new file mode 100644
index 00000000000..03af2cfeeb8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1rw.hh
@@ -0,0 +1,232 @@
+// -*- related-file-name: "../../libefont/t1rw.cc" -*-
+#ifndef EFONT_T1RW_HH
+#define EFONT_T1RW_HH
+#include <stdio.h>
+#include <lcdf/string.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+
+class Type1Reader { public:
+
+ Type1Reader();
+ virtual ~Type1Reader();
+
+ int get_data(unsigned char *, int);
+ virtual int more_data(unsigned char *, int) = 0;
+ virtual bool preserve_whitespace() const { return false; }
+
+ void switch_eexec(bool, unsigned char *, int);
+ virtual void set_charstring_definer(PermString);
+
+ bool next_line(StringAccum &);
+ bool was_charstring() const { return _charstring_len > 0; }
+ int charstring_start() const { return _charstring_start; }
+ int charstring_length() const { return _charstring_len; }
+
+ private:
+
+ enum { DATA_SIZE = 1024 };
+
+ unsigned char *_data;
+ int _len;
+ int _pos;
+
+ PermString _charstring_definer;
+ int _charstring_start;
+ int _charstring_len;
+
+ int _ungot;
+ int _crlf;
+
+ bool _eexec;
+ bool _binary_eexec;
+ int _r;
+
+ Type1Reader(const Type1Reader &);
+ Type1Reader &operator=(const Type1Reader &);
+
+ int more_data();
+
+ inline int eexec(int);
+ int ascii_eexec_get();
+ inline int get_base();
+ inline int get();
+
+ void start_eexec(int ascii_chars);
+
+ bool test_charstring(StringAccum &);
+
+ static unsigned char xvalue_store[];
+ static unsigned char *xvalue;
+ static void static_initialize();
+
+};
+
+
+class Type1PFAReader : public Type1Reader {
+
+ FILE *_f;
+
+ public:
+
+ Type1PFAReader(FILE *);
+
+ int more_data(unsigned char *, int);
+
+};
+
+class Type1PFBReader : public Type1Reader {
+
+ FILE *_f;
+ bool _binary;
+ int _left;
+
+ public:
+
+ Type1PFBReader(FILE *);
+
+ int more_data(unsigned char *, int);
+ bool preserve_whitespace() const;
+
+};
+
+class Type1SubsetReader : public Type1Reader {
+
+ Type1Reader *_reader;
+ int _left;
+
+ public:
+
+ Type1SubsetReader(Type1Reader *, int);
+
+ int more_data(unsigned char *, int);
+ bool preserve_whitespace() const;
+
+};
+
+
+/*****
+ * Writers
+ **/
+
+class Type1Writer { public:
+
+ Type1Writer();
+ virtual ~Type1Writer();
+
+ bool eexecing() const { return _eexec; }
+
+ inline void print(int);
+ void print(const char *, int);
+
+ inline Type1Writer &operator<<(char);
+ inline Type1Writer &operator<<(unsigned char);
+ Type1Writer &operator<<(int);
+ Type1Writer &operator<<(double);
+
+ virtual void flush();
+ virtual void switch_eexec(bool);
+ virtual void print0(const unsigned char *, int) = 0;
+
+ PermString charstring_start() const { return _charstring_start; }
+ int lenIV() const { return _lenIV; }
+ void set_charstring_start(PermString p) { _charstring_start = p; }
+ void set_lenIV(int l) { _lenIV = l; }
+
+ private:
+
+ enum { BufSize = 1024 };
+
+ unsigned char *_buf;
+ int _pos;
+
+ bool _eexec;
+ int _eexec_start;
+ int _eexec_end;
+ int _r;
+
+ PermString _charstring_start;
+ int _lenIV;
+
+ void local_flush();
+ inline unsigned char eexec(int);
+
+ Type1Writer(const Type1Writer &);
+ Type1Writer &operator=(const Type1Writer &);
+
+};
+
+
+class Type1PFAWriter: public Type1Writer {
+
+ FILE *_f;
+ int _hex_line;
+
+ public:
+
+ Type1PFAWriter(FILE *);
+ ~Type1PFAWriter();
+
+ void switch_eexec(bool);
+ void print0(const unsigned char *, int);
+
+};
+
+
+class Type1PFBWriter: public Type1Writer {
+
+ StringAccum _save;
+ FILE *_f;
+ bool _binary;
+
+ public:
+
+ Type1PFBWriter(FILE *);
+ ~Type1PFBWriter();
+
+ void flush();
+ void switch_eexec(bool);
+ void print0(const unsigned char *, int);
+
+};
+
+
+inline void Type1Writer::print(int c)
+{
+ if (_pos >= BufSize)
+ local_flush();
+ _buf[_pos++] = c;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, const char *cc)
+{
+ w.print(cc, strlen(cc));
+ return w;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, PermString p)
+{
+ w.print(p.c_str(), p.length());
+ return w;
+}
+
+inline Type1Writer &operator<<(Type1Writer &w, const String &s)
+{
+ w.print(s.data(), s.length());
+ return w;
+}
+
+inline Type1Writer &Type1Writer::operator<<(char c)
+{
+ print((unsigned char)c);
+ return *this;
+}
+
+inline Type1Writer &Type1Writer::operator<<(unsigned char c)
+{
+ print(c);
+ return *this;
+}
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1unparser.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1unparser.hh
new file mode 100644
index 00000000000..15e12fb79d1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/t1unparser.hh
@@ -0,0 +1,39 @@
+// -*- related-file-name: "../../libefont/t1unparser.cc" -*-
+#ifndef EFONT_T1UNPARSER_HH
+#define EFONT_T1UNPARSER_HH
+#include <efont/t1interp.hh>
+#include <lcdf/straccum.hh>
+namespace Efont {
+
+class CharstringUnparser : public CharstringInterp { public:
+
+ CharstringUnparser();
+ CharstringUnparser(const CharstringUnparser &);
+
+ const String &indent() const { return _indent; }
+ void set_indent(const String &s) { _indent = s; }
+ void set_one_command_per_line(bool b) { _one_command_per_line = b; }
+
+ void clear();
+
+ bool number(double);
+ bool type1_command(int);
+ bool type2_command(int, const unsigned char *, int *);
+ void act_hintmask(int, const unsigned char *, int);
+
+ String value();
+
+ static String unparse(const Charstring *);
+ static String unparse(const Charstring &);
+
+ private:
+
+ String _indent;
+ bool _one_command_per_line;
+ bool _start_of_line;
+ StringAccum _sa;
+
+};
+
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfcs.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfcs.hh
new file mode 100644
index 00000000000..96758435603
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfcs.hh
@@ -0,0 +1,40 @@
+// -*- related-file-name: "../../libefont/ttfcs.cc" -*-
+#ifndef EFONT_TTFCS_HH
+#define EFONT_TTFCS_HH
+#include <efont/t1cs.hh>
+#include <efont/otf.hh>
+#include <efont/otfdata.hh>
+namespace Efont {
+
+class TrueTypeBoundsCharstringProgram : public CharstringProgram { public:
+
+ TrueTypeBoundsCharstringProgram(const OpenType::Font *);
+ ~TrueTypeBoundsCharstringProgram();
+
+ void font_matrix(double[6]) const;
+
+ int nglyphs() const;
+ Charstring *glyph(int gi) const;
+ PermString glyph_name(int gi) const;
+ void glyph_names(Vector<PermString> &) const;
+
+ private:
+
+ const OpenType::Font *_otf;
+ int _nglyphs;
+ int _nhmtx;
+ bool _loca_long;
+ OpenType::Data _loca;
+ OpenType::Data _glyf;
+ OpenType::Data _hmtx;
+ mutable Vector<Charstring*> _charstrings;
+ mutable Vector<PermString> _glyph_names;
+ mutable bool _got_glyph_names;
+ mutable Vector<uint32_t> _unicodes;
+ mutable bool _got_unicodes;
+
+};
+
+}
+#endif
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfhead.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfhead.hh
new file mode 100644
index 00000000000..f5ab4cedff6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfhead.hh
@@ -0,0 +1,41 @@
+// -*- related-file-name: "../../libefont/ttfhead.cc" -*-
+#ifndef EFONT_TTFHEAD_HH
+#define EFONT_TTFHEAD_HH
+#include <efont/otf.hh>
+#include <efont/otfdata.hh> // for ntohl()
+#include <lcdf/error.hh>
+namespace Efont { namespace OpenType {
+
+class Head { public:
+
+ Head(const String &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+ int error() const { return _error; }
+
+ unsigned units_per_em() const;
+ unsigned index_to_loc_format() const;
+
+ private:
+
+ Data _d;
+ int _error;
+
+ int parse_header(ErrorHandler *);
+
+};
+
+
+inline unsigned Head::units_per_em() const
+{
+ return (_error >= 0 ? _d.u16(18) : 0);
+}
+
+inline unsigned Head::index_to_loc_format() const
+{
+ return (_error >= 0 ? _d.u16(50) : 0);
+}
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh
new file mode 100644
index 00000000000..9b46c2d58ba
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/efont/ttfkern.hh
@@ -0,0 +1,42 @@
+// -*- related-file-name: "../../libefont/ttfkern.cc" -*-
+#ifndef EFONT_TTFKERN_HH
+#define EFONT_TTFKERN_HH
+#include <efont/otfgpos.hh>
+namespace Efont { namespace OpenType {
+
+class KernTable { public:
+
+ KernTable(const Data &, ErrorHandler * = 0);
+ // default destructor
+
+ bool ok() const { return _error >= 0; }
+
+ bool unparse_automatics(Vector<Positioning> &, ErrorHandler * = 0) const;
+
+ private:
+
+ Data _d;
+ int _version;
+ int _error;
+
+ enum {
+ COV_V0_HORIZONTAL = 0x0001, COV_V0_MINIMUM = 0x0002,
+ COV_V0_CROSS_STREAM = 0x0004, COV_V0_OVERRIDE = 0x0008,
+ COV_V0_FORMAT = 0xFF00, COV_V0_FORMAT0 = 0x0000,
+ COV_V1_VERTICAL = 0x8000, COV_V1_CROSS_STREAM = 0x4000,
+ COV_V1_VARIATION = 0x2000,
+ COV_V1_FORMAT = 0x00FF, COV_V1_FORMAT0 = 0x0000
+ };
+
+ inline uint32_t ntables() const {
+ return _version == 0 ? _d.u16(2) : _d.u32(4);
+ }
+ inline uint32_t first_offset() const {
+ return _version == 0 ? 4 : 8;
+ }
+ inline Data subtable(uint32_t &off) const;
+
+};
+
+}}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh
new file mode 100644
index 00000000000..fb1018ed0e5
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/bezier.hh
@@ -0,0 +1,136 @@
+// -*- related-file-name: "../../liblcdf/bezier.cc" -*-
+#ifndef LCDF_BEZIER_HH
+#define LCDF_BEZIER_HH
+#include <lcdf/point.hh>
+#include <lcdf/vector.hh>
+#include <string.h>
+
+class Bezier { public:
+
+ Bezier() : _bb(-1) { }
+ inline Bezier(Point p[4]) noexcept;
+ inline Bezier(const Point &, const Point &, const Point &, const Point &) noexcept;
+
+ const Point *points() const { return _p; }
+ const Point &point(int i) const { assert(i>=0&&i<4); return _p[i]; }
+ Point &mpoint(int i) { assert(i>=0&&i<4); _bb = -1; return _p[i]; }
+ void set_point(int i, const Point &p) { mpoint(i) = p; }
+
+ Point eval(double) const noexcept;
+ bool is_flat(double) const noexcept;
+ bool in_bb(const Point &, double) const noexcept;
+ bool hit(const Point &, double) const noexcept;
+
+ inline double bb_left() const noexcept;
+ inline double bb_right() const noexcept;
+ inline double bb_top() const noexcept;
+ inline double bb_bottom() const noexcept;
+
+ inline double bb_left_x() const noexcept;
+ inline double bb_right_x() const noexcept;
+ inline double bb_top_x() const noexcept;
+ inline double bb_bottom_x() const noexcept;
+
+ void halve(Bezier &, Bezier &) const noexcept;
+
+ inline void segmentize(Vector<Point> &) const;
+ void segmentize(Vector<Point> &, bool) const;
+
+ static void fit(const Vector<Point> &, double, Vector<Bezier> &);
+
+ private:
+
+ Point _p[4];
+ mutable int _bb;
+
+ void make_bb() const noexcept;
+ inline void ensure_bb() const noexcept;
+
+ double hit_recurse(const Point &, double, double, double, double, double) const noexcept;
+
+};
+
+
+inline
+Bezier::Bezier(Point p[4]) noexcept
+ : _bb(-1)
+{
+ memcpy(_p, p, sizeof(Point) * 4);
+}
+
+inline
+Bezier::Bezier(const Point &p0, const Point &p1, const Point &p2, const Point &p3) noexcept
+{
+ _p[0] = p0;
+ _p[1] = p1;
+ _p[2] = p2;
+ _p[3] = p3;
+ _bb = -1;
+}
+
+inline void
+Bezier::ensure_bb() const noexcept
+{
+ if (_bb < 0)
+ make_bb();
+}
+
+inline double
+Bezier::bb_top_x() const noexcept
+{
+ return _p[(_bb >> 4) & 3].y;
+}
+
+inline double
+Bezier::bb_left_x() const noexcept
+{
+ return _p[(_bb >> 2) & 3].x;
+}
+
+inline double
+Bezier::bb_bottom_x() const noexcept
+{
+ return _p[(_bb >> 6) & 3].y;
+}
+
+inline double
+Bezier::bb_right_x() const noexcept
+{
+ return _p[(_bb >> 0) & 3].x;
+}
+
+inline double
+Bezier::bb_top() const noexcept
+{
+ ensure_bb();
+ return bb_top_x();
+}
+
+inline double
+Bezier::bb_left() const noexcept
+{
+ ensure_bb();
+ return bb_left_x();
+}
+
+inline double
+Bezier::bb_bottom() const noexcept
+{
+ ensure_bb();
+ return bb_bottom_x();
+}
+
+inline double
+Bezier::bb_right() const noexcept
+{
+ ensure_bb();
+ return bb_right_x();
+}
+
+inline void
+Bezier::segmentize(Vector<Point> &v) const
+{
+ segmentize(v, v.size() == 0 || v.back() != _p[0]);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h
new file mode 100644
index 00000000000..3174a06e596
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/clp.h
@@ -0,0 +1,303 @@
+/* -*- related-file-name: "../../liblcdf/clp.c" -*- */
+#ifndef LCDF_CLP_H
+#define LCDF_CLP_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* clp.h - Public interface to CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler, ekohler@gmail.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+typedef struct Clp_Option Clp_Option;
+typedef struct Clp_Parser Clp_Parser;
+typedef struct Clp_ParserState Clp_ParserState;
+
+
+/** @brief Option description.
+ *
+ * CLP users declare arrays of Clp_Option structures to specify what options
+ * should be parsed.
+ * @sa Clp_NewParser, Clp_SetOptions */
+struct Clp_Option {
+ const char *long_name; /**< Name of long option, or NULL if the option
+ has no long name. */
+ int short_name; /**< Character defining short option, or 0 if
+ the option has no short name. */
+ int option_id; /**< User-specified ID defining option,
+ returned by Clp_Next. */
+ int val_type; /**< ID of option's value type, or 0 if option
+ takes no value. */
+ int flags; /**< Option parsing flags. */
+};
+
+/** @name Value types
+ * These values describe the type of an option's argument and are used in
+ * the Clp_Option val_type field. For example, if an option took integers, its
+ * Clp_Option structure would have val_type set to Clp_ValInt. */
+/**@{*/
+#define Clp_NoVal 0 /**< @brief Option takes no value. */
+#define Clp_ValString 1 /**< @brief Option value is an
+ arbitrary string. */
+#define Clp_ValStringNotOption 2 /**< @brief Option value is a
+ non-option string.
+
+ See Clp_DisallowOptions. */
+#define Clp_ValBool 3 /**< @brief Option value is a
+ boolean.
+
+ Accepts "true", "false", "yes", "no", "1", and "0", or any
+ prefixes thereof. The match is case-insensitive. */
+#define Clp_ValInt 4 /**< @brief Option value is a
+ signed int.
+
+ Accepts an optional "+" or "-" sign, followed by one or more
+ digits. The digits may be include a "0x" or "0X" prefix, for
+ a hexidecimal number, or a "0" prefix, for an octal number;
+ otherwise it is decimal. */
+#define Clp_ValUnsigned 5 /**< @brief Option value is an
+ unsigned int.
+
+ Accepts an optional "+" sign, followed by one or more
+ digits. The digits may be include a "0x" or "0X" prefix, for
+ a hexidecimal number, or a "0" prefix, for an octal number;
+ otherwise it is decimal. */
+#define Clp_ValDouble 6 /**< @brief Option value is a
+ double.
+ Accepts a real number as defined by strtod(). */
+#define Clp_ValFirstUser 10 /**< @brief Value types >=
+ Clp_ValFirstUser are available
+ for user types. */
+/**@}*/
+
+/** @name Option flags
+ * These flags are used in the Clp_Option flags field. */
+/**@{*/
+#define Clp_Mandatory (1<<0) /**< @brief Option flag: value
+ is mandatory.
+
+ It is an error if the option has no value. This is the
+ default if an option has arg_type != 0 and the Clp_Optional
+ flag is not provided. */
+#define Clp_Optional (1<<1) /**< @brief Option flag: value
+ is optional. */
+#define Clp_Negate (1<<2) /**< @brief Option flag: option
+ may be negated.
+
+ --no-[long_name] will be accepted in argument lists. */
+#define Clp_OnlyNegated (1<<3) /**< @brief Option flag: option
+ <em>must</em> be negated.
+
+ --no-[long_name] will be accepted in argument lists, but
+ --[long_name] will not. This is the default if long_name
+ begins with "no-". */
+#define Clp_PreferredMatch (1<<4) /**< @brief Option flag: prefer this
+ option when matching.
+
+ Prefixes of --[long_name] should map to this option, even if
+ other options begin with --[long_name]. */
+/**@}*/
+
+/** @name Option character types
+ * These flags are used in to define character types in Clp_SetOptionChar(). */
+/**@{*/
+/* Clp_NotOption 0 */
+#define Clp_Short (1<<0) /**< @brief Option character begins
+ a set of short options. */
+#define Clp_Long (1<<1) /**< @brief Option character begins
+ a long option. */
+#define Clp_ShortNegated (1<<2) /**< @brief Option character begins
+ a set of negated short options. */
+#define Clp_LongNegated (1<<3) /**< @brief Option character begins
+ a negated long option. */
+#define Clp_LongImplicit (1<<4) /**< @brief Option character can begin
+ a long option, and is part of that
+ long option. */
+/**@}*/
+
+#define Clp_NotOption 0 /**< @brief Clp_Next value: argument
+ was not an option. */
+#define Clp_Done -1 /**< @brief Clp_Next value: there are
+ no more arguments. */
+#define Clp_BadOption -2 /**< @brief Clp_Next value: argument
+ was an erroneous option. */
+#define Clp_Error -3 /**< @brief Clp_Next value: internal
+ CLP error. */
+
+#define Clp_ValSize 40 /**< @brief Minimum size of the
+ Clp_Parser val.cs field. */
+#define Clp_ValIntSize 10 /**< @brief Minimum size of the
+ Clp_Parser val.is field. */
+
+
+/** @brief A value parsing function.
+ * @param clp the parser
+ * @param vstr the value to be parsed
+ * @param complain if nonzero, report error messages via Clp_OptionError
+ * @param user_data user data passed to Clp_AddType()
+ * @return 1 if parsing succeeded, 0 otherwise
+ */
+typedef int (*Clp_ValParseFunc)(Clp_Parser *clp, const char *vstr,
+ int complain, void *user_data);
+
+/** @brief A function for reporting option errors.
+ * @param clp the parser
+ * @param message error message
+ */
+typedef void (*Clp_ErrorHandler)(Clp_Parser *clp, const char *message);
+
+
+/** @brief Command line parser.
+ *
+ * A Clp_Parser object defines an instance of CLP, including allowed options,
+ * value types, and current arguments.
+ * @sa Clp_NewParser, Clp_SetOptions, Clp_SetArguments */
+struct Clp_Parser {
+ const Clp_Option *option; /**< The last option. */
+
+ int negated; /**< Whether the last option was negated. */
+
+ int have_val; /**< Whether the last option had a value. */
+ const char *vstr; /**< The string value provided with the last
+ option. */
+
+ union {
+ int i;
+ unsigned u;
+ double d;
+ const char *s;
+ void *pv;
+#ifdef HAVE_INT64_TYPES
+ int64_t i64;
+ uint64_t u64;
+#endif
+ char cs[Clp_ValSize];
+ unsigned char ucs[Clp_ValSize];
+ int is[Clp_ValIntSize];
+ unsigned us[Clp_ValIntSize];
+ } val; /**< The parsed value provided with the last
+ option. */
+
+ void *user_data; /**< Uninterpreted by CLP; users can set
+ arbitrarily. */
+
+ struct Clp_Internal *internal;
+};
+
+/** @cond never */
+#if __GNUC__ >= 4
+# define CLP_SENTINEL __attribute__((sentinel))
+#else
+# define CLP_SENTINEL /* nothing */
+#endif
+/** @endcond never */
+
+
+/** @brief Create a new Clp_Parser. */
+Clp_Parser *Clp_NewParser(int argc, const char * const *argv,
+ int nopt, const Clp_Option *opt);
+
+/** @brief Destroy a Clp_Parser object. */
+void Clp_DeleteParser(Clp_Parser *clp);
+
+
+/** @brief Return @a clp's program name. */
+const char *Clp_ProgramName(Clp_Parser *clp);
+
+/** @brief Set @a clp's program name. */
+const char *Clp_SetProgramName(Clp_Parser *clp, const char *name);
+
+
+/** @brief Set @a clp's error handler function. */
+Clp_ErrorHandler Clp_SetErrorHandler(Clp_Parser *clp, Clp_ErrorHandler errh);
+
+/** @brief Set @a clp's UTF-8 mode. */
+int Clp_SetUTF8(Clp_Parser *clp, int utf8);
+
+/** @brief Return @a clp's treatment of character @a c. */
+int Clp_OptionChar(Clp_Parser *clp, int c);
+
+/** @brief Set @a clp's treatment of character @a c. */
+int Clp_SetOptionChar(Clp_Parser *clp, int c, int type);
+
+/** @brief Set @a clp's option definitions. */
+int Clp_SetOptions(Clp_Parser *clp, int nopt, const Clp_Option *opt);
+
+/** @brief Set @a clp's arguments. */
+void Clp_SetArguments(Clp_Parser *clp, int argc, const char * const *argv);
+
+/** @brief Set whether @a clp is searching for options. */
+int Clp_SetOptionProcessing(Clp_Parser *clp, int on);
+
+
+#define Clp_DisallowOptions (1<<0) /**< @brief Value type flag: value
+ can't be an option string.
+
+ See Clp_AddType(). */
+
+/** @brief Define a new value type for @a clp. */
+int Clp_AddType(Clp_Parser *clp, int val_type, int flags,
+ Clp_ValParseFunc parser, void *user_data);
+
+
+#define Clp_AllowNumbers (1<<0) /**< @brief String list flag: allow
+ explicit numbers.
+
+ See Clp_AddStringListType() and Clp_AddStringListTypeVec(). */
+
+/** @brief Define a new string list value type for @a clp. */
+int Clp_AddStringListTypeVec(Clp_Parser *clp, int val_type, int flags,
+ int nstrs, const char * const *strs,
+ const int *vals);
+
+/** @brief Define a new string list value type for @a clp. */
+int Clp_AddStringListType(Clp_Parser *clp, int val_type, int flags, ...)
+ CLP_SENTINEL;
+
+
+/** @brief Parse and return the next argument from @a clp. */
+int Clp_Next(Clp_Parser *clp);
+
+/** @brief Return the next argument from @a clp without option parsing. */
+const char *Clp_Shift(Clp_Parser *clp, int allow_options);
+
+
+/** @brief Create a new Clp_ParserState. */
+Clp_ParserState *Clp_NewParserState(void);
+
+/** @brief Destroy a Clp_ParserState object. */
+void Clp_DeleteParserState(Clp_ParserState *state);
+
+/** @brief Save @a clp's current state in @a state. */
+void Clp_SaveParser(const Clp_Parser *clp, Clp_ParserState *state);
+
+/** @brief Restore parser state from @a state into @a clp. */
+void Clp_RestoreParser(Clp_Parser *clp, const Clp_ParserState *state);
+
+
+/** @brief Report a parser error. */
+int Clp_OptionError(Clp_Parser *clp, const char *format, ...);
+
+/** @brief Extract the current option as a string. */
+int Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int len);
+
+/** @brief Extract the current option as a string. */
+const char *Clp_CurOptionName(Clp_Parser *clp);
+
+#undef CLP_SENTINEL
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/error.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/error.hh
new file mode 100644
index 00000000000..36b3e728a63
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/error.hh
@@ -0,0 +1,877 @@
+// -*- related-file-name: "../../liblcdf/error.cc" -*-
+#ifndef LCDF_ERROR_HH
+#define LCDF_ERROR_HH
+#include <lcdf/string.hh>
+#ifndef __KERNEL__
+# include <stdio.h>
+#endif
+#include <stdarg.h>
+#if HAVE_ADDRESSABLE_VA_LIST
+# define VA_LIST_REF_T va_list *
+# define VA_LIST_DEREF(val) (*(val))
+# define VA_LIST_REF(val) (&(val))
+#else
+# define VA_LIST_REF_T va_list
+# define VA_LIST_DEREF(val) (val)
+# define VA_LIST_REF(val) (val)
+#endif
+#if __GNUC__ <= 3
+# define ERRH_SENTINEL
+# define ERRH_NORETURN
+#else
+# define ERRH_SENTINEL __attribute__((sentinel))
+# define ERRH_NORETURN __attribute__((noreturn))
+#endif
+
+/** @class ErrorHandler
+ * @brief Error reporting class.
+ *
+ * Report errors through ErrorHandler objects, which represent
+ * error collectors and printers. ErrorHandlers are passed to configure() and
+ * initialize() methods explicitly, as well as to write handlers; the
+ * click_chatter() function calls ErrorHandler implicitly.
+ *
+ * <h3>Cooked error messages</h3>
+ *
+ * Most ErrorHandler interactions consist of a simple call like this:
+ * @code
+ * errh->error("not enough arguments (%d needed)", 5);
+ * // prints something like "not enough arguments (5 needed)\n"
+ * @endcode
+ *
+ * This function constructs an error message string from the format arguments,
+ * annotates the string with a default error level (here, el_error), and
+ * prints it. Alternate versions take a landmark specifying where the error
+ * took place:
+ * @code
+ * errh->lwarning("file.click:2", "syntax error at '%s'", word.c_str());
+ * // prints something like "file.click:2: syntax error at 'foo'\n"
+ * @endcode
+ *
+ * <h3>Raw error messages</h3>
+ *
+ * For finer control over error levels and annotations, construct an error
+ * message string directly. An error message is a string consisting of one or
+ * more lines. Each line begins with a set of optional textual @em
+ * annotations. The following error message has a @em level annotation
+ * determining how serious the error is (this one is critical, since
+ * el_critical == 2), and a @em landmark annotation, which specifies where the
+ * error took place (here, "x.click:1"):
+ *
+ * <tt>"<2>{l:x.click:1}syntax error"</tt>
+ *
+ * The default ErrorHandlers understand the level and landmark
+ * annotations. Users can add other arbitrary annotations, which can be
+ * useful to pass error metadata. A pair of braces ends the annotation area.
+ * This example has one user annotation <tt>eoc</tt>, and a message area that
+ * would be mistaken for an annotation were it not for the <tt>{}</tt>:
+ *
+ * <tt>"<2>{l:x.click:1}{eoc:520}{}{not:an annotation}"</tt>
+ *
+ * <h3>Stacking handlers</h3>
+ *
+ * Some ErrorHandlers stack on top of others, adding useful functionality like
+ * automatic context description and prefixing. For example,
+ * ContextErrorHandler can be used to print messages like "In function
+ * 'xxx':".
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "While counting to 2:\n"
+ * // " An error occurred.\n"
+ * // " Another error occurred.\n"
+ * @endcode */
+class ErrorHandler { public:
+
+ /** @brief Error level constants.
+ *
+ * Lower values represent more serious errors. Levels 0-7 correspond to
+ * Linux's error levels. Negative levels request immediate exit; at user
+ * level, the exit status is the absolute value of the
+ * error level. */
+ enum Level {
+ el_abort = -999, ///< Error level that triggers abort().
+ el_fatal = -1, ///< Fatal exit error level.
+ /// Exit status equals -(level).
+ el_emergency = 0, ///< Emergency error level: system is unusable.
+ el_alert = 1, ///< Alert error level: action must be taken.
+ el_critical = 2, ///< Error level for critical conditions.
+ el_error = 3, ///< Error level for normal error conditions.
+ el_warning = 4, ///< Error level for warning conditions.
+ el_notice = 5, ///< Error level for normal, but significant
+ /// conditions.
+ el_info = 6, ///< Error level for informational messages.
+ el_debug = 7 ///< Error level for debug messages.
+ };
+
+ /** @brief Error level indicators. */
+ static const char e_abort[],
+ e_fatal[],
+ e_emergency[],
+ e_alert[],
+ e_critical[],
+ e_error[],
+ e_warning[],
+ e_warning_annotated[],
+ e_notice[],
+ e_info[],
+ e_debug[];
+
+ /** @brief Construct an ErrorHandler. */
+ ErrorHandler()
+ : _nerrors(0) {
+ }
+
+ virtual ~ErrorHandler() {
+ }
+
+
+ /** @brief Initialize the ErrorHandler implementation.
+ * @param errh default error handler
+ * @return @a errh
+ *
+ * Call this function to initialize the ErrorHandler implementation. The
+ * function installs the default conversions, creates the
+ * silent_handler(), and installs @a errh as the default error handler
+ * (see default_handler()).
+ *
+ * @note The @a errh object becomes the property of the ErrorHandler
+ * implementation and must not be deleted.
+ * (ErrorHandler::static_cleanup() will delete it.) Only the first call
+ * to static_initialize() has any effect. */
+ static ErrorHandler *static_initialize(ErrorHandler *errh);
+
+ /** @brief Tear down the ErrorHandler implementation.
+ *
+ * Deletes the internal ErrorHandlers and uninstalls default
+ * conversions. */
+ static void static_cleanup();
+
+
+ /** @brief Return the default ErrorHandler.
+ * @sa static_initialize() */
+ static ErrorHandler *default_handler() {
+ return the_default_handler;
+ }
+
+ /** @brief Set the default ErrorHandler to @a errh.
+ * @note @a errh becomes property of the ErrorHandler implementation,
+ * and will be freed by static_cleanup(). However, any prior default
+ * handler is @em not destroyed. Callers should delete the prior handler
+ * when necessary. */
+ static void set_default_handler(ErrorHandler *errh);
+
+ /** @brief Return the global silent ErrorHandler. */
+ static ErrorHandler *silent_handler() {
+ return the_silent_handler;
+ }
+
+
+ static const int ok_result; ///< Equals 0, used for error levels
+ /// <5> and above
+ static const int error_result; ///< Equals -EINVAL, used for error
+ /// levels <4> and below
+
+
+ /** @brief Print a debug message (level el_debug).
+ *
+ * @a fmt and any following arguments are parsed as by format(), and the
+ * resulting string is passed to xmessage(). */
+ void debug(const char *fmt, ...);
+ /** @brief Print an informational message (level el_info). */
+ void message(const char *fmt, ...);
+ /** @brief Print a warning message (level el_warning).
+ * @return error_result
+ *
+ * The string "warning: " is prepended to every line of the message. */
+ int warning(const char *fmt, ...);
+ /** @brief Print an error message (level el_error).
+ * @return error_result */
+ int error(const char *fmt, ...);
+ /** @brief Print a fatal error message (level el_fatal).
+ * @return error_result
+ *
+ * Calling fatal() will cause the process to abort. */
+ void fatal(const char *fmt, ...) ERRH_NORETURN;
+
+ /** @brief Print a debug message with a landmark annotation. */
+ void ldebug(const String &landmark, const char *fmt, ...);
+ /** @brief Print an informational message with a landmark annotation. */
+ void lmessage(const String &landmark, const char *fmt, ...);
+ /** @brief Print a warning message with a landmark annotation. */
+ int lwarning(const String &landmark, const char *fmt, ...);
+ /** @brief Print an error message with a landmark annotation. */
+ int lerror(const String &landmark, const char *fmt, ...);
+ /** @brief Print a fatal error message with a landmark annotation. */
+ void lfatal(const String &landmark, const char *fmt, ...) ERRH_NORETURN;
+
+
+ /** @brief Print an annotated error message.
+ * @return ok_result if the minimum error level was el_notice or higher,
+ * otherwise error_result
+ *
+ * This function drives the virtual functions actually responsible for
+ * error message decoration and printing. It passes @a str to decorate(),
+ * separates the result into lines, calls emit() for each line, and calls
+ * account() with the minimum error level of any line.
+ *
+ * Most users will call shorthand functions like error(), warning(), or
+ * lmessage(), which add relevant annotations to the message. */
+ int xmessage(const String &str);
+ /** @brief Print an error message, adding annotations.
+ * @param anno annotations
+ * @param str error message
+ *
+ * Shorthand for xmessage(combine_anno(@a str, @a anno)). */
+ int xmessage(const String &anno, const String &str) {
+ return xmessage(combine_anno(str, anno));
+ }
+ /** @brief Format and print an error message, adding annotations.
+ * @param anno annotations
+ * @param fmt error message format
+ * @param val format arguments
+ *
+ * Shorthand for xmessage(@a anno, vformat(@a fmt, @a val)). */
+ int xmessage(const String &anno, const char *fmt, va_list val) {
+ return xmessage(anno, vformat(fmt, val));
+ }
+ /** @brief Print an error message, adding landmark and other annotations.
+ * @param landmark landmark annotation
+ * @param anno additional annotations
+ * @param str error message
+ *
+ * Shorthand for xmessage(combine_anno(@a anno, make_landmark_anno(@a
+ * landmark)), @a str). */
+ int xmessage(const String &landmark, const String &anno,
+ const String &str) {
+ return xmessage(combine_anno(anno, make_landmark_anno(landmark)), str);
+ }
+ /** @brief Format and print an error message, adding landmark and other
+ * annotations.
+ * @param landmark landmark annotation
+ * @param anno additional annotations
+ * @param fmt error message format
+ * @param val format arguments
+ *
+ * Shorthand for xmessage(@a landmark, @a anno, vformat(@a fmt, @a
+ * val)). */
+ int xmessage(const String &landmark, const String &anno,
+ const char *fmt, va_list val) {
+ return xmessage(landmark, anno, vformat(fmt, val));
+ }
+
+
+ /** @brief Return the number of errors reported via this handler.
+ *
+ * An error is any message that contains at least one line with error
+ * level 3 (#el_error) or below.
+ *
+ * @note The error count will also contain errors reported via stacked
+ * handlers. For instance:
+ * @code
+ * SilentErrorHandler errh1;
+ * PrefixErrorHandler errh2(&errh1, "");
+ * assert(errh1.nerrors() == 0);
+ * errh2.error("blah");
+ * assert(errh1.nerrors() == 1);
+ * @endcode
+ *
+ * @sa account, clear */
+ int nerrors() const {
+ return _nerrors;
+ }
+
+
+ /** @brief Format an error string.
+ * @param default_flags default ConversionFlags
+ * @param fmt printf-like format string
+ * @return formatted error string
+ *
+ * Formats an error string using printf-like % conversions. Conversions
+ * include:
+ *
+ * <table>
+ *
+ * <tr><td><tt>\%d</tt>, <tt>\%i</tt></td><td>Format an <tt>int</tt> as a
+ * decimal string. Understands flags in <tt>#0- +</tt>, field widths
+ * (including <tt>*</tt>), and precisions.</td></tr>
+ *
+ * <tr><td><tt>\%hd</tt>, <tt>\%ld</tt>, <tt>\%lld</tt>,
+ * <tt>\%zd</tt></td><td>Format a <tt>short</tt>, <tt>long</tt>, <tt>long
+ * long</tt>, or <tt>size_t</tt>.</td></tr>
+ *
+ * <tr><td><tt>\%^16d</tt>, <tt>\%^32d</tt>, <tt>\%^64d</tt></td>
+ * <td>Format a 16-, 32-, or 64-bit integer.</td></tr>
+ *
+ * <tr><td><tt>\%o</tt>, <tt>\%u</tt>, <tt>\%x</tt>,
+ * <tt>\%X</tt></td><td>Format an unsigned integer in octal, decimal, or
+ * hexadecimal (with lower-case or upper-case letters).</td></tr>
+ *
+ * <tr><td><tt>\%s</tt></td><td>Format a C string (<tt>const char *</tt>).
+ * The alternate form <tt>\%\#s</tt> calls String::printable() on the
+ * input string. Both <tt>\%\#s</tt> and the alternate form <tt>\%'s</tt>
+ * ensure that no part of the string is mistaken for an error
+ * annotation.</td></tr>
+ *
+ * <tr><td><tt>\%c</tt></td><td>Format a character. Prints a C-like
+ * escape if the input character isn't printable ASCII.</td></tr>
+ *
+ * <tr><td><tt>\%p</tt></td><td>Format a pointer as a hexadecimal
+ * value.</td></tr>
+ *
+ * <tr><td><tt>\%e</tt>, <tt>\%E</tt>, <tt>\%f</tt>, <tt>\%F</tt>,
+ * <tt>\%g</tt>, <tt>\%G</tt></td><td>Format a <tt>double</tt> (user-level
+ * only).</td></tr>
+ *
+ * <tr><td><tt>\%p{...}</tt><td>Call a user-provided conversion function.
+ * For example, <tt>\%p{ip_ptr}</tt> reads an <tt>IPAddress *</tt> argument
+ * from the argument list, and formats the pointed-to address using
+ * IPAddress::unparse().</td></tr>
+ *
+ * <tr><td><tt>\%\%</tt></td><td>Format a literal \% character.</td></tr>
+ *
+ * <tr><td><tt>\%\<</tt></td><td>Format a left quote string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * <tr><td><tt>\%\></tt></td><td>Format a right quote string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * <tr><td><tt>\%,</tt></td><td>Format an apostrophe string. Usually
+ * prints a single quote.</td></tr>
+ *
+ * </table> */
+ static String xformat(int default_flags, const char *fmt, ...);
+ /** @overload */
+ static String vxformat(int default_flags, const char *fmt, va_list val);
+ /** @overload */
+ static String xformat(const char *fmt, ...);
+ /** @overload */
+ static String vxformat(const char *fmt, va_list val) {
+ return vxformat(0, fmt, val);
+ }
+
+
+ /** @brief Format an error string.
+ * @param fmt format string
+ * @param val argument list
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * This virtual function is called to format an error message. The
+ * default implementation returns the result of vxformat(@a fmt, @a val). */
+ virtual String vformat(const char *fmt, va_list val);
+
+ /** @brief Format an error string.
+ * @param fmt format string
+ *
+ * @warning ErrorHandler users don't usually need to call this function
+ * directly.
+ *
+ * This is a convenience function that calls vformat(const char *fmt,
+ * va_list val) for a va_list taken from the ellipsis arguments. */
+ String format(const char *fmt, ...);
+
+ /** @brief Decorate an error message.
+ * @param str error message, possibly with annotations
+ * @return decorated error message
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * This virtual function is called to decorate an error message before it
+ * is emitted. The input @a str is an error message string, possibly
+ * annotated. The default implementation returns @a str unchanged. Other
+ * ErrorHandlers might add context lines (ContextErrorHandler), prefixes
+ * (PrefixErrorHandler), or a default landmark (LandmarkErrorHandler). */
+ virtual String decorate(const String &str);
+
+ /** @brief Output an error message line.
+ * @param str error message line, possibly with annotations
+ * @param user_data callback data, 0 for first line in a message
+ * @param more true iff this is the last line in the current message
+ * @return @a user_data to be passed to emit() for the next line
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * After calling decorate(), ErrorHandler splits the message into
+ * individual lines and calls emit() once per line. ErrorHandler
+ * subclasses should output the error lines as appropriate; for example,
+ * FileErrorHandler outputs the error message to a file.
+ *
+ * @a str does not contain a newline, but may contain annotations,
+ * including a landmark annotation. Most ErrorHandlers use parse_anno()
+ * to extract the landmark annotation, clean it with clean_landmark(), and
+ * print it ahead of the error message proper.
+ *
+ * ErrorHandler can handle multi-line error messages. However, the emit()
+ * function takes a line at a time; this is more useful in practice for
+ * most error message printers. The @a user_data and @a more arguments
+ * can help an ErrorHandler combine the lines of a multi-line error
+ * message. @a user_data is null for the first line; for second and
+ * subsequent lines, ErrorHandler passes the result of the last line's
+ * emit() call. @a more is true iff this is the last line in the current
+ * message.
+ *
+ * The default emit() implementation does nothing. */
+ virtual void *emit(const String &str, void *user_data, bool more);
+
+ /** @brief Account for an error message at level @a level.
+ * @param level minimum error level in the message
+ *
+ * @warning ErrorHandler users don't need to call this function directly;
+ * it is called implicitly by the error()/xmessage() functions.
+ *
+ * After calling emit() for the lines of an error message, ErrorHandler
+ * calls account(), passing the minimum (worst) error level of any message
+ * line (or 1000 if no line had a level). The default implementation
+ * updates the nerrors() counter, and exits the program if @a level is
+ * small enough. */
+ virtual void account(int level);
+
+ /** @brief Clear accumulated error state.
+ *
+ * The default implementation sets the nerrors() counter to zero. */
+ virtual void clear() {
+ _nerrors = 0;
+ }
+
+
+ /** @brief Create an error annotation.
+ * @param name annotation name
+ * @param value annotation value
+ * @return annotation string
+ *
+ * Returns an error annotation that associates annotation @a name with @a
+ * value.
+ *
+ * If @a name equals "<>", then returns a level annotation of the form
+ * "<@a value>". @a value must be valid number; if it isn't, the function
+ * returns the empty string.
+ *
+ * Otherwise, @a name must be a nonempty series of letters and digits.
+ * make_anno() returns a string of the form "{@a name:@a value}", where
+ * special characters in @a value are quoted with backslashes. */
+ static String make_anno(const char *name, const String &value);
+
+ /** @brief Apply annotations from @a anno to every line in @a str.
+ * @param str string
+ * @param anno annotation string
+ *
+ * The annotations from @a anno are applied to every line in @a str. New
+ * annotations do not override existing annotations with the same names.
+ * If the @a anno string ends with non-annotation characters, this
+ * substring is prefixed to every line in @a str.
+ *
+ * For example:
+ * @code
+ * combine_anno("Line 1\n{l:old}{x:x}Line 2\n", "<0>{l:new} ")
+ * // returns "<0>{l:new} Line 1\n<0>{l:old}{x:x} Line 2\n"
+ * @endcode */
+ static String combine_anno(const String &str, const String &anno);
+
+ /** @brief Parse error annotations from a string.
+ * @param str the string
+ * @param begin pointer within @a str to start of annotation area
+ * @param end pointer to end of error region, usually @a str.end()
+ * @return pointer to first character after annotation area
+ * @pre @a str.begin() <= {@a begin, @a end} <= @a str.end()
+ * @post @a begin <= returned value <= @a end
+ *
+ * Use this function to skip an error line's annotation area, possibly
+ * extracting named annotations.
+ *
+ * The variable arguments portion consists of a series of pairs of C
+ * strings and value pointers, terminated by a null character pointer.
+ * Each C string is an annotation name. The corresponding annotation
+ * value, if found, is stored as a String object in the value pointer.
+ * You can also store the <tt>int</tt> value of an annotation by prefixing
+ * an annotation name with the '#' character.
+ *
+ * For example:
+ * @code
+ * String line = "{l:file:30}<4.5>error message\n";
+ * String landmark_str, level_str;
+ * const char *s = ErrorHandler::parse_anno(line, line.begin(), line.end(),
+ * "l", &landmark_str, "<>", &level_str, (const char *) 0);
+ * // Results: s points to "error message\n",
+ * // landmark_str == "file:30", level_str == "4.5"
+ *
+ * int level;
+ * s = ErrorHandler::parse_anno(line, line.begin(), line.end(),
+ * "#<>", &level, (const char *) 0);
+ * // Results: s points to "error message\n", level_str == 4
+ * @endcode */
+ static const char *parse_anno(const String &str,
+ const char *begin, const char *end, ...) ERRH_SENTINEL;
+
+ /** @brief Skip a string's error annotations.
+ * @param begin pointer to start of string
+ * @param end pointer one past end of string
+ * @return pointer to first character after annotation area
+ * @post @a begin <= returned value <= @a end
+ *
+ * Use this function to skip an error line's annotation area. The error
+ * line is defined as a pair of iterators. */
+ static const char *skip_anno(const char *begin, const char *end) {
+ String name, value;
+ const char *x = begin;
+ do {
+ x = skip_anno(String(), x, end, &name, &value, false);
+ } while (name);
+ return x;
+ }
+
+
+ /** @brief Return a landmark annotation equal to @a x.
+ * @param x landmark
+ *
+ * If @a x is empty, returns the empty string. Otherwise, if @a x looks
+ * like a formatted annotation (it starts with an open brace), returns @a
+ * x unchanged. Otherwise, returns make_anno("l", @a x). */
+ static String make_landmark_anno(const String &x) {
+ if (x && x[0] == '{')
+ return x;
+ else if (x)
+ return make_anno("l", x);
+ else
+ return String();
+ }
+
+ /** @brief Clean the @a landmark.
+ * @param landmark landmark text
+ * @param colon if true, append <tt>": "</tt> to a nonempty landmark
+ *
+ * Removes trailing space and an optional trailing colon from @a landmark
+ * and returns the result. If @a colon is true, and the cleaned landmark
+ * isn't the empty string, then appends <tt>": "</tt> to the result. */
+ static String clean_landmark(const String &landmark, bool colon = false);
+
+
+ // error conversions
+ struct Conversion;
+ typedef String (*ConversionFunction)(int flags, VA_LIST_REF_T);
+ enum ConversionFlags {
+ cf_zero_pad = 1, ///< Set for conversions using the '0' flag.
+ cf_plus_positive = 2, ///< Set for conversions using the '+' flag.
+ cf_space_positive = 4, ///< Set for conversions using the ' ' flag.
+ cf_left_just = 8, ///< Set for conversions using the '-' flag.
+ cf_alternate_form = 16, ///< Set for conversions using the '#' flag.
+ cf_singlequote = 32, ///< Set for conversions using the '\'' flag.
+ cf_uppercase = 64, ///< Set for 'X' conversions (not 'x').
+ cf_signed = 128, ///< Set for conversions of signed numbers.
+ cf_negative = 256, ///< Set for conversions of negative numbers.
+ cf_utf8 = 1024 ///< Set to use UTF-8 characters on output.
+ };
+ static Conversion *add_conversion(const String &name, ConversionFunction func);
+ static int remove_conversion(Conversion *conversion);
+
+ private:
+
+ int _nerrors;
+
+ static ErrorHandler *the_default_handler;
+ static ErrorHandler *the_silent_handler;
+
+ static const char *skip_anno(const String &str,
+ const char *begin, const char *end,
+ String *name_result, String *value_result,
+ bool raw);
+
+};
+
+
+/** @class SilentErrorHandler
+ * @brief An ErrorHandler that does not report messages.
+ *
+ * Use SilentErrorHandler when an ErrorHandler object is required, but error
+ * messages should not be printed. */
+class SilentErrorHandler : public ErrorHandler { public:
+
+ SilentErrorHandler() {
+ }
+
+};
+
+
+/** @class ErrorVeneer
+ * @brief Base class for ErrorHandlers that forward messages.
+ *
+ * ErrorHandlers can stack. Stacking ErrorHandlers simplify modify a message
+ * and then pass the result to a base ErrorHandler, which does the actual
+ * printing. The ErrorVeneer base class simplifies the implementation of
+ * stacking ErrorHandlers. It provides versions of ErrorHandler's format(),
+ * decorate(), emit(), and account() methods that forward to the underlying
+ * handler. Note that the clear() method is <em>not</em> automatically
+ * forwarded. */
+class ErrorVeneer : public ErrorHandler { public:
+
+ /** @brief Construct an ErrorVeneer.
+ * @param errh base ErrorHandler
+ *
+ * If @a errh is 0, then the ErrorVeneer acts like a
+ * SilentErrorHandler. */
+ ErrorVeneer(ErrorHandler *errh)
+ : _errh(errh) {
+ }
+
+ String vformat(const char *fmt, va_list val);
+ String decorate(const String &str);
+ void *emit(const String &str, void *user_data, bool more);
+ void account(int level);
+
+ private:
+
+ ErrorHandler *_errh;
+
+};
+
+
+#ifndef __KERNEL__
+/** @class FileErrorHandler
+ * @brief An ErrorHandler that prints error messages to a given file.
+ *
+ * FileErrorHandler is the typical base ErrorHandler used at user level. It
+ * prints messages to a file passed in to the constructor, and calls exit() or
+ * abort() based on the error level. */
+class FileErrorHandler : public ErrorHandler { public:
+
+ /** @brief Construct a FileErrorHandler.
+ * @param f file to print errors
+ * @param prefix string to prefix every error line */
+ FileErrorHandler(FILE *f, const String &prefix = String());
+
+ void set_default_flags(int default_flags) {
+ _default_flags = default_flags;
+ }
+
+ String vformat(const char *fmt, va_list val);
+ void *emit(const String &str, void *user_data, bool more);
+
+ private:
+
+ FILE *_f;
+ String _context;
+ int _default_flags;
+
+};
+#endif
+
+
+/** @class LocalErrorHandler
+ * @brief A convenience stackable ErrorHandler.
+ *
+ * It's often convenient to pass a null ErrorHandler pointer when errors
+ * should not be printed. The LocalErrorHandler class simplifies dealing with
+ * ErrorHandler pointers that may or may not be null. LocalErrorHandler is a
+ * transparent layer on the base handler; but if the base handler is null, it
+ * acts like a SilentErrorHandler. For example:
+ * @code
+ * void f(ErrorHandler *errh) { // errh might or might not be null
+ * LocalErrorHandler lerrh(errh);
+ * ... lerrh.message("message") ...
+ * }
+ * @endcode */
+class LocalErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a LocalErrorHandler. */
+ LocalErrorHandler(ErrorHandler *errh)
+ : ErrorVeneer(errh) {
+ }
+
+};
+
+
+/** @class ContextErrorHandler
+ * @brief A stackable ErrorHandler that prints context lines.
+ *
+ * The stackable ContextErrorHandler adds context to the first error
+ * message printed, and optionally indent error messages so that they appear
+ * grouped underneath the context.
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "While counting to 2:\n"
+ * // " An error occurred.\n"
+ * // " Another error occurred.\n"
+ * @endcode
+ *
+ * To prevent ContextErrorHandler from indenting or printing context for a
+ * message, add a "{context:no}" annotation to the message's first line. To
+ * turn off the indent but keep the context, add a "{context:noindent}"
+ * annotation.
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("{context:no}An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "An error occurred.\n"
+ * // "While counting to 2:\n"
+ * // " Another error occurred.\n"
+ *
+ * FileErrorHandler errh1(stderr);
+ * PrefixErrorHandler noctx_errh(stderr, "{context:no}");
+ * ContextErrorHandler errh2(&errh1, "While counting to 2:");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "An error occurred.\n"
+ * // "Another error occurred.\n"
+ * @endcode
+ *
+ * ContextErrorHandler adds the "{context:context}" annotation to context
+ * lines. */
+class ContextErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a ContextErrorHandler.
+ * @param errh base ErrorHandler
+ * @param fmt format for context lines
+ *
+ * The context message is formed by @a errh->format() using @a fmt and
+ * any additional arguments. */
+ ContextErrorHandler(ErrorHandler *errh, const char *fmt, ...);
+
+ /** @brief Return true iff the context has already been printed. */
+ bool context_printed() const {
+ return _context_printed;
+ }
+
+ /** @brief Set whether the context has been printed. */
+ void set_context_printed(bool x) {
+ _context_printed = x;
+ }
+
+ /** @brief Set the context string to @a str. */
+ void set_context(const String &str) {
+ _context = str;
+ }
+
+ /** @brief Set the indent string to @a str.
+ *
+ * The indent string is prepended to all non-context messages. It can
+ * contain landmarks as well as non-landmark text. The default indent
+ * string is " " (two spaces). */
+ void set_indent(const String &str) {
+ _indent = str;
+ }
+
+ /** @brief Set the context landmark to @a str.
+ *
+ * The context landmark is used to decorate the context, and also applied
+ * to any error messages that lack landmarks of their own. The default
+ * context landmark is empty.
+ *
+ * @note The input @a str is passed to
+ * ErrorHandler::make_landmark_anno(). */
+ void set_context_landmark(const String &str) {
+ _context_landmark = make_landmark_anno(str);
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ String _context;
+ String _indent;
+ String _context_landmark;
+ bool _context_printed;
+
+};
+
+
+/** @class PrefixErrorHandler
+ * @brief A stackable ErrorHandler that adds a prefix to error messages.
+ *
+ * The stackable ContextErrorHandler adds a prefix to every error line
+ * printed. For example:
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * PrefixErrorHandler errh2(&errh1, "Blah--");
+ * errh2.error("An error occurred.");
+ * errh2.error("Another error occurred.");
+ * // prints "Blah--An error occurred.\n"
+ * // "Blah--Another error occurred.\n"
+ * @endcode */
+class PrefixErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a PrefixErrorHandler.
+ * @param errh base ErrorHandler
+ * @param prefix string to prefix to error lines */
+ PrefixErrorHandler(ErrorHandler *errh, const String &prefix);
+
+ String decorate(const String &str);
+
+ private:
+
+ String _prefix;
+
+};
+
+
+/** @class LandmarkErrorHandler
+ * @brief A stackable ErrorHandler that adds a default landmark to error
+ * messages.
+ *
+ * The stackable ContextErrorHandler adds a default landmark to every error
+ * line printed. Error lines' own landmarks are preserved when they exist.
+ * For example:
+ * @code
+ * FileErrorHandler errh1(stderr);
+ * LandmarkErrorHandler errh2(&errh1, "file:1");
+ * errh2.error("An error occurred.");
+ * errh2.lerror("file:2", "Another error occurred.");
+ * // prints "file:1: An error occurred.\n"
+ * // "file:2: Another error occurred.\n"
+ * @endcode */
+class LandmarkErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a LandmarkErrorHandler.
+ * @param errh base ErrorHandler
+ * @param landmark default landmark */
+ LandmarkErrorHandler(ErrorHandler *errh, const String &landmark);
+
+ /** @brief Set the default landmark applied to error messages. */
+ void set_landmark(const String &landmark) {
+ _landmark = make_landmark_anno(landmark);
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ String _landmark;
+
+};
+
+
+#ifndef __KERNEL__
+/** @class BailErrorHandler
+ * @brief A stackable ErrorHandler that exits when errors occur.
+ *
+ * The stackable BailErrorHandler, available only at user level, causes the
+ * process to exit if an error worse than a configurable level occurs. */
+class BailErrorHandler : public ErrorVeneer { public:
+
+ /** @brief Construct a BailErrorHandler.
+ * @param errh base ErrorHandler
+ * @param level error level that causes premature exit
+ *
+ * An error message with level less than or equal to @a el_error will
+ * cause the process to exit with status 1. */
+ BailErrorHandler(ErrorHandler *errh, int level = el_error);
+
+ void account(int level);
+
+ private:
+
+ int _level;
+
+};
+#endif
+
+#undef ERRH_SENTINEL
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/filename.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/filename.hh
new file mode 100644
index 00000000000..9424a4c04fa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/filename.hh
@@ -0,0 +1,41 @@
+// -*- related-file-name: "../../liblcdf/filename.cc" -*-
+#ifndef LCDF_FILENAME_HH
+#define LCDF_FILENAME_HH
+#include <lcdf/string.hh>
+#include <stdio.h>
+
+class Filename { public:
+
+ Filename() : _dir("."), _actual(0) { }
+ Filename(const String &);
+ Filename(const String &dir, const String &name);
+ Filename(FILE *, const String &fake_name);
+
+ bool fake() const { return _actual != 0; }
+
+ const String &directory() const { return _dir; }
+ const String &name() const { return _name; }
+ const String &path() const { return _path; }
+ String base() const;
+ String extension() const;
+
+ operator bool() const { return _name; }
+ bool operator!() const { return !_name; }
+
+ FILE *open_read(bool binary = false) const;
+ bool readable() const;
+
+ FILE *open_write(bool binary = false) const;
+
+ Filename from_directory(const String &n) const { return Filename(_dir, n);}
+
+ private:
+
+ mutable String _dir; // mutable for c_str()
+ mutable String _name;
+ mutable String _path;
+ FILE *_actual;
+
+};
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/globmatch.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/globmatch.hh
new file mode 100644
index 00000000000..963035e0ead
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/globmatch.hh
@@ -0,0 +1,8 @@
+// -*- related-file-name: "../../liblcdf/globmatch.cc" -*-
+#ifndef LCDF_GLOBMATCH_HH
+#define LCDF_GLOBMATCH_HH
+class String;
+
+bool glob_match(const String& str, const String& pattern);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashcode.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashcode.hh
new file mode 100644
index 00000000000..53a0e428989
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashcode.hh
@@ -0,0 +1,31 @@
+#ifndef LCDF_HASHCODE_HH
+#define LCDF_HASHCODE_HH
+#include <stddef.h>
+
+typedef size_t hashcode_t; ///< Typical type for a hashcode() value.
+
+inline hashcode_t
+hashcode(int x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(unsigned x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(long x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+inline hashcode_t
+hashcode(unsigned long x)
+{
+ return static_cast<hashcode_t>(x);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.cc
new file mode 100644
index 00000000000..4851463c560
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.cc
@@ -0,0 +1,187 @@
+#ifndef LCDF_HASHMAP_CC
+#define LCDF_HASHMAP_CC
+
+/*
+ * hashmap.{cc,hh} -- simple open-coded hash table class
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2003 International Computer Science Institute
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+/* #include <lcdf/hashmap.hh> */
+
+template <class K, class V>
+HashMap<K, V>::HashMap()
+ : _capacity(0), _grow_limit(0), _n(0), _e(0), _default_value()
+{
+ increase(-1);
+}
+
+template <class K, class V>
+HashMap<K, V>::HashMap(const V &def)
+ : _capacity(0), _grow_limit(0), _n(0), _e(0), _default_value(def)
+{
+ increase(-1);
+}
+
+
+template <class K, class V>
+HashMap<K, V>::HashMap(const HashMap<K, V> &m)
+ : _capacity(m._capacity), _grow_limit(m._grow_limit), _n(m._n),
+ _e(new Pair[m._capacity]), _default_value(m._default_value)
+{
+ for (int i = 0; i < _capacity; i++)
+ _e[i] = m._e[i];
+}
+
+
+template <class K, class V>
+HashMap<K, V> &
+HashMap<K, V>::operator=(const HashMap<K, V> &o)
+{
+ // This works with self-assignment.
+
+ _capacity = o._capacity;
+ _grow_limit = o._grow_limit;
+ _n = o._n;
+ _default_value = o._default_value;
+
+ Pair *new_e = new Pair[_capacity];
+ for (int i = 0; i < _capacity; i++)
+ new_e[i] = o._e[i];
+
+ delete[] _e;
+ _e = new_e;
+
+ return *this;
+}
+
+
+template <class K, class V>
+void
+HashMap<K, V>::increase(int min_size)
+{
+ int ncap = (_capacity < 8 ? 8 : _capacity * 2);
+ while (ncap < min_size && ncap > 0)
+ ncap *= 2;
+ if (ncap <= 0) // want too many elements
+ return;
+
+ Pair *ne = new Pair[ncap];
+ if (!ne) // out of memory
+ return;
+
+ Pair *oe = _e;
+ int ocap = _capacity;
+ _e = ne;
+ _capacity = ncap;
+ _grow_limit = ((3 * _capacity) >> 2) - 1;
+
+ Pair *otrav = oe;
+ for (int i = 0; i < ocap; i++, otrav++)
+ if (otrav->key) {
+ int j = bucket(otrav->key);
+ _e[j] = *otrav;
+ }
+
+ delete[] oe;
+}
+
+template <class K, class V>
+inline void
+HashMap<K, V>::check_capacity()
+{
+ if (_n >= _grow_limit)
+ increase(-1);
+}
+
+template <class K, class V>
+bool
+HashMap<K, V>::insert(const K &key, const V &val)
+{
+ check_capacity();
+ int i = bucket(key);
+ bool is_new = !(bool)_e[i].key;
+ _e[i].key = key;
+ _e[i].value = val;
+ _n += is_new;
+ return is_new;
+}
+
+template <class K, class V>
+V &
+HashMap<K, V>::find_force(const K &key, const V &value)
+{
+ check_capacity();
+ int i = bucket(key);
+ if (!(bool)_e[i].key) {
+ _e[i].key = key;
+ _e[i].value = value;
+ _n++;
+ }
+ return _e[i].value;
+}
+
+template <class K, class V>
+void
+HashMap<K, V>::clear()
+{
+ delete[] _e;
+ _e = 0;
+ _capacity = _grow_limit = _n = 0;
+ increase(-1);
+}
+
+template <class K, class V>
+void
+HashMap<K, V>::swap(HashMap<K, V> &o)
+{
+ int capacity = _capacity;
+ int grow_limit = _grow_limit;
+ int n = _n;
+ Pair *e = _e;
+ V default_value = _default_value;
+ _capacity = o._capacity;
+ _grow_limit = o._grow_limit;
+ _n = o._n;
+ _e = o._e;
+ _default_value = o._default_value;
+ o._capacity = capacity;
+ o._grow_limit = grow_limit;
+ o._n = n;
+ o._e = e;
+ o._default_value = default_value;
+}
+
+template <class K, class V>
+_HashMap_const_iterator<K, V>::_HashMap_const_iterator(const HashMap<K, V> *hm, int pos)
+ : _hm(hm), _pos(pos)
+{
+ typename HashMap<K, V>::Pair *e = _hm->_e;
+ int capacity = _hm->_capacity;
+ while (_pos < capacity && !(bool)e[_pos].key)
+ _pos++;
+}
+
+template <class K, class V>
+void
+_HashMap_const_iterator<K, V>::operator++(int)
+{
+ typename HashMap<K, V>::Pair *e = _hm->_e;
+ int capacity = _hm->_capacity;
+ for (_pos++; _pos < capacity && !(bool)e[_pos].key; _pos++)
+ ;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.hh
new file mode 100644
index 00000000000..3d4179e5b5f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/hashmap.hh
@@ -0,0 +1,210 @@
+#ifndef LCDF_HASHMAP_HH
+#define LCDF_HASHMAP_HH
+#include <assert.h>
+#include <lcdf/hashcode.hh>
+
+// K AND V REQUIREMENTS:
+//
+// K::K()
+// K::operator bool() const
+// Must have (bool)(K()) == false
+// and no k with (bool)k == false is stored.
+// K & K::operator=(const K &)
+// k1 == k2
+// hashcode_t hashcode(const K &)
+// If hashcode(k1) != hashcode(k2), then k1 != k2.
+// Actually any unsigned integer type may be used.
+//
+// V::V()
+// V & V::operator=(const V &)
+
+template <class K, class V> class _HashMap_const_iterator;
+template <class K, class V> class _HashMap_iterator;
+
+template <class K, class V>
+class HashMap { public:
+
+ HashMap();
+ explicit HashMap(const V &);
+ HashMap(const HashMap<K, V> &);
+ ~HashMap() { delete[] _e; }
+
+ int size() const { return _n; }
+ bool empty() const { return _n == 0; }
+ int capacity() const { return _capacity; }
+ const V &default_value() const { return _default_value; }
+ void set_default_value(const V &v) { _default_value = v; }
+
+ typedef _HashMap_const_iterator<K, V> const_iterator;
+ typedef _HashMap_iterator<K, V> iterator;
+
+ inline const_iterator begin() const;
+ inline iterator begin();
+ inline const_iterator end() const;
+ inline iterator end();
+
+ inline const V &find(const K &) const;
+ inline V *findp(const K &) const;
+ inline const V &operator[](const K &k) const;
+ V &find_force(const K &, const V &);
+ inline V &find_force(const K &);
+
+ bool insert(const K &, const V &);
+ void clear();
+
+ HashMap<K, V> &operator=(const HashMap<K, V> &);
+ void swap(HashMap<K, V> &);
+
+ void resize(int size) { increase(size); }
+
+ struct Pair {
+ K key;
+ V value;
+ Pair() : key(), value() { }
+ };
+
+ private:
+
+ int _capacity;
+ int _grow_limit;
+ int _n;
+ Pair *_e;
+ V _default_value;
+
+ void increase(int);
+ inline void check_capacity();
+ inline int bucket(const K &) const;
+
+ friend class _HashMap_const_iterator<K, V>;
+ friend class _HashMap_iterator<K, V>;
+
+};
+
+template <class K, class V>
+class _HashMap_const_iterator { public:
+ typedef _HashMap_const_iterator const_iterator;
+ typedef typename HashMap<K, V>::Pair Pair;
+
+ operator bool() const { return _pos < _hm->_capacity; }
+ bool operator!() const { return _pos >= _hm->_capacity; }
+
+ void operator++(int);
+ void operator++() { (*this)++; }
+
+ const K &key() const { return _hm->_e[_pos].key; }
+ const V &value() const { return _hm->_e[_pos].value; }
+ const Pair &pair() const { return _hm->_e[_pos]; }
+
+ inline bool operator==(const const_iterator &) const;
+ inline bool operator!=(const const_iterator &) const;
+
+ private:
+ const HashMap<K, V> *_hm;
+ int _pos;
+ _HashMap_const_iterator(const HashMap<K, V> *, int);
+ friend class HashMap<K, V>;
+ friend class _HashMap_iterator<K, V>;
+};
+
+template <class K, class V>
+class _HashMap_iterator : public _HashMap_const_iterator<K, V> { public:
+ typedef _HashMap_iterator iterator;
+
+ V &value() const { return this->_hm->_e[this->_pos].value; }
+
+ private:
+ _HashMap_iterator(const HashMap<K, V> *hm, int pos) : _HashMap_const_iterator<K, V>(hm, pos) { }
+ friend class HashMap<K, V>;
+};
+
+
+template <class K, class V>
+inline int
+HashMap<K, V>::bucket(const K &key) const
+{
+ assert(key);
+ hashcode_t hc = hashcode(key);
+ int i = hc & (_capacity - 1);
+ int j = ((hc >> 6) & (_capacity - 1)) | 1;
+
+ while (_e[i].key && !(_e[i].key == key))
+ i = (i + j) & (_capacity - 1);
+
+ return i;
+}
+
+template <class K, class V>
+inline const V &
+HashMap<K, V>::find(const K &key) const
+{
+ int i = bucket(key);
+ const V *v = (_e[i].key ? &_e[i].value : &_default_value);
+ return *v;
+}
+
+template <class K, class V>
+inline const V &
+HashMap<K, V>::operator[](const K &key) const
+{
+ return find(key);
+}
+
+template <class K, class V>
+inline V *
+HashMap<K, V>::findp(const K &key) const
+{
+ int i = bucket(key);
+ return _e[i].key ? &_e[i].value : 0;
+}
+
+template <class K, class V>
+inline V &
+HashMap<K, V>::find_force(const K &key)
+{
+ return find_force(key, _default_value);
+}
+
+template <class K, class V>
+inline _HashMap_const_iterator<K, V>
+HashMap<K, V>::begin() const
+{
+ return const_iterator(this, 0);
+}
+
+template <class K, class V>
+inline _HashMap_const_iterator<K, V>
+HashMap<K, V>::end() const
+{
+ return const_iterator(this, _capacity);
+}
+
+template <class K, class V>
+inline _HashMap_iterator<K, V>
+HashMap<K, V>::begin()
+{
+ return iterator(this, 0);
+}
+
+template <class K, class V>
+inline _HashMap_iterator<K, V>
+HashMap<K, V>::end()
+{
+ return iterator(this, _capacity);
+}
+
+template <class K, class V>
+inline bool
+_HashMap_const_iterator<K, V>::operator==(const const_iterator &i) const
+{
+ return _hm == i._hm && _pos == i._pos;
+}
+
+template <class K, class V>
+inline bool
+_HashMap_const_iterator<K, V>::operator!=(const const_iterator &i) const
+{
+ return _hm != i._hm || _pos != i._pos;
+}
+
+#include <lcdf/hashmap.cc> // necessary to support GCC 3.3
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/inttypes.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/inttypes.h
new file mode 100644
index 00000000000..b88e9e9faf0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/inttypes.h
@@ -0,0 +1,34 @@
+#ifndef LCDF_INTTYPES_H
+#define LCDF_INTTYPES_H
+/* Define known-width integer types. */
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#elif defined(HAVE_SYS_TYPES_H)
+# include <sys/types.h>
+# ifdef HAVE_U_INT_TYPES
+typedef u_int8_t uint8_t;
+typedef u_int16_t uint16_t;
+typedef u_int32_t uint32_t;
+# endif
+#endif
+
+#ifdef HAVE_FAKE_INT_TYPES
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+#endif
+
+#ifndef HAVE_UINTPTR_T
+# if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT
+typedef unsigned int uintptr_t;
+# elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG
+typedef unsigned long uintptr_t;
+# endif
+#endif
+
+/* Note: Windows compilers call these types '[un]signed __int8', etc. */
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/landmark.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/landmark.hh
new file mode 100644
index 00000000000..183ab936ee8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/landmark.hh
@@ -0,0 +1,39 @@
+// -*- related-file-name: "../../liblcdf/landmark.cc" -*-
+#ifndef LCDF_LANDMARK_HH
+#define LCDF_LANDMARK_HH
+#include <lcdf/string.hh>
+
+class Landmark { public:
+
+ Landmark() : _file(), _line(~0U) { }
+ explicit Landmark(const String &f) : _file(f), _line(~0U) { }
+ Landmark(const String &f, unsigned l) : _file(f), _line(l) { }
+
+ operator bool() const { return _file; }
+ bool operator!() const { return !_file; }
+ bool has_line() const { return _line != ~0U; }
+
+ const String &file() const { return _file; }
+ unsigned line() const { return _line; }
+
+ Landmark next_line() const;
+ Landmark whole_file() const { return Landmark(_file); }
+
+ operator String() const;
+
+ private:
+
+ String _file;
+ unsigned _line;
+
+};
+
+Landmark operator+(const Landmark &, int);
+
+inline Landmark
+Landmark::next_line() const
+{
+ return *this + 1;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/md5.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/md5.h
new file mode 100644
index 00000000000..7d7f8641d23
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/md5.h
@@ -0,0 +1,48 @@
+/* -*- related-file-name: "../../liblcdf/md5.c" -*-
+ * md5.h - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc
+ *
+ * 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 2, 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, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LCDF_MD5_H
+#define LCDF_MD5_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_TEXT_DIGEST_SIZE 26 /* + 1 for the terminating NUL */
+
+typedef struct { /* Hmm, should be private */
+ uint32_t A,B,C,D;
+ uint32_t nblocks;
+ unsigned char buf[64];
+ int count;
+ int finalized;
+} MD5_CONTEXT;
+
+void md5_init(MD5_CONTEXT *ctx);
+void md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen);
+void md5_final(unsigned char digest[MD5_DIGEST_SIZE], MD5_CONTEXT *ctx);
+void md5_final_text(char *text_digest, MD5_CONTEXT *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* LCDF_MD5_H */
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/permstr.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/permstr.hh
new file mode 100644
index 00000000000..c6d73178b2b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/permstr.hh
@@ -0,0 +1,197 @@
+// -*- related-file-name: "../../liblcdf/permstr.cc" -*-
+#ifndef LCDF_PERMSTR_HH
+#define LCDF_PERMSTR_HH
+#include <assert.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <string.h>
+#include <lcdf/inttypes.h>
+#include <lcdf/hashcode.hh>
+class PermString;
+inline bool operator==(PermString a, PermString b);
+inline bool operator!=(PermString a, PermString b);
+
+class PermString { struct Doodad; public:
+
+ typedef Doodad *Capsule;
+ // Declare a PermString::Initializer in any file in which you declare
+ // static global PermStrings.
+ struct Initializer { Initializer(); };
+
+ PermString()
+ : _rep(zero_char_doodad.data) {
+ }
+ explicit PermString(char c)
+ : _rep(one_char_doodad[(unsigned char) c].data) {
+ }
+ inline PermString(const char *s);
+ inline PermString(const char *s, int len);
+ inline PermString(const char *begin, const char *end);
+
+ typedef int (PermString::*unspecified_bool_type)() const;
+ inline operator unspecified_bool_type() const;
+ inline bool operator!() const;
+
+ inline int length() const;
+ char operator[](int i) const;
+
+ inline const char* data() const {
+ return _rep;
+ }
+ inline const char *c_str() const {
+ return _rep;
+ }
+ inline char operator*() const {
+ return *_rep;
+ }
+
+ inline const char *begin() const;
+ inline const char *end() const;
+
+ inline bool equals(const char *s, int len) const;
+ friend inline bool operator==(PermString a, PermString b);
+ friend inline bool operator!=(PermString a, PermString b);
+
+ inline Capsule capsule() const;
+ inline static PermString decapsule(Capsule c);
+
+ friend PermString permprintf(const char*, ...);
+ friend PermString vpermprintf(const char*, va_list);
+ friend PermString permcat(PermString, PermString);
+ friend PermString permcat(PermString, PermString, PermString);
+
+ private:
+
+ struct Doodad {
+ Doodad *next;
+ int length;
+ char data[2];
+ };
+
+ const char *_rep;
+
+ PermString(Doodad* d) : _rep(d->data) { }
+ void initialize(const char*, int);
+ Doodad* doodad() const { return (Doodad*)(_rep - offsetof(Doodad, data)); }
+
+ friend struct PermString::Initializer;
+ static void static_initialize();
+
+ enum { NHASH = 1024 }; // must be power of 2
+ static Doodad zero_char_doodad, one_char_doodad[256], *buckets[NHASH];
+
+};
+
+
+inline PermString::PermString(const char* s)
+{
+ initialize(s, -1);
+}
+
+inline PermString::PermString(const char* s, int len)
+{
+ initialize(s, len);
+}
+
+inline PermString::PermString(const char* begin, const char* end)
+{
+ assert(end);
+ initialize(begin, end > begin ? end - begin : 0);
+}
+
+inline PermString::operator unspecified_bool_type() const
+{
+ return _rep != zero_char_doodad.data ? &PermString::length : 0;
+}
+
+inline bool PermString::operator!() const
+{
+ return _rep == zero_char_doodad.data;
+}
+
+inline int PermString::length() const
+{
+ return doodad()->length;
+}
+
+inline const char *PermString::begin() const
+{
+ return _rep;
+}
+
+inline const char *PermString::end() const
+{
+ return _rep + doodad()->length;
+}
+
+inline char PermString::operator[](int i) const
+{
+ assert((unsigned) i < (unsigned) length());
+ return c_str()[i];
+}
+
+inline bool operator==(PermString a, PermString b)
+{
+ return a._rep == b._rep;
+}
+
+inline bool operator==(PermString a, const char *b)
+{
+ return (!a || !b ? !a && !b : strcmp(a.c_str(), b) == 0);
+}
+
+inline bool operator==(const char *a, PermString b)
+{
+ return b == a;
+}
+
+inline bool operator!=(PermString a, PermString b)
+{
+ return a._rep != b._rep;
+}
+
+inline bool operator!=(PermString a, const char *b)
+{
+ return !(a == b);
+}
+
+inline bool operator!=(const char *a, PermString b)
+{
+ return !(b == a);
+}
+
+inline bool operator<(PermString a, PermString b)
+{
+ // NOT lexicographic ordering!
+ return a.begin() < b.begin();
+}
+
+inline bool PermString::equals(const char *s, int len) const
+{
+ if (len > 0)
+ return len == length() && memcmp(s, _rep, len) == 0;
+ else
+ return strcmp(s, _rep) == 0;
+}
+
+inline PermString::Capsule PermString::capsule() const
+{
+ return doodad();
+}
+
+inline PermString PermString::decapsule(Capsule c)
+{
+ return PermString(c);
+}
+
+inline hashcode_t hashcode(PermString s)
+{
+ return (uintptr_t) s.c_str();
+}
+
+PermString permprintf(const char *format, ...);
+PermString vpermprintf(const char *format, va_list val);
+
+PermString permcat(PermString a, PermString b);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh
new file mode 100644
index 00000000000..9645615d17e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/point.hh
@@ -0,0 +1,185 @@
+// -*- related-file-name: "../../liblcdf/point.cc" -*-
+#ifndef LCDF_POINT_HH
+#define LCDF_POINT_HH
+#include <math.h>
+
+struct Point {
+
+ double x;
+ double y;
+
+ Point() { }
+ Point(double xx, double yy) : x(xx), y(yy) { }
+ // Point(const Point &) use compiler default
+ Point(const Point &p, double dx, double dy) : x(p.x + dx), y(p.y + dy) { }
+ // ~Point() use compiler default
+
+ inline double squared_length() const noexcept;
+ inline double length() const noexcept;
+ inline double magnitude() const noexcept;
+ static inline double distance(const Point &, const Point &) noexcept;
+ static inline double dot(const Point &, const Point &) noexcept;
+ static Point midpoint(const Point &, const Point &) noexcept;
+
+ inline double angle() const noexcept;
+
+ void shift(double dx, double dy) { x += dx; y += dy; }
+
+ inline Point shifted(double dx, double dy) const noexcept;
+ Point rotated(double) const noexcept;
+ inline Point normal() const noexcept;
+
+ bool on_line(const Point &, const Point &, double) const noexcept;
+ bool on_segment(const Point &, const Point &, double) const noexcept;
+
+ inline Point &operator+=(const Point &) noexcept;
+ inline Point &operator-=(const Point &) noexcept;
+ inline Point &operator*=(double) noexcept;
+ inline Point &operator/=(double) noexcept;
+
+ // Point operator+(Point, const Point &);
+ // Point operator-(Point, const Point &);
+ // Point operator*(Point, double);
+ // Point operator/(Point, double);
+ // Point operator-(const Point &);
+
+ // bool operator==(const Point &, const Point &);
+ // bool operator!=(const Point &, const Point &);
+
+};
+
+inline double
+Point::squared_length() const noexcept
+{
+ return x*x + y*y;
+}
+
+inline double
+Point::length() const noexcept
+{
+ return sqrt(x*x + y*y);
+}
+
+inline double
+Point::magnitude() const noexcept
+{
+ return length();
+}
+
+inline double
+Point::angle() const noexcept
+{
+ return atan2(y, x);
+}
+
+inline Point
+Point::shifted(double dx, double dy) const noexcept
+{
+ return Point(x + dx, y + dy);
+}
+
+inline Point
+Point::normal() const noexcept
+{
+ double l = length();
+ return (l ? Point(x/l, y/l) : *this);
+}
+
+inline Point &
+Point::operator+=(const Point &p) noexcept
+{
+ x += p.x;
+ y += p.y;
+ return *this;
+}
+
+inline Point &
+Point::operator-=(const Point &p) noexcept
+{
+ x -= p.x;
+ y -= p.y;
+ return *this;
+}
+
+inline Point &
+Point::operator*=(double d) noexcept
+{
+ x *= d;
+ y *= d;
+ return *this;
+}
+
+inline Point &
+Point::operator/=(double d) noexcept
+{
+ x /= d;
+ y /= d;
+ return *this;
+}
+
+inline bool
+operator==(const Point &a, const Point &b) noexcept
+{
+ return a.x == b.x && a.y == b.y;
+}
+
+inline bool
+operator!=(const Point &a, const Point &b) noexcept
+{
+ return a.x != b.x || a.y != b.y;
+}
+
+inline Point
+operator+(Point a, const Point &b) noexcept
+{
+ a += b;
+ return a;
+}
+
+inline Point
+operator-(Point a, const Point &b) noexcept
+{
+ a -= b;
+ return a;
+}
+
+inline Point
+operator-(const Point &a) noexcept
+{
+ return Point(-a.x, -a.y);
+}
+
+inline Point
+operator*(Point a, double scale) noexcept
+{
+ a *= scale;
+ return a;
+}
+
+inline Point
+operator*(double scale, Point a) noexcept
+{
+ a *= scale;
+ return a;
+}
+
+inline Point
+operator/(Point a, double scale) noexcept
+{
+ a /= scale;
+ return a;
+}
+
+inline double
+Point::distance(const Point &a, const Point &b) noexcept
+{
+ return (a - b).length();
+}
+
+inline double
+Point::dot(const Point &a, const Point &b) noexcept
+{
+ return a.x*b.x + a.y*b.y;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/slurper.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/slurper.hh
new file mode 100644
index 00000000000..2e400d3c3f2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/slurper.hh
@@ -0,0 +1,63 @@
+// -*- related-file-name: "../../liblcdf/slurper.cc" -*-
+#ifndef LCDF_SLURPER_HH
+#define LCDF_SLURPER_HH
+#include <lcdf/landmark.hh>
+#include <lcdf/filename.hh>
+#include <stdio.h>
+
+class Slurper { public:
+
+ Slurper(const Filename &, FILE * = 0);
+ ~Slurper();
+
+ bool ok() const { return _f != 0; }
+
+ Landmark landmark() const { return Landmark(_filename.name(), _lineno); }
+ operator Landmark() const { return landmark(); }
+ unsigned lineno() const { return _lineno; }
+
+ const Filename &filename() const { return _filename; }
+ char *peek_line();
+ char *next_line();
+ char *append_next_line();
+ void save_line() { _saved_line = true; }
+
+ char *cur_line() const { return (char *)_line; }
+ unsigned cur_line_length() const { return _line_len; }
+ void shorten_line(unsigned);
+
+ private:
+
+ FILE *_f;
+ Filename _filename;
+ unsigned _lineno;
+ bool _own_f;
+
+ unsigned char *_data;
+ unsigned _cap;
+ unsigned _pos;
+ unsigned _len;
+
+ unsigned char *_line;
+ unsigned _line_len;
+
+ bool _saved_line;
+ bool _at_eof;
+
+ void grow_buffer();
+ inline int more_data();
+ char *get_line_at(unsigned);
+
+};
+
+
+inline void
+Slurper::shorten_line(unsigned pos)
+{
+ if (pos < _line_len) {
+ _line_len = pos;
+ _line[_line_len] = 0;
+ }
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh
new file mode 100644
index 00000000000..b5756561684
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/straccum.hh
@@ -0,0 +1,641 @@
+// -*- related-file-name: "../../liblcdf/straccum.cc" -*-
+#ifndef LCDF_STRACCUM_HH
+#define LCDF_STRACCUM_HH
+#include <string.h>
+#include <assert.h>
+#include <lcdf/string.hh>
+#if HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+#if __GNUC__ > 4
+# define LCDF_SNPRINTF_ATTR __attribute__((__format__(__printf__, 3, 4)))
+#else
+# define LCDF_SNPRINTF_ATTR /* nothing */
+#endif
+template<typename T> class Vector;
+
+/** @file <lcdf/straccum.hh>
+ @brief Click's StringAccum class, used to construct Strings efficiently from pieces.
+*/
+
+class StringAccum { public:
+
+ typedef const char* const_iterator;
+ typedef char* iterator;
+
+ typedef int (StringAccum::*unspecified_bool_type)() const;
+
+ inline StringAccum();
+ explicit inline StringAccum(int capacity);
+ explicit inline StringAccum(const char *cstr);
+ inline StringAccum(const char* s, int len);
+ inline StringAccum(const String& str);
+ inline StringAccum(const StringAccum& x);
+ inline ~StringAccum();
+
+ inline const char* data() const;
+ inline char* data();
+ inline const unsigned char* udata() const;
+ inline unsigned char* udata();
+ inline int length() const;
+ inline int capacity() const;
+
+ inline bool empty() const;
+ inline bool operator!() const;
+ inline bool out_of_memory() const;
+
+ inline const_iterator begin() const;
+ inline iterator begin();
+ inline const_iterator end() const;
+ inline iterator end();
+
+
+ /** @brief Return true iff the StringAccum contains characters.
+ *
+ * Returns false for empty and out-of-memory StringAccums. */
+ inline operator unspecified_bool_type() const {
+ return _len != 0 ? &StringAccum::capacity : 0;
+ }
+
+
+ /** @brief Null-terminate this StringAccum and return its data.
+ *
+ * Note that the null character does not contribute to the StringAccum's
+ * length(), and later append() and similar operations can overwrite it.
+ * If appending the null character fails, the StringAccum becomes
+ * out-of-memory and the returned value is a null string. */
+ const char *c_str();
+
+
+ inline char operator[](int i) const;
+ inline char& operator[](int i);
+ inline char front() const;
+ inline char& front();
+ inline char back() const;
+ inline char& back();
+
+ inline void clear();
+
+ inline char* reserve(int n);
+ inline void set_length(int len);
+
+ /** @brief Set the StringAccum's length to @a len.
+ * @pre @a len >= 0
+ * @return 0 on success, -ENOMEM on failure */
+ int resize(int len);
+
+ inline void adjust_length(int delta);
+ inline char* extend(int nadjust, int nreserve = 0);
+
+ inline void pop_back(int n = 1);
+
+
+ inline void append(char c);
+ inline void append(unsigned char c);
+
+ /** @brief Append @a len copies of character @a c to the StringAccum. */
+ void append_fill(int c, int len);
+
+ inline void append_utf8(unsigned ch);
+
+ /** @brief Append the null-terminated C string @a s to this StringAccum.
+ * @param s data to append */
+ void append(const char* s);
+ inline void append(const char* s, int len);
+ inline void append(const unsigned char* s, int len);
+ inline void append(const char* begin, const char* end);
+ inline void append(const unsigned char* begin, const unsigned char* end);
+
+ // word joining
+ void append_break_lines(const String &text, int linelen, const String &leftmargin = String());
+
+ /** @brief Append result of snprintf() to this StringAccum.
+ * @param n maximum number of characters to print
+ * @param format format argument to snprintf()
+ *
+ * The terminating null character is not appended to the string.
+ *
+ * @note The safe vsnprintf() variant is called if it exists. It does in
+ * the Linux kernel, and on modern Unix variants. However, if it does not
+ * exist on your machine, then this function is actually unsafe, and you
+ * should make sure that the printf() invocation represented by your
+ * arguments will never write more than @a n characters, not including the
+ * terminating null. */
+ StringAccum &snprintf(int n, const char *format, ...) LCDF_SNPRINTF_ATTR;
+
+
+ /** @brief Return a String object with this StringAccum's contents.
+ *
+ * This operation donates the StringAccum's memory to the returned String.
+ * After a call to take_string(), the StringAccum object becomes empty,
+ * and any future append() operations may cause memory allocations. If
+ * the StringAccum is out-of-memory, the returned String is also
+ * out-of-memory, but the StringAccum's out-of-memory state is reset. */
+ String take_string();
+
+
+ inline StringAccum& operator=(const StringAccum& x);
+
+ /** @brief Swap this StringAccum's contents with @a x. */
+ void swap(StringAccum &x);
+
+ // see also operator<< declarations below
+
+ private:
+
+ enum {
+ MEMO_SPACE = String::MEMO_SPACE
+ };
+
+ unsigned char *_s;
+ int _len;
+ int _cap;
+
+ char *grow(int);
+ void assign_out_of_memory();
+
+ char *hard_extend(int nadjust, int nreserve);
+ void hard_append(const char *s, int len);
+ void append_utf8_hard(unsigned ch);
+
+ friend StringAccum &operator<<(StringAccum &sa, const char *s);
+ friend StringAccum &operator<<(StringAccum &sa, const String &str);
+#if HAVE_PERMSTRING
+ friend StringAccum &operator<<(StringAccum &sa, PermString s);
+#endif
+
+};
+
+inline StringAccum &operator<<(StringAccum &, char);
+inline StringAccum &operator<<(StringAccum &, unsigned char);
+inline StringAccum &operator<<(StringAccum &, const char *);
+inline StringAccum &operator<<(StringAccum &, const String &);
+inline StringAccum &operator<<(StringAccum &, const StringAccum &);
+#ifdef HAVE_PERMSTRING
+inline StringAccum &operator<<(StringAccum &, PermString);
+#endif
+
+inline StringAccum &operator<<(StringAccum &, bool);
+inline StringAccum &operator<<(StringAccum &, short);
+inline StringAccum &operator<<(StringAccum &, unsigned short);
+inline StringAccum &operator<<(StringAccum &, int);
+inline StringAccum &operator<<(StringAccum &, unsigned);
+StringAccum &operator<<(StringAccum &, long);
+StringAccum &operator<<(StringAccum &, unsigned long);
+StringAccum &operator<<(StringAccum &, double);
+
+
+/** @brief Construct an empty StringAccum (with length 0). */
+inline StringAccum::StringAccum()
+ : _s(0), _len(0), _cap(0) {
+}
+
+/** @brief Construct a StringAccum with room for at least @a capacity
+ * characters.
+ * @param capacity initial capacity
+ *
+ * If @a capacity <= 0, the StringAccum is created empty. If @a capacity
+ * is too large (so that @a capacity bytes of memory can't be allocated),
+ * the StringAccum falls back to a smaller capacity (possibly zero). */
+inline StringAccum::StringAccum(int capacity)
+ : _len(0) {
+ assert(capacity >= 0);
+ if (capacity
+ && (_s = new unsigned char[capacity + MEMO_SPACE])) {
+ _s += MEMO_SPACE;
+ _cap = capacity;
+ } else {
+ _s = 0;
+ _cap = 0;
+ }
+}
+
+/** @brief Construct a StringAccum containing the characters in @a s. */
+inline StringAccum::StringAccum(const char *cstr)
+ : _s(0), _len(0), _cap(0) {
+ append(cstr);
+}
+
+/** @brief Construct a StringAccum containing the characters in @a s. */
+inline StringAccum::StringAccum(const char *s, int len)
+ : _s(0), _len(0), _cap(0) {
+ append(s, len);
+}
+
+/** @brief Construct a StringAccum containing the characters in @a str. */
+inline StringAccum::StringAccum(const String &str)
+ : _s(0), _len(0), _cap(0) {
+ append(str.begin(), str.end());
+}
+
+/** @brief Construct a StringAccum containing a copy of @a x. */
+inline StringAccum::StringAccum(const StringAccum &x)
+ : _s(0), _len(0), _cap(0) {
+ append(x.data(), x.length());
+}
+
+/** @brief Destroy a StringAccum, freeing its memory. */
+inline StringAccum::~StringAccum() {
+ if (_cap > 0)
+ delete[] (_s - MEMO_SPACE);
+}
+
+/** @brief Return the contents of the StringAccum.
+ * @return The StringAccum's contents.
+ *
+ * The return value is null if the StringAccum is empty or out-of-memory.
+ * The returned data() value points to writable memory (unless the
+ * StringAccum itself is const). */
+inline const char* StringAccum::data() const {
+ return reinterpret_cast<const char *>(_s);
+}
+
+/** @overload */
+inline char* StringAccum::data() {
+ return reinterpret_cast<char *>(_s);
+}
+
+inline const unsigned char* StringAccum::udata() const {
+ return _s;
+}
+
+inline unsigned char* StringAccum::udata() {
+ return _s;
+}
+
+/** @brief Return true iff the StringAccum is empty or out-of-memory. */
+inline bool StringAccum::empty() const {
+ return _len == 0;
+}
+
+/** @brief Return the length of the StringAccum. */
+inline int StringAccum::length() const {
+ return _len;
+}
+
+/** @brief Return the StringAccum's current capacity.
+ *
+ * The capacity is the maximum length the StringAccum can hold without
+ * incurring a memory allocation. Returns -1 for out-of-memory
+ * StringAccums. */
+inline int StringAccum::capacity() const {
+ return _cap;
+}
+
+/** @brief Return an iterator for the first character in the StringAccum.
+ *
+ * StringAccum iterators are simply pointers into string data, so they are
+ * quite efficient. @sa StringAccum::data */
+inline StringAccum::const_iterator StringAccum::begin() const {
+ return reinterpret_cast<char*>(_s);
+}
+
+/** @overload */
+inline StringAccum::iterator StringAccum::begin() {
+ return reinterpret_cast<char*>(_s);
+}
+
+/** @brief Return an iterator for the end of the StringAccum.
+ *
+ * The return value points one character beyond the last character in the
+ * StringAccum. */
+inline StringAccum::const_iterator StringAccum::end() const {
+ return reinterpret_cast<char*>(_s + _len);
+}
+
+/** @overload */
+inline StringAccum::iterator StringAccum::end() {
+ return reinterpret_cast<char*>(_s + _len);
+}
+
+/** @brief Return true iff the StringAccum does not contain characters.
+ *
+ * Returns true for empty and out-of-memory StringAccums. */
+inline bool StringAccum::operator!() const {
+ return _len == 0;
+}
+
+/** @brief Return true iff the StringAccum is out-of-memory. */
+inline bool StringAccum::out_of_memory() const {
+ return _cap < 0;
+}
+
+/** @brief Return the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+inline char StringAccum::operator[](int i) const {
+ assert((unsigned) i < (unsigned) _len);
+ return static_cast<char>(_s[i]);
+}
+
+/** @brief Return a reference to the <a>i</a>th character in the string.
+ * @param i character index
+ * @pre 0 <= @a i < length() */
+inline char& StringAccum::operator[](int i) {
+ assert((unsigned) i < (unsigned) _len);
+ return reinterpret_cast<char &>(_s[i]);
+}
+
+/** @brief Return the first character in the string.
+ * @pre length() > 0 */
+inline char StringAccum::front() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[0]);
+}
+
+/** @brief Return a reference to the first character in the string.
+ * @pre length() > 0 */
+inline char& StringAccum::front() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[0]);
+}
+
+/** @brief Return the last character in the string.
+ * @pre length() > 0 */
+inline char StringAccum::back() const {
+ assert(_len > 0);
+ return static_cast<char>(_s[_len - 1]);
+}
+
+/** @brief Return a reference to the last character in the string.
+ * @pre length() > 0 */
+inline char& StringAccum::back() {
+ assert(_len > 0);
+ return reinterpret_cast<char &>(_s[_len - 1]);
+}
+
+/** @brief Clear the StringAccum's comments.
+ *
+ * All characters in the StringAccum are erased. Also resets the
+ * StringAccum's out-of-memory status. */
+inline void StringAccum::clear() {
+ if (_cap < 0) {
+ _cap = 0;
+ _s = 0;
+ }
+ _len = 0;
+}
+
+/** @brief Reserve space for at least @a n characters.
+ * @return a pointer to at least @a n characters, or null if allocation
+ * fails
+ * @pre @a n >= 0
+ *
+ * reserve() does not change the string's length(), only its capacity().
+ * In a frequent usage pattern, code calls reserve(), passing an upper
+ * bound on the characters that could be written by a series of
+ * operations. After writing into the returned buffer, adjust_length() is
+ * called to account for the number of characters actually written.
+ *
+ * On failure, null is returned and errno is set to ENOMEM. */
+inline char* StringAccum::reserve(int n) {
+ assert(n >= 0);
+ if (_len + n <= _cap)
+ return reinterpret_cast<char *>(_s + _len);
+ else
+ return grow(_len + n);
+}
+
+/** @brief Set the StringAccum's length to @a len.
+ * @param len new length in characters
+ * @pre 0 <= @a len <= capacity()
+ * @sa adjust_length */
+inline void StringAccum::set_length(int len) {
+ assert(len >= 0 && _len <= _cap);
+ _len = len;
+}
+
+/** @brief Adjust the StringAccum's length.
+ * @param delta length adjustment
+ * @pre If @a delta > 0, then length() + @a delta <= capacity().
+ * If @a delta < 0, then length() + delta >= 0.
+ *
+ * The StringAccum's length after adjust_length(@a delta) equals its old
+ * length plus @a delta. Generally adjust_length() is used after a call
+ * to reserve(). @sa set_length */
+inline void StringAccum::adjust_length(int delta) {
+ assert(_len + delta >= 0 && _len + delta <= _cap);
+ _len += delta;
+}
+
+/** @brief Reserve space and adjust length in one operation.
+ * @param nadjust number of characters to reserve and adjust length
+ * @param nreserve additional characters to reserve
+ * @pre @a nadjust >= 0 and @a nreserve >= 0
+ *
+ * This operation combines the effects of reserve(@a nadjust + @a
+ * nreserve) and adjust_length(@a nadjust). Returns the result of the
+ * reserve() call. */
+inline char* StringAccum::extend(int nadjust, int nreserve) {
+ assert(nadjust >= 0 && nreserve >= 0);
+ if (_len + nadjust + nreserve <= _cap) {
+ char *x = reinterpret_cast<char *>(_s + _len);
+ _len += nadjust;
+ return x;
+ } else
+ return hard_extend(nadjust, nreserve);
+}
+
+/** @brief Remove characters from the end of the StringAccum.
+ * @param n number of characters to remove
+ * @pre @a n >= 0 and @a n <= length()
+ *
+ * Same as adjust_length(-@a n). */
+inline void StringAccum::pop_back(int n) {
+ assert(n >= 0 && _len >= n);
+ _len -= n;
+}
+
+/** @brief Append character @a c to the StringAccum.
+ * @param c character to append */
+inline void StringAccum::append(char c) {
+ if (_len < _cap || grow(_len))
+ _s[_len++] = c;
+}
+
+/** @overload */
+inline void StringAccum::append(unsigned char c) {
+ append(static_cast<char>(c));
+}
+
+/** @brief Append the UTF-8 encoding of Unicode character @a ch. */
+inline void StringAccum::append_utf8(unsigned ch) {
+ if (ch < 0x80)
+ append((unsigned char) ch);
+ else
+ append_utf8_hard(ch);
+}
+
+/** @brief Append the first @a len characters of @a s to this StringAccum.
+ * @param s data to append
+ * @param len length of data
+ * @pre @a len >= 0 */
+inline void StringAccum::append(const char* s, int len) {
+ assert(len >= 0);
+ if (_len + len <= _cap) {
+ memcpy(_s + _len, s, len);
+ _len += len;
+ } else
+ hard_append(s, len);
+}
+
+/** @overload */
+inline void StringAccum::append(const unsigned char* s, int len) {
+ append(reinterpret_cast<const char *>(s), len);
+}
+
+/** @brief Append the data from @a begin to @a end to the end of this
+ * StringAccum.
+ *
+ * Does nothing if @a begin >= @a end. */
+inline void StringAccum::append(const char* begin, const char* end) {
+ if (begin < end)
+ append(begin, end - begin);
+}
+
+/** @overload */
+inline void StringAccum::append(const unsigned char* begin, const unsigned char* end) {
+ if (begin < end)
+ append(begin, end - begin);
+}
+
+/** @brief Assign this StringAccum to @a x. */
+inline StringAccum& StringAccum::operator=(const StringAccum& x) {
+ if (&x != this) {
+ if (out_of_memory())
+ _s = 0, _cap = 0;
+ _len = 0;
+ append(x.data(), x.length());
+ }
+ return *this;
+}
+
+/** @relates StringAccum
+ @brief Append character @a c to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a c). */
+inline StringAccum &
+operator<<(StringAccum &sa, char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append character @a c to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a c). */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned char c)
+{
+ sa.append(c);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append null-terminated C string @a cstr to StringAccum @a sa.
+ @return @a sa
+ @note Same as @a sa.append(@a cstr). */
+inline StringAccum &
+operator<<(StringAccum &sa, const char *cstr)
+{
+ sa.append(cstr);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append "true" or "false" to @a sa, depending on @a b.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, bool b)
+{
+ static const char truefalse[] = "truefalse";
+ if (b)
+ sa.append(truefalse, 4);
+ else
+ sa.append(truefalse + 4, 5);
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, short i)
+{
+ return sa << static_cast<long>(i);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned short u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, int i)
+{
+ return sa << static_cast<long>(i);
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, unsigned u)
+{
+ return sa << static_cast<unsigned long>(u);
+}
+
+/** @relates StringAccum
+ @brief Append the contents of @a str to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, const String &str)
+{
+ if (!str.out_of_memory())
+ sa.hard_append(str.begin(), str.length());
+ else
+ sa.assign_out_of_memory();
+ return sa;
+}
+
+#ifdef HAVE_PERMSTRING
+inline StringAccum &
+operator<<(StringAccum &sa, PermString s)
+{
+ sa.append(s.c_str(), s.length());
+ return sa;
+}
+#endif
+
+/** @relates StringAccum
+ @brief Append the contents of @a sb to @a sa.
+ @return @a sa */
+inline StringAccum &
+operator<<(StringAccum &sa, const StringAccum &sb)
+{
+ sa.append(sb.begin(), sb.end());
+ return sa;
+}
+
+inline bool
+operator==(StringAccum &sa, const char *s)
+{
+ return strcmp(sa.c_str(), s) == 0;
+}
+
+inline bool
+operator!=(StringAccum &sa, const char *s)
+{
+ return strcmp(sa.c_str(), s) != 0;
+}
+
+#undef LCDF_SNPRINTF_ATTR
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/string.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/string.hh
new file mode 100644
index 00000000000..2aba859caa4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/string.hh
@@ -0,0 +1,888 @@
+// -*- related-file-name: "../../liblcdf/string.cc" -*-
+#ifndef LCDF_STRING_HH
+#define LCDF_STRING_HH
+#include <lcdf/hashcode.hh>
+#ifdef HAVE_PERMSTRING
+# include <lcdf/permstr.hh>
+#endif
+#include <assert.h>
+class StringAccum;
+
+class String { public:
+
+ /** @brief Construct an empty String (with length 0). */
+ inline String() {
+ assign_memo(&null_data, 0, 0);
+ }
+
+ /** @brief Construct a copy of the String @a x. */
+ inline String(const String &x) {
+ assign(x);
+ }
+
+ /** @brief Construct a String containing the C string @a cstr.
+ * @param cstr a null-terminated C string
+ * @return A String containing the characters of @a cstr, up to but not
+ * including the terminating null character.
+ *
+ * If @a cstr equals String::out_of_memory_data(), returns an
+ * out-of-memory string. */
+ inline String(const char *cstr) {
+ assign(cstr, -1, false);
+ }
+
+ /** @brief Construct a String containing the first @a len characters of
+ * string @a s.
+ * @param s a string
+ * @param len number of characters to take from @a s. If @a len @< 0,
+ * then takes @c strlen(@a s) characters.
+ * @return A String containing @a len characters of @a s.
+ *
+ * If @a s equals String::out_of_memory_data(), returns an out-of-memory
+ * string. */
+ inline String(const char *s, int len) {
+ assign(s, len, false);
+ }
+ /** @overload */
+ inline String(const unsigned char *s, int len) {
+ assign(reinterpret_cast<const char *>(s), len, false);
+ }
+
+ /** @brief Construct a String containing the characters from @a begin
+ * to @a end.
+ * @param begin first character in string (begin iterator)
+ * @param end pointer one past last character in string (end iterator)
+ * @return A String containing the characters from @a begin to @a end.
+ *
+ * Returns a null string if @a begin @>= @a end. If @a begin equals
+ * String::out_of_memory_data(), returns an out-of-memory string. */
+ inline String(const char *begin, const char *end) {
+ assign(begin, (end > begin ? end - begin : 0), false);
+ }
+ /** @overload */
+ inline String(const unsigned char *begin, const unsigned char *end) {
+ assign(reinterpret_cast<const char *>(begin),
+ (end > begin ? end - begin : 0), false);
+ }
+
+ /** @brief Construct a String equal to "true" or "false" depending on the
+ * value of @a x. */
+ explicit inline String(bool x) {
+ assign_memo(bool_data + (x ? 0 : 5), x ? 4 : 5, 0);
+ }
+
+ /** @brief Construct a String containing the single character @a c. */
+ explicit inline String(char c) {
+ assign(&c, 1, false);
+ }
+
+ /** @overload */
+ explicit inline String(unsigned char c) {
+ assign(reinterpret_cast<char *>(&c), 1, false);
+ }
+
+ /** @brief Construct a base-10 string representation of @a x. */
+ explicit String(int x);
+ /** @overload */
+ explicit String(unsigned x);
+ /** @overload */
+ explicit String(long x);
+ /** @overload */
+ explicit String(unsigned long x);
+ /** @overload */
+ explicit String(double x);
+#if HAVE_PERMSTRING
+ inline String(PermString x) {
+ assign(x);
+ }
+#endif
+
+ /** @brief Destroy a String, freeing memory if necessary. */
+ inline ~String() {
+ deref();
+ }
+
+
+ /** @brief Return a const reference to an empty String.
+ *
+ * May be quicker than String::String(). */
+ static inline const String &make_empty() {
+ return reinterpret_cast<const String &>(null_string_rep);
+ }
+
+ /** @brief Return a String containing @a len unknown characters. */
+ static String make_uninitialized(int len) {
+ String s;
+ s.append_uninitialized(len);
+ return s;
+ }
+
+ /** @brief Return a String that directly references the first @a len
+ * characters of @a s.
+ *
+ * This function is suitable for static constant strings whose data is
+ * known to stay around forever, such as C string constants. If @a len @<
+ * 0, treats @a s as a null-terminated C string.
+ *
+ * @warning The String implementation may access @a s[@a len], which
+ * should remain constant even though it's not part of the String. */
+ static String make_stable(const char *s, int len = -1);
+
+ /** @brief Return a String that directly references the character data in
+ * [@a begin, @a end).
+ * @param begin pointer to the first character in the character data
+ * @param end pointer one beyond the last character in the character data
+ * (but see the warning)
+ *
+ * This function is suitable for static constant strings whose data is
+ * known to stay around forever, such as C string constants. Returns an
+ * empty string if @a begin @>= @a end.
+ *
+ * @warning The String implementation may access *@a end, which should
+ * remain constant even though it's not part of the String. */
+ static inline String make_stable(const char *begin, const char *end) {
+ if (begin < end)
+ return String::make_stable(begin, end - begin);
+ else
+ return String();
+ }
+ static String make_fill(int c, int n); // n copies of c
+
+
+ /** @brief Return the string's length. */
+ inline int length() const {
+ return _r.length;
+ }
+
+ /** @brief Return a pointer to the string's data.
+ *
+ * Only the first length() characters are valid, and the string data
+ * might not be null-terminated. */
+ inline const char *data() const {
+ return _r.data;
+ }
+
+ /** @brief Return a pointer to the string's data as unsigned chars.
+ *
+ * Only the first length() characters are valid, and the string data
+ * might not be null-terminated. @sa data() */
+ inline const unsigned char *udata() const {
+ return reinterpret_cast<const unsigned char *>(_r.data);
+ }
+
+
+ typedef const char *const_iterator;
+ typedef const_iterator iterator;
+
+ /** @brief Return an iterator for the first character in the string.
+ *
+ * String iterators are simply pointers into string data, so they are
+ * quite efficient. @sa String::data */
+ inline const_iterator begin() const {
+ return _r.data;
+ }
+
+ /** @brief Return an iterator for the end of the string.
+ *
+ * The return value points one character beyond the last character in the
+ * string. */
+ inline const_iterator end() const {
+ return _r.data + _r.length;
+ }
+
+ inline const unsigned char* ubegin() const {
+ return reinterpret_cast<const unsigned char*>(_r.data);
+ }
+
+ inline const unsigned char* uend() const {
+ return reinterpret_cast<const unsigned char*>(_r.data + _r.length);
+ }
+
+
+ typedef int (String::*unspecified_bool_type)() const;
+ /** @brief Return true iff the string is nonempty. */
+ inline operator unspecified_bool_type() const {
+ return _r.length != 0 ? &String::length : 0;
+ }
+
+ /** @brief Return true iff the string is empty. */
+ inline bool empty() const {
+ return _r.length == 0;
+ }
+
+ /** @brief Return true iff the string is empty. */
+ inline bool operator!() const {
+ return empty();
+ }
+
+
+ /** @brief Return the @a i th character in the string.
+ *
+ * Does not check bounds. @sa String::at */
+ inline char operator[](int i) const {
+ return _r.data[i];
+ }
+
+ /** @brief Return the @a i th character in the string.
+ *
+ * Checks bounds: an assertion will fail if @a i is less than 0 or not
+ * less than length(). @sa String::operator[] */
+ inline char at(int i) const {
+ assert((unsigned) i < (unsigned) _r.length);
+ return _r.data[i];
+ }
+
+ /** @brief Return the first character in the string.
+ *
+ * Does not check bounds. Same as (*this)[0]. */
+ inline char front() const {
+ return _r.data[0];
+ }
+
+ /** @brief Return the last character in the string.
+ *
+ * Does not check bounds. Same as (*this)[length() - 1]. */
+ inline char back() const {
+ return _r.data[_r.length - 1];
+ }
+
+
+ /** @brief Null-terminate the string.
+ *
+ * The terminating null character isn't considered part of the string, so
+ * this->length() doesn't change. Returns a corresponding C string
+ * pointer. The returned pointer is semi-temporary; it will persist until
+ * the string is destroyed or appended to. */
+ inline const char *c_str() const {
+ // We may already have a '\0' in the right place. If _memo has no
+ // capacity, then this is one of the special strings (null or
+ // stable). We are guaranteed, in these strings, that _data[_length]
+ // exists. Otherwise must check that _data[_length] exists.
+ const char *end_data = _r.data + _r.length;
+ if ((_r.memo && end_data >= _r.memo->real_data + _r.memo->dirty)
+ || *end_data != '\0') {
+ if (char *x = const_cast<String *>(this)->append_uninitialized(1)) {
+ *x = '\0';
+ --_r.length;
+ }
+ }
+ return _r.data;
+ }
+
+#if HAVE_PERMSTRING
+ operator PermString() const {
+ return PermString(_r.data, _r.length);
+ }
+#endif
+
+
+ /** @brief Return a 32-bit hash function of the characters in [begin, end).
+ *
+ * Uses Paul Hsieh's "SuperFastHash" algorithm, described at
+ * http://www.azillionmonkeys.com/qed/hash.html
+ * This hash function uses all characters in the string.
+ *
+ * @invariant If end1 - begin1 == end2 - begin2 and memcmp(begin1, begin2,
+ * end1 - begin1) == 0, then hashcode(begin1, end1) == hashcode(begin2,
+ * end2). */
+ static hashcode_t hashcode(const char *begin, const char *end);
+
+ /** @overload */
+ static inline hashcode_t hashcode(const unsigned char *begin,
+ const unsigned char *end) {
+ return hashcode(reinterpret_cast<const char *>(begin),
+ reinterpret_cast<const char *>(end));
+ }
+
+ /** @brief Returns a 32-bit hash function of this string's characters.
+ *
+ * Equivalent to String::hashcode(begin(), end()). Uses Paul Hsieh's
+ * "SuperFastHash."
+ *
+ * @invariant If s1 == s2, then s1.hashcode() == s2.hashcode(). */
+ inline hashcode_t hashcode() const {
+ return length() ? hashcode(begin(), end()) : 0;
+ }
+
+
+ /** @brief Return true iff this string is equal to the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * Same as String::compare(*this, String(s, len)) == 0. If @a len @< 0,
+ * then treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ bool equals(const char *s, int len) const;
+
+ // bool operator==(const String &, const String &);
+ // bool operator==(const String &, const char *);
+ // bool operator==(const char *, const String &);
+ // bool operator!=(const String &, const String &);
+ // bool operator!=(const String &, const char *);
+ // bool operator!=(const char *, const String &);
+
+
+ /** @brief Compare two strings.
+ * @param a first string to compare
+ * @param b second string to compare
+ *
+ * Returns 0 if @a a == @a b, negative if @a a @< @a b in lexicographic
+ * order, and positive if @a a @> @a b in lexicographic order. The
+ * lexicographic order treats all characters as unsigned. */
+ static inline int compare(const String &a, const String &b) {
+ return a.compare(b);
+ }
+
+ /** @brief Compare this string with string @a x.
+ *
+ * Same as String::compare(*this, @a x).
+ * @sa String::compare(const String &a, const String &b) */
+ inline int compare(const String &x) const {
+ return compare(x._r.data, x._r.length);
+ }
+
+ /** @brief Compare this string with the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * Same as String::compare(*this, String(s, len)). If @a len @< 0, then
+ * treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ int compare(const char *s, int len) const;
+
+ // bool operator<(const String &, const String &);
+ // bool operator<=(const String &, const String &);
+ // bool operator>(const String &, const String &);
+ // bool operator>=(const String &, const String &);
+
+
+ /** @brief Return a substring of the current string starting at @a begin
+ * and ending before @a end.
+ * @param begin pointer to the first substring character
+ * @param end pointer one beyond the last substring character
+ *
+ * Returns an empty string if @a begin @>= @a end. Also returns an empty
+ * string if @a begin or @a end is out of range (i.e., either less than
+ * this->begin() or greater than this->end()), but this should be
+ * considered a programming error; a future version may generate a warning
+ * for this case. */
+ inline String substring(const char *begin, const char *end) const {
+ if (begin < end && begin >= _r.data && end <= _r.data + _r.length)
+ return String(begin, end - begin, _r.memo);
+ else
+ return String();
+ }
+
+ /** @overload */
+ inline String substring(const unsigned char* first, const unsigned char* last) const {
+ return substring(reinterpret_cast<const char*>(first),
+ reinterpret_cast<const char*>(last));
+ }
+
+ /** @brief Return a substring of this string, consisting of the @a len
+ * characters starting at index @a pos.
+ * @param pos substring's first position relative to the string
+ * @param len length of substring
+ *
+ * If @a pos is negative, starts that far from the end of the string. If
+ * @a len is negative, leaves that many characters off the end of the
+ * string. If @a pos and @a len specify a substring that is partly
+ * outside the string, only the part within the string is returned. If
+ * the substring is beyond either end of the string, returns an empty
+ * string (but this should be considered a programming error; a future
+ * version may generate a warning for this case).
+ *
+ * @note String::substring() is intended to behave like Perl's substr(). */
+ String substring(int pos, int len) const;
+
+ /** @brief Return the suffix of the current string starting at index @a pos.
+ *
+ * If @a pos is negative, starts that far from the end of the string. If
+ * @a pos is so negative that the suffix starts outside the string, then
+ * the entire string is returned. If the substring is beyond the end of
+ * the string (@a pos > length()), returns an empty string (but this
+ * should be considered a programming error; a future version may generate
+ * a warning for this case).
+ *
+ * @note String::substring() is intended to behave like Perl's substr(). */
+ inline String substring(int pos) const {
+ return substring((pos <= -_r.length ? 0 : pos), _r.length);
+ }
+
+
+ /** @brief Search for a character in a string.
+ * @param c character to search for
+ * @param start initial search position
+ *
+ * Return the index of the leftmost occurence of @a c, starting at index
+ * @a start and working up to the end of the string. Returns -1 if @a c
+ * is not found. */
+ int find_left(char c, int start = 0) const;
+
+ /** @brief Search for a substring in a string.
+ * @param x substring to search for
+ * @param start initial search position
+ *
+ * Return the index of the leftmost occurence of the substring @a str,
+ * starting at index @a start and working up to the end of the string.
+ * Returns -1 if @a str is not found. */
+ int find_left(const String &x, int start = 0) const;
+
+ /** @brief Search for a character in a string.
+ * @param c character to search for
+ * @param start initial search position
+ *
+ * Return the index of the rightmost occurence of the character @a c,
+ * starting at index @a start and working back to the beginning of the
+ * string. Returns -1 if @a c is not found. @a start may start beyond
+ * the end of the string. */
+ int find_right(char c, int start = 0x7FFFFFFF) const;
+
+ /** @brief Return true iff this string begins with prefix @a x.
+ *
+ * Same as String::starts_with(@a x.data(), @a x.length()). */
+ inline bool starts_with(const String &x) const {
+ return starts_with(x._r.data, x._r.length);
+ }
+
+ /** @brief Return true iff this string begins with the data in @a s.
+ * @param s string data to compare to
+ * @param len length of @a s
+ *
+ * If @a len @< 0, then treats @a s as a null-terminated C string.
+ *
+ * @sa String::compare(const String &a, const String &b) */
+ bool starts_with(const char *s, int len) const;
+
+ String lower() const;
+ String upper() const;
+ String printable(int type = 0) const;
+
+
+ /** @brief Assign this string to @a x. */
+ inline String &operator=(const String &x) {
+ if (&x != this) {
+ deref();
+ assign(x);
+ }
+ return *this;
+ }
+
+ /** @brief Assign this string to the C string @a cstr. */
+ inline String &operator=(const char *cstr) {
+ assign(cstr, -1, true);
+ return *this;
+ }
+
+#ifdef HAVE_PERMSTRING
+ inline String &operator=(PermString p) {
+ deref();
+ assign(p);
+ return *this;
+ }
+#endif
+
+ /** @brief Append the null-terminated C string @a cstr to this string.
+ * @param cstr data to append */
+ inline void append(const char *cstr) {
+ append(cstr, -1, 0);
+ }
+
+ /** @brief Append the first @a len characters of @a s to this string.
+ * @param s data to append
+ * @param len length of data
+ * @pre @a len @>= 0 */
+ inline void append(const char *s, int len) {
+ append(s, len, 0);
+ }
+
+ /** @brief Appends the data from @a begin to @a end to the end of this
+ * string.
+ *
+ * Does nothing if @a begin @>= @a end. */
+ inline void append(const char *begin, const char *end) {
+ if (begin < end)
+ append(begin, end - begin);
+ }
+
+ /** @brief Append @a len copies of character @a c to this string. */
+ void append_fill(int c, int len);
+
+ /** @brief Append @a len unknown characters to this string.
+ * @return Modifiable pointer to the appended characters.
+ *
+ * The caller may safely modify the returned memory. Null is returned if
+ * the string becomes out-of-memory. */
+ char *append_uninitialized(int len);
+
+
+ /** @brief Append a copy of @a x to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(const String &x) {
+ append(x._r.data, x._r.length, x._r.memo);
+ return *this;
+ }
+
+ /** @brief Append a copy of the C string @a cstr to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(const char *cstr) {
+ append(cstr);
+ return *this;
+ }
+
+ /** @brief Append the character @a c to the end of this string.
+ *
+ * Returns the result. */
+ inline String &operator+=(char c) {
+ append(&c, 1);
+ return *this;
+ }
+
+#if HAVE_PERMSTRING
+ inline String &operator+=(PermString p) {
+ append(p.c_str(), p.length());
+ return *this;
+ }
+#endif
+
+
+ // String operator+(String, const String &);
+ // String operator+(String, const char *);
+ // String operator+(const char *, const String &);
+ // String operator+(String, PermString);
+ // String operator+(PermString, String);
+ // String operator+(PermString, const char *);
+ // String operator+(const char *, PermString);
+ // String operator+(PermString, PermString);
+ // String operator+(String, char);
+
+
+ /** @brief Return true iff the String's data is shared or immutable. */
+ inline bool data_shared() const {
+ return !_r.memo || _r.memo->refcount != 1;
+ }
+
+ /** @brief Return a compact version of this String.
+ *
+ * The compact version shares no more than 256 bytes of data with any
+ * other non-stable String. */
+ inline String compact() const {
+ if (!_r.memo || _r.memo->refcount == 1
+ || (uint32_t) _r.length + 256 >= _r.memo->capacity)
+ return *this;
+ else
+ return String(_r.data, _r.data + _r.length);
+ }
+
+ /** @brief Ensure the string's data is unshared and return a mutable
+ * pointer to it. */
+ char *mutable_data();
+
+ /** @brief Null-terminate the string and return a mutable pointer to its
+ * data.
+ * @sa String::c_str */
+ char *mutable_c_str();
+
+ unsigned char *mutable_udata() {
+ return reinterpret_cast<unsigned char *>(mutable_data());
+ }
+
+ void align(int);
+
+
+ /** @brief Return true iff this is an out-of-memory string. */
+ inline bool out_of_memory() const {
+ return _r.data == &oom_data;
+ }
+
+ /** @brief Return a const reference to an out-of-memory String. */
+ static inline const String &make_out_of_memory() {
+ return reinterpret_cast<const String &>(oom_string_rep);
+ }
+
+ /** @brief Return the data pointer used for out-of-memory strings.
+ *
+ * The returned value may be dereferenced; it points to a null
+ * character. */
+ static inline const char *out_of_memory_data() {
+ return &oom_data;
+ }
+
+ private:
+
+ /** @cond never */
+ struct memo_t {
+ volatile uint32_t refcount;
+ uint32_t capacity;
+ volatile uint32_t dirty;
+#if HAVE_STRING_PROFILING > 1
+ memo_t **pprev;
+ memo_t *next;
+#endif
+ char real_data[8]; // but it might be more or less
+ };
+
+ enum {
+ MEMO_SPACE = sizeof(memo_t) - 8
+ };
+
+ struct rep_t {
+ const char *data;
+ int length;
+ memo_t *memo;
+ };
+ /** @endcond never */
+
+ mutable rep_t _r; // mutable for c_str()
+
+#if HAVE_STRING_PROFILING
+ static uint64_t live_memo_count;
+ static uint64_t memo_sizes[55];
+ static uint64_t live_memo_sizes[55];
+ static uint64_t live_memo_bytes[55];
+# if HAVE_STRING_PROFILING > 1
+ static memo_t *live_memos[55];
+# endif
+
+ static inline int profile_memo_size_bucket(uint32_t dirty, uint32_t capacity) {
+ if (capacity <= 16)
+ return dirty;
+ else if (capacity <= 32)
+ return 17 + (capacity - 17) / 2;
+ else if (capacity <= 64)
+ return 25 + (capacity - 33) / 8;
+ else
+ return 29 + 26 - ffs_msb(capacity - 1);
+ }
+
+ static void profile_update_memo_dirty(memo_t *memo, uint32_t old_dirty, uint32_t new_dirty, uint32_t capacity) {
+ if (capacity <= 16 && new_dirty != old_dirty) {
+ ++memo_sizes[new_dirty];
+ ++live_memo_sizes[new_dirty];
+ live_memo_bytes[new_dirty] += capacity;
+ --live_memo_sizes[old_dirty];
+ live_memo_bytes[old_dirty] -= capacity;
+# if HAVE_STRING_PROFILING > 1
+ if ((*memo->pprev = memo->next))
+ memo->next->pprev = memo->pprev;
+ memo->pprev = &live_memos[new_dirty];
+ if ((memo->next = *memo->pprev))
+ memo->next->pprev = &memo->next;
+ *memo->pprev = memo;
+# else
+ (void) memo;
+# endif
+ }
+ }
+
+ static void one_profile_report(StringAccum &sa, int i, int examples);
+#endif
+
+ inline void assign_memo(const char *data, int length, memo_t *memo) const {
+ _r.data = data;
+ _r.length = length;
+ if ((_r.memo = memo))
+ ++memo->refcount;
+ }
+
+ inline String(const char *data, int length, memo_t *memo) {
+ assign_memo(data, length, memo);
+ }
+
+ inline void assign(const String &x) const {
+ assign_memo(x._r.data, x._r.length, x._r.memo);
+ }
+
+ inline void deref() const {
+ if (_r.memo && --_r.memo->refcount == 0)
+ delete_memo(_r.memo);
+ }
+
+ void assign(const char *cstr, int len, bool need_deref);
+#if HAVE_PERMSTRING
+ inline void assign(PermString x) const {
+ assign_memo(x.c_str(), x.length(), 0);
+ }
+#endif
+ void assign_out_of_memory();
+ void append(const char *s, int len, memo_t *memo);
+ static memo_t *create_memo(char *space, int dirty, int capacity);
+ static void delete_memo(memo_t *memo);
+
+ static const char null_data;
+ static const char oom_data;
+ static const char bool_data[11];
+ static const char int_data[20];
+ static const rep_t null_string_rep;
+ static const rep_t oom_string_rep;
+
+ static String make_claim(char *, int, int); // claim memory
+
+ friend struct rep_t;
+ friend class StringAccum;
+
+};
+
+
+/** @relates String
+ * @brief Compares two strings for equality.
+ *
+ * Returns true iff the two operands have the same lengths and the same
+ * characters in the same order. At most one of the operands can be a
+ * null-terminated C string.
+ * @sa String::compare
+ */
+inline bool operator==(const String &a, const String &b) {
+ return a.equals(b.data(), b.length());
+}
+
+/** @relates String */
+inline bool operator==(const char *a, const String &b) {
+ return b.equals(a, -1);
+}
+
+/** @relates String */
+inline bool operator==(const String &a, const char *b) {
+ return a.equals(b, -1);
+}
+
+/** @relates String
+ * @brief Compare two Strings for inequality.
+ *
+ * Returns true iff !(@a a == @a b). At most one of the operands can be a
+ * null-terminated C string. */
+inline bool operator!=(const String &a, const String &b) {
+ return !a.equals(b.data(), b.length());
+}
+
+/** @relates String */
+inline bool operator!=(const char *a, const String &b) {
+ return !b.equals(a, -1);
+}
+
+/** @relates String */
+inline bool operator!=(const String &a, const char *b) {
+ return !a.equals(b, -1);
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @< @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator<(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) < 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @<= @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator<=(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) <= 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @> @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator>(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) > 0;
+}
+
+/** @relates String
+ * @brief Compare two Strings.
+ *
+ * Returns true iff @a a @>= @a b in lexicographic order.
+ * @sa String::compare
+ */
+inline bool operator>=(const String &a, const String &b) {
+ return a.compare(b.data(), b.length()) >= 0;
+}
+
+/** @relates String
+ * @brief Concatenate the operands and return the result.
+ *
+ * At most one of the two operands can be a null-terminated C string. */
+inline String operator+(String a, const String &b) {
+ a += b;
+ return a;
+}
+
+/** @relates String */
+inline String operator+(String a, const char *b) {
+ a.append(b);
+ return a;
+}
+
+/** @relates String */
+inline String operator+(const char *a, const String &b) {
+ String s1(a);
+ s1 += b;
+ return s1;
+}
+
+/** @relates String
+ * @brief Concatenate the operands and return the result.
+ *
+ * The second operand is a single character. */
+inline String operator+(String a, char b) {
+ a.append(&b, 1);
+ return a;
+}
+
+#if HAVE_PERMSTRING
+
+inline bool operator==(PermString a, const String &b) {
+ return b.equals(a.c_str(), a.length());
+}
+
+inline bool operator==(const String &a, PermString b) {
+ return a.equals(b.c_str(), b.length());
+}
+
+inline bool operator!=(PermString a, const String &b) {
+ return !b.equals(a.c_str(), a.length());
+}
+
+inline bool operator!=(const String &a, PermString b) {
+ return !a.equals(b.c_str(), b.length());
+}
+
+inline String operator+(String a, PermString b) {
+ a.append(b.c_str(), b.length());
+ return a;
+}
+
+inline String operator+(PermString a, String b) {
+ return String(a) + b;
+}
+
+inline String operator+(PermString a, const char *b) {
+ return String(a) + b;
+}
+
+inline String operator+(const char *a, PermString b) {
+ return String(a) + b;
+}
+
+inline String operator+(PermString a, PermString b) {
+ return String(a) + b;
+}
+
+#endif
+
+inline hashcode_t hashcode(const String &str) {
+ return str.hashcode();
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/strtonum.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/strtonum.h
new file mode 100644
index 00000000000..ee8745a4a42
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/strtonum.h
@@ -0,0 +1,10 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+double strtonumber(const char *, char **);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/transform.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/transform.hh
new file mode 100644
index 00000000000..850a73c8004
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/transform.hh
@@ -0,0 +1,147 @@
+// -*- related-file-name: "../../liblcdf/transform.cc" -*-
+#ifndef LCDF_TRANSFORM_HH
+#define LCDF_TRANSFORM_HH
+#include <lcdf/bezier.hh>
+#include <lcdf/string.hh>
+#include <assert.h>
+
+class Transform { public:
+
+ Transform();
+ Transform(const double[6]);
+ Transform(double scalex, double sheary, double shearx, double scaley, double shiftx, double shifty);
+ // Transform(const Transform &) generated by compiler
+ // ~Transform() generated by compiler
+
+ double operator[](int i) const { assert(i>=0&&i<6); return _m[i]; }
+ Point translation() const { return Point(_m[4], _m[5]); }
+ bool null() const { return _null; }
+ void check_null(double tolerance);
+
+ void scale(double, double);
+ void scale(const Point &p) { scale(p.x, p.y); }
+ void scale(double d) { scale(d, d); }
+ void rotate(double);
+ void translate(double, double);
+ void translate(const Point &p) { translate(p.x, p.y); }
+ void raw_translate(double, double);
+ void raw_translate(const Point& p) { raw_translate(p.x, p.y); }
+ void shear(double);
+ Transform& operator*=(const Transform& x);
+
+ inline Transform scaled(double, double) const;
+ Transform scaled(const Point &p) const { return scaled(p.x, p.y); }
+ Transform scaled(double d) const { return scaled(d, d); }
+ inline Transform rotated(double) const;
+ inline Transform translated(double, double) const;
+ inline Transform translated(const Point &p) const;
+ inline Transform sheared(double) const;
+
+ // Transform operator+(Transform, const Point &);
+ // Transform &operator+=(Transform &, const Point &);
+ // Transform operator*(Transform, double);
+ // Transform &operator*=(Transform &, double);
+ // Transform operator*(Transform, const Transform &);
+ // Transform &operator*=(Transform &, const Transform &);
+ friend Point operator*(const Point &, const Transform &);
+ friend Point &operator*=(Point &, const Transform &);
+ friend Bezier operator*(const Bezier &, const Transform &);
+ friend Bezier &operator*=(Bezier &, const Transform &);
+
+ String unparse() const;
+
+ private:
+
+ // stored in PostScript order (along columns)
+ double _m[6];
+ bool _null;
+
+ void real_apply_to(Point &) const;
+ Point real_apply(const Point &) const;
+
+};
+
+
+inline Transform
+Transform::scaled(double x, double y) const
+{
+ Transform t(*this);
+ t.scale(x, y);
+ return t;
+}
+
+inline Transform
+Transform::rotated(double r) const
+{
+ Transform t(*this);
+ t.rotate(r);
+ return t;
+}
+
+inline Transform
+Transform::translated(double x, double y) const
+{
+ Transform t(*this);
+ t.translate(x, y);
+ return t;
+}
+
+inline Transform
+Transform::translated(const Point &p) const
+{
+ return translated(p.x, p.y);
+}
+
+inline Transform
+Transform::sheared(double s) const
+{
+ Transform t(*this);
+ t.shear(s);
+ return t;
+}
+
+
+inline Transform &
+operator+=(Transform &t, const Point &p)
+{
+ t.translate(p);
+ return t;
+}
+
+inline Transform
+operator+(Transform t, const Point &p)
+{
+ return t += p;
+}
+
+inline Transform &
+operator*=(Transform &t, double scale)
+{
+ t.scale(scale);
+ return t;
+}
+
+inline Transform operator*(Transform t, double scale) {
+ return t *= scale;
+}
+
+inline Transform operator*(Transform a, const Transform& b) {
+ return a *= b;
+}
+
+
+inline Point &
+operator*=(Point &p, const Transform &t)
+{
+ if (!t.null())
+ t.real_apply_to(p);
+ return p;
+}
+
+inline Point
+operator*(const Point &p, const Transform &t)
+{
+ return (t.null() ? p : t.real_apply(p));
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc
new file mode 100644
index 00000000000..cf8906a333f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.cc
@@ -0,0 +1,202 @@
+#ifndef LCDF_VECTOR_CC
+#define LCDF_VECTOR_CC
+
+/*
+ * vector.{cc,hh} -- simple array template class
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2003 International Computer Science Institute
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+/* #include <lcdf/vector.hh> */
+
+template <class T>
+Vector<T>::Vector(const Vector<T> &x)
+ : _l(0), _n(0), _capacity(0)
+{
+ *this = x;
+}
+
+template <class T>
+Vector<T>::~Vector()
+{
+ for (size_type i = 0; i < _n; i++)
+ _l[i].~T();
+ delete[] (unsigned char *)_l;
+}
+
+template <class T> Vector<T> &
+Vector<T>::operator=(const Vector<T> &o)
+{
+ if (&o != this) {
+ for (size_type i = 0; i < _n; i++)
+ _l[i].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ if (_l && _n)
+ VALGRIND_MAKE_MEM_NOACCESS(_l, _n * sizeof(T));
+#endif
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ if (_l && _n)
+ VALGRIND_MAKE_MEM_UNDEFINED(_l, _n * sizeof(T));
+#endif
+ for (size_type i = 0; i < _n; i++)
+ new(velt(i)) T(o._l[i]);
+ }
+ }
+ return *this;
+}
+
+template <class T> Vector<T> &
+Vector<T>::assign(size_type n, const T &x)
+{
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ return assign(n, x_copy);
+ } else {
+ resize(0, x);
+ resize(n, x);
+ return *this;
+ }
+}
+
+template <class T> typename Vector<T>::iterator
+Vector<T>::insert(iterator it, const T &x)
+{
+ assert(it >= begin() && it <= end());
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ return insert(it, x_copy);
+ }
+ if (_n == _capacity) {
+ size_type pos = it - begin();
+ if (!reserve(RESERVE_GROW))
+ return end();
+ it = begin() + pos;
+ }
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(velt(_n), sizeof(T));
+#endif
+ for (iterator j = end(); j > it; ) {
+ --j;
+ new((void*) (j + 1)) T(*j);
+ j->~T();
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(j, sizeof(T));
+#endif
+ }
+ new((void*) it) T(x);
+ _n++;
+ return it;
+}
+
+template <class T> typename Vector<T>::iterator
+Vector<T>::erase(iterator a, iterator b)
+{
+ if (b > a) {
+ assert(a >= begin() && b <= end());
+ iterator i = a, j = b;
+ for (; j < end(); i++, j++) {
+ i->~T();
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(i, sizeof(T));
+#endif
+ new((void*) i) T(*j);
+ }
+ for (; i < end(); i++)
+ i->~T();
+ _n -= b - a;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(_l + _n, (b - a) * sizeof(T));
+#endif
+ return a;
+ } else
+ return b;
+}
+
+template <class T> bool
+Vector<T>::reserve_and_push_back(size_type want, const T *push_x)
+{
+ if (push_x && push_x >= begin() && push_x < end()) {
+ T x_copy(*push_x);
+ return reserve_and_push_back(want, &x_copy);
+ }
+
+ if (want < 0)
+ want = (_capacity > 0 ? _capacity * 2 : 4);
+
+ if (want > _capacity) {
+ T *new_l = (T *)new unsigned char[sizeof(T) * want];
+ if (!new_l)
+ return false;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(new_l + _n, (want - _n) * sizeof(T));
+#endif
+
+ for (size_type i = 0; i < _n; i++) {
+ new(velt(new_l, i)) T(_l[i]);
+ _l[i].~T();
+ }
+ delete[] (unsigned char *)_l;
+
+ _l = new_l;
+ _capacity = want;
+ }
+
+ if (push_x)
+ push_back(*push_x);
+ return true;
+}
+
+template <class T> void
+Vector<T>::resize(size_type n, const T &x)
+{
+ if (&x >= begin() && &x < end()) {
+ T x_copy(x);
+ resize(n, x_copy);
+ } else if (n <= _capacity || reserve(n)) {
+ for (size_type i = n; i < _n; i++)
+ _l[i].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ if (n < _n)
+ VALGRIND_MAKE_MEM_NOACCESS(_l + n, (_n - n) * sizeof(T));
+ if (_n < n)
+ VALGRIND_MAKE_MEM_UNDEFINED(_l + _n, (n - _n) * sizeof(T));
+#endif
+ for (size_type i = _n; i < n; i++)
+ new(velt(i)) T(x);
+ _n = n;
+ }
+}
+
+template <class T> void
+Vector<T>::swap(Vector<T> &x)
+{
+ T *l = _l;
+ _l = x._l;
+ x._l = l;
+
+ size_type n = _n;
+ _n = x._n;
+ x._n = n;
+
+ size_type cap = _capacity;
+ _capacity = x._capacity;
+ x._capacity = cap;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.hh
new file mode 100644
index 00000000000..86e64e238ba
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/include/lcdf/vector.hh
@@ -0,0 +1,324 @@
+#ifndef LCDF_VECTOR_HH
+#define LCDF_VECTOR_HH
+#include <assert.h>
+#include <stdlib.h>
+#ifdef HAVE_NEW_HDR
+# include <new>
+#elif defined(HAVE_NEW_H)
+# include <new.h>
+#else
+static inline void *operator new(size_t, void *v) { return v; }
+#endif
+#if HAVE_VALGRIND && HAVE_VALGRIND_MEMCHECK_H
+# include <valgrind/memcheck.h>
+#endif
+
+template <class T>
+class Vector { public:
+
+ typedef T value_type;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef const T& const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = (size_type) -1 };
+
+ typedef T* iterator;
+ typedef const T* const_iterator;
+
+ explicit Vector()
+ : _l(0), _n(0), _capacity(0) {
+ }
+ explicit Vector(size_type n, const T &e)
+ : _l(0), _n(0), _capacity(0) {
+ resize(n, e);
+ }
+ // template <class In> ...
+ Vector(const Vector<T> &x);
+ ~Vector();
+
+ Vector<T>& operator=(const Vector<T>&);
+ Vector<T>& assign(size_type n, const T& e = T());
+ // template <class In> ...
+
+ // iterators
+ iterator begin() { return _l; }
+ const_iterator begin() const { return _l; }
+ iterator end() { return _l + _n; }
+ const_iterator end() const { return _l + _n; }
+
+ // capacity
+ size_type size() const { return _n; }
+ void resize(size_type nn, const T& e = T());
+ size_type capacity() const { return _capacity; }
+ bool empty() const { return _n == 0; }
+ bool reserve(size_type n) { return reserve_and_push_back(n, 0); }
+
+ // element access
+ T &operator[](size_type i) {
+ assert((unsigned) i < (unsigned) _n);
+ return _l[i];
+ }
+ const T &operator[](size_type i) const {
+ assert((unsigned) i < (unsigned) _n);
+ return _l[i];
+ }
+ T& at(size_type i) { return operator[](i); }
+ const T& at(size_type i) const { return operator[](i); }
+ T& front() { return operator[](0); }
+ const T& front() const { return operator[](0); }
+ T& back() { return operator[](_n - 1); }
+ const T& back() const { return operator[](_n - 1); }
+ T& at_u(size_type i) { return _l[i]; }
+ const T& at_u(size_type i) const { return _l[i]; }
+
+ // modifiers
+ inline void push_back(const T& x);
+ inline void pop_back();
+ inline void push_front(const T& x);
+ inline void pop_front();
+ iterator insert(iterator it, const T& x);
+ inline iterator erase(iterator it);
+ iterator erase(iterator a, iterator b);
+ void swap(Vector<T>& x);
+ void clear() { erase(begin(), end()); }
+
+ private:
+
+ T *_l;
+ size_type _n;
+ size_type _capacity;
+
+ void *velt(size_type i) const { return (void *)&_l[i]; }
+ static void *velt(T *l, size_type i) { return (void *)&l[i]; }
+ bool reserve_and_push_back(size_type n, const T *x);
+
+};
+
+template <class T> inline void
+Vector<T>::push_back(const T& x)
+{
+ if (_n < _capacity) {
+#ifdef VALGRIND_MAKE_MEM_UNDEFINED
+ VALGRIND_MAKE_MEM_UNDEFINED(velt(_n), sizeof(T));
+#endif
+ new(velt(_n)) T(x);
+ ++_n;
+ } else
+ reserve_and_push_back(RESERVE_GROW, &x);
+}
+
+template <class T> inline void
+Vector<T>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+ _l[_n].~T();
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(&_l[_n], sizeof(T));
+#endif
+}
+
+template <class T> inline typename Vector<T>::iterator
+Vector<T>::erase(iterator it)
+{
+ return (it < end() ? erase(it, it + 1) : it);
+}
+
+template <class T> inline void
+Vector<T>::push_front(const T& x)
+{
+ insert(begin(), x);
+}
+
+template <class T> inline void
+Vector<T>::pop_front()
+{
+ erase(begin());
+}
+
+
+template <>
+class Vector<void*> { public:
+
+ typedef void* value_type;
+ typedef void*& reference;
+ typedef void* const& const_reference;
+ typedef void** pointer;
+ typedef void* const* const_pointer;
+ typedef void* const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = (size_type) -1 };
+
+ typedef void** iterator;
+ typedef void* const* const_iterator;
+
+ explicit Vector()
+ : _l(0), _n(0), _capacity(0) {
+ }
+ explicit Vector(size_type n, void* e)
+ : _l(0), _n(0), _capacity(0) {
+ resize(n, e);
+ }
+ Vector(const Vector<void*> &);
+ ~Vector();
+
+ Vector<void*> &operator=(const Vector<void*> &);
+ Vector<void*> &assign(size_type n, void* x = 0);
+
+ // iterators
+ iterator begin() { return _l; }
+ const_iterator begin() const { return _l; }
+ iterator end() { return _l + _n; }
+ const_iterator end() const { return _l + _n; }
+
+ // capacity
+ size_type size() const { return _n; }
+ void resize(size_type n, void* x = 0);
+ size_type capacity() const { return _capacity; }
+ bool empty() const { return _n == 0; }
+ bool reserve(size_type n);
+
+ // element access
+ void*& operator[](size_type i) { assert(i>=0 && i<_n); return _l[i]; }
+ void* operator[](size_type i) const { assert(i>=0 && i<_n); return _l[i]; }
+ void*& at(size_type i) { return operator[](i); }
+ void* at(size_type i) const { return operator[](i); }
+ void*& front() { return operator[](0); }
+ void* front() const { return operator[](0); }
+ void*& back() { return operator[](_n - 1); }
+ void* back() const { return operator[](_n - 1); }
+ void*& at_u(size_type i) { return _l[i]; }
+ void* at_u(size_type i) const { return _l[i]; }
+
+ // modifiers
+ inline void push_back(void* x);
+ inline void pop_back();
+ inline void push_front(void* x);
+ inline void pop_front();
+ iterator insert(iterator it, void* x);
+ inline iterator erase(iterator it);
+ iterator erase(iterator a, iterator b);
+ void swap(Vector<void*> &x);
+ void clear() { _n = 0; }
+
+ private:
+
+ void **_l;
+ size_type _n;
+ size_type _capacity;
+
+};
+
+inline void
+Vector<void*>::push_back(void* x)
+{
+ if (_n < _capacity || reserve(RESERVE_GROW)) {
+ _l[_n] = x;
+ _n++;
+ }
+}
+
+inline void
+Vector<void*>::pop_back()
+{
+ assert(_n > 0);
+ --_n;
+#ifdef VALGRIND_MAKE_MEM_NOACCESS
+ VALGRIND_MAKE_MEM_NOACCESS(&_l[_n], sizeof(void *));
+#endif
+}
+
+inline Vector<void*>::iterator
+Vector<void*>::erase(Vector<void*>::iterator it)
+{
+ return (it < end() ? erase(it, it + 1) : it);
+}
+
+inline void
+Vector<void*>::push_front(void* x)
+{
+ insert(begin(), x);
+}
+
+inline void
+Vector<void*>::pop_front()
+{
+ erase(begin());
+}
+
+
+template <class T>
+class Vector<T*>: private Vector<void*> {
+
+ typedef Vector<void*> Base;
+
+ public:
+
+ typedef T* value_type;
+ typedef T*& reference;
+ typedef T* const& const_reference;
+ typedef T** pointer;
+ typedef T* const* const_pointer;
+ typedef T* const_access_type;
+
+ typedef int size_type;
+ enum { RESERVE_GROW = Base::RESERVE_GROW };
+
+ typedef T** iterator;
+ typedef T* const* const_iterator;
+
+ explicit Vector() : Base() { }
+ explicit Vector(size_type n, T* x) : Base(n, (void *)x) { }
+ Vector(const Vector<T*>& x) : Base(x) { }
+ ~Vector() { }
+
+ Vector<T*>& operator=(const Vector<T*>& x)
+ { Base::operator=(x); return *this; }
+ Vector<T*>& assign(size_type n, T* x = 0)
+ { Base::assign(n, (void*)x); return *this; }
+
+ // iterators
+ const_iterator begin() const { return (const_iterator)(Base::begin()); }
+ iterator begin() { return (iterator)(Base::begin()); }
+ const_iterator end() const { return (const_iterator)(Base::end()); }
+ iterator end() { return (iterator)(Base::end()); }
+
+ // capacity
+ size_type size() const { return Base::size(); }
+ void resize(size_type n, T* x = 0) { Base::resize(n, (void*)x); }
+ size_type capacity() const { return Base::capacity(); }
+ bool empty() const { return Base::empty(); }
+ bool reserve(size_type n) { return Base::reserve(n); }
+
+ // element access
+ T*& operator[](size_type i) { return (T*&)(Base::at(i)); }
+ T* operator[](size_type i) const { return (T*)(Base::operator[](i)); }
+ T*& at(size_type i) { return (T*&)(Base::operator[](i)); }
+ T* at(size_type i) const { return (T*)(Base::at(i)); }
+ T*& front() { return (T*&)(Base::front()); }
+ T* front() const { return (T*)(Base::front()); }
+ T*& back() { return (T*&)(Base::back()); }
+ T* back() const { return (T*)(Base::back()); }
+ T*& at_u(size_type i) { return (T*&)(Base::at_u(i)); }
+ T* at_u(size_type i) const { return (T*)(Base::at_u(i)); }
+
+ // modifiers
+ void push_back(T* x) { Base::push_back((void*)x); }
+ void pop_back() { Base::pop_back(); }
+ void push_front(T* x) { Base::push_front((void*)x); }
+ void pop_front() { Base::pop_front(); }
+ iterator insert(iterator it, T* x) { return (iterator)Base::insert((void**)it, (void*)x); }
+ iterator erase(iterator it) { return (iterator)Base::erase((void**)it); }
+ iterator erase(iterator a, iterator b) { return (iterator)Base::erase((void**)a, (void**)b); }
+ void swap(Vector<T*>& x) { Base::swap(x); }
+ void clear() { Base::clear(); }
+
+};
+
+#include <lcdf/vector.cc>
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec
new file mode 100644
index 00000000000..d9eedba6dd3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/lcdf-typetools.spec
@@ -0,0 +1,99 @@
+Summary: Programs to manipulate OpenType and multiple-master fonts
+Name: lcdf-typetools
+Version: 2.108
+Copyright: GPL
+Vendor: Little Cambridgeport Design Factory <http://www.lcdf.org/>
+Group: Utilities/Printing
+Source: %{name}-%{version}.tar.gz
+Buildroot: /var/tmp/%{name}-%{version}-buildroot
+Requires: tetex > 2.0
+
+%description
+This package contains four tools for working with OpenType fonts:
+
+ cfftot1 allows you to translate Compact Font Format (CFF) or
+ PostScript-flavored OpenType fonts into PostScript
+ Type 1 font format
+
+ otfinfo reports information about OpenType fonts, such as the
+ features they support and the contents of their ``size''
+ optical size option
+
+ otftotfm allows you to create TeX font metrics and encodings for
+ using OpenType fonts
+
+ t1dotlessj creates a Type 1 font with a single character --
+ the dotless j corresponding to the specified design
+
+ t1lint checks a Type 1 font for correctness (preliminary)
+
+ t1reencode reencodes a Type 1 font, replacing its internal encoding with
+ one you specify
+
+ t1testpage creates a PostScript test page for a specified
+ font file (preliminary)
+
+ ttftotype42 creates a Type 42 wrapper for a TrueType or TrueType-flavored
+ OpenType font.
+
+The package now includes programs for working with multiple-master
+fonts formerly distributed as mminstance. These tools allow you to
+use multiple-master fonts with programs that require single-master
+fonts (afm2tfm, ps2pk, fontinst, etc.). Both programs work fine with
+fonts that contain intermediate masters (e.g., Adobe Jenson MM and
+Adobe Kepler MM).
+
+mmafm creates an AFM (Adobe font metric) file corresponding to
+ a single instance of a multiple-master font. It reads
+ (and therefore requires) the AMFM and AFM files
+ distributed with the font.
+
+mmpfb creates a normal, single-master font program that looks
+ like an instance of a multiple-master font. It reads
+ the multiple-master font program in PFA or PFB format.
+
+## PREP
+%prep
+%setup -q
+
+## BUILD
+%build
+%configure
+make
+
+## PRE
+%pre
+
+## POST
+%post
+
+## INSTALL
+%install
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+#make install all DESTDIR=%{buildroot}
+
+## FILES
+%files
+%defattr(-,root,root)
+%doc NEWS ONEWS README
+%{_bindir}/cfftot1
+%{_bindir}/mmafm
+%{_bindir}/mmpfb
+%{_bindir}/otfinfo
+%{_bindir}/otftotfm
+%{_bindir}/t1dotlessj
+%{_bindir}/t1lint
+%{_bindir}/t1reencode
+%{_bindir}/t1testpage
+%{_bindir}/ttftotype42
+%{_mandir}/man*/*
+%{_datadir}/lcdf-typetools/*
+
+%changelog
+
+* Fri Aug 3 2007 Eddie Kohler <kohler@cs.ucla.edu>
+- Updates.
+
+* Wed Sep 8 2004 Claire Connelly <cmc@math.hmc.edu> - 2.12-hmcmath.1
+- Initial packaging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.am
new file mode 100644
index 00000000000..a783e28e640
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.am
@@ -0,0 +1,43 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+noinst_LIBRARIES = libefont.a
+
+libefont_a_SOURCES = \
+ afm.cc \
+ afmparse.cc \
+ afmw.cc \
+ amfm.cc \
+ cff.cc \
+ encoding.cc \
+ findmet.cc \
+ metrics.cc \
+ otf.cc \
+ otfcmap.cc \
+ otfdata.cc \
+ otfdescrip.cc \
+ otfgpos.cc \
+ otfgsub.cc \
+ otfname.cc \
+ otfos2.cc \
+ otfpost.cc \
+ pairop.cc \
+ psres.cc \
+ t1bounds.cc \
+ t1cs.cc \
+ t1csgen.cc \
+ t1interp.cc \
+ t1item.cc \
+ t1font.cc \
+ t1fontskel.cc \
+ t1mm.cc \
+ t1rw.cc \
+ t1unparser.cc \
+ ttfcs.cc \
+ ttfhead.cc \
+ ttfkern.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+AM_CPPFLAGS = -I$(srcdir)/../include
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.in
new file mode 100644
index 00000000000..f6119467ab7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/Makefile.in
@@ -0,0 +1,778 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = lcdf-typetools-src/libefont
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libefont_a_AR = $(AR) $(ARFLAGS)
+libefont_a_DEPENDENCIES =
+am_libefont_a_OBJECTS = afm.$(OBJEXT) afmparse.$(OBJEXT) \
+ afmw.$(OBJEXT) amfm.$(OBJEXT) cff.$(OBJEXT) encoding.$(OBJEXT) \
+ findmet.$(OBJEXT) metrics.$(OBJEXT) otf.$(OBJEXT) \
+ otfcmap.$(OBJEXT) otfdata.$(OBJEXT) otfdescrip.$(OBJEXT) \
+ otfgpos.$(OBJEXT) otfgsub.$(OBJEXT) otfname.$(OBJEXT) \
+ otfos2.$(OBJEXT) otfpost.$(OBJEXT) pairop.$(OBJEXT) \
+ psres.$(OBJEXT) t1bounds.$(OBJEXT) t1cs.$(OBJEXT) \
+ t1csgen.$(OBJEXT) t1interp.$(OBJEXT) t1item.$(OBJEXT) \
+ t1font.$(OBJEXT) t1fontskel.$(OBJEXT) t1mm.$(OBJEXT) \
+ t1rw.$(OBJEXT) t1unparser.$(OBJEXT) ttfcs.$(OBJEXT) \
+ ttfhead.$(OBJEXT) ttfkern.$(OBJEXT)
+libefont_a_OBJECTS = $(am_libefont_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/afm.Po ./$(DEPDIR)/afmparse.Po \
+ ./$(DEPDIR)/afmw.Po ./$(DEPDIR)/amfm.Po ./$(DEPDIR)/cff.Po \
+ ./$(DEPDIR)/encoding.Po ./$(DEPDIR)/findmet.Po \
+ ./$(DEPDIR)/metrics.Po ./$(DEPDIR)/otf.Po \
+ ./$(DEPDIR)/otfcmap.Po ./$(DEPDIR)/otfdata.Po \
+ ./$(DEPDIR)/otfdescrip.Po ./$(DEPDIR)/otfgpos.Po \
+ ./$(DEPDIR)/otfgsub.Po ./$(DEPDIR)/otfname.Po \
+ ./$(DEPDIR)/otfos2.Po ./$(DEPDIR)/otfpost.Po \
+ ./$(DEPDIR)/pairop.Po ./$(DEPDIR)/psres.Po \
+ ./$(DEPDIR)/t1bounds.Po ./$(DEPDIR)/t1cs.Po \
+ ./$(DEPDIR)/t1csgen.Po ./$(DEPDIR)/t1font.Po \
+ ./$(DEPDIR)/t1fontskel.Po ./$(DEPDIR)/t1interp.Po \
+ ./$(DEPDIR)/t1item.Po ./$(DEPDIR)/t1mm.Po ./$(DEPDIR)/t1rw.Po \
+ ./$(DEPDIR)/t1unparser.Po ./$(DEPDIR)/ttfcs.Po \
+ ./$(DEPDIR)/ttfhead.Po ./$(DEPDIR)/ttfkern.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libefont_a_SOURCES)
+DIST_SOURCES = $(libefont_a_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+noinst_LIBRARIES = libefont.a
+libefont_a_SOURCES = \
+ afm.cc \
+ afmparse.cc \
+ afmw.cc \
+ amfm.cc \
+ cff.cc \
+ encoding.cc \
+ findmet.cc \
+ metrics.cc \
+ otf.cc \
+ otfcmap.cc \
+ otfdata.cc \
+ otfdescrip.cc \
+ otfgpos.cc \
+ otfgsub.cc \
+ otfname.cc \
+ otfos2.cc \
+ otfpost.cc \
+ pairop.cc \
+ psres.cc \
+ t1bounds.cc \
+ t1cs.cc \
+ t1csgen.cc \
+ t1interp.cc \
+ t1item.cc \
+ t1font.cc \
+ t1fontskel.cc \
+ t1mm.cc \
+ t1rw.cc \
+ t1unparser.cc \
+ ttfcs.cc \
+ ttfhead.cc \
+ ttfkern.cc
+
+libefont_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+AM_CPPFLAGS = -I$(srcdir)/../include
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/libefont/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/libefont/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libefont.a: $(libefont_a_OBJECTS) $(libefont_a_DEPENDENCIES) $(EXTRA_libefont_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libefont.a
+ $(AM_V_AR)$(libefont_a_AR) libefont.a $(libefont_a_OBJECTS) $(libefont_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libefont.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afmparse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afmw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amfm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cff.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encoding.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findmet.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metrics.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfcmap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfdata.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfdescrip.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfgpos.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfgsub.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfos2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfpost.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pairop.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psres.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bounds.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1cs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1csgen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1font.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fontskel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1interp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1item.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1mm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1unparser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfcs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfhead.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttfkern.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/afm.Po
+ -rm -f ./$(DEPDIR)/afmparse.Po
+ -rm -f ./$(DEPDIR)/afmw.Po
+ -rm -f ./$(DEPDIR)/amfm.Po
+ -rm -f ./$(DEPDIR)/cff.Po
+ -rm -f ./$(DEPDIR)/encoding.Po
+ -rm -f ./$(DEPDIR)/findmet.Po
+ -rm -f ./$(DEPDIR)/metrics.Po
+ -rm -f ./$(DEPDIR)/otf.Po
+ -rm -f ./$(DEPDIR)/otfcmap.Po
+ -rm -f ./$(DEPDIR)/otfdata.Po
+ -rm -f ./$(DEPDIR)/otfdescrip.Po
+ -rm -f ./$(DEPDIR)/otfgpos.Po
+ -rm -f ./$(DEPDIR)/otfgsub.Po
+ -rm -f ./$(DEPDIR)/otfname.Po
+ -rm -f ./$(DEPDIR)/otfos2.Po
+ -rm -f ./$(DEPDIR)/otfpost.Po
+ -rm -f ./$(DEPDIR)/pairop.Po
+ -rm -f ./$(DEPDIR)/psres.Po
+ -rm -f ./$(DEPDIR)/t1bounds.Po
+ -rm -f ./$(DEPDIR)/t1cs.Po
+ -rm -f ./$(DEPDIR)/t1csgen.Po
+ -rm -f ./$(DEPDIR)/t1font.Po
+ -rm -f ./$(DEPDIR)/t1fontskel.Po
+ -rm -f ./$(DEPDIR)/t1interp.Po
+ -rm -f ./$(DEPDIR)/t1item.Po
+ -rm -f ./$(DEPDIR)/t1mm.Po
+ -rm -f ./$(DEPDIR)/t1rw.Po
+ -rm -f ./$(DEPDIR)/t1unparser.Po
+ -rm -f ./$(DEPDIR)/ttfcs.Po
+ -rm -f ./$(DEPDIR)/ttfhead.Po
+ -rm -f ./$(DEPDIR)/ttfkern.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/afm.Po
+ -rm -f ./$(DEPDIR)/afmparse.Po
+ -rm -f ./$(DEPDIR)/afmw.Po
+ -rm -f ./$(DEPDIR)/amfm.Po
+ -rm -f ./$(DEPDIR)/cff.Po
+ -rm -f ./$(DEPDIR)/encoding.Po
+ -rm -f ./$(DEPDIR)/findmet.Po
+ -rm -f ./$(DEPDIR)/metrics.Po
+ -rm -f ./$(DEPDIR)/otf.Po
+ -rm -f ./$(DEPDIR)/otfcmap.Po
+ -rm -f ./$(DEPDIR)/otfdata.Po
+ -rm -f ./$(DEPDIR)/otfdescrip.Po
+ -rm -f ./$(DEPDIR)/otfgpos.Po
+ -rm -f ./$(DEPDIR)/otfgsub.Po
+ -rm -f ./$(DEPDIR)/otfname.Po
+ -rm -f ./$(DEPDIR)/otfos2.Po
+ -rm -f ./$(DEPDIR)/otfpost.Po
+ -rm -f ./$(DEPDIR)/pairop.Po
+ -rm -f ./$(DEPDIR)/psres.Po
+ -rm -f ./$(DEPDIR)/t1bounds.Po
+ -rm -f ./$(DEPDIR)/t1cs.Po
+ -rm -f ./$(DEPDIR)/t1csgen.Po
+ -rm -f ./$(DEPDIR)/t1font.Po
+ -rm -f ./$(DEPDIR)/t1fontskel.Po
+ -rm -f ./$(DEPDIR)/t1interp.Po
+ -rm -f ./$(DEPDIR)/t1item.Po
+ -rm -f ./$(DEPDIR)/t1mm.Po
+ -rm -f ./$(DEPDIR)/t1rw.Po
+ -rm -f ./$(DEPDIR)/t1unparser.Po
+ -rm -f ./$(DEPDIR)/ttfcs.Po
+ -rm -f ./$(DEPDIR)/ttfhead.Po
+ -rm -f ./$(DEPDIR)/ttfkern.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-libtool clean-noinstLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc
new file mode 100644
index 00000000000..2d850c6ef8e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afm.cc
@@ -0,0 +1,586 @@
+// -*- related-file-name: "../include/efont/afm.hh" -*-
+
+/* afm.{cc,hh} -- Adobe Font Metrics files
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afm.hh>
+#include <efont/afmparse.hh>
+#include <efont/t1cs.hh> /* for UNKDOUBLE */
+#include <lcdf/error.hh>
+#include <ctype.h>
+#include <assert.h>
+namespace Efont {
+
+AfmReader::AfmReader(AfmParser &parser, Metrics *afm, AfmMetricsXt *afm_xt,
+ ErrorHandler *errh)
+ : _afm(afm), _afm_xt(afm_xt), _l(parser),
+ _composite_warned(false), _metrics_sets_warned(false), _y_width_warned(0)
+{
+ _errh = errh ? errh : ErrorHandler::silent_handler();
+}
+
+Metrics *
+AfmReader::read(Slurper &slurp, ErrorHandler *errh)
+{
+ AfmParser p(slurp);
+ if (!p.ok())
+ return 0;
+
+ Metrics *afm = new Metrics;
+ AfmMetricsXt *afm_xt = new AfmMetricsXt;
+ afm->add_xt(afm_xt);
+ AfmReader reader(p, afm, afm_xt, errh);
+
+ if (!reader.read()) {
+ delete afm;
+ return 0;
+ } else
+ return afm;
+}
+
+Metrics *
+AfmReader::read(const Filename &fn, ErrorHandler *errh)
+{
+ Slurper slurpy(fn);
+ return read(slurpy, errh);
+}
+
+
+void
+AfmReader::lwarning(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->xmessage(_l.landmark(), ErrorHandler::e_warning, format, val);
+ va_end(val);
+}
+
+void
+AfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->xmessage(_l.landmark(), ErrorHandler::e_error, format, val);
+ va_end(val);
+}
+
+GlyphIndex
+AfmReader::find_err(PermString name, const char *) const
+{
+ GlyphIndex gi = _afm->find(name);
+ if (gi < 0)
+ lerror("character `%s' doesn't exist", name.c_str());
+ return gi;
+}
+
+void
+AfmReader::composite_warning() const
+{
+ if (!_composite_warned)
+ lwarning("composite fonts not supported");
+ _composite_warned = 1;
+}
+
+void
+AfmReader::metrics_sets_warning() const
+{
+ if (!_metrics_sets_warned)
+ lwarning("only metrics set 0 is supported");
+ _metrics_sets_warned = 1;
+}
+
+void
+AfmReader::y_width_warning() const
+{
+ if (_y_width_warned < 40) {
+ lwarning("character has a nonzero Y width");
+ _y_width_warned++;
+ if (_y_width_warned == 40)
+ lwarning("I won't warn you again.");
+ }
+}
+
+void
+AfmReader::no_match_warning(const char *context) const
+{
+ // keyword() will fail (and a warning won't get printed) only if the string
+ // is all whitespace, which the spec allows
+ PermString keyword = _l.keyword();
+ if (!keyword) return;
+ if (_l.key_matched()) {
+ lwarning(context ? "bad `%s' command in %s:"
+ : "bad `%s' command:", keyword.c_str(), context);
+ lwarning("field %d %s", _l.fail_field(), _l.message().c_str());
+ } else
+ lwarning(context ? "unknown command `%s' in %s"
+ : "unknown command `%s'", keyword.c_str(), context);
+ _l.clear_message();
+}
+
+
+bool
+AfmReader::read()
+{
+ AfmParser &l = _l;
+ assert(_afm && _afm_xt);
+
+ // First, read all opening comments into an array so we can print them out
+ // later.
+ PermString comment;
+ while (l.next_line()) {
+ if (l.isall("Comment %+s", &comment))
+ _afm_xt->opening_comments.push_back(comment);
+ else if (l.isall("StartFontMetrics %g", (double *)0))
+ ;
+ else {
+ l.save_line();
+ break;
+ }
+ }
+
+ _afm->set_scale(1000);
+ unsigned invalid_lines = 0;
+ PermString s;
+ bool isbasefont;
+ int metrics_sets;
+ int direction;
+
+ while (l.next_line())
+ switch (l.first()) {
+
+ case 'A':
+ if (l.isall("Ascender %g", &fd( fdAscender )))
+ break;
+ goto invalid;
+
+ case 'C':
+ if (l.isall("Characters %d", (int *)0))
+ break;
+ if (l.isall("CapHeight %g", &fd( fdCapHeight )))
+ break;
+ if (l.isall("CharacterSet %+s", (PermString *) 0))
+ break;
+ if (l.isall("CharWidth %g %g", (double *)0, (double *)0))
+ break;
+ if (l.isall("Comment %+s", (PermString *) 0))
+ break;
+ goto invalid;
+
+ case 'D':
+ if (l.isall("Descender %g", &fd( fdDescender )))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EncodingScheme %+s", &_afm_xt->encoding_scheme))
+ break;
+ if (l.isall("EndDirection"))
+ break;
+ if (l.isall("EndFontMetrics"))
+ goto done;
+ if (l.isall("EscChar %d", (int *)0)) {
+ composite_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'F':
+ if (l.isall("FontName %+s", &s)) {
+ _afm->set_font_name(s);
+ break;
+ }
+ if (l.isall("FullName %+s", &s)) {
+ _afm->set_full_name(s);
+ break;
+ }
+ if (l.isall("FamilyName %+s", &s)) {
+ _afm->set_family(s);
+ break;
+ }
+ if (l.isall("FontBBox %g %g %g %g",
+ &fd( fdFontBBllx ), &fd( fdFontBBlly ),
+ &fd( fdFontBBurx ), &fd( fdFontBBury )))
+ break;
+ goto invalid;
+
+ case 'I':
+ if (l.isall("ItalicAngle %g", &fd( fdItalicAngle )))
+ break;
+ if (l.isall("IsBaseFont %b", &isbasefont)) {
+ if (isbasefont == 0)
+ composite_warning();
+ break;
+ }
+ if (l.isall("IsFixedV %b", (bool *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("IsFixedPitch %b", (bool *)0))
+ break;
+ goto invalid;
+
+ case 'M':
+ if (l.isall("MappingScheme %d", (int *)0)) {
+ composite_warning();
+ break;
+ }
+ if (l.isall("MetricsSets %d", &metrics_sets)) {
+ if (metrics_sets != 0)
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.isall("Notice %+s", &_afm_xt->notice))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (l.isall("StartDirection %d", &direction)) {
+ if (direction != 0)
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("StartCharMetrics %d", (int *)0)) {
+ read_char_metrics();
+ break;
+ }
+ if (l.isall("StartKernData")) {
+ read_kerns();
+ break;
+ }
+ if (l.isall("StartComposites %d", (int *)0)) {
+ read_composites();
+ break;
+ }
+ if (l.isall("StdHW %g", &fd( fdStdHW )))
+ break;
+ if (l.isall("StdVW %g", &fd( fdStdVW )))
+ break;
+ if (l.isall("StartFontMetrics %g", (double *)0))
+ break;
+ goto invalid;
+
+ case 'U':
+ if (l.isall("UnderlinePosition %g", &fd( fdUnderlinePosition )))
+ break;
+ if (l.isall("UnderlineThickness %g", &fd( fdUnderlineThickness )))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (l.isall("Version %+s", &s)) {
+ _afm->set_version(s);
+ break;
+ }
+ if (l.isall("VVector %g %g", (double *)0, (double *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ case 'W':
+ if (l.isall("Weight %+s", &s)) {
+ _afm->set_weight(s);
+ break;
+ }
+ goto invalid;
+
+ case 'X':
+ if (l.isall("XHeight %g", &fd( fdXHeight )))
+ break;
+ goto invalid;
+
+ default:
+ invalid:
+ invalid_lines++;
+ no_match_warning();
+
+ }
+
+ done:
+ if (invalid_lines >= l.lineno() - 10)
+ return false;
+ else
+ return true;
+}
+
+
+static Vector<PermString> ligature_left;
+static Vector<PermString> ligature_right;
+static Vector<PermString> ligature_result;
+
+void
+AfmReader::read_char_metric_data() const
+{
+ int c = -1;
+ double wx = UNKDOUBLE;
+ double bllx = UNKDOUBLE, blly = 0, burx = 0, bury = 0;
+ PermString n;
+ PermString ligright, ligresult;
+
+ AfmParser &l = _l;
+
+ l.is("C %d ; WX %g ; N %/s ; B %g %g %g %g ;",
+ &c, &wx, &n, &bllx, &blly, &burx, &bury);
+
+ while (l.left()) {
+
+ switch (l.first()) {
+
+ case 'B':
+ if (l.is("B %g %g %g %g", &bllx, &blly, &burx, &bury))
+ break;
+ goto invalid;
+
+ case 'C':
+ if (l.is("C %d", &c))
+ break;
+ if (l.is("CH <%x>", &c))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EndCharMetrics"))
+ return;
+ goto invalid;
+
+ case 'L':
+ if (l.is("L %/s %/s", &ligright, &ligresult)) {
+ if (!n)
+ lerror("ligature given, but character has no name");
+ else {
+ ligature_left.push_back(n);
+ ligature_right.push_back(ligright);
+ ligature_result.push_back(ligresult);
+ }
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.is("N %/s", &n))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (l.is("WX %g", &wx) ||
+ l.is("W0X %g", &wx))
+ break;
+ if (l.is("W %g %g", &wx, (double *)0) ||
+ l.is("W0 %g %g", &wx, (double *)0) ||
+ l.is("W0Y %g", (double *)0)) {
+ y_width_warning();
+ break;
+ }
+ if (l.is("W1X %g", (double *)0) ||
+ l.is("W1Y %g", (double *)0) ||
+ l.is("W1 %g %g", (double *)0, (double *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ // always warn about unknown directives here!
+ no_match_warning("character metrics");
+ l.skip_until(';');
+ break;
+
+ }
+
+ l.is(";"); // get rid of any possible semicolon
+ }
+
+ // create the character
+ if (!n)
+ lwarning("character without a name ignored");
+ else {
+ if (_afm->find(n) != -1)
+ lwarning("character %s defined twice", n.c_str());
+
+ GlyphIndex gi = _afm->add_glyph(n);
+
+ _afm->wd(gi) = wx;
+ _afm->lf(gi) = bllx;
+ _afm->rt(gi) = burx;
+ _afm->tp(gi) = bury;
+ _afm->bt(gi) = blly;
+
+ if (c != -1)
+ _afm->set_code(gi, c);
+ }
+}
+
+
+void
+AfmReader::read_char_metrics() const
+{
+ assert(!ligature_left.size());
+
+ while (_l.next_line())
+ // Grok the whole line. Are we on a character metric data line?
+ switch (_l.first()) {
+
+ case 'C':
+ if (isspace(_l[1]) || (_l[1] == 'H' && isspace(_l[2]))) {
+ read_char_metric_data();
+ break;
+ }
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndCharMetrics"))
+ goto end_char_metrics;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ end_char_metrics:
+
+ for (int i = 0; i < ligature_left.size(); i++) {
+ GlyphIndex leftgi = find_err(ligature_left[i], "ligature");
+ GlyphIndex rightgi = find_err(ligature_right[i], "ligature");
+ GlyphIndex resultgi = find_err(ligature_result[i], "ligature");
+ if (leftgi >= 0 && rightgi >= 0 && resultgi >= 0)
+ if (_afm->add_lig(leftgi, rightgi, resultgi))
+ lwarning("duplicate ligature; first ignored");
+ }
+ ligature_left.clear();
+ ligature_right.clear();
+ ligature_result.clear();
+}
+
+
+void
+AfmReader::read_kerns() const
+{
+ double kx;
+ PermString left, right;
+ GlyphIndex leftgi, rightgi;
+
+ AfmParser &l = _l;
+ // AFM files have reversed pair programs when read.
+ _afm->pair_program()->set_reversed(true);
+
+ while (l.next_line())
+ switch (l.first()) {
+
+ case 'C':
+ if (l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EndKernPairs"))
+ break;
+ if (l.isall("EndKernData"))
+ return;
+ if (l.isall("EndTrackKern"))
+ break;
+ goto invalid;
+
+ case 'K':
+ if (l.isall("KPX %/s %/s %g", &left, &right, &kx)) {
+ goto validkern;
+ }
+ if (l.isall("KP %/s %/s %g %g", &left, &right, &kx, (double *)0)) {
+ y_width_warning();
+ goto validkern;
+ }
+ if (l.isall("KPY %/s %/s %g", &left, &right, (double *)0)) {
+ y_width_warning();
+ break;
+ }
+ if (l.isall("KPH <%x> <%x> %g %g", (int *)0, (int *)0,
+ (double *)0, (double *)0)) {
+ lwarning("KPH not supported");
+ break;
+ }
+ goto invalid;
+
+ validkern:
+ leftgi = find_err(left, "kern");
+ rightgi = find_err(right, "kern");
+ if (leftgi >= 0 && rightgi >= 0)
+ // A kern with 0 amount is NOT useless!
+ // (Because of multiple masters.)
+ if (_afm->add_kern(leftgi, rightgi, _afm->add_kv(kx)))
+ lwarning("duplicate kern; first pair ignored");
+ break;
+
+ case 'S':
+ if (l.isall("StartKernPairs %d", (int *)0) ||
+ l.isall("StartKernPairs0 %d", (int *)0))
+ break;
+ if (l.isall("StartKernPairs1 %d", (int *)0)) {
+ metrics_sets_warning();
+ break;
+ }
+ if (l.isall("StartTrackKern %d", (int *)0))
+ break;
+ goto invalid;
+
+ case 'T':
+ if (l.isall("TrackKern %g %g %g %g %g", (double *)0, (double *)0,
+ (double *)0, (double *)0, (double *)0))
+ break; // FIXME: implement TrackKern
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+}
+
+
+void
+AfmReader::read_composites() const
+{
+ while (_l.next_line())
+ switch (_l.first()) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ if (_l.is("CC"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndComposites"))
+ return;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc
new file mode 100644
index 00000000000..6e825bbd2b8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmparse.cc
@@ -0,0 +1,365 @@
+// -*- related-file-name: "../include/efont/afmparse.hh" -*-
+
+/* afmparse.{cc,hh} -- Adobe Font Metrics parsing
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afmparse.hh>
+#include <efont/t1cs.hh>
+#include <efont/metrics.hh>
+#include <lcdf/strtonum.h>
+#include <string.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <stdlib.h>
+#if HAVE_BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+namespace Efont {
+
+static bool name_enders[256];
+static char xvalue[256];
+
+
+AfmParser::AfmParser(Slurper &slurp)
+ : _slurper(slurp),
+ _line(0), _pos(0), _length(0)
+{
+ static_initialize();
+}
+
+
+void
+AfmParser::trim_end()
+{
+ int l = _length - 1;
+ while (l >= 0 && isspace(_line[l])) {
+ _line[l] = 0;
+ l--;
+ }
+ _length = l + 1;
+}
+
+
+void
+AfmParser::static_initialize()
+{
+ if (name_enders[(uint8_t)'('])
+ return;
+ name_enders[(uint8_t)' '] = name_enders[(uint8_t)'\t']
+ = name_enders[(uint8_t)'\r'] = name_enders[(uint8_t)'\f']
+ = name_enders[(uint8_t)'\v'] = name_enders[(uint8_t)'\n']
+ = name_enders[(uint8_t)'\0'] = name_enders[(uint8_t)'[']
+ = name_enders[(uint8_t)']'] = name_enders[(uint8_t)'/']
+ = name_enders[(uint8_t)'('] = name_enders[(uint8_t)')']
+ = name_enders[(uint8_t)';'] = true;
+
+ xvalue[(uint8_t)'0'] = 0;
+ xvalue[(uint8_t)'1'] = 1;
+ xvalue[(uint8_t)'2'] = 2;
+ xvalue[(uint8_t)'3'] = 3;
+ xvalue[(uint8_t)'4'] = 4;
+ xvalue[(uint8_t)'5'] = 5;
+ xvalue[(uint8_t)'6'] = 6;
+ xvalue[(uint8_t)'7'] = 7;
+ xvalue[(uint8_t)'8'] = 8;
+ xvalue[(uint8_t)'9'] = 9;
+ xvalue[(uint8_t)'a'] = 10;
+ xvalue[(uint8_t)'b'] = 11;
+ xvalue[(uint8_t)'c'] = 12;
+ xvalue[(uint8_t)'d'] = 13;
+ xvalue[(uint8_t)'e'] = 14;
+ xvalue[(uint8_t)'f'] = 15;
+ xvalue[(uint8_t)'A'] = 10;
+ xvalue[(uint8_t)'B'] = 11;
+ xvalue[(uint8_t)'C'] = 12;
+ xvalue[(uint8_t)'D'] = 13;
+ xvalue[(uint8_t)'E'] = 14;
+ xvalue[(uint8_t)'F'] = 15;
+}
+
+
+// isall == is total == is all of the string
+
+// %s whitespace-terminated PermString - non-zero-length
+// %/s name-terminated PermString - non-zero-length
+// %+s rest of line PermString
+// %= rest of line/until next `=' PermString; beginning & ending spaces
+// elided
+// %d integer
+// %g number
+// %x hex integer
+// %b boolean
+// %c character
+// %< hex string; argument is String *stored
+// %. any non-alphanumeric
+// ???????????? EOS vs. don't-skip-to-EOS ???????????
+
+
+#define FAIL(s) do { _message = s; return 0; } while (0)
+
+unsigned char *
+AfmParser::vis(const char *formatsigned, va_list valist)
+{
+ const unsigned char *format = (const unsigned char *)formatsigned;
+ unsigned char *str = _pos;
+
+ // Oftentimes, we'll get a keyword first. So handle that simple case
+ // with a tight loop for (possibly) better performance and slightly different
+ // semantics. (A keyword that comes first in the format must be followed
+ // by a nonalphanumeric in the input to match.)
+ if (isalpha(*format)) {
+ bool ok = true;
+ for (; *format && *format != ' ' && ok; format++, str++) {
+ assert(isalnum(*format));
+ if (*format != *str) ok = false;
+ }
+ if (!ok || isalnum(*str)) {
+ if (_message) return 0;
+ _fail_field = -1;
+ FAIL("keyword mismatch");
+ }
+ }
+
+ int fplus, fslash;
+ _fail_field = 0;
+ _message = PermString();
+
+ while (1) {
+
+ switch (*format) {
+
+ /* - - - - - - - - percent specifications - - - - - - - */
+ case '%':
+ fplus = fslash = 0;
+ _fail_field++;
+
+ percentspec:
+ switch (*++format) {
+
+ // FLAGS
+ case '+':
+ fplus++;
+ goto percentspec;
+ case '/':
+ fslash++;
+ goto percentspec;
+
+ case '%':
+ goto matchchar;
+
+ case 'b':
+ case 's': {
+ int len;
+
+ if (fplus)
+ len = strlen((char *)str);
+ else if (fslash) {
+ for (len = 0; !name_enders[ str[len] ]; len++)
+ ;
+ if (len == 0)
+ FAIL("should be a string");
+ } else {
+ for (len = 0; !isspace(str[len]) && str[len]; len++)
+ ;
+ if (len == 0)
+ FAIL("should be a string");
+ }
+
+ PermString s = PermString((char *)str, len);
+ str += len;
+
+ // Now we have the string. What to do with it? Depends on format.
+ if (*format == 'b') {
+
+ bool *bstore = va_arg(valist, bool *);
+ if (s == "true") {
+ if (bstore) *bstore = 1;
+ } else if (s == "false") {
+ if (bstore) *bstore = 0;
+ } else
+ FAIL("should be `true' or `false'");
+
+ } else {
+ PermString *sstore = va_arg(valist, PermString *);
+ if (sstore) *sstore = s;
+ }
+ break;
+ }
+
+ case '(': {
+ if (*str++ != '(') FAIL("should be a parenthesized string");
+ unsigned char *last = str;
+ int paren_level = 0;
+ while (*last && paren_level >= 0) {
+ if (*last == '(') paren_level++;
+ if (*last == ')') paren_level--;
+ last++;
+ }
+ if (paren_level >= 0) FAIL("had unbalanced parentheses");
+
+ PermString *sstore = va_arg(valist, PermString *);
+ if (sstore) *sstore = PermString((char *)str, last - str - 1);
+ str = last;
+ break;
+ }
+
+ case 'd':
+ case 'i': {
+ union { unsigned char *uc; char *c; } new_str;
+ int v = strtol((char *)str, &new_str.c, 10);
+ if (new_str.uc == str) FAIL("should be an integer");
+
+ str = new_str.uc;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'x': {
+ union { unsigned char *uc; char *c; } new_str;
+ int v = strtol((char *)str, &new_str.c, 16);
+ if (new_str.uc == str) FAIL("should be a hex integer");
+
+ str = new_str.uc;
+ int *istore = va_arg(valist, int *);
+ if (istore) *istore = v;
+ break;
+ }
+
+ case 'e':
+ case 'f':
+ case 'g': {
+ union { unsigned char *uc; char *c; } new_str;
+ double v = strtonumber((char *)str, &new_str.c);
+ if (v < MIN_KNOWN_DOUBLE) v = MIN_KNOWN_DOUBLE;
+ if (new_str.uc == str) FAIL("should be a real number");
+
+ str = new_str.uc;
+ double *dstore = va_arg(valist, double *);
+ if (dstore) *dstore = v;
+ break;
+ }
+
+ case '<': {
+ unsigned char *endbrack =
+ (unsigned char *)strchr((char *)str, '>');
+ int n = (endbrack ? endbrack - (str + 1) : 0);
+ if (!endbrack || n % 2 != 0)
+ FAIL("should be hex values in <angle brackets>");
+ String s = String::make_uninitialized(n/2);
+ unsigned char *data = s.mutable_udata();
+
+ str++;
+ while (*str != '>') {
+ if (isxdigit(str[0]) && isxdigit(str[1])) {
+ *data++ = xvalue[str[0]] * 16 + xvalue[str[1]];
+ str += 2;
+ } else
+ FAIL("had non-hex digits in the angle brackets");
+ }
+ str++;
+
+ if (String *datastore = va_arg(valist, String *))
+ *datastore = s;
+ break;
+ }
+
+ default:
+ assert(0 /* internal error: bad % */);
+ FAIL("");
+
+ }
+ break;
+ /* - - - - - - - - end percent specifications - - - - - - - */
+
+ case ' ':
+ if (!isspace(*str))
+ FAIL("should be followed by whitespace");
+ /* FALLTHRU */
+
+ case '-':
+ while (isspace(*str)) str++;
+ break;
+
+ case 0:
+ // always eat space at end of format
+ while (isspace(*str)) str++;
+ return str;
+
+ default:
+ matchchar:
+ if (*str++ != *format)
+ FAIL(permprintf("- expected `%c'", *format));
+ break;
+
+ }
+
+ format++;
+ }
+}
+
+
+bool
+AfmParser::isall(const char *format, ...)
+{
+ va_list valist;
+ va_start(valist, format);
+ unsigned char *new_pos = vis(format, valist);
+ va_end(valist);
+ if (new_pos && *new_pos == 0) {
+ _pos = new_pos;
+ return 1;
+ } else
+ return 0;
+}
+
+
+bool
+AfmParser::is(const char *format, ...)
+{
+ va_list valist;
+ va_start(valist, format);
+ unsigned char *new_pos = vis(format, valist);
+ va_end(valist);
+ if (new_pos) {
+ _pos = new_pos;
+ return 1;
+ } else
+ return 0;
+}
+
+
+PermString
+AfmParser::keyword() const
+{
+ const char *f = (const char *)_pos;
+ while (isspace((unsigned char) *f))
+ f++;
+ const char *l = f;
+ while (isalnum((unsigned char) *l) || *l == '_')
+ l++;
+ return PermString(f, l - f);
+}
+
+
+void
+AfmParser::skip_until(unsigned char c)
+{
+ while (*_pos && *_pos != c)
+ _pos++;
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc
new file mode 100644
index 00000000000..5f81af998f2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/afmw.cc
@@ -0,0 +1,190 @@
+// -*- related-file-name: "../include/efont/afmw.hh" -*-
+
+/* afmw.{cc,hh} -- Adobe Font Metrics writing
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/afmw.hh>
+#include <efont/t1cs.hh> /* for KNOWN() */
+namespace Efont {
+
+AfmWriter::AfmWriter(Metrics *m, FILE *f)
+ : _m(m), _afm_xt((AfmMetricsXt *)m->find_xt("AFM")), _f(f)
+{
+}
+
+void
+AfmWriter::write(Metrics *m, FILE *f)
+{
+ AfmWriter w(m, f);
+ w.write();
+}
+
+
+void
+AfmWriter::write()
+{
+ _m->pair_program()->unreverse();
+ _m->pair_program()->optimize();
+
+ fprintf(_f, "StartFontMetrics 4.1\n");
+ if (_afm_xt)
+ for (int i = 0; i < _afm_xt->opening_comments.size(); i++)
+ fprintf(_f, "Comment %s\n", _afm_xt->opening_comments[i].c_str());
+
+ write_prologue();
+
+ fprintf(_f, "StartCharMetrics %d\n", _m->nglyphs());
+
+ GlyphIndex gi;
+ for (int i = 0; i < 256; i++) //FIXME
+ if ((gi = _m->find_code(i)) >= 0)
+ write_char_metric_data(gi, i);
+ for (gi = 0; gi < _m->nglyphs(); gi++)
+ if (_m->code(gi) == -1)
+ write_char_metric_data(gi, -1);
+
+ fprintf(_f, "EndCharMetrics\n");
+
+ write_kerns();
+
+ fprintf(_f, "EndFontMetrics\n");
+}
+
+
+void
+AfmWriter::write_prologue() const
+{
+ if (_m->font_name())
+ fprintf(_f, "FontName %s\n", _m->font_name().c_str());
+ else
+ fprintf(_f, "FontName No-Font-Name-Given\n");
+
+ if (_m->full_name())
+ fprintf(_f, "FullName %s\n", _m->full_name().c_str());
+ if (_m->family())
+ fprintf(_f, "FamilyName %s\n", _m->family().c_str());
+ if (_m->weight())
+ fprintf(_f, "Weight %s\n", _m->weight().c_str());
+
+ if (KNOWN(fd( fdItalicAngle )))
+ fprintf(_f, "ItalicAngle %.8g\n", fd( fdItalicAngle ));
+
+ fprintf(_f, "FontBBox %.8g %.8g %.8g %.8g\n",
+ fd( fdFontBBllx ), fd( fdFontBBlly ),
+ fd( fdFontBBurx ), fd( fdFontBBury ));
+
+ if (KNOWN(fd( fdUnderlinePosition )))
+ fprintf(_f, "UnderlinePosition %.8g\n", fd( fdUnderlinePosition ));
+ if (KNOWN(fd( fdUnderlineThickness )))
+ fprintf(_f, "UnderlineThickness %.8g\n", fd( fdUnderlineThickness ));
+
+ if (_m->version())
+ fprintf(_f, "Version %s\n", _m->version().c_str());
+ if (_afm_xt && _afm_xt->notice)
+ fprintf(_f, "Notice %s\n", _afm_xt->notice.c_str());
+
+ if (_afm_xt && _afm_xt->encoding_scheme)
+ fprintf(_f, "EncodingScheme %s\n", _afm_xt->encoding_scheme.c_str());
+
+ if (KNOWN(fd( fdCapHeight )))
+ fprintf(_f, "CapHeight %.8g\n", fd( fdCapHeight ));
+ if (KNOWN(fd( fdXHeight )))
+ fprintf(_f, "XHeight %.8g\n", fd( fdXHeight ));
+ if (KNOWN(fd( fdAscender )))
+ fprintf(_f, "Ascender %.8g\n", fd( fdAscender ));
+ if (KNOWN(fd( fdDescender )))
+ fprintf(_f, "Descender %.8g\n", fd( fdDescender ));
+ if (KNOWN(fd( fdStdHW )))
+ fprintf(_f, "StdHW %.8g\n", fd( fdStdHW ));
+ if (KNOWN(fd( fdStdVW )))
+ fprintf(_f, "StdVW %.8g\n", fd( fdStdVW ));
+}
+
+
+void
+AfmWriter::write_char_metric_data(GlyphIndex gi, int e) const
+{
+ if (e >= -1 && e < 256)
+ fprintf(_f, "C %d ;", e);
+ else
+ fprintf(_f, "CH <%04X> ;", e);
+
+ double w = _m->wd(gi);
+ if (KNOWN(w))
+ fprintf(_f, " WX %.8g ;", w);
+ else
+ w = 0;
+
+ fprintf(_f, " N %s ;", _m->name(gi).c_str());
+
+ if (KNOWN(_m->lf(gi)))
+ fprintf(_f, " B %.8g %.8g %.8g %.8g ;",
+ _m->lf(gi), _m->bt(gi), _m->rt(gi), _m->tp(gi));
+
+ // Run through the ligature/kern program to find ligatures.
+ PairProgram &pairp = *_m->pair_program();
+ PairOpIndex opi = pairp.find_left(gi);
+ while (opi >= 0) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_lig()) {
+ if (op.lig_kind() == opLigSimple)
+ fprintf(_f, " L %s %s ;",
+ _m->name( op.right() ).c_str(),
+ _m->name( op.result() ).c_str());
+ //else
+ //warning("strange ligature combination not supported by AFM");
+ }
+ opi = op.next_left();
+ }
+
+ fputc('\n', _f);
+}
+
+
+void
+AfmWriter::write_kerns() const
+{
+ PairProgram &pairp = *_m->pair_program();
+
+ // Damn. First we have to count how many kerning pairs there are.
+ int numkerns = 0;
+ for (PairOpIndex opi = 0; opi < pairp.op_count(); opi++) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_kern() && _m->kv( op.value() ))
+ numkerns++;
+ }
+
+ if (numkerns == 0) return;
+
+ fprintf(_f, "StartKernData\n");
+ fprintf(_f, "StartKernPairs %d\n", numkerns);
+ for (GlyphIndex gi = 0; gi < _m->nglyphs(); gi++) {
+ PairOpIndex opi = pairp.find_left(gi);
+ while (opi >= 0) {
+ const PairOp &op = pairp.op(opi);
+ if (op.is_kern() && _m->kv( op.value() ))
+ fprintf(_f, "KPX %s %s %.8g\n",
+ _m->name( gi ).c_str(),
+ _m->name( op.right() ).c_str(),
+ _m->kv( op.value() ));
+ opi = op.next_left();
+ }
+ }
+ fprintf(_f, "EndKernPairs\n");
+ fprintf(_f, "EndKernData\n");
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc
new file mode 100644
index 00000000000..0ee4f66e6b0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/amfm.cc
@@ -0,0 +1,850 @@
+// -*- related-file-name: "../include/efont/amfm.hh" -*-
+
+/* amfm.{cc,hh} -- Adobe Multiple-Master Font Metrics
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/amfm.hh>
+#include <efont/afm.hh>
+#include <efont/afmparse.hh>
+#include <lcdf/error.hh>
+#include <efont/findmet.hh>
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <assert.h>
+#include <string.h>
+namespace Efont {
+
+AmfmMetrics::AmfmMetrics(MetricsFinder *finder)
+ : _finder(finder),
+ _fdv(fdLast, UNKDOUBLE),
+ _nmasters(-1), _naxes(-1), _masters(0), _mmspace(0),
+ _primary_fonts(0), _sanity_afm(0), _uses(0)
+{
+}
+
+AmfmMetrics::~AmfmMetrics()
+{
+ assert(_uses == 0);
+ for (int m = 0; m < _nmasters; m++)
+ if (_masters[m].afm)
+ _masters[m].afm->unuse();
+ delete[] _masters;
+ delete _mmspace;
+ while (_primary_fonts) {
+ AmfmPrimaryFont *pf = _primary_fonts;
+ _primary_fonts = _primary_fonts->next;
+ delete pf;
+ }
+}
+
+
+bool
+AmfmMetrics::sanity(ErrorHandler *errh) const
+{
+ if (!_mmspace) {
+ errh->error("AMFM sanity: no multiple master interpolation information");
+ return false;
+ }
+
+ bool ok = true;
+ for (int m = 0; m < _nmasters; m++)
+ if (!_masters[m].font_name
+ || _masters[m].weight_vector.size() != _nmasters) {
+ errh->error("AMFM sanity: no information for master %d", m);
+ ok = false;
+ }
+
+ if (!_mmspace->check(errh))
+ ok = false;
+
+ return ok;
+}
+
+
+int
+AmfmMetrics::primary_label_value(int ax, PermString label) const
+{
+ assert(ax >= 0 && ax < _naxes);
+ for (AmfmPrimaryFont *pf = _primary_fonts; pf; pf = pf->next) {
+ if (pf->labels[ax] == label)
+ return pf->design_vector[ax];
+ }
+ return -1;
+}
+
+
+inline static bool
+strcompat(PermString a, PermString b)
+{
+ return !a || !b || a == b;
+}
+
+Metrics *
+AmfmMetrics::master(int m, ErrorHandler *errh)
+{
+ AmfmMaster &master = _masters[m];
+
+ if (!master.loaded) {
+ master.loaded = true;
+ DirectoryMetricsFinder directory_finder(_directory);
+ _finder->add_finder(&directory_finder);
+ Metrics *afm = _finder->find_metrics(master.font_name);
+
+ if (!afm) {
+ if (errh)
+ errh->error("%s: can't find AFM file for master `%s'",
+ _font_name.c_str(), master.font_name.c_str());
+
+ } else if (!strcompat(afm->font_name(), master.font_name)
+ || !strcompat(afm->family(), master.family)
+ || !strcompat(afm->full_name(), master.full_name)
+ || !strcompat(afm->version(), master.version)) {
+ if (errh)
+ errh->error("%s: AFM for master `%s' doesn't match AMFM",
+ _font_name.c_str(), master.font_name.c_str());
+
+ } else if (!_sanity_afm) {
+ master.afm = afm;
+ _sanity_afm = afm;
+ afm->use();
+
+ } else {
+ PairProgram *sanity_pairp = _sanity_afm->pair_program();
+ PairProgram *pairp = afm->pair_program();
+ char buf[1024];
+ buf[0] = 0;
+
+ if (afm->nglyphs() != _sanity_afm->nglyphs())
+ sprintf(buf, "glyph count (%d vs. %d)", afm->nglyphs(), _sanity_afm->nglyphs());
+ if (afm->nfd() != _sanity_afm->nfd())
+ sprintf(buf, "fd count (%d vs. %d)", afm->nfd(), _sanity_afm->nfd());
+ if (afm->nkv() != _sanity_afm->nkv())
+ sprintf(buf, "kv count (%d vs. %d)", afm->nkv(), _sanity_afm->nkv());
+ if (pairp->op_count() != sanity_pairp->op_count())
+ sprintf(buf, "pair op count (%d vs. %d)", pairp->op_count(), sanity_pairp->op_count());
+
+ if (!buf[0]) {
+ master.afm = afm;
+ afm->use();
+ } else if (errh)
+ errh->error("%s: AFM for master `%s' failed sanity checks (%s)", _font_name.c_str(), master.font_name.c_str(), buf);
+ }
+ }
+
+ return master.afm;
+}
+
+
+AmfmPrimaryFont *
+AmfmMetrics::find_primary_font(const Vector<double> &design_vector) const
+{
+ assert(design_vector.size() == _naxes);
+ for (AmfmPrimaryFont *pf = _primary_fonts; pf; pf = pf->next) {
+
+ for (int a = 0; a < _naxes; a++)
+ if ((int)design_vector[a] != pf->design_vector[a])
+ goto loser;
+ return pf;
+
+ loser: ;
+ }
+ return 0;
+}
+
+
+Metrics *
+AmfmMetrics::interpolate(const Vector<double> &design_vector,
+ const Vector<double> &weight_vector,
+ ErrorHandler *errh)
+{
+ assert(design_vector.size() == _naxes);
+ assert(weight_vector.size() == _nmasters);
+
+ // FIXME: check masters for correspondence.
+
+ /* 0.
+ * Make sure all necessary AFMs have been loaded. */
+ int m;
+ for (m = 0; m < _nmasters; m++)
+ if (weight_vector[m])
+ if (!master(m, errh))
+ return 0;
+
+ /* 1.
+ * Use the design vector to generate new FontName and FullName. */
+
+ AmfmPrimaryFont *pf = find_primary_font(design_vector);
+ // The primary font is useless to us if it doesn't have axis labels.
+ if (pf && !pf->labels.size())
+ pf = 0;
+
+ StringAccum font_name_sa, full_name_sa;
+ font_name_sa << _font_name;
+ full_name_sa << _full_name;
+ for (int a = 0; a < _naxes; a++) {
+ double dv = design_vector[a];
+ font_name_sa << '_' << dv;
+ full_name_sa << (a == 0 ? '_' : ' ') << dv;
+
+ PermString label;
+ if (pf)
+ label = pf->labels[a];
+ if (!label)
+ label = _mmspace->axis_abbreviation(a);
+ if (label)
+ full_name_sa << ' ' << label;
+ }
+ // Multiple master fonts require an underscore AFTER the font name too
+ font_name_sa << '_';
+
+ /* 2.
+ * Set up the new AFM with the special constructor. */
+
+ // Find the first master with a non-zero component.
+ for (m = 0; m < _nmasters && weight_vector[m] == 0; m++)
+ ;
+ Metrics *afm = new Metrics(font_name_sa.c_str(), full_name_sa.c_str(), *_masters[m].afm);
+ if (MetricsXt *xt = _masters[m].afm->find_xt("AFM")) {
+ AfmMetricsXt *new_xt = new AfmMetricsXt((AfmMetricsXt &)*xt);
+ afm->add_xt(new_xt);
+ }
+
+ /* 2.
+ * Interpolate the old AFM data into the new. */
+
+ afm->interpolate_dimens(*_masters[m].afm, weight_vector[m], false);
+
+ for (m++; m < _nmasters; m++)
+ if (weight_vector[m])
+ afm->interpolate_dimens(*_masters[m].afm, weight_vector[m], true);
+
+ return afm;
+}
+
+
+/*****
+ * AmfmReader
+ **/
+
+AmfmReader::AmfmReader(AfmParser &afmp, AmfmMetrics *amfm, ErrorHandler *errh)
+ : _amfm(amfm), _finder(amfm->_finder), _l(afmp),
+ _mmspace(amfm->_mmspace)
+{
+ _errh = errh ? errh : ErrorHandler::silent_handler();
+}
+
+AmfmMetrics *
+AmfmReader::read(Slurper &slurper, MetricsFinder *finder, ErrorHandler *errh)
+{
+ AfmParser parser(slurper);
+ if (!parser.ok()) return 0;
+ AmfmMetrics *amfm = new AmfmMetrics(finder);
+ AmfmReader reader(parser, amfm, errh);
+ if (!reader.read()) {
+ delete amfm;
+ return 0;
+ } else
+ return amfm;
+}
+
+AmfmMetrics *
+AmfmReader::read(const Filename &fn, MetricsFinder *finder, ErrorHandler *errh)
+{
+ Slurper slurper(fn);
+ return read(slurper, finder, errh);
+}
+
+void
+AmfmReader::add_amcp_file(Slurper &slurper, AmfmMetrics *amfm, ErrorHandler *errh)
+{
+ AfmParser parser(slurper);
+ if (!parser.ok()) return;
+ AmfmReader reader(parser, amfm, errh);
+ reader.read_amcp_file();
+}
+
+
+void
+AmfmReader::lwarning(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->xmessage(_l.landmark(), ErrorHandler::e_warning, format, val);
+ va_end(val);
+}
+
+void
+AmfmReader::lerror(const char *format, ...) const
+{
+ va_list val;
+ va_start(val, format);
+ _errh->xmessage(_l.landmark(), ErrorHandler::e_error, format, val);
+ va_end(val);
+}
+
+void
+AmfmReader::no_match_warning(const char *context) const
+{
+ // keyword() will fail (and a warning won't get printed) only if the string
+ // is all whitespace, which the spec allows
+ PermString keyword = _l.keyword();
+ if (!keyword) return;
+ if (_l.key_matched()) {
+ lwarning(context ? "bad `%s' command in %s:"
+ : "bad `%s' command:", keyword.c_str(), context);
+ lwarning("field %d %s", _l.fail_field(), _l.message().c_str());
+ } else
+ lwarning(context ? "unknown command `%s' in %s"
+ : "unknown command `%s'", keyword.c_str(), context);
+ _l.clear_message();
+}
+
+
+void
+AmfmReader::check_mmspace()
+{
+ if (!_mmspace && _amfm->_naxes >= 0 && _amfm->_nmasters >= 0
+ && _amfm->_font_name) {
+ _mmspace = _amfm->_mmspace =
+ new MultipleMasterSpace(_amfm->_font_name, _amfm->_naxes, _amfm->_nmasters);
+ }
+}
+
+
+bool
+AmfmReader::read()
+{
+ assert(_amfm != 0);
+ _mmspace = _amfm->_mmspace;
+
+ AfmParser &l = _l;
+ _amfm->_directory = l.filename().directory();
+
+ // First, read all opening comments into an array so we can print them out
+ // later.
+ PermString comment;
+ while (l.next_line()) {
+ if (l.isall("Comment %+s", &comment))
+ _amfm->_opening_comments.push_back(comment);
+ else if (l.isall("StartMasterFontMetrics %g", (double *)0))
+ ;
+ else {
+ l.save_line();
+ break;
+ }
+ }
+
+ int master = 0, axis = 0;
+
+ while (l.next_line())
+ switch (l[0]) {
+
+ case 'A':
+ if (l.isall("Ascender %g", &fd( fdAscender )))
+ break;
+ if (l.isall("Axes %d", &_amfm->_naxes)) {
+ check_mmspace();
+ break;
+ }
+ goto invalid;
+
+ case 'B':
+ if (l.is("BlendDesignPositions")) {
+ read_positions();
+ break;
+ }
+ if (l.is("BlendDesignMap")) {
+ read_normalize();
+ break;
+ }
+ if (l.is("BlendAxisTypes")) {
+ read_axis_types();
+ break;
+ }
+ goto invalid;
+
+ case 'C':
+ if (l.isall("CapHeight %g", &fd( fdCapHeight )))
+ break;
+ if (l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'D':
+ if (l.isall("Descender %g", &fd( fdDescender )))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (l.isall("EncodingScheme %+s", &_amfm->_encoding_scheme))
+ break;
+ if (l.isall("EndMasterFontMetrics"))
+ goto done;
+ goto invalid;
+
+ case 'F':
+ if (l.isall("FontName %+s", &_amfm->_font_name)) {
+ check_mmspace();
+ break;
+ }
+ if (l.isall("FullName %+s", &_amfm->_full_name))
+ break;
+ if (l.isall("FamilyName %+s", &_amfm->_family))
+ break;
+ if (l.isall("FontBBox %g %g %g %g",
+ &fd( fdFontBBllx ), &fd( fdFontBBlly ),
+ &fd( fdFontBBurx ), &fd( fdFontBBury )))
+ break;
+ goto invalid;
+
+ case 'I':
+ if (l.isall("IsFixedPitch %b", (bool *)0))
+ break;
+ if (l.isall("ItalicAngle %g", &fd( fdItalicAngle )))
+ break;
+ goto invalid;
+
+ case 'M':
+ if (l.isall("Masters %d", &_amfm->_nmasters)) {
+ check_mmspace();
+ break;
+ }
+ goto invalid;
+
+ case 'N':
+ if (l.isall("Notice %+s", &_amfm->_notice))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (l.isall("StartAxis")) {
+ read_axis(axis++);
+ break;
+ }
+ if (l.isall("StartMaster")) {
+ read_master(master++);
+ break;
+ }
+ if (l.isall("StartPrimaryFonts %d", (int *)0)) {
+ read_primary_fonts();
+ break;
+ }
+ if (l.isall("StartConversionPrograms %d %d", (int *)0, (int *)0)) {
+ read_conversion_programs();
+ break;
+ }
+ if (l.isall("StartMasterFontMetrics %g", (double *)0))
+ break;
+ goto invalid;
+
+ case 'U':
+ if (l.isall("UnderlinePosition %g", &fd( fdUnderlinePosition )))
+ break;
+ else if (l.isall("UnderlineThickness %g", &fd( fdUnderlineThickness )))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (l.isall("Version %+s", &_amfm->_version))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (l.isall("Weight %+s", &_amfm->_weight))
+ break;
+ if (l.is("WeightVector")) {
+ Vector<double> wv;
+ if (!read_simple_array(wv) || !_mmspace)
+ lerror("bad WeightVector");
+ else
+ _mmspace->set_weight_vector(wv);
+ break;
+ }
+ goto invalid;
+
+ case 'X':
+ if (l.isall("XHeight %g", &fd( fdXHeight )))
+ break;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ done:
+ if (!_mmspace) {
+ _errh->error("`%s' is not an AMFM file", String(_l.landmark().file()).c_str());
+ return false;
+ }
+
+ LandmarkErrorHandler pin_errh(_errh, _l.landmark());
+ if (!_amfm->sanity(&pin_errh)) {
+ _errh->lerror(_l.landmark().whole_file(),
+ "bad AMFM file (missing or inconsistent information)");
+ return false;
+ }
+
+ if (!_mmspace->check_intermediate() && _l.filename().directory()) {
+ String name = l.filename().base() + ".amcp";
+ Slurper slurp(_l.filename().from_directory(name));
+ add_amcp_file(slurp, _amfm, _errh);
+ }
+
+ return true;
+}
+
+
+void
+AmfmReader::read_amcp_file()
+{
+ int lines_read = 0;
+
+ while (_l.next_line()) {
+ lines_read++;
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'S':
+ if (_l.isall("StartConversionPrograms %d %d", (int *)0, (int *)0)) {
+ read_conversion_programs();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning("AMCP file");
+
+ }
+ }
+
+ if (_mmspace && !_mmspace->ndv() && !_mmspace->cdv() && lines_read)
+ lwarning("no conversion programs in .amcp file");
+}
+
+
+bool
+AmfmReader::read_simple_array(Vector<double> &vec) const
+{
+ if (!_l.is("[")) return false;
+
+ vec.clear();
+ double d;
+ while (_l.is("%g", &d))
+ vec.push_back(d);
+
+ return _l.is("]");
+}
+
+
+void
+AmfmReader::read_positions() const
+{
+ if (nmasters() < 2 || naxes() < 1) return;
+ Vector<NumVector> positions;
+ if (!_l.is("[") || !_mmspace) goto error;
+
+ for (int i = 0; i < nmasters(); i++) {
+ positions.push_back(NumVector());
+ if (!read_simple_array(positions.back()))
+ goto error;
+ }
+
+ if (!_l.is("]")) goto error;
+ _mmspace->set_master_positions(positions);
+ return;
+
+ error:
+ lerror("bad BlendDesignPositions");
+}
+
+
+void
+AmfmReader::read_normalize() const
+{
+ if (naxes() < 1) return;
+ Vector<NumVector> normalize_in, normalize_out;
+ if (!_l.is("[") || !_mmspace) goto error;
+
+ for (int a = 0; a < naxes(); a++) {
+ if (!_l.is("[")) goto error;
+ normalize_in.push_back(NumVector());
+ normalize_out.push_back(NumVector());
+ double v1, v2;
+ while (_l.is("[-%g %g-]", &v1, &v2)) {
+ normalize_in[a].push_back(v1);
+ normalize_out[a].push_back(v2);
+ }
+ if (!_l.is("]")) goto error;
+ }
+
+ if (!_l.is("]")) goto error;
+ _mmspace->set_normalize(normalize_in, normalize_out);
+ return;
+
+ error:
+ lerror("bad BlendDesignPositions");
+}
+
+
+void
+AmfmReader::read_axis_types() const
+{
+ PermString s;
+ int ax = 0;
+ Vector<PermString> types;
+ if (naxes() < 1) return;
+ if (!_l.is("[") || !_mmspace) goto error;
+ _mmspace->check();
+
+ while (_l.is("/%/s", &s))
+ _mmspace->set_axis_type(ax++, s);
+
+ if (!_l.is("]")) goto error;
+ return;
+
+ error:
+ lerror("bad BlendAxisTypes");
+}
+
+
+void
+AmfmReader::read_axis(int ax) const
+{
+ bool ok = _mmspace && ax < naxes();
+ if (!ok)
+ lerror("bad axis number %d", ax);
+ else
+ _mmspace->check();
+
+ PermString s;
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'A':
+ if (_l.is("AxisType %+s", &s)) {
+ if (ok)
+ _mmspace->set_axis_type(ax, s);
+ break;
+ }
+ if (_l.is("AxisLabel %+s", &s)) {
+ if (ok)
+ _mmspace->set_axis_label(ax, s);
+ break;
+ }
+ goto invalid;
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndAxis"))
+ goto endaxis;
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ endaxis: ;
+}
+
+
+void
+AmfmReader::read_master(int m) const
+{
+ AmfmMaster *amfmm;
+ AmfmMaster dummy;
+ if (m >= nmasters()) {
+ lerror("too many masters");
+ amfmm = &dummy;
+ } else {
+ if (!_amfm->_masters)
+ _amfm->_masters = new AmfmMaster[ nmasters() ];
+ amfmm = &_amfm->_masters[m];
+ }
+
+ while (_l.next_line())
+ // Grok the whole line. Are we on a character metric data line?
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndMaster"))
+ goto endmaster;
+ goto invalid;
+
+ case 'F':
+ if (_l.isall("FontName %+s", &amfmm->font_name))
+ break;
+ if (_l.isall("FullName %+s", &amfmm->full_name))
+ break;
+ if (_l.isall("FamilyName %+s", &amfmm->family))
+ break;
+ goto invalid;
+
+ case 'V':
+ if (_l.isall("Version %+s", &amfmm->version))
+ break;
+ goto invalid;
+
+ case 'W':
+ if (_l.is("WeightVector")) {
+ if (!(read_simple_array(amfmm->weight_vector) &&
+ amfmm->weight_vector.size() == nmasters())) {
+ lerror("bad WeightVector");
+ amfmm->weight_vector.clear();
+ }
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ endmaster: ;
+}
+
+
+void
+AmfmReader::read_one_primary_font() const
+{
+ AmfmPrimaryFont *pf = new AmfmPrimaryFont;
+ pf->design_vector.resize(naxes());
+ pf->labels.resize(naxes());
+
+ while (_l.left()) {
+
+ if (_l.is("PC")) {
+ for (int a = 0; a < naxes(); a++)
+ if (!_l.is("%d", &pf->design_vector[a]))
+ goto error;
+ } else if (_l.is("PL")) {
+ for (int a = 0; a < naxes(); a++)
+ if (!_l.is("(-%/s-)", &pf->labels[a]))
+ goto error;
+ } else if (_l.is("PN %(", &pf->name))
+ ;
+ else
+ no_match_warning("primary font");
+
+ _l.is(";"); // get rid of any possible semicolon
+ }
+
+ pf->next = _amfm->_primary_fonts;
+ _amfm->_primary_fonts = pf;
+ return;
+
+ error:
+ delete pf;
+}
+
+
+void
+AmfmReader::read_primary_fonts() const
+{
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.is("Comment"))
+ break;
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndPrimaryFonts"))
+ goto end_primary_fonts;
+ goto invalid;
+
+ case 'P':
+ if (_l[1] == 'C' && isspace(_l[2])) {
+ read_one_primary_font();
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+
+ }
+
+ end_primary_fonts: ;
+}
+
+
+void
+AmfmReader::read_conversion_programs() const
+{
+ String ndv, cdv, s;
+
+ while (_l.next_line())
+ switch (_l[0]) {
+
+ case 'C':
+ if (_l.isall("CDV %<", &s)) {
+ cdv += s;
+ break;
+ }
+ goto invalid;
+
+ case 'E':
+ if (_l.isall("EndConversionPrograms"))
+ goto end_conversion_programs;
+ goto invalid;
+
+ case 'N':
+ if (_l.isall("NDV %<", &s)) {
+ ndv += s;
+ break;
+ }
+ goto invalid;
+
+ default:
+ invalid:
+ no_match_warning();
+ break;
+
+ }
+
+ end_conversion_programs:
+ if (_mmspace) {
+ _mmspace->set_ndv(Type1Charstring(ndv));
+ _mmspace->set_cdv(Type1Charstring(cdv));
+ }
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc
new file mode 100644
index 00000000000..74af65d7cd2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/cff.cc
@@ -0,0 +1,1685 @@
+// -*- related-file-name: "../include/efont/cff.hh" -*-
+
+/* cff.{cc,hh} -- Compact Font Format fonts
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/cff.hh>
+#include <lcdf/error.hh>
+#include <efont/t1item.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+#include <efont/t1unparser.hh>
+
+#ifndef static_assert
+#define static_assert(c, msg) switch ((int) (c)) case 0: case (c):
+#endif
+
+namespace Efont {
+
+const char * const Cff::operator_names[] = {
+ "version", "Notice", "FullName", "FamilyName",
+ "Weight", "FontBBox", "BlueValues", "OtherBlues",
+ "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW",
+ "UNKNOWN_12", "UniqueID", "XUID", "charset",
+ "Encoding", "CharStrings", "Private", "Subrs",
+ "defaultWidthX", "nominalWidthX", "UNKNOWN_22", "UNKNOWN_23",
+ "UNKNOWN_24", "UNKNOWN_25", "UNKNOWN_26", "UNKNOWN_27",
+ "UNKNOWN_28", "UNKNOWN_29", "UNKNOWN_30", "UNKNOWN_31",
+ "Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition",
+ "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix",
+ "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz",
+ "StemSnapH", "StemSnapV", "ForceBold", "UNKNOWN_12_15",
+ "UNKNOWN_12_16", "LanguageGroup", "ExpansionFactor", "initialRandomSeed",
+ "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend",
+ "UNKNOWN_12_24", "UNKNOWN_12_25", "UNKNOWN_12_26", "UNKNOWN_12_27",
+ "UNKNOWN_12_28", "UNKNOWN_12_29", "ROS", "CIDFontVersion",
+ "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase",
+ "FDArray", "FDSelect", "FontName"
+};
+
+const int Cff::operator_types[] = {
+ tSID, tSID, tSID, tSID, // version, Notice, FullName, FamilyName
+ tSID, tArray4, tP+tArray, tP+tArray, // Weight, FontBBox, BlueValues, OtherBlues
+ tP+tArray, tP+tArray, tP+tNumber, tP+tNumber, // FamBlues, FamOthBlues, StdHW, StdVW
+ tNone, tNumber, tArray, tOffset, // escape, UniqueID, XUID, charset
+ tOffset, tOffset, tPrivateType, tP+tLocalOffset, // Encoding, CharStrings, Private, Subrs
+ tP+tNumber, tP+tNumber, tNone, tNone, // defaultWX, nominalWX, 22, 23
+ tNone, tNone, tNone, tNone, // 24, 25, 26, 27
+ tNone, tNone, tNone, tNone, // 28, 29, 30, 31
+ tSID, tBoolean, tNumber, tNumber, // Copyright, isFixedPitch, ItalicAngle, UnderlinePosition
+ tNumber, tNumber, tNumber, tArray6, // UnderlineThickness, PaintType, CharstringType, FontMatrix
+ tNumber, tP+tNumber, tP+tNumber, tP+tNumber, // StrokeWidth, BlueScale, BlueShift, BlueFuzz
+ tP+tArray, tP+tArray, tP+tBoolean, tNone, // StemSnapH, StemSnapV, ForceBold, 12 15
+ tNone, tP+tNumber, tP+tNumber, tP+tNumber, // 12 16, LanguageGroup, ExpansionFactor, initialRandomSeed
+ tNumber, tSID, tSID, tArray, // SyntheticBase, PostScript, BaseFontName, BaseFontBlend
+ tNone, tNone, tNone, tNone, // 12 24, 12 25, 12 26, 12 27
+ tNone, tNone, tArray, tNumber, // 12 28, 12 29, ROS, CIDFontVersion
+ tNumber, tNumber, tNumber, tNumber, // CIDFontRevision, CIDFontType, CIDCount, UIDBase
+ tOffset, tOffset, tSID // FDArray, FDSelect, FontName
+};
+
+static PermString::Initializer initializer;
+static const char * const standard_strings[] = {
+ // Automatically generated from Appendix A of the CFF specification; do
+ // not edit. Size should be 391.
+ ".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar",
+ "percent", "ampersand", "quoteright", "parenleft", "parenright",
+ "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one",
+ "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon",
+ "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C",
+ "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
+ "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash",
+ "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
+ "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright",
+ "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen",
+ "florin", "section", "currency", "quotesingle", "quotedblleft",
+ "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash",
+ "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla",
+ "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash",
+ "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe",
+ "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth",
+ "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar",
+ "degree", "thorn", "threequarters", "twosuperior", "registered", "minus",
+ "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex",
+ "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute",
+ "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve",
+ "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave",
+ "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis",
+ "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex",
+ "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave",
+ "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde",
+ "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute",
+ "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall",
+ "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader",
+ "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle",
+ "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle",
+ "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior",
+ "threequartersemdash", "periodsuperior", "questionsmall", "asuperior",
+ "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior",
+ "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior",
+ "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior",
+ "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall",
+ "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",
+ "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall",
+ "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall",
+ "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary",
+ "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle",
+ "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall",
+ "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash",
+ "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall",
+ "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths",
+ "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior",
+ "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior",
+ "ninesuperior", "zeroinferior", "oneinferior", "twoinferior",
+ "threeinferior", "fourinferior", "fiveinferior", "sixinferior",
+ "seveninferior", "eightinferior", "nineinferior", "centinferior",
+ "dollarinferior", "periodinferior", "commainferior", "Agravesmall",
+ "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall",
+ "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall",
+ "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall",
+ "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall",
+ "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall",
+ "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall",
+ "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall",
+ "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black",
+ "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"
+};
+static PermString standard_permstrings[Cff::NSTANDARD_STRINGS];
+static HashMap<PermString, int> standard_permstrings_map(-1);
+
+static const int standard_encoding[] = {
+ // Automatically generated from Appendix B of the CFF specification; do
+ // not edit. Size should be 256.
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 0, 111, 112, 113,
+ 114, 0, 115, 116, 117, 118, 119, 120, 121, 122,
+ 0, 123, 0, 124, 125, 126, 127, 128, 129, 130,
+ 131, 0, 132, 133, 0, 134, 135, 136, 137, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 138, 0, 139, 0, 0,
+ 0, 0, 140, 141, 142, 143, 0, 0, 0, 0,
+ 0, 144, 0, 0, 0, 145, 0, 0, 146, 147,
+ 148, 149, 0, 0, 0, 0
+};
+
+static const int expert_encoding[] = {
+ // Automatically generated from Appendix B of the CFF specification; do
+ // not edit. Size should be 256.
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 229, 230, 0, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99, 239, 240,
+ 241, 242, 243, 244, 245, 246, 247, 248, 27, 28,
+ 249, 250, 251, 252, 0, 253, 254, 255, 256, 257,
+ 0, 0, 0, 258, 0, 0, 259, 260, 261, 262,
+ 0, 0, 263, 264, 265, 0, 266, 109, 110, 267,
+ 268, 269, 0, 270, 271, 272, 273, 274, 275, 276,
+ 277, 278, 279, 280, 281, 282, 283, 284, 285, 286,
+ 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 304, 305, 306, 0, 0, 307, 308, 309, 310,
+ 311, 0, 312, 0, 0, 313, 0, 0, 314, 315,
+ 0, 0, 316, 317, 318, 0, 0, 0, 158, 155,
+ 163, 319, 320, 321, 322, 323, 324, 325, 0, 0,
+ 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+};
+
+static const int iso_adobe_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+ 220, 221, 222, 223, 224, 225, 226, 227, 228
+};
+
+static const int expert_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 229, 230, 231, 232, 233, 234, 235, 236,
+ 237, 238, 13, 14, 15, 99, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 27, 28, 249, 250,
+ 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
+ 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
+ 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+ 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
+ 158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
+ 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+};
+
+static const int expert_subset_charset[] = {
+ // Automatically generated from Appendix C of the CFF specification; do
+ // not edit.
+ 0, 1, 231, 232, 235, 236, 237, 238, 13, 14,
+ 15, 99, 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 253, 254, 255,
+ 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
+ 302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
+ 323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
+ 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346
+};
+
+static const uint8_t default_dict_cff_data[] = {
+ // CFF header
+ 1, 0, // format major and minor version
+ 4, // header size
+ 4, // absolute offset size
+
+ // Name INDEX
+ 0, 1, // one element in index
+ 1, // offset size
+ 1, 14, // offset array
+ '%', 'D', 'E', 'F', 'A', 'U', 'L', 'T', 'D', 'I', 'C', 'T', '%',
+
+ // Top DICT INDEX
+ 0, 1, // one element in index
+ 1, // offset size
+ 1, 92, // offset array
+ // and the DICT
+ 139, 12, 1, // isFixedPitch false
+ 139, 12, 2, // ItalicAngle 0
+ 39, 12, 3, // UnderlinePosition -100
+ 189, 12, 4, // UnderlineThickness 50
+ 139, 12, 5, // PaintType 0
+ 141, 12, 6, // CharstringType 2
+ 30, 0x0A, 0x00, 0x1F, 139, 139, 30, 0x0A, 0x00, 0x1F, 139, 139, 12, 7,
+ // FontMatrix 0.001 0 0 0.001 0 0
+ 139, 139, 139, 139, 5, // FontBBox 0 0 0 0
+ 139, 12, 8, // StrokeWidth 0
+ 139, 15, // charset 0
+ 139, 16, // Encoding 0
+ 139, 12, 31, // CIDFontVersion 0
+ 139, 12, 32, // CIDFontRevision 0
+ 139, 12, 33, // CIDFontType 0
+ 28, 34, 16, 12, 34, // CIDCount 8720
+ 30, 0x0A, 0x03, 0x96, 0x25, 0xFF, 12, 9, // BlueScale 0.039625
+ 146, 12, 10, // BlueShift 7
+ 140, 12, 11, // BlueFuzz 1
+ 139, 12, 14, // ForceBold false
+ 139, 12, 17, // LanguageGroup 0
+ 30, 0x0A, 0x06, 0xFF, 12, 18, // ExpansionFactor 0.06
+ 139, 12, 19, // initialRandomSeed 0
+ 139, 20, // defaultWidthX 0
+ 139, 21, // nominalWidthX 0
+
+ // String INDEX
+ 0, 0,
+
+ // Gsubr INDEX
+ 0, 0
+};
+
+static const Cff::Dict&
+default_dict()
+{
+ static Cff cff(String::make_stable((const char*) default_dict_cff_data, sizeof(default_dict_cff_data)), 0, ErrorHandler::default_handler());
+ return static_cast<Cff::Font*>(cff.font())->top_dict();
+}
+
+
+#define POS_GT(pos1, pos2) ((unsigned)(pos1) > (unsigned)(pos2))
+
+
+Cff::Cff(const String& s, unsigned units_per_em, ErrorHandler* errh)
+ : _data_string(s), _data(reinterpret_cast<const uint8_t *>(_data_string.data())), _len(_data_string.length()),
+ _strings_map(-2), _units_per_em(units_per_em)
+{
+ static_assert((sizeof(standard_strings) / sizeof(standard_strings[0])) == NSTANDARD_STRINGS,
+ "NSTANDARD_STRINGS defined incorrectly");
+ static_assert((sizeof(standard_encoding) / sizeof(standard_encoding[0])) == 256,
+ "standard_encoding has wrong size");
+ static_assert((sizeof(expert_encoding) / sizeof(expert_encoding[0])) == 256,
+ "expert_encoding has wrong size");
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+Cff::~Cff()
+{
+ for (int i = 0; i < _gsubrs_cs.size(); i++)
+ delete _gsubrs_cs[i];
+ for (int i = 0; i < _fonts.size(); ++i)
+ delete _fonts[i];
+}
+
+/*
+ * Parsing the file header
+ */
+
+int
+Cff::parse_header(ErrorHandler *errh)
+{
+ if (_gsubrs_index.error() >= 0) // already done
+ return 0;
+
+ // parse header
+ if (_len == 0)
+ return errh->error("not a PostScript-flavored OpenType font"), -EFAULT;
+ if (_len < HEADER_SIZE)
+ return errh->error("CFF file corrupted (too small)"), -EFAULT;
+ if (_data[0] != 1) // major version number
+ return errh->error("bad major version number %d", _data[0]), -ERANGE;
+ int hdrSize = _data[2], offSize = _data[3];
+ if (hdrSize < 4 || hdrSize > _len || offSize < 1 || offSize > 4)
+ return errh->error("corrupted file header"), -EINVAL;
+ int name_index_pos = hdrSize;
+
+ // parse name INDEX
+ IndexIterator niter(_data, name_index_pos, _len, errh, "Name INDEX");
+ if (niter.error() < 0)
+ return niter.error();
+ _name_index.clear();
+ for (; niter; niter++) {
+ const uint8_t *d0 = niter[0];
+ const uint8_t *d1 = niter[1];
+ if (d0 == d1 || d0[0] == 0)
+ _name_index.push_back(PermString());
+ else
+ _name_index.push_back(PermString(reinterpret_cast<const char *>(d0), d1 - d0));
+ }
+ int top_dict_index_pos = niter.index_end() - _data;
+
+ // check top DICT INDEX
+ _top_dict_index = IndexIterator(_data, top_dict_index_pos, _len, errh, "Top DICT INDEX");
+ if (_top_dict_index.error() < 0)
+ return _top_dict_index.error();
+ else if (_top_dict_index.nitems() != nfonts())
+ return errh->error("invalid font: Top DICT INDEX has %d elements, but there are %d fonts", _top_dict_index.nitems(), nfonts()), -EINVAL;
+ int string_index_pos = _top_dict_index.index_end() - _data;
+
+ // check strings INDEX
+ _strings_index = IndexIterator(_data, string_index_pos, _len, errh, "Strings INDEX");
+ if (_strings_index.error() < 0)
+ return _strings_index.error();
+ else if (NSTANDARD_STRINGS + _strings_index.nitems() - 1 > MAX_SID)
+ return errh->error("too many strings defined in font"), -EINVAL;
+ _strings.assign(_strings_index.nitems(), PermString());
+ int global_subr_index_pos = _strings_index.index_end() - _data;
+
+ // check gsubr INDEX
+ _gsubrs_index = IndexIterator(_data, global_subr_index_pos, _len, errh, "Gsubrs INDEX");
+ if (_gsubrs_index.error() < 0)
+ return _gsubrs_index.error();
+ _gsubrs_cs.assign(ngsubrs(), 0);
+
+ return 0;
+}
+
+int
+Cff::sid(PermString s)
+{
+ if (!s) // XXX?
+ return -1;
+
+ // check standard strings
+ if (standard_permstrings_map["a"] < 0)
+ for (int i = 0; i < NSTANDARD_STRINGS; i++) {
+ if (!standard_permstrings[i])
+ standard_permstrings[i] = PermString(standard_strings[i]);
+ standard_permstrings_map.insert(standard_permstrings[i], i);
+ }
+ int sid = standard_permstrings_map[s];
+ if (sid >= 0)
+ return sid;
+
+ // check user strings
+ sid = _strings_map[s];
+ if (sid >= -1)
+ return sid;
+
+ for (int i = 0; i < _strings.size(); i++)
+ if (!_strings[i] && s.length() == _strings_index[i+1] - _strings_index[i] && memcmp(s.c_str(), _strings_index[i], s.length()) == 0) {
+ _strings[i] = s;
+ _strings_map.insert(s, i + NSTANDARD_STRINGS);
+ return i + NSTANDARD_STRINGS;
+ }
+
+ _strings_map.insert(s, -1);
+ return -1;
+}
+
+String
+Cff::sid_string(int sid) const
+{
+ if (sid < 0)
+ return String();
+ else if (sid < NSTANDARD_STRINGS)
+ return String(sid_permstring(sid));
+ else {
+ sid -= NSTANDARD_STRINGS;
+ if (sid >= _strings.size())
+ return String();
+ else if (_strings[sid])
+ return String(_strings[sid]);
+ else
+ return String(reinterpret_cast<const char *>(_strings_index[sid]), _strings_index[sid + 1] - _strings_index[sid]);
+ }
+}
+
+PermString
+Cff::sid_permstring(int sid) const
+{
+ if (sid < 0)
+ return PermString();
+ else if (sid < NSTANDARD_STRINGS) {
+ if (!standard_permstrings[sid])
+ standard_permstrings[sid] = PermString(standard_strings[sid]);
+ return standard_permstrings[sid];
+ } else {
+ sid -= NSTANDARD_STRINGS;
+ if (sid >= _strings.size())
+ return PermString();
+ else if (_strings[sid])
+ return _strings[sid];
+ else {
+ PermString s = PermString(reinterpret_cast<const char *>(_strings_index[sid]), _strings_index[sid + 1] - _strings_index[sid]);
+ _strings[sid] = s;
+ _strings_map.insert(s, sid + NSTANDARD_STRINGS);
+ return s;
+ }
+ }
+}
+
+Cff::FontParent *
+Cff::font(PermString font_name, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ if (!ok())
+ return errh->error("invalid CFF"), (FontParent *) 0;
+
+ // search for a font named 'font_name'
+ int findex;
+ for (findex = 0; findex < _name_index.size(); ++findex) {
+ if (_name_index[findex]
+ && (!font_name || font_name == _name_index[findex]))
+ break;
+ }
+ if (findex >= _name_index.size()) {
+ if (!font_name)
+ errh->error("no fonts in CFF");
+ else
+ errh->error("font %<%s%> not found", font_name.c_str());
+ return 0;
+ }
+
+ // return font
+ for (int i = 0; i < _fonts.size(); ++i)
+ if (_fonts[i]->_font_index == findex)
+ return _fonts[i];
+
+ int td_offset = _top_dict_index[findex] - _data;
+ int td_length = _top_dict_index[findex + 1] - _top_dict_index[findex];
+ Dict top_dict(this, td_offset, td_length, errh, "Top DICT");
+ if (!top_dict.ok())
+ return 0;
+
+ Cff::FontParent* fp;
+ if (top_dict.has_first(oROS))
+ fp = new Cff::CIDFont(this, _name_index[findex], top_dict, errh);
+ else
+ fp = new Cff::Font(this, _name_index[findex], top_dict, errh);
+ fp->_font_index = findex;
+ _fonts.push_back(fp);
+ return fp;
+}
+
+static inline int
+subr_bias(int charstring_type, int nsubrs)
+{
+ if (charstring_type == 1)
+ return 0;
+ else if (nsubrs < 1240)
+ return 107;
+ else if (nsubrs < 33900)
+ return 1131;
+ else
+ return 32768;
+}
+
+Charstring *
+Cff::gsubr(int i)
+{
+ i += subr_bias(2, ngsubrs());
+ if (i < 0 || i >= ngsubrs())
+ return 0;
+ if (!_gsubrs_cs[i]) {
+ const uint8_t *s1 = _gsubrs_index[i];
+ int slen = _gsubrs_index[i + 1] - s1;
+ String cs = data_string().substring(s1 - data(), slen);
+ if (slen == 0)
+ return 0;
+ else
+ _gsubrs_cs[i] = new Type2Charstring(cs);
+ }
+ return _gsubrs_cs[i];
+}
+
+
+/*****
+ * Cff::Charset
+ **/
+
+Cff::Charset::Charset(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ assign(cff, pos, nglyphs, max_sid, errh);
+}
+
+void
+Cff::Charset::assign(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ _sids.reserve(nglyphs);
+
+ if (pos == 0)
+ assign(iso_adobe_charset, sizeof(iso_adobe_charset) / sizeof(int), nglyphs);
+ else if (pos == 1)
+ assign(expert_charset, sizeof(expert_charset) / sizeof(int), nglyphs);
+ else if (pos == 2)
+ assign(expert_subset_charset, sizeof(expert_subset_charset) / sizeof(int), nglyphs);
+ else
+ _error = parse(cff, pos, nglyphs, max_sid, errh);
+
+ if (_error >= 0)
+ for (int g = 0; g < _sids.size(); g++) {
+ if (_gids[_sids[g]] >= 0) {
+ errh->error("glyph %<%s%> in charset twice", cff->sid_permstring(_sids[g]).c_str());
+ _error = -EEXIST;
+ }
+ _gids[_sids[g]] = g;
+ }
+}
+
+void
+Cff::Charset::assign(const int *data, int size, int nglyphs)
+{
+ if (size < nglyphs)
+ size = nglyphs;
+ _sids.resize(size);
+ memcpy(&_sids[0], data, sizeof(const int) * size);
+ _gids.resize(data[size-1] + 1, -1);
+ _error = 0;
+}
+
+int
+Cff::Charset::parse(const Cff *cff, int pos, int nglyphs, int max_sid, ErrorHandler *errh)
+{
+ const uint8_t *data = cff->data();
+ int len = cff->length();
+
+ if (pos + 1 > len)
+ return errh->error("charset position out of range"), -EFAULT;
+
+ _sids.push_back(0);
+ int actual_max_sid = 0;
+
+ int format = data[pos];
+ if (format == 0) {
+ if (pos + 1 + (nglyphs - 1) * 2 > len)
+ return errh->error("charset [format 0] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 2) {
+ int sid = (p[0] << 8) | p[1];
+ if (sid > actual_max_sid)
+ actual_max_sid = sid;
+ _sids.push_back(sid);
+ }
+
+ } else if (format == 1) {
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 3) {
+ if (p + 3 > data + len)
+ return errh->error("charset [format 1] out of range"), -EFAULT;
+ int sid = (p[0] << 8) | p[1];
+ int n = p[2];
+ if (sid + n > actual_max_sid)
+ actual_max_sid = sid + n;
+ for (int i = 0; i <= n; i++)
+ _sids.push_back(sid + i);
+ }
+
+ } else if (format == 2) {
+ const uint8_t *p = data + pos + 1;
+ for (; _sids.size() < nglyphs; p += 4) {
+ if (p + 4 > data + len)
+ return errh->error("charset [format 2] out of range"), -EFAULT;
+ int sid = (p[0] << 8) | p[1];
+ int n = (p[2] << 8) | p[3];
+ if (sid + n > actual_max_sid)
+ actual_max_sid = sid + n;
+ for (int i = 0; i <= n; i++)
+ _sids.push_back(sid + i);
+ }
+
+ } else
+ return errh->error("unknown charset format %d", format), -EINVAL;
+
+ if (max_sid >= 0 && actual_max_sid > max_sid)
+ return errh->error("charset [format %d] uses bad SID %d", format, actual_max_sid), -EINVAL;
+ _sids.resize(nglyphs);
+ _gids.resize(actual_max_sid + 1, -1);
+ return 0;
+}
+
+
+/*****
+ * Cff::FDSelect
+ **/
+
+void
+Cff::FDSelect::assign(const Cff *cff, int pos, int nglyphs, ErrorHandler *errh)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ if (_my_fds)
+ delete[] _fds;
+ _fds = 0;
+ _my_fds = false;
+ _nglyphs = nglyphs;
+ _error = parse(cff, pos, nglyphs, errh);
+}
+
+Cff::FDSelect::~FDSelect()
+{
+ if (_my_fds)
+ delete[] _fds;
+}
+
+int
+Cff::FDSelect::parse(const Cff *cff, int pos, int nglyphs, ErrorHandler *errh)
+{
+ const uint8_t *data = cff->data();
+ int len = cff->length();
+
+ if (pos + 1 > len)
+ return errh->error("FDSelect position out of range"), -EFAULT;
+
+ int format = data[pos];
+ if (format == 0) {
+ if (pos + 1 + nglyphs > len)
+ return errh->error("FDSelect [format 0] out of range"), -EFAULT;
+ _fds = data + pos + 1;
+ _my_fds = false;
+ return 0;
+
+ } else if (format == 3) {
+ int nranges = (data[pos+1] << 8) | data[pos+2];
+ if (pos + 3 + 3*nranges + 2 > len)
+ return errh->error("FDSelect [format 3] out of range"), -EFAULT;
+
+ const uint8_t *p = data + pos + 3;
+ int last_glyph = (p[3*nranges] << 8) | p[3*nranges + 1];
+ if (p[0] || p[1] || last_glyph != nglyphs)
+ return errh->error("FDSelect [format 3] bad values"), -EINVAL;
+
+ _fds = new uint8_t[nglyphs];
+ _my_fds = true;
+ int curglyph = 0;
+ for (; curglyph < nglyphs; p += 3) {
+ int nextglyph = (p[3] << 8) | p[4];
+ if (nextglyph > nglyphs || nextglyph < curglyph)
+ return errh->error("FDSelect [format 3] sorting error"), -EINVAL;
+ memset(const_cast<uint8_t *>(_fds + curglyph), p[2], nextglyph - curglyph);
+ curglyph = nextglyph;
+ }
+ return 0;
+
+ } else
+ return errh->error("unknown charset format %d", format), -EINVAL;
+}
+
+
+/*****
+ * Cff::IndexIterator
+ **/
+
+Cff::IndexIterator::IndexIterator(const uint8_t *data, int pos, int len, ErrorHandler *errh, const char *index_name)
+ : _contents(0), _offset(0), _last_offset(0)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ // check header
+ int nitems = 0;
+ if (POS_GT(pos + 2, len)) {
+ errh->error("%s: position out of range", index_name);
+ _offsize = -EFAULT;
+ } else if (data[pos] == 0 && data[pos + 1] == 0) {
+ _contents = data + pos + 2;
+ _offsize = 0;
+ } else if (POS_GT(pos + 3, len)) {
+ errh->error("%s: position out of range", index_name);
+ _offsize = -EFAULT;
+ } else if ((_offsize = data[pos + 2]), (_offsize < 1 || _offsize > 4)) {
+ errh->error("%s: offset size %d out of range", index_name, _offsize);
+ _offsize = -EINVAL;
+ } else {
+ nitems = (data[pos] << 8) | data[pos + 1];
+ if (POS_GT(pos + 3 + (nitems + 1) * _offsize, len)) {
+ errh->error("%s: data out of range", index_name);
+ _offsize = -EFAULT;
+ } else {
+ _offset = data + pos + 3;
+ _last_offset = _offset + nitems * _offsize;
+ _contents = _last_offset + _offsize - 1;
+ }
+ }
+
+ // check items in offset array
+ uint32_t max_doff_allowed = len - (pos + 2 + (nitems + 1) * _offsize);
+ uint32_t last_doff = 1;
+ for (const uint8_t *o = _offset; o <= _last_offset && _offsize > 0; o += _offsize) {
+ uint32_t doff = offset_at(o);
+ if (doff > max_doff_allowed) {
+ errh->error("%s: element out of range", index_name);
+ _offsize = -EFAULT;
+ } else if (doff < last_doff) {
+ errh->error("%s: garbled elements", index_name);
+ break;
+ }
+ last_doff = doff;
+ }
+}
+
+const uint8_t *
+Cff::IndexIterator::index_end() const
+{
+ if (_offsize <= 0)
+ return _contents;
+ else
+ return _contents + offset_at(_last_offset);
+}
+
+int
+Cff::IndexIterator::nitems() const
+{
+ if (_offsize <= 0)
+ return 0;
+ else
+ return (_last_offset - _offset) / _offsize;
+}
+
+
+
+/*****
+ * Cff::Dict
+ **/
+
+Cff::Dict::Dict()
+ : _cff(0), _pos(0), _error(-ENOENT)
+{
+}
+
+Cff::Dict::Dict(Cff *cff, int pos, int dict_len, ErrorHandler *errh, const char *dict_name)
+{
+ assign(cff, pos, dict_len, errh, dict_name);
+}
+
+int
+Cff::Dict::assign(Cff *cff, int pos, int dict_len, ErrorHandler *errh, const char *dict_name)
+{
+ _cff = cff;
+ _pos = pos;
+ _operators.clear();
+ _pointers.clear();
+ _operands.clear();
+
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = cff->data() + pos;
+ const uint8_t *end_data = data + dict_len;
+
+ _pointers.push_back(0);
+ while (data < end_data)
+ switch (data[0]) {
+
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ case 8: case 9: case 10: case 11: case 13: case 14: case 15:
+ case 16: case 17: case 18: case 19: case 20: case 21:
+ _operators.push_back(data[0]);
+ _pointers.push_back(_operands.size());
+ data++;
+ break;
+
+ case 22: case 23: case 24: case 25: case 26: case 27: case 31:
+ case 255: // reserved
+ errh->error("%s: reserved operator %d", dict_name, data[0]);
+ return (_error = -ERANGE);
+
+ case 12:
+ if (data + 1 >= end_data)
+ goto runoff;
+ _operators.push_back(32 + data[1]);
+ _pointers.push_back(_operands.size());
+ data += 2;
+ break;
+
+ case 28: {
+ if (data + 2 >= end_data)
+ goto runoff;
+ int16_t val = (data[1] << 8) | data[2];
+ _operands.push_back(val);
+ data += 3;
+ break;
+ }
+
+ case 29: {
+ if (data + 4 >= end_data)
+ goto runoff;
+ int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ _operands.push_back(val);
+ data += 5;
+ break;
+ }
+
+ case 30: {
+ char buf[1024];
+ int pos = 0;
+ if (data + 1 >= end_data)
+ goto runoff;
+ for (data++; data < end_data && pos < 1020; data++) {
+ int d = *data;
+ for (int i = 0; i < 2; i++, d <<= 4) {
+ int digit = (d >> 4) & 0xF;
+ switch (digit) {
+ case 10:
+ buf[pos++] = '.';
+ break;
+ case 11:
+ buf[pos++] = 'E';
+ break;
+ case 12:
+ buf[pos++] = 'E';
+ buf[pos++] = '-';
+ break;
+ case 13:
+ errh->error("%s: bad digit in real number", dict_name);
+ goto invalid;
+ case 14:
+ buf[pos++] = '-';
+ break;
+ case 15:
+ goto found;
+ default:
+ buf[pos++] = digit + '0';
+ break;
+ }
+ }
+ }
+ // number not found
+ goto runoff;
+ found:
+ char *endptr;
+ buf[pos] = '\0';
+ _operands.push_back(strtod(buf, &endptr));
+ if (*endptr) {
+ errh->error("%s: real number syntax error", dict_name);
+ goto invalid;
+ }
+ data++;
+ break;
+ }
+
+ case 247: case 248: case 249: case 250: {
+ if (data + 1 >= end_data)
+ goto runoff;
+ int val = ((data[0] - 247) << 8) + data[1] + 108;
+ _operands.push_back(val);
+ data += 2;
+ break;
+ }
+
+ case 251: case 252: case 253: case 254: {
+ if (data + 1 >= end_data)
+ goto runoff;
+ int val = -((data[0] - 251) << 8) - data[1] - 108;
+ _operands.push_back(val);
+ data += 2;
+ break;
+ }
+
+ default:
+ _operands.push_back(data[0] - 139);
+ data++;
+ break;
+
+ }
+
+ // not closed by an operator?
+ if (_pointers.back() != _operands.size()) {
+ errh->error("%s: not closed by an operator", dict_name);
+ goto invalid;
+ }
+
+ return (_error = 0);
+
+ runoff:
+ errh->error("%s: runoff end of DICT", dict_name);
+ return (_error = -EFAULT);
+
+ invalid:
+ return (_error = -EINVAL);
+}
+
+int
+Cff::Dict::check(bool is_private, ErrorHandler *errh, const char *dict_name) const
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ int before_nerrors = errh->nerrors();
+
+ // keep track of operator reuse
+ Vector<int> operators_used;
+
+ for (int i = 0; i < _operators.size(); i++) {
+ int arity = _pointers[i+1] - _pointers[i];
+ double num = (arity == 0 ? 0 : _operands[_pointers[i]]);
+ double truncnum = floor(num);
+ int op = _operators[i];
+ int type = (op > oLastOperator ? tNone : operator_types[op]);
+
+ // check reuse
+ if (op >= operators_used.size())
+ operators_used.resize(op + 1, 0);
+ if (operators_used[op] && (type & tTypeMask) != tNone)
+ errh->error("%s: operator %<%s%> specified twice", dict_name, operator_names[op]);
+ operators_used[op]++;
+
+ // check data
+ switch (type & tTypeMask) {
+
+ case tNone:
+ if (op >= 32)
+ errh->warning("%s: unknown operator %<12 %d%>", dict_name, op - 32);
+ else
+ errh->warning("%s: unknown operator %<%d%>", dict_name, op);
+ continue;
+
+ case tSID:
+ if (arity != 1 || num != truncnum || num < 0 || num > _cff->max_sid())
+ goto bad_data;
+ break;
+
+ case tFontNumber:
+ if (arity != 1 || num != truncnum || num < 0 || num >= _cff->nfonts())
+ goto bad_data;
+ break;
+
+ case tBoolean:
+ if (arity != 1)
+ goto bad_data;
+ else if (num != 0 && num != 1)
+ errh->warning("%s: data for Boolean operator %<%s%> not 0 or 1", dict_name, operator_names[op]);
+ break;
+
+ case tNumber:
+ if (arity != 1)
+ goto bad_data;
+ break;
+
+ case tOffset:
+ if (arity != 1 || num != truncnum || num < 0 || num >= _cff->length())
+ goto bad_data;
+ break;
+
+ case tLocalOffset:
+ if (arity != 1 || num != truncnum || _pos + num < 0 || _pos + num >= _cff->length())
+ goto bad_data;
+ break;
+
+ case tPrivateType: {
+ if (arity != 2 || num != truncnum || num < 0)
+ goto bad_data;
+ double off = _operands[_pointers[i] + 1];
+ if (off < 0 || off + num > _cff->length())
+ goto bad_data;
+ break;
+ }
+
+ case tArray2: case tArray3: case tArray4:
+ case tArray5: case tArray6:
+ if (arity != (type & tTypeMask) - tArray2 + 2)
+ goto bad_data;
+ break;
+
+ case tArray:
+ break;
+
+ }
+
+ // check dict location
+ if (((type & tPrivate) != 0) != is_private)
+ errh->warning("%s: operator %<%s%> in wrong DICT", dict_name, operator_names[op]);
+
+ continue;
+
+ bad_data:
+ errh->error("%s: bad data for operator %<%s%>", dict_name, operator_names[op]);
+ }
+
+ return (errh->nerrors() != before_nerrors ? -1 : 0);
+}
+
+bool
+Cff::Dict::has(DictOperator op) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op)
+ return true;
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, Vector<double> &out) const
+{
+ out.clear();
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op) {
+ for (int j = _pointers[i]; j < _pointers[i+1]; j++)
+ out.push_back(_operands[j]);
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, int *val) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op && _pointers[i] + 1 == _pointers[i+1]) {
+ *val = (int) _operands[_pointers[i]];
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::xvalue(DictOperator op, double *val) const
+{
+ for (int i = 0; i < _operators.size(); i++)
+ if (_operators[i] == op && _pointers[i] + 1 == _pointers[i+1]) {
+ *val = _operands[_pointers[i]];
+ return true;
+ }
+ return false;
+}
+
+bool
+Cff::Dict::value(DictOperator op, Vector<double> &out) const
+{
+ return xvalue(op, out) || default_dict().xvalue(op, out);
+}
+
+bool
+Cff::Dict::value(DictOperator op, int *val) const
+{
+ return xvalue(op, val) || default_dict().xvalue(op, val);
+}
+
+bool
+Cff::Dict::value(DictOperator op, double *val) const
+{
+ return xvalue(op, val) || default_dict().xvalue(op, val);
+}
+
+void
+Cff::Dict::unparse(ErrorHandler *errh, const char *dict_name) const
+{
+ StringAccum sa;
+ for (int i = 0; i < _operators.size(); i++) {
+ sa.clear();
+ if (_pointers[i] + 1 == _pointers[i+1])
+ sa << _operands[_pointers[i]];
+ else {
+ sa << "[";
+ for (int j = _pointers[i]; j < _pointers[i+1]; j++)
+ sa << _operands[j] << ' ';
+ sa.pop_back();
+ sa << "]";
+ }
+ errh->message("%s: %s %s", dict_name, operator_names[_operators[i]], sa.c_str());
+ }
+}
+
+
+/*****
+ * CffFontParent
+ **/
+
+static int
+handle_private(Cff *cff, const Cff::Dict &top_dict, Cff::Dict &private_dict,
+ double &default_width_x, double &nominal_width_x,
+ Cff::IndexIterator &subrs_index, Vector<Charstring *> &subrs_cs,
+ ErrorHandler *errh)
+{
+ Vector<double> private_info;
+ top_dict.value(Cff::oPrivate, private_info);
+ int private_offset = (int) private_info[1];
+ private_dict.assign(cff, private_offset, (int) private_info[0], errh, "Private DICT");
+ if (private_dict.error() < 0)
+ return private_dict.error();
+ else if (private_dict.check(true, errh, "Private DICT") < 0)
+ return -EINVAL;
+ //private_dict.unparse(errh, "Private DICT");
+
+ private_dict.value(Cff::oDefaultWidthX, &default_width_x);
+ private_dict.value(Cff::oNominalWidthX, &nominal_width_x);
+ if (private_dict.has(Cff::oSubrs)) {
+ int subrs_offset = 0;
+ private_dict.value(Cff::oSubrs, &subrs_offset);
+ subrs_index = Cff::IndexIterator(cff->data(), private_offset + subrs_offset, cff->length(), errh, "Subrs INDEX");
+ if (subrs_index.error() < 0)
+ return subrs_index.error();
+ }
+ subrs_cs.assign(subrs_index.nitems(), 0);
+ return 0;
+}
+
+
+Cff::FontParent::FontParent(Cff* cff)
+ : CharstringProgram(cff->units_per_em()), _cff(cff), _error(-1)
+{
+}
+
+Charstring *
+Cff::FontParent::charstring(const IndexIterator &iiter, int which) const
+{
+ const uint8_t *s1 = iiter[which];
+ int slen = iiter[which + 1] - s1;
+ String cs = _cff->data_string().substring(s1 - _cff->data(), slen);
+ if (slen == 0)
+ return 0;
+ else if (_charstring_type == 1)
+ return new Type1Charstring(cs);
+ else
+ return new Type2Charstring(cs);
+}
+
+Charstring *
+Cff::FontParent::gsubr(int i) const
+{
+ return _cff->gsubr(i);
+}
+
+int
+Cff::FontParent::gsubr_bias() const
+{
+ return Efont::subr_bias(2, ngsubrs_x());
+}
+
+
+/*****
+ * CffFont
+ **/
+
+Cff::Font::Font(Cff *cff, PermString font_name, const Dict &top_dict, ErrorHandler *errh)
+ : ChildFont(cff, 0, 2, top_dict, errh), _font_name(font_name),
+ _t1encoding(0)
+{
+ assert(!_top_dict.has_first(oROS));
+ if (_error < 0)
+ return;
+
+ // extract CharStrings
+ // must use xvalue because we could be creating the default dict!
+ int charstrings_offset = 0;
+ _top_dict.xvalue(oCharStrings, &charstrings_offset);
+ _charstrings_index = Cff::IndexIterator(cff->data(), charstrings_offset, cff->length(), errh, "CharStrings INDEX");
+ if (_charstrings_index.error() < 0) {
+ _error = _charstrings_index.error();
+ return;
+ }
+ _charstrings_cs.assign(_charstrings_index.nitems(), 0);
+
+ int charset = 0;
+ _top_dict.xvalue(oCharset, &charset);
+ _charset.assign(cff, charset, _charstrings_index.nitems(), cff->max_sid(), errh);
+ if (_charset.error() < 0) {
+ _error = _charset.error();
+ return;
+ }
+
+ int Encoding = 0;
+ _top_dict.xvalue(oEncoding, &Encoding);
+ if (parse_encoding(Encoding, errh) < 0)
+ return;
+
+ // success!
+ _error = 0;
+}
+
+Cff::Font::~Font()
+{
+ for (int i = 0; i < _charstrings_cs.size(); i++)
+ delete _charstrings_cs[i];
+ delete _t1encoding;
+}
+
+int
+Cff::Font::parse_encoding(int pos, ErrorHandler *errh)
+{
+ _encoding_pos = pos;
+ for (int i = 0; i < 256; i++)
+ _encoding[i] = 0;
+
+ // check for standard encodings
+ if (pos == 0)
+ return assign_standard_encoding(standard_encoding);
+ else if (pos == 1)
+ return assign_standard_encoding(expert_encoding);
+
+ // otherwise, a custom encoding
+ const uint8_t *data = _cff->data();
+ int len = _cff->length();
+ if (pos + 1 > len)
+ return errh->error("Encoding position out of range"), -EFAULT;
+ bool supplemented = (data[pos] & 0x80) != 0;
+ int format = (data[pos] & 0x7F);
+
+ int retval = 0;
+ int endpos, g = 1;
+ if (format == 0) {
+ endpos = pos + 2 + data[pos + 1];
+ if (endpos > len)
+ return errh->error("Encoding[0] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 2;
+ int n = data[pos + 1];
+ for (; g <= n; g++, p++) {
+ int e = p[0];
+ if (_encoding[e])
+ retval = 1;
+ _encoding[e] = g;
+ }
+
+ } else if (format == 1) {
+ endpos = pos + 2 + data[pos + 1] * 2;
+ if (endpos > len)
+ return errh->error("Encoding[1] out of range"), -EFAULT;
+ const uint8_t *p = data + pos + 2;
+ int n = data[pos + 1];
+ for (int i = 0; i < n; i++, p += 2) {
+ int first = p[0];
+ int nLeft = p[1];
+ for (int e = first; e <= first + nLeft; e++) {
+ if (_encoding[e])
+ retval = 1;
+ _encoding[e] = g++;
+ }
+ }
+
+ } else
+ return errh->error("unknown Encoding format %d", format), -EINVAL;
+
+ if (g > _charset.nglyphs())
+ return errh->error("Encoding glyph %d out of range", g), -EINVAL;
+
+ // check supplements
+ if (supplemented) {
+ if (endpos + data[endpos] * 3 > len)
+ return -EINVAL;
+ const uint8_t *p = data + endpos + 1;
+ int n = data[endpos];
+ for (int i = 0; i < n; i++, p += 3) {
+ int e = p[0];
+ int s = (p[1] << 8) | p[2];
+ int g = _charset.sid_to_gid(s);
+ if (_encoding[e])
+ retval = 1;
+ if (g < 0 || g >= _charset.nglyphs())
+ return errh->error("Encoding glyph %d out of range", g), -EINVAL;
+ _encoding[e] = g;
+ }
+ }
+
+ // successfully done
+ return retval;
+}
+
+int
+Cff::Font::assign_standard_encoding(const int *standard_encoding)
+{
+ for (int i = 0; i < 256; i++)
+ _encoding[i] = _charset.sid_to_gid(standard_encoding[i]);
+ return 0;
+}
+
+void
+Cff::Font::font_matrix(double matrix[6]) const
+{
+ Vector<double> t1d_matrix;
+ if (dict_value(oFontMatrix, t1d_matrix) && t1d_matrix.size() == 6)
+ memcpy(&matrix[0], &t1d_matrix[0], sizeof(double) * 6);
+ else {
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+ }
+}
+
+PermString
+Cff::Font::glyph_name(int gid) const
+{
+ if (gid >= 0 && gid < nglyphs())
+ return _cff->sid_permstring(_charset.gid_to_sid(gid));
+ else
+ return PermString();
+}
+
+void
+Cff::Font::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.resize(nglyphs());
+ for (int i = 0; i < nglyphs(); i++)
+ gnames[i] = _cff->sid_permstring(_charset.gid_to_sid(i));
+}
+
+Charstring *
+Cff::Font::glyph(int gid) const
+{
+ if (gid < 0 || gid >= nglyphs())
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+Charstring *
+Cff::Font::glyph(PermString name) const
+{
+ int gid = _charset.sid_to_gid(_cff->sid(name));
+ if (gid < 0)
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+int
+Cff::Font::glyphid(PermString name) const
+{
+ return _charset.sid_to_gid(_cff->sid(name));
+}
+
+Type1Encoding *
+Cff::Font::type1_encoding() const
+{
+ if (_encoding_pos == 0)
+ return Type1Encoding::standard_encoding();
+ if (!_t1encoding)
+ _t1encoding = type1_encoding_copy();
+ return _t1encoding;
+}
+
+Type1Encoding *
+Cff::Font::type1_encoding_copy() const
+{
+ if (_encoding_pos == 0)
+ return Type1Encoding::standard_encoding();
+ Type1Encoding *e = new Type1Encoding;
+ for (int i = 0; i < 256; i++)
+ if (_encoding[i])
+ e->put(i, _cff->sid_permstring(_charset.gid_to_sid(_encoding[i])));
+ return e;
+}
+
+bool
+Cff::Font::dict_has(DictOperator op) const
+{
+ return dict_of(op).has(op);
+}
+
+String
+Cff::Font::dict_string(DictOperator op) const
+{
+ Vector<double> vec;
+ dict_of(op).value(op, vec);
+ if (vec.size() == 1 && vec[0] >= 0 && vec[0] <= _cff->max_sid())
+ return _cff->sid_string((int) vec[0]);
+ else
+ return String();
+}
+
+
+/*****
+ * Cff::CIDFont
+ **/
+
+Cff::CIDFont::CIDFont(Cff *cff, PermString font_name, const Dict &top_dict, ErrorHandler *errh)
+ : FontParent(cff), _font_name(font_name), _top_dict(top_dict)
+{
+ assert(_top_dict.has_first(oROS));
+
+ // parse top DICT
+ _error = -EINVAL;
+ if (_top_dict.check(false, errh, "Top DICT") < 0)
+ return;
+ else if (!_top_dict.has(oCharStrings)) {
+ errh->error("font has no CharStrings dictionary");
+ return;
+ }
+ //_top_dict.unparse(errh, "Top DICT");
+
+ // extract offsets and information from TOP DICT
+ _top_dict.value(oCharstringType, &_charstring_type);
+ if (_charstring_type != 1 && _charstring_type != 2) {
+ errh->error("unknown CharString type %d", _charstring_type);
+ return;
+ }
+
+ int charstrings_offset = 0;
+ _top_dict.value(oCharStrings, &charstrings_offset);
+ _charstrings_index = Cff::IndexIterator(cff->data(), charstrings_offset, cff->length(), errh, "CharStrings INDEX");
+ if (_charstrings_index.error() < 0) {
+ _error = _charstrings_index.error();
+ return;
+ }
+ _charstrings_cs.assign(_charstrings_index.nitems(), 0);
+
+ int charset = 0;
+ _top_dict.value(oCharset, &charset);
+ _charset.assign(cff, charset, _charstrings_index.nitems(), -1, errh);
+ if (_charset.error() < 0) {
+ _error = _charset.error();
+ return;
+ }
+
+ // extract information about child fonts
+ int fdarray_offset = 0;
+ if (!_top_dict.value(oFDArray, &fdarray_offset)) {
+ errh->error("CID-keyed font missing FDArray");
+ return;
+ }
+ IndexIterator fdarray_index(cff->data(), fdarray_offset, cff->length(), errh, "FDArray INDEX");
+ for (; fdarray_index; fdarray_index++) {
+ Dict d(cff, fdarray_index[0] - cff->data(), fdarray_index[1] - fdarray_index[0], errh, "Top DICT");
+ if (!d.ok() || d.check(false, errh, "Top DICT") < 0) {
+ _error = d.error();
+ return;
+ }
+ _child_fonts.push_back(new ChildFont(cff, this, _charstring_type, d, errh));
+ if (!_child_fonts.back()->ok())
+ return;
+ }
+
+ int fdselect_offset = 0;
+ if (!_top_dict.value(oFDSelect, &fdselect_offset)) {
+ errh->error("CID-keyed font missing FDSelect");
+ return;
+ }
+ _fdselect.assign(cff, fdselect_offset, _charstrings_cs.size(), errh);
+ if (_fdselect.error() < 0)
+ return;
+
+ // success!
+ _error = 0;
+ set_parent_program(true);
+}
+
+Cff::CIDFont::~CIDFont()
+{
+ for (int i = 0; i < _charstrings_cs.size(); i++)
+ delete _charstrings_cs[i];
+ for (int i = 0; i < _child_fonts.size(); i++)
+ delete _child_fonts[i];
+}
+
+void
+Cff::CIDFont::font_matrix(double matrix[6]) const
+{
+ // XXX
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+}
+
+const CharstringProgram *
+Cff::CIDFont::child_program(int gid) const
+{
+ int fd = _fdselect.gid_to_fd(gid);
+ if (fd >= 0 && fd < _child_fonts.size())
+ return _child_fonts.at_u(fd);
+ else
+ return 0;
+}
+
+PermString
+Cff::CIDFont::glyph_name(int gid) const
+{
+ if (gid >= 0 && gid < nglyphs())
+ return permprintf("#%d", _charset.gid_to_sid(gid));
+ else
+ return PermString();
+}
+
+void
+Cff::CIDFont::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.resize(nglyphs());
+ for (int i = 0; i < nglyphs(); i++)
+ gnames[i] = permprintf("#%d", _charset.gid_to_sid(i));
+}
+
+Charstring *
+Cff::CIDFont::glyph(int gid) const
+{
+ if (gid < 0 || gid >= nglyphs())
+ return 0;
+ if (!_charstrings_cs[gid])
+ _charstrings_cs[gid] = charstring(_charstrings_index, gid);
+ return _charstrings_cs[gid];
+}
+
+int
+Cff::CIDFont::glyphid(PermString name) const
+{
+ if (name.length() <= 1 || name[0] != '#' || !isdigit((unsigned char) name[1]))
+ return -1;
+ char *endptr;
+ long cid = strtol(name.c_str() + 1, &endptr, 10);
+ if (*endptr != 0)
+ return -1;
+ return _charset.sid_to_gid(cid);
+}
+
+Charstring *
+Cff::CIDFont::glyph(PermString name) const
+{
+ return CIDFont::glyph(CIDFont::glyphid(name));
+}
+
+
+/*****
+ * ChildFont
+ **/
+
+Cff::ChildFont::ChildFont(Cff *cff, Cff::CIDFont *parent, int charstring_type, const Dict &top_dict, ErrorHandler *errh)
+ : FontParent(cff), _parent(parent), _top_dict(top_dict)
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+
+ if (!cff->ok() || !_top_dict.ok()) {
+ errh->error("invalid CFF");
+ _error = -EINVAL;
+ return;
+ }
+
+ // extract offsets and information from TOP DICT
+ _charstring_type = charstring_type;
+ _top_dict.value(oCharstringType, &_charstring_type);
+ if (_charstring_type != 1 && _charstring_type != 2) {
+ errh->error("unknown CharString type %d", _charstring_type);
+ return;
+ }
+
+ // extract information from Private DICT
+ if (_top_dict.has(oPrivate)
+ && (_error = handle_private(cff, _top_dict, _private_dict, _default_width_x, _nominal_width_x, _subrs_index, _subrs_cs, errh)) < 0)
+ return;
+
+ // success!
+ _error = 0;
+}
+
+Cff::ChildFont::~ChildFont()
+{
+ for (int i = 0; i < _subrs_cs.size(); i++)
+ delete _subrs_cs[i];
+}
+
+Charstring *
+Cff::ChildFont::charstring(const IndexIterator &iiter, int which) const
+{
+ const uint8_t *s1 = iiter[which];
+ int slen = iiter[which + 1] - s1;
+ String cs = _cff->data_string().substring(s1 - _cff->data(), slen);
+ if (slen == 0)
+ return 0;
+ else if (_charstring_type == 1)
+ return new Type1Charstring(cs);
+ else
+ return new Type2Charstring(cs);
+}
+
+Charstring *
+Cff::ChildFont::subr(int i) const
+{
+ i += Efont::subr_bias(_charstring_type, nsubrs_x());
+ if (i < 0 || i >= nsubrs_x())
+ return 0;
+ if (!_subrs_cs[i])
+ _subrs_cs[i] = charstring(_subrs_index, i);
+ return _subrs_cs[i];
+}
+
+int
+Cff::ChildFont::subr_bias() const
+{
+ return Efont::subr_bias(_charstring_type, nsubrs_x());
+}
+
+double
+Cff::ChildFont::global_width_x(bool is_nominal) const
+{
+ return (is_nominal ? _nominal_width_x : _default_width_x);
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc
new file mode 100644
index 00000000000..760fbfaffae
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/encoding.cc
@@ -0,0 +1,29 @@
+// -*- related-file-name: "../include/efont/encoding.hh" -*-
+
+/* encoding.{cc,hh} -- 8-bit encodings
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/encoding.hh>
+namespace Efont {
+
+void
+Encoding8::reserve_glyphs(int count)
+{
+ if (count <= _codes.size()) return;
+ _codes.resize(count, -1);
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc
new file mode 100644
index 00000000000..ceea7992c43
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/findmet.cc
@@ -0,0 +1,321 @@
+// -*- related-file-name: "../include/efont/findmet.hh" -*-
+
+/* findmet.{cc,hh} -- find font metrics
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/findmet.hh>
+#include <efont/afmparse.hh>
+#include <efont/afm.hh>
+#include <efont/amfm.hh>
+#include <efont/psres.hh>
+#include <string.h>
+#include <stdlib.h>
+namespace Efont {
+
+MetricsFinder::~MetricsFinder()
+{
+ if (_next)
+ _next->_prev = _prev;
+ if (_prev)
+ _prev->_next = _next;
+}
+
+void
+MetricsFinder::add_finder(MetricsFinder *new_finder)
+{
+ if (_next)
+ _next->add_finder(new_finder);
+ else {
+ assert(!new_finder->_prev);
+ new_finder->_prev = this;
+ _next = new_finder;
+ }
+}
+
+Metrics *
+MetricsFinder::find_metrics(PermString name, ErrorHandler *errh)
+{
+ MetricsFinder *f = this;
+ while (f) {
+ Metrics *m = f->find_metrics_x(name, this, errh);
+ if (m) return m;
+ f = f->_next;
+ }
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::find_amfm(PermString name, ErrorHandler *errh)
+{
+ MetricsFinder *f = this;
+ while (f) {
+ AmfmMetrics *m = f->find_amfm_x(name, this, errh);
+ if (m) return m;
+ f = f->_next;
+ }
+ return 0;
+}
+
+void
+MetricsFinder::record(Metrics *m)
+{
+ record(m, m->font_name());
+}
+
+void
+MetricsFinder::record(Metrics *m, PermString name)
+{
+ if (_next) _next->record(m, name);
+}
+
+void
+MetricsFinder::record(AmfmMetrics *amfm)
+{
+ if (_next) _next->record(amfm);
+}
+
+Metrics *
+MetricsFinder::find_metrics_x(PermString, MetricsFinder *, ErrorHandler *)
+{
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::find_amfm_x(PermString, MetricsFinder *, ErrorHandler *)
+{
+ return 0;
+}
+
+Metrics *
+MetricsFinder::try_metrics_file(const Filename &fn, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (fn.readable()) {
+ Metrics *afm = AfmReader::read(fn, errh);
+ if (afm) finder->record(afm);
+ return afm;
+ } else
+ return 0;
+}
+
+AmfmMetrics *
+MetricsFinder::try_amfm_file(const Filename &fn, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (fn.readable()) {
+ AmfmMetrics *amfm = AmfmReader::read(fn, finder, errh);
+ if (amfm) finder->record(amfm);
+ return amfm;
+ } else
+ return 0;
+}
+
+
+/*****
+ * CacheMetricsFinder
+ **/
+
+CacheMetricsFinder::CacheMetricsFinder()
+ : _metrics_map(-1), _amfm_map(-1)
+{
+}
+
+CacheMetricsFinder::~CacheMetricsFinder()
+{
+ clear();
+}
+
+Metrics *
+CacheMetricsFinder::find_metrics_x(PermString name, MetricsFinder *,
+ ErrorHandler *)
+{
+ int index = _metrics_map[name];
+ return index >= 0 ? _metrics[index] : 0;
+}
+
+AmfmMetrics *
+CacheMetricsFinder::find_amfm_x(PermString name, MetricsFinder *,
+ ErrorHandler*)
+{
+ int index = _amfm_map[name];
+ return index >= 0 ? _amfm[index] : 0;
+}
+
+
+void
+CacheMetricsFinder::record(Metrics *m, PermString name)
+{
+ int index = _metrics.size();
+ _metrics.push_back(m);
+ _metrics_map.insert(name, index);
+ m->use();
+ MetricsFinder::record(m, name);
+}
+
+void
+CacheMetricsFinder::record(AmfmMetrics *amfm)
+{
+ int index = _amfm.size();
+ _amfm.push_back(amfm);
+ _amfm_map.insert(amfm->font_name(), index);
+ amfm->use();
+ MetricsFinder::record(amfm);
+}
+
+void
+CacheMetricsFinder::clear()
+{
+ for (int i = 0; i < _metrics.size(); i++)
+ _metrics[i]->unuse();
+ for (int i = 0; i < _amfm.size(); i++)
+ _amfm[i]->unuse();
+ _metrics.clear();
+ _amfm.clear();
+ _metrics_map.clear();
+ _amfm_map.clear();
+}
+
+
+/*****
+ * InstanceMetricsFinder
+ **/
+
+InstanceMetricsFinder::InstanceMetricsFinder(bool call_mmpfb)
+ : _call_mmpfb(call_mmpfb)
+{
+}
+
+Metrics *
+InstanceMetricsFinder::find_metrics_instance(PermString name,
+ MetricsFinder *finder, ErrorHandler *errh)
+{
+ const char *underscore = strchr(name.c_str(), '_');
+ PermString amfm_name =
+ PermString(name.c_str(), underscore - name.c_str());
+
+ AmfmMetrics *amfm = finder->find_amfm(amfm_name, errh);
+ if (!amfm) return 0;
+
+ MultipleMasterSpace *mmspace = amfm->mmspace();
+ if (!mmspace->check_intermediate() && _call_mmpfb) {
+ char *buf = new char[amfm->font_name().length() + 30];
+ sprintf(buf, "mmpfb -q --amcp-info '%s'", amfm->font_name().c_str());
+
+ FILE *f = popen(buf, "r");
+ if (f) {
+ Filename fake("<mmpfb output>");
+ Slurper slurpy(fake, f);
+ AmfmReader::add_amcp_file(slurpy, amfm, errh);
+ pclose(f);
+ }
+
+ delete[] buf;
+ }
+
+ Vector<double> design = mmspace->default_design_vector();
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ mmspace->set_design(design, i, x, errh);
+ i++;
+ }
+
+ Vector<double> weight;
+ if (!mmspace->design_to_weight(design, weight, errh))
+ return 0;
+ Metrics *new_afm = amfm->interpolate(design, weight, errh);
+ if (new_afm) {
+ finder->record(new_afm);
+ // What if the dimensions changed because the user specified out-of-range
+ // dimens? We don't want to reinterpolate each time, so record the new
+ // AFM under that name as well.
+ if (new_afm->font_name() != name)
+ finder->record(new_afm, name);
+ }
+ return new_afm;
+}
+
+Metrics *
+InstanceMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ if (strchr(name.c_str(), '_'))
+ return find_metrics_instance(name, finder, errh);
+ else
+ return 0;
+}
+
+
+/*****
+ * PsresMetricsFinder
+ **/
+
+PsresMetricsFinder::PsresMetricsFinder(PsresDatabase *psres)
+ : _psres(psres)
+{
+}
+
+Metrics *
+PsresMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ return try_metrics_file
+ (_psres->filename_value("FontAFM", name), finder, errh);
+}
+
+AmfmMetrics *
+PsresMetricsFinder::find_amfm_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ return try_amfm_file
+ (_psres->filename_value("FontAMFM", name), finder, errh);
+}
+
+
+/*****
+ * DirectoryMetricsFinder
+ **/
+
+DirectoryMetricsFinder::DirectoryMetricsFinder(PermString d)
+ : _directory(d)
+{
+}
+
+Metrics *
+DirectoryMetricsFinder::find_metrics_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ Metrics *afm = try_metrics_file
+ (Filename(_directory, permcat(name, ".afm")), finder, errh);
+ if (!afm)
+ afm = try_metrics_file
+ (Filename(_directory, permcat(name, ".AFM")), finder, errh);
+ return afm;
+}
+
+AmfmMetrics *
+DirectoryMetricsFinder::find_amfm_x(PermString name, MetricsFinder *finder,
+ ErrorHandler *errh)
+{
+ AmfmMetrics *amfm = try_amfm_file
+ (Filename(_directory, permcat(name, ".amfm")), finder, errh);
+ if (!amfm)
+ amfm = try_amfm_file
+ (Filename(_directory, permcat(name, ".AMFM")), finder, errh);
+ return amfm;
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc
new file mode 100644
index 00000000000..5c8fd973fcf
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/metrics.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/efont/metrics.hh" -*-
+
+/* metrics.{cc,hh} -- generic font metrics
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/metrics.hh>
+#include <efont/t1cs.hh> /* for UNKDOUBLE */
+namespace Efont {
+
+Metrics::Metrics()
+ : _name_map(-1),
+ _scale(1), _fdv(fdLast, UNKDOUBLE),
+ _xt_map(0),
+ _uses(0)
+{
+ _xt.push_back((MetricsXt *)0);
+}
+
+
+Metrics::Metrics(PermString font_name, PermString full_name, const Metrics &m)
+ : _font_name(font_name),
+ _family(m._family), _full_name(full_name), _version(m._version),
+ _name_map(m._name_map), _names(m._names), _encoding(m._encoding),
+ _scale(1), _fdv(fdLast, UNKDOUBLE),
+ _pairp(m._pairp),
+ _xt_map(0),
+ _uses(0)
+{
+ reserve_glyphs(m._wdv.size());
+ _kernv.resize(m._kernv.size(), UNKDOUBLE);
+ _xt.push_back((MetricsXt *)0);
+}
+
+
+Metrics::~Metrics()
+{
+ assert(_uses == 0);
+ for (int i = 1; i < _xt.size(); i++)
+ delete _xt[i];
+}
+
+
+void
+Metrics::set_font_name(PermString n)
+{
+ assert(!_font_name);
+ _font_name = n;
+}
+
+
+void
+Metrics::reserve_glyphs(int amt)
+{
+ if (amt <= _wdv.size()) return;
+ _wdv.resize(amt, UNKDOUBLE);
+ _lfv.resize(amt, UNKDOUBLE);
+ _rtv.resize(amt, UNKDOUBLE);
+ _tpv.resize(amt, UNKDOUBLE);
+ _btv.resize(amt, UNKDOUBLE);
+ _encoding.reserve_glyphs(amt);
+ _pairp.reserve_glyphs(amt);
+ for (int i = 1; i < _xt.size(); i++)
+ _xt[i]->reserve_glyphs(amt);
+}
+
+
+GlyphIndex
+Metrics::add_glyph(PermString n)
+{
+ if (nglyphs() >= _wdv.size())
+ reserve_glyphs(nglyphs() ? nglyphs() * 2 : 64);
+ GlyphIndex gi = _names.size();
+ _names.push_back(n);
+ _name_map.insert(n, gi);
+ return gi;
+}
+
+
+static void
+set_dimen(Vector<double> &dest, const Vector<double> &src, double scale,
+ bool increment)
+{
+ int c = src.size();
+ if (increment)
+ for (int i = 0; i < c; i++)
+ dest.at_u(i) += src.at_u(i) * scale;
+ else if (scale < 0.9999 || scale > 1.0001)
+ for (int i = 0; i < c; i++)
+ dest.at_u(i) = src.at_u(i) * scale;
+ else
+ dest = src;
+}
+
+void
+Metrics::interpolate_dimens(const Metrics &m, double scale, bool increment)
+{
+ set_dimen(_fdv, m._fdv, scale, increment);
+ set_dimen(_wdv, m._wdv, scale, increment);
+ set_dimen(_lfv, m._lfv, scale, increment);
+ set_dimen(_rtv, m._rtv, scale, increment);
+ set_dimen(_tpv, m._tpv, scale, increment);
+ set_dimen(_btv, m._btv, scale, increment);
+ set_dimen(_kernv, m._kernv, scale, increment);
+}
+
+
+void
+Metrics::add_xt(MetricsXt *mxt)
+{
+ int n = _xt.size();
+ _xt.push_back(mxt);
+ _xt_map.insert(mxt->kind(), n);
+ if (_wdv.size() > 0)
+ mxt->reserve_glyphs(_wdv.size());
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc
new file mode 100644
index 00000000000..67eb7e72856
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otf.cc
@@ -0,0 +1,1491 @@
+// -*- related-file-name: "../include/efont/otf.hh" -*-
+
+/* otf.{cc,hh} -- OpenType font basics
+ *
+ * Copyright (c) 2002-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otf.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+#include <efont/otfdata.hh> // for ntohl()
+#include <efont/otfname.hh>
+#include <efont/ttfhead.hh>
+
+namespace Efont { namespace OpenType {
+
+Vector<PermString> debug_glyph_names;
+
+Font::Font(const String& s, ErrorHandler* errh)
+ : _str(s), _units_per_em(0) {
+ _str.align(4);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Font::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // Fixed sfnt version
+ // USHORT numTables
+ // USHORT searchRange
+ // USHORT entrySelector
+ // USHORT rangeShift
+ int len = length();
+ const uint8_t *data = this->data();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF file corrupted (too small)"), -EFAULT;
+ if ((data[0] != 'O' || data[1] != 'T' || data[2] != 'T' || data[3] != 'O')
+ && (data[0] != '\000' || data[1] != '\001'))
+ return errh->error("not an OpenType font (bad magic number)"), -ERANGE;
+ int ntables = Data::u16_aligned(data + 4);
+ if (ntables == 0)
+ return errh->error("OTF contains no tables"), -EINVAL;
+ if (HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * ntables > len)
+ return errh->error("OTF table directory out of range"), -EFAULT;
+
+ // TABLE DIRECTORY ENTRY FORMAT:
+ // ULONG tag
+ // ULONG checksum
+ // ULONG offset
+ // ULONG length
+ uint32_t last_tag = 0U;
+ for (int i = 0; i < ntables; i++) {
+ int loc = HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ uint32_t tag = Data::u32_aligned(data + loc);
+ uint32_t offset = Data::u32_aligned(data + loc + 8);
+ uint32_t length = Data::u32_aligned(data + loc + 12);
+ if (tag <= last_tag)
+ return errh->error("tags out of order"), -EINVAL;
+ if (offset + length > (uint32_t) len)
+ return errh->error("OTF data for %<%s%> out of range", Tag(tag).text().c_str()), -EFAULT;
+ if (Tag::head_tag() == tag) {
+ Head head(_str.substring(offset, length));
+ _units_per_em = head.units_per_em();
+ }
+ last_tag = tag;
+ }
+
+ return 0;
+}
+
+bool
+Font::check_checksums(ErrorHandler *errh) const
+{
+ if (error() < 0)
+ return false;
+ int nt = ntables();
+ bool ok = true;
+ for (int i = 0; i < nt; i++) {
+ const uint8_t *entry = data() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ String tbl = _str.substring(Data::u32_aligned(entry + 8),
+ Data::u32_aligned(entry + 12));
+ uint32_t sum = checksum(tbl);
+ if (Data::u32_aligned(entry) == 0x68656164 // 'head'
+ && tbl.length() >= 12)
+ sum -= Data::u32_aligned(tbl.udata() + 8);
+ if (sum != Data::u32_aligned(entry + 4)) {
+ if (errh)
+ errh->error("table %<%s%> checksum error: %x vs. %x", Tag(Data::u32_aligned(entry)).text().c_str(), sum, Data::u32_aligned(entry + 4));
+ ok = false;
+ }
+ }
+ return ok;
+}
+
+int
+Font::ntables() const
+{
+ if (error() < 0)
+ return 0;
+ else
+ return Data::u16_aligned(data() + 4);
+}
+
+String
+Font::table(Tag tag) const
+{
+ if (error() < 0)
+ return String();
+ const uint8_t *entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ if (entry)
+ return _str.substring(Data::u32_aligned(entry + 8), Data::u32_aligned(entry + 12));
+ else
+ return String();
+}
+
+bool
+Font::has_table(Tag tag) const
+{
+ const uint8_t *entry = 0;
+ if (error() >= 0)
+ entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ return entry != 0;
+}
+
+uint32_t
+Font::table_checksum(Tag tag) const
+{
+ if (error() < 0)
+ return 0;
+ const uint8_t *entry = tag.table_entry(data() + HEADER_SIZE, Data::u16_aligned(data() + 4), TABLE_DIR_ENTRY_SIZE);
+ if (entry)
+ return Data::u32_aligned(entry + 4);
+ else
+ return 0;
+}
+
+Tag
+Font::table_tag(int i) const
+{
+ if (error() < 0 || i < 0 || i >= ntables())
+ return Tag();
+ else
+ return Tag(Data::u32_aligned(data() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i));
+}
+
+uint32_t
+Font::checksum(const uint8_t *begin, const uint8_t *end)
+{
+ uint32_t sum = 0;
+ if (reinterpret_cast<uintptr_t>(begin) % 4)
+ for (; begin + 3 < end; begin += 4)
+ sum += Data::u32(begin);
+ else
+ for (; begin + 3 < end; begin += 4)
+ sum += Data::u32_aligned(begin);
+ uint32_t leftover = 0;
+ for (int i = 0; i < 4; i++)
+ leftover = (leftover << 8) + (begin < end ? *begin++ : 0);
+ return sum + leftover;
+}
+
+uint32_t
+Font::checksum(const String &s)
+{
+ return checksum(reinterpret_cast<const uint8_t *>(s.begin()), reinterpret_cast<const uint8_t *>(s.end()));
+}
+
+namespace {
+class TagCompar { public:
+ TagCompar(const Vector<Tag> &tags) : _tags(tags) { }
+ bool operator()(int a, int b) { return _tags[a] < _tags[b]; }
+ const Vector<Tag> &_tags;
+};
+}
+
+Font
+Font::make(bool truetype, const Vector<Tag>& tags, const Vector<String>& data)
+{
+ StringAccum sa;
+
+ // create offset table
+ {
+ union {
+ uint8_t c[HEADER_SIZE];
+ uint16_t s[HEADER_SIZE / 2];
+ uint32_t l[HEADER_SIZE / 4];
+ } hdr;
+ hdr.l[0] = (truetype ? htonl(0x00010000) : htonl(0x4F54544F));
+ hdr.s[2] = htons(tags.size());
+ int entrySelector;
+ for (entrySelector = 0; (2 << entrySelector) <= tags.size(); entrySelector++)
+ /* nada */;
+ hdr.s[3] = htons((1 << entrySelector) * 16);
+ hdr.s[4] = htons(entrySelector);
+ hdr.s[5] = htons((tags.size() - (1 << entrySelector)) * 16);
+ sa.append(&hdr.c[0], HEADER_SIZE);
+ }
+
+ // sort tags
+ Vector<int> permut;
+ for (int i = 0; i < tags.size(); i++)
+ permut.push_back(i);
+ std::sort(permut.begin(), permut.end(), TagCompar(tags));
+
+ // table listing
+ uint32_t offset = HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * tags.size();
+ for (int *tp = permut.begin(); tp < permut.end(); tp++) {
+ union {
+ uint8_t c[TABLE_DIR_ENTRY_SIZE];
+ uint32_t l[TABLE_DIR_ENTRY_SIZE / 4];
+ } tdir;
+ tdir.l[0] = htonl(tags[*tp].value());
+
+ // discount current checksum adjustment in head table
+ uint32_t sum = checksum(data[*tp]);
+ if (tags[*tp] == Tag("head") && data[*tp].length() >= 12)
+ sum -= Data::u32(data[*tp].udata() + 8);
+ tdir.l[1] = htonl(sum);
+
+ tdir.l[2] = htonl(offset);
+ tdir.l[3] = htonl(data[*tp].length());
+ sa.append(&tdir.c[0], TABLE_DIR_ENTRY_SIZE);
+ offset += (data[*tp].length() + 3) & ~3;
+ }
+
+ // actual tables
+ for (int *tp = permut.begin(); tp < permut.end(); tp++) {
+ sa << data[*tp];
+ while (sa.length() % 4)
+ sa << '\0';
+ }
+
+ // fix 'head' table
+ for (int i = 0; i < tags.size(); i++) {
+ unsigned char *thdr = sa.udata() + HEADER_SIZE + TABLE_DIR_ENTRY_SIZE * i;
+ if (Data::u32(thdr) == 0x68656164 && Data::u32(thdr + 12) >= 12) {
+ uint32_t offset = Data::u32(thdr + 8);
+ char *head = sa.data() + offset;
+ memset(head + 8, '\0', 4);
+ uint32_t allsum = checksum(reinterpret_cast<uint8_t *>(sa.data()), reinterpret_cast<uint8_t *>(sa.data() + sa.length()));
+ uint32_t *adj = reinterpret_cast<uint32_t *>(head + 8);
+ *adj = htonl(0xB1B0AFBA - allsum);
+ }
+ }
+
+ return Font(sa.take_string());
+}
+
+
+/**************************
+ * Tag *
+ * *
+ **************************/
+
+Tag::Tag(const char *s)
+ : _tag(0)
+{
+ if (!s)
+ s = "";
+ for (int i = 0; i < 4; i++)
+ if (*s == 0)
+ _tag = (_tag << 8) | 0x20;
+ else if (*s < 32 || *s > 126) { // don't care if s is signed
+ _tag = 0;
+ return;
+ } else
+ _tag = (_tag << 8) | *s++;
+ if (*s)
+ _tag = 0;
+}
+
+Tag::Tag(const String &s)
+ : _tag(0)
+{
+ if (s.length() <= 4) {
+ const char *ss = s.data();
+ for (int i = 0; i < s.length(); i++, ss++)
+ if (*ss < 32 || *ss > 126) {
+ _tag = 0;
+ return;
+ } else
+ _tag = (_tag << 8) | *ss;
+ for (int i = s.length(); i < 4; i++)
+ _tag = (_tag << 8) | 0x20;
+ }
+}
+
+bool
+Tag::valid() const
+{
+ uint32_t tag = _tag;
+ for (int i = 0; i < 4; i++, tag >>= 8)
+ if ((tag & 255) < 32 || (tag & 255) > 126)
+ return false;
+ return true;
+}
+
+String
+Tag::text() const
+{
+ StringAccum sa;
+ uint32_t tag = _tag;
+ for (int i = 0; i < 4; i++, tag = (tag << 8) | 0x20)
+ if (tag != 0x20202020) {
+ uint8_t c = (tag >> 24) & 255;
+ if (c < 32 || c > 126)
+ sa.snprintf(6, "\\%03o", c);
+ else
+ sa << c;
+ }
+ return sa.take_string();
+}
+
+String
+Tag::langsys_text(Tag script, Tag langsys)
+{
+ if (!langsys.null())
+ return script.text() + "." + langsys.text();
+ else
+ return script.text();
+}
+
+const uint8_t *
+Tag::table_entry(const uint8_t *table, int n, int entry_size) const
+{
+ assert(((uintptr_t)table & 1) == 0);
+ int l = 0, r = n;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *entry = table + m * entry_size;
+ uint32_t m_tag = Data::u32_aligned16(entry);
+ if (_tag < m_tag)
+ r = m;
+ else if (_tag == m_tag)
+ return entry;
+ else
+ l = m + 1;
+ }
+ return 0;
+}
+
+
+
+/**************************
+ * ScriptList *
+ * *
+ **************************/
+
+int
+ScriptList::assign(const String &str, ErrorHandler *errh)
+{
+ _str = str;
+ _str.align(4);
+ int result = check_header(errh ? errh : ErrorHandler::silent_handler());
+ if (result < 0)
+ _str = String();
+ return result;
+}
+
+int
+ScriptList::check_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT scriptCount
+ // 6bytes scriptRecord[]
+ int scriptCount;
+ if (_str.length() < SCRIPTLIST_HEADERSIZE
+ || (scriptCount = Data::u16_aligned(_str.udata()),
+ _str.length() < SCRIPTLIST_HEADERSIZE + scriptCount*SCRIPT_RECSIZE))
+ return errh->error("OTF ScriptList too short");
+
+ // XXX check that scripts are sorted
+
+ return 0;
+}
+
+int
+ScriptList::script_offset(Tag script) const
+{
+ if (_str.length() == 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ if (const uint8_t *entry = script.table_entry(data + SCRIPTLIST_HEADERSIZE, Data::u16_aligned(data), SCRIPT_RECSIZE))
+ return Data::u16_aligned(entry + 4);
+ else
+ return 0;
+}
+
+int
+ScriptList::check_script(Tag tag, int script_off, ErrorHandler *errh) const
+{
+ const uint8_t *data = _str.udata();
+ int langSysCount;
+ if (_str.length() < script_off + SCRIPT_HEADERSIZE
+ || (langSysCount = Data::u16_aligned(data + script_off + 2),
+ (_str.length() < script_off + SCRIPT_HEADERSIZE + langSysCount*LANGSYS_RECSIZE)))
+ return (errh ? errh->error("OTF Script table for %<%s%> out of range", tag.text().c_str()) : -1);
+ // XXX check that langsys are sorted
+ return 0;
+}
+
+int
+ScriptList::langsys_offset(Tag script, Tag langsys, ErrorHandler *errh) const
+{
+ int script_off = script_offset(script);
+ if (script_off == 0) {
+ script = Tag("DFLT");
+ script_off = script_offset(script);
+ }
+ if (script_off <= 0)
+ return script_off;
+
+ // check script bounds
+ if (check_script(script, script_off, errh) < 0)
+ return -1;
+
+ // search script table
+ const uint8_t *data = _str.udata();
+ int langSysCount = Data::u16_aligned(data + script_off + 2);
+ if (const uint8_t *entry = langsys.table_entry(data + script_off + SCRIPT_HEADERSIZE, langSysCount, LANGSYS_RECSIZE))
+ return script_off + Data::u16_aligned(entry + 4);
+
+ // return default
+ int defaultLangSys = Data::u16_aligned(data + script_off);
+ if (defaultLangSys != 0)
+ return script_off + defaultLangSys;
+ else
+ return 0;
+}
+
+int
+ScriptList::language_systems(Vector<Tag> &script, Vector<Tag> &langsys, ErrorHandler *errh) const
+{
+ script.clear();
+ langsys.clear();
+
+ const uint8_t *data = _str.udata();
+ int nscripts = Data::u16_aligned(data);
+ for (int i = 0; i < nscripts; i++) {
+ Tag script_tag(Data::u32_aligned16(data + SCRIPTLIST_HEADERSIZE + i*SCRIPT_RECSIZE));
+ int script_off = Data::u16_aligned(data + SCRIPTLIST_HEADERSIZE + i*SCRIPT_RECSIZE + 4);
+ if (check_script(script_tag, script_off, errh) < 0)
+ return -1;
+ const uint8_t *script_table = data + script_off;
+ if (Data::u16_aligned(script_table) != 0) // default LangSys
+ script.push_back(script_tag), langsys.push_back(Tag());
+ int nlangsys = Data::u16_aligned(script_table + 2);
+ for (int j = 0; j < nlangsys; j++) {
+ Tag langsys_tag(Data::u32_aligned16(script_table + SCRIPT_HEADERSIZE + j*LANGSYS_RECSIZE));
+ script.push_back(script_tag), langsys.push_back(langsys_tag);
+ }
+ }
+
+ return 0;
+}
+
+int
+ScriptList::features(Tag script, Tag langsys, int &required_fid, Vector<int> &fids, ErrorHandler *errh, bool clear_fids) const
+{
+ required_fid = -1;
+ if (clear_fids)
+ fids.clear();
+
+ int offset = langsys_offset(script, langsys);
+ if (offset <= 0)
+ return offset;
+
+ // check langsys bounds
+ const uint8_t *data = _str.udata();
+ int featureCount;
+ if (_str.length() < offset + LANGSYS_HEADERSIZE
+ || (featureCount = Data::u16_aligned(data + offset + 4),
+ (_str.length() < offset + LANGSYS_HEADERSIZE + featureCount*FEATURE_RECSIZE)))
+ return (errh ? errh->error("OTF LangSys table for %<%s/%s%> out of range", script.text().c_str(), langsys.text().c_str()) : -1);
+
+ // search langsys table
+ int f = Data::u16_aligned(data + offset + 2);
+ if (f != 0xFFFF)
+ required_fid = f;
+ data += offset + 6;
+ for (int i = 0; i < featureCount; i++, data += FEATURE_RECSIZE)
+ fids.push_back(Data::u16_aligned(data));
+
+ return 0;
+}
+
+
+
+/**************************
+ * FeatureList *
+ * *
+ **************************/
+
+int
+FeatureList::assign(const String &str, ErrorHandler *errh)
+{
+ _str = str;
+ _str.align(2);
+ int result = check_header(errh ? errh : ErrorHandler::silent_handler());
+ if (result < 0)
+ _str = String();
+ return result;
+}
+
+int
+FeatureList::check_header(ErrorHandler *errh)
+{
+ int featureCount;
+ if (_str.length() < FEATURELIST_HEADERSIZE
+ || (featureCount = Data::u16_aligned(_str.udata()),
+ _str.length() < FEATURELIST_HEADERSIZE + featureCount*FEATURE_RECSIZE))
+ return errh->error("OTF FeatureList too short");
+ return 0;
+}
+
+Tag
+FeatureList::tag(int fid) const
+{
+ if (_str.length() == 0)
+ return Tag();
+ const uint8_t *data = _str.udata();
+ int nfeatures = Data::u16_aligned(data);
+ if (fid >= 0 && fid < nfeatures)
+ return Tag(Data::u32_aligned16(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE));
+ else
+ return Tag();
+}
+
+String
+FeatureList::params(int fid, int length, ErrorHandler *errh, bool old_style_offset) const
+{
+ if (_str.length() == 0 || length < 0)
+ return String();
+ if (errh == 0)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ int nfeatures = Data::u16_aligned(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID %<%d%> out of range", fid), String();
+ int foff = Data::u16_aligned(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE + 4);
+ if (len < foff + FEATURE_HEADERSIZE)
+ return errh->error("OTF LookupList for feature ID %<%d%> too short", fid), String();
+ int poff = Data::u16_aligned(data + foff);
+ if (poff == 0)
+ return String();
+ if (!old_style_offset)
+ poff += foff;
+ if (len < poff + length)
+ return errh->error("OTF feature parameters for feature ID %<%d%> out of range", fid), String();
+ else
+ return _str.substring(poff, length);
+}
+
+String
+FeatureList::size_params(int fid, const Name &name, ErrorHandler *errh) const
+{
+ // implement 'size' checks from Read Roberts
+ for (int i = 0; i < 2; i++) {
+ String s = params(fid, 10, errh, i != 0);
+ const uint8_t *data = s.udata();
+ // errh->message("trying %d %d %d %d %d\n", Data::u16_aligned(data), Data::u16_aligned(data + 2), Data::u16_aligned(data + 4), Data::u16_aligned(data + 6), Data::u16_aligned(data + 8));
+ if (Data::u16_aligned(data) == 0) // design size == 0
+ continue;
+ if (Data::u16_aligned(data + 2) == 0 // subfamily ID == 0
+ && Data::u16_aligned(data + 6) == 0 // range start == 0
+ && Data::u16_aligned(data + 8) == 0 // range end == 0
+ && Data::u16_aligned(data + 4) == 0) // menu name ID == 0
+ return s;
+ if (Data::u16_aligned(data + 6) >= Data::u16_aligned(data + 8) // range start >= range end
+ || Data::u16_aligned(data + 4) < 256 // menu name ID < 256
+ || Data::u16_aligned(data + 4) > 32767 // menu name ID > 32767
+ || !name.english_name(Data::u16_aligned(data + 4))) // menu name ID is a name ID defined by the font
+ continue;
+ if (Data::u16_aligned(data) + 1 >= Data::u16_aligned(data + 6) // design size >= range start (with 1 dp grace)
+ && Data::u16_aligned(data) <= Data::u16_aligned(data + 8) + 1) // design size <= range end (with 1 dp grace)
+ return s;
+ else if (i == 1 // old-style feature
+ && Data::u16_aligned(data + 8) <= 1440 // range end <= 144 point
+ && Data::u16_aligned(data) <= 1440) { // design size <= 144 point
+ // some old fonts define a bogus feature with design size
+ // not in range (John Owens, Read Roberts)
+ if (errh)
+ errh->warning("invalid 'size' feature: design size not in range");
+ return s;
+ }
+ }
+ if (errh)
+ errh->error("no valid 'size' feature data in the 'size' feature");
+ return String();
+}
+
+int
+FeatureList::find(Tag tag, const Vector<int> &fids) const
+{
+ if (fids.size() == 0 || _str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int nfeatures = Data::u16_aligned(data);
+ for (const int *fidp = fids.begin(); fidp != fids.end(); fidp++)
+ if (*fidp >= 0 && *fidp < nfeatures) {
+ uint32_t ftag = Data::u32_aligned16(data + FEATURELIST_HEADERSIZE + (*fidp)*FEATURE_RECSIZE);
+ if (ftag == tag.value())
+ return *fidp;
+ }
+
+ return -1;
+}
+
+void
+FeatureList::filter(Vector<int> &fids, const Vector<Tag> &sorted_ftags) const
+{
+ if (_str.length() == 0)
+ fids.clear();
+ else {
+ std::sort(fids.begin(), fids.end()); // sort fids
+
+ int i = 0, j = 0;
+ while (i < fids.size() && fids[i] < 0)
+ fids[i++] = 0x7FFFFFFF;
+
+ // XXX check that feature list is in alphabetical order
+
+ const uint8_t *data = _str.udata();
+ int nfeatures = Data::u16_aligned(data);
+ while (i < fids.size() && j < sorted_ftags.size() && fids[i] < nfeatures) {
+ uint32_t ftag = Data::u32_aligned16(data + FEATURELIST_HEADERSIZE + fids[i]*FEATURE_RECSIZE);
+ if (ftag < sorted_ftags[j].value()) { // not an interesting feature
+ // replace featureID with a large number, remove later
+ fids[i] = 0x7FFFFFFF;
+ i++;
+ } else if (ftag == sorted_ftags[j].value()) // interesting feature
+ i++;
+ else // an interesting feature is not available
+ j++;
+ }
+
+ fids.resize(i); // remove remaining uninteresting features
+ std::sort(fids.begin(), fids.end()); // resort, to move bad ones last
+ while (fids.size() && fids.back() == 0x7FFFFFFF)
+ fids.pop_back();
+ }
+}
+
+int
+FeatureList::lookups(int fid, Vector<int> &results, ErrorHandler *errh, bool clear_results) const
+{
+ if (clear_results)
+ results.clear();
+ if (_str.length() == 0)
+ return -1;
+ if (errh == 0)
+ errh = ErrorHandler::silent_handler();
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ int nfeatures = Data::u16_aligned(data);
+ if (fid < 0 || fid >= nfeatures)
+ return errh->error("OTF feature ID %<%d%> out of range", fid);
+ int foff = Data::u16_aligned(data + FEATURELIST_HEADERSIZE + fid*FEATURE_RECSIZE + 4);
+ int lookupCount;
+ if (len < foff + FEATURE_HEADERSIZE
+ || (lookupCount = Data::u16_aligned(data + foff + 2),
+ len < foff + FEATURE_HEADERSIZE + lookupCount*LOOKUPLIST_RECSIZE))
+ return errh->error("OTF LookupList for feature ID %<%d%> too short", fid);
+ const uint8_t *ldata = data + foff + FEATURE_HEADERSIZE;
+ for (int j = 0; j < lookupCount; j++, ldata += LOOKUPLIST_RECSIZE)
+ results.push_back(Data::u16_aligned(ldata));
+
+ return 0;
+}
+
+int
+FeatureList::lookups(const Vector<int> &fids, Vector<int> &results, ErrorHandler *errh) const
+{
+ results.clear();
+ if (_str.length() == 0)
+ return -1;
+
+ for (int i = 0; i < fids.size(); i++)
+ if (lookups(fids[i], results, errh, false) < 0)
+ return -1;
+
+ // sort results and remove duplicates
+ std::sort(results.begin(), results.end());
+ int *unique_result = std::unique(results.begin(), results.end());
+ results.resize(unique_result - results.begin());
+ return 0;
+}
+
+int
+FeatureList::lookups(const Vector<int> &required_fids, const Vector<int> &fids, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ Vector<int> fidsx(fids);
+ filter(fidsx, sorted_ftags);
+ for (int i = 0; i < required_fids.size(); i++)
+ fidsx.push_back(required_fids[i]);
+ return lookups(fidsx, results, errh);
+}
+
+int
+FeatureList::lookups(int required_fid, const Vector<int> &fids, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ Vector<int> fidsx(fids);
+ filter(fidsx, sorted_ftags);
+ if (required_fid >= 0)
+ fidsx.push_back(required_fid);
+ return lookups(fidsx, results, errh);
+}
+
+int
+FeatureList::lookups(const ScriptList &script_list, Tag script, Tag langsys, const Vector<Tag> &sorted_ftags, Vector<int> &results, ErrorHandler *errh) const
+{
+ int required_fid;
+ Vector<int> fids;
+ int result = script_list.features(script, langsys, required_fid, fids, errh);
+ if (result >= 0) {
+ filter(fids, sorted_ftags);
+ if (required_fid >= 0)
+ fids.push_back(required_fid);
+ result = lookups(fids, results, errh);
+ }
+ return result;
+}
+
+
+/**************************
+ * Coverage *
+ * *
+ **************************/
+
+Coverage::Coverage() noexcept
+{
+}
+
+Coverage::Coverage(Glyph first, Glyph last) noexcept
+{
+ if (first <= last) {
+ _str = String("\000\002\000\001\000\000\000\000\000\000", 10);
+ uint8_t *data = _str.mutable_udata();
+ data[4] = first >> 8;
+ data[5] = first & 255;
+ data[6] = last >> 8;
+ data[7] = last & 255;
+ _str.align(2);
+ }
+}
+
+Coverage::Coverage(const Vector<bool> &gmap) noexcept
+{
+ int end = gmap.size();
+ while (end > 0 && !gmap[end - 1])
+ --end;
+ if (end > 0) {
+ _str = String::make_uninitialized(8 + end);
+ _str.align(4);
+ uint8_t *data = _str.mutable_udata();
+ memset(data, 0, 8 + end);
+ data[1] = 3;
+
+ uint32_t n = 0;
+ const bool *it = gmap.begin();
+ data += 8;
+ for (int i = 0; i < end; ++i, ++it, ++data)
+ if (*it) {
+ *data = 1;
+ ++n;
+ }
+
+ n = htonl(n);
+ memcpy(_str.mutable_udata() + 4, &n, 4);
+ }
+}
+
+Coverage::Coverage(const String &str, ErrorHandler *errh, bool do_check) noexcept
+ : _str(str)
+{
+ _str.align(2);
+ if (do_check) {
+ if (check(errh ? errh : ErrorHandler::silent_handler()) < 0)
+ _str = String();
+ } else { // check()'s shorten-string side effect
+ const uint8_t *data = _str.udata();
+ int count = Data::u16_aligned(data + 2);
+ if (data[1] == T_LIST)
+ _str = _str.substring(0, HEADERSIZE + count*LIST_RECSIZE);
+ else
+ _str = _str.substring(0, HEADERSIZE + count*RANGES_RECSIZE);
+ }
+}
+
+int
+Coverage::check(ErrorHandler *errh)
+ // side effect: shorten string to cover coverage
+{
+ // HEADER FORMAT:
+ // USHORT coverageFormat
+ // USHORT glyphCount
+ const uint8_t *data = _str.udata();
+ if (_str.length() < HEADERSIZE)
+ return errh->error("OTF coverage table too small");
+ int coverageFormat = Data::u16_aligned(data);
+ int count = Data::u16_aligned(data + 2);
+
+ int len;
+ switch (coverageFormat) {
+ case T_LIST:
+ len = HEADERSIZE + count*LIST_RECSIZE;
+ if (_str.length() < len)
+ return errh->error("OTF coverage table too short (format 1)");
+ // XXX don't check sorting
+ break;
+ case T_RANGES:
+ len = HEADERSIZE + count*RANGES_RECSIZE;
+ if (_str.length() < len)
+ return errh->error("OTF coverage table too short (format 2)");
+ // XXX don't check sorting
+ // XXX don't check startCoverageIndexes
+ break;
+ default:
+ return errh->error("OTF coverage table has unknown format %d", coverageFormat);
+ }
+
+ _str = _str.substring(0, len);
+ return 0;
+}
+
+int
+Coverage::size() const noexcept
+{
+ if (_str.length() == 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ if (data[1] == T_LIST)
+ return (_str.length() - HEADERSIZE) / LIST_RECSIZE;
+ else if (data[1] == T_RANGES) {
+ data += _str.length() - RANGES_RECSIZE;
+ return Data::u16_aligned(data + 4) + Data::u16_aligned(data + 2) - Data::u16_aligned(data) + 1;
+ } else if (data[1] == T_X_BYTEMAP)
+ return Data::u32_aligned(data + 4);
+ else
+ return -1;
+}
+
+int
+Coverage::coverage_index(Glyph g) const noexcept
+{
+ if (_str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int count = Data::u16_aligned(data + 2);
+ if (data[1] == T_LIST) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ int mval = Data::u16_aligned(data + m * LIST_RECSIZE);
+ if (g < mval)
+ r = m;
+ else if (g == mval)
+ return m;
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else if (data[1] == T_RANGES) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < Data::u16_aligned(rec))
+ r = m;
+ else if (g <= Data::u16_aligned(rec + 2))
+ return Data::u16_aligned(rec + 4) + g - Data::u16_aligned(rec);
+ else
+ l = m + 1;
+ }
+ return -1;
+ } else if (data[1] == T_X_BYTEMAP) {
+ if (g >= 0 && g < _str.length() - 8 && data[8 + g])
+ return g;
+ else
+ return -1;
+ } else
+ return -1;
+}
+
+Glyph
+Coverage::operator[](int cindex) const noexcept
+{
+ if (_str.length() == 0 || cindex < 0)
+ return 0;
+
+ const uint8_t *data = _str.udata();
+ int count = Data::u16_aligned(data + 2);
+ if (data[1] == T_LIST)
+ return (cindex < count ? Data::u16_aligned(data + cindex * LIST_RECSIZE) : 0);
+ else if (data[1] == T_RANGES) {
+ int l = 0, r = count;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ int start_cindex = Data::u16_aligned(rec + 4);
+ if (cindex < start_cindex)
+ r = m;
+ else if (cindex < start_cindex + Data::u16_aligned(rec + 2) - Data::u16_aligned(rec))
+ return Data::u16_aligned(rec) + cindex - start_cindex;
+ else
+ l = m + 1;
+ }
+ return 0;
+ } else
+ return 0;
+}
+
+void
+Coverage::unparse(StringAccum &sa) const noexcept
+{
+ const uint8_t *data = _str.udata();
+ if (_str.length() == 0)
+ sa << "@*#!";
+ else if (data[1] == T_LIST) {
+ int count = Data::u16_aligned(data + 2);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << Data::u16_aligned(data + HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = Data::u16_aligned(data + pos);
+ Glyph end = Data::u16_aligned(data + pos + 2);
+ if (pos > HEADERSIZE) sa << ',';
+ sa << start;
+ if (end != start) sa << '.' << '.' << end;
+ }
+ }
+}
+
+String
+Coverage::unparse() const noexcept
+{
+ StringAccum sa;
+ unparse(sa);
+ return sa.take_string();
+}
+
+Coverage
+operator&(const Coverage &a, const Coverage &b)
+{
+ StringAccum sa;
+ sa << '\000' << '\001' << '\000' << '\000';
+
+ if (b.has_fast_covers()) {
+ for (Coverage::iterator ai = a.begin(); ai; ++ai)
+ if (b.covers(*ai)) {
+ uint16_t x = *ai;
+ sa << (char)(x >> 8) << (char)(x & 0xFF);
+ }
+
+ } else {
+ Coverage::iterator ai = a.begin(), bi = b.begin();
+ while (ai && bi) {
+ if (*ai < *bi)
+ ai.forward_to(*bi);
+ else if (*ai == *bi) {
+ uint16_t x = *ai;
+ sa << (char)(x >> 8) << (char)(x & 0xFF);
+ ai++, bi++;
+ } else
+ bi.forward_to(*ai);
+ }
+ }
+
+ int n = (sa.length() - 4) / 2;
+ sa[2] = (n >> 8);
+ sa[3] = (n & 0xFF);
+ return Coverage(sa.take_string(), 0, false);
+}
+
+bool
+operator<=(const Coverage &a, const Coverage &b)
+{
+ Coverage::iterator ai = a.begin(), bi = b.begin();
+ while (ai && bi) {
+ if (*ai != *bi && !bi.forward_to(*ai))
+ return false;
+ ai++, bi++;
+ }
+ return bi || !ai;
+}
+
+
+/************************
+ * Coverage::iterator *
+ * *
+ ************************/
+
+Coverage::iterator::iterator(const String &str, bool is_end)
+ : _str(str), _value(0)
+{
+ // XXX assume _str has been checked
+ if (!_str.length()) {
+ _pos = 0;
+ return;
+ }
+
+ // shrink _str to fit the coverage table
+ const uint8_t *data = _str.udata();
+ int n = Data::u16_aligned(data + 2);
+ switch (Data::u16_aligned(data)) {
+ case T_LIST:
+ _str = _str.substring(0, HEADERSIZE + n*LIST_RECSIZE);
+ normal_pos_setting:
+ _pos = is_end ? _str.length() : HEADERSIZE;
+ _value = _pos >= _str.length() ? 0 : Data::u16_aligned(data + _pos);
+ break;
+ case T_RANGES:
+ _str = _str.substring(0, HEADERSIZE + n*RANGES_RECSIZE);
+ goto normal_pos_setting;
+ case T_X_BYTEMAP:
+ for (_pos = 8; _pos < _str.length() && !data[_pos]; ++_pos)
+ /* do nothing */;
+ _value = _pos >= _str.length() ? 0 : _pos - 8;
+ break;
+ default:
+ _str = String();
+ _pos = 0;
+ _value = 0;
+ break;
+ }
+}
+
+int
+Coverage::iterator::coverage_index() const
+{
+ const uint8_t *data = _str.udata();
+ assert(_pos < _str.length());
+ if (data[1] == T_LIST)
+ return (_pos - HEADERSIZE) / LIST_RECSIZE;
+ else if (data[1] == T_RANGES)
+ return Data::u16_aligned(data + _pos + 4) + _value - Data::u16_aligned(data + _pos);
+ else
+ return _pos - 8;
+}
+
+void
+Coverage::iterator::operator++(int)
+{
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ if (_pos >= len
+ || (data[1] == T_RANGES && ++_value <= Data::u16_aligned(data + _pos + 2)))
+ return;
+ switch (data[1]) {
+ case T_LIST:
+ _pos += LIST_RECSIZE;
+ normal_pos_setting:
+ _value = _pos >= len ? 0 : Data::u16_aligned(data + _pos);
+ break;
+ case T_RANGES:
+ _pos += RANGES_RECSIZE;
+ goto normal_pos_setting;
+ case T_X_BYTEMAP:
+ for (++_pos; _pos < len && !data[_pos]; ++_pos)
+ /* do nothing */;
+ _value = _pos >= len ? 0 : _pos - 8;
+ break;
+ }
+}
+
+bool
+Coverage::iterator::forward_to(Glyph find)
+{
+ // XXX really should check that this works
+
+ if (find <= _value)
+ return find == _value;
+ else if (_pos >= _str.length())
+ return false;
+
+ const uint8_t *data = _str.udata();
+ if (data[1] == T_LIST) {
+ // check for "common" case: next element
+ _pos += LIST_RECSIZE;
+ if (_pos >= _str.length())
+ return false;
+ else if (find <= Data::u16_aligned(data + _pos)) {
+ _value = Data::u16_aligned(data + _pos);
+ return find == _value;
+ }
+
+ // otherwise, binary search over remaining area
+ int l = ((_pos - HEADERSIZE) / LIST_RECSIZE) + 1;
+ int r = (_str.length() - HEADERSIZE) / LIST_RECSIZE;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ Glyph g = Data::u16_aligned(data + m * LIST_RECSIZE);
+ if (find < g)
+ r = m;
+ else if (find == g)
+ l = r = m;
+ else
+ l = m + 1;
+ }
+ _pos = HEADERSIZE + l * LIST_RECSIZE;
+ _value = (_pos >= _str.length() ? 0 : Data::u16_aligned(data - HEADERSIZE + _pos));
+
+ } else if (data[1] == T_RANGES) {
+ // check for "common" case: this or next element
+ if (find <= Data::u16_aligned(data + _pos + 2)) {
+ assert(find >= Data::u16_aligned(data + _pos));
+ _value = find;
+ return true;
+ }
+ _pos += RANGES_RECSIZE;
+ if (_pos >= _str.length())
+ return false;
+ else if (find <= Data::u16_aligned(data + _pos + 2)) {
+ _value = (find >= Data::u16_aligned(data + _pos) ? find : Data::u16_aligned(data + _pos));
+ return find == _value;
+ }
+
+ // otherwise, binary search over remaining area
+ int l = ((_pos - HEADERSIZE) / RANGES_RECSIZE) + 1;
+ int r = (_str.length() - HEADERSIZE) / RANGES_RECSIZE;
+ data += HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ if (find < Data::u16_aligned(data + m * RANGES_RECSIZE))
+ r = m;
+ else if (find <= Data::u16_aligned(data + m * RANGES_RECSIZE + 2)) {
+ _pos = HEADERSIZE + m * RANGES_RECSIZE;
+ _value = find;
+ return true;
+ } else
+ l = m + 1;
+ }
+ _pos = HEADERSIZE + l * LIST_RECSIZE;
+ _value = (_pos >= _str.length() ? 0 : Data::u16_aligned(data - HEADERSIZE + _pos));
+
+ } else if (data[1] == T_X_BYTEMAP) {
+ _pos = 8 + find;
+ while (_pos < _str.length() && !data[_pos])
+ ++_pos;
+ _pos = _pos >= _str.length() ? _str.length() : _pos;
+ _value = _pos >= _str.length() ? 0 : _pos - 8;
+ }
+
+ return find == _value;
+}
+
+
+/**************************
+ * GlyphSet *
+ * *
+ **************************/
+
+GlyphSet::GlyphSet()
+{
+ memset(_v, 0, sizeof(_v));
+}
+
+GlyphSet::GlyphSet(const GlyphSet &o)
+{
+ for (int i = 0; i < VLEN; i++)
+ if (o._v[i]) {
+ _v[i] = new uint32_t[VULEN];
+ memcpy(_v[i], o._v[i], sizeof(uint32_t) * VULEN);
+ } else
+ _v[i] = 0;
+}
+
+GlyphSet::~GlyphSet()
+{
+ for (int i = 0; i < VLEN; i++)
+ delete[] _v[i];
+}
+
+int
+GlyphSet::change(Glyph g, bool value)
+{
+ if ((unsigned)g > MAXGLYPH)
+ return -1;
+ uint32_t *&u = _v[g >> SHIFT];
+ if (!u) {
+ u = new uint32_t[VULEN];
+ memset(u, 0, sizeof(uint32_t) * VULEN);
+ }
+ uint32_t mask = (1 << (g & 0x1F));
+ if (value)
+ u[(g & MASK) >> 5] |= mask;
+ else
+ u[(g & MASK) >> 5] &= ~mask;
+ return 0;
+}
+
+GlyphSet &
+GlyphSet::operator=(const GlyphSet &o)
+{
+ if (&o != this) {
+ for (int i = 0; i < VLEN; i++)
+ if (o._v[i]) {
+ if (!_v[i])
+ _v[i] = new uint32_t[VULEN];
+ memcpy(_v[i], o._v[i], sizeof(uint32_t) * VULEN);
+ } else if (_v[i])
+ memset(_v[i], 0, sizeof(uint32_t) * VULEN);
+ }
+ return *this;
+}
+
+
+/**************************
+ * ClassDef *
+ * *
+ **************************/
+
+ClassDef::ClassDef(const String &str, ErrorHandler *errh) noexcept
+ : _str(str)
+{
+ _str.align(2);
+ if (check(errh ? errh : ErrorHandler::silent_handler()) < 0)
+ _str = String();
+}
+
+int
+ClassDef::check(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT coverageFormat
+ // USHORT glyphCount
+ const uint8_t *data = _str.udata();
+ if (_str.length() < 6) // NB: prevents empty format-2 tables
+ return errh->error("OTF class def table too small");
+ int classFormat = Data::u16_aligned(data);
+
+ int len;
+ if (classFormat == T_LIST) {
+ int count = Data::u16_aligned(data + 4);
+ len = LIST_HEADERSIZE + count*LIST_RECSIZE;
+ // XXX don't check sorting
+ } else if (classFormat == T_RANGES) {
+ int count = Data::u16_aligned(data + 2);
+ len = RANGES_HEADERSIZE + count*RANGES_RECSIZE;
+ // XXX don't check sorting
+ } else
+ return errh->error("OTF class def table has unknown format %d", classFormat);
+
+ if (len > _str.length())
+ return errh->error("OTF class def table too short");
+ else {
+ _str = _str.substring(0, len);
+ return 0;
+ }
+}
+
+int
+ClassDef::lookup(Glyph g) const noexcept
+{
+ if (_str.length() == 0)
+ return -1;
+
+ const uint8_t *data = _str.udata();
+ int coverageFormat = Data::u16_aligned(data);
+
+ if (coverageFormat == T_LIST) {
+ Glyph start = Data::u16_aligned(data + 2);
+ int count = Data::u16_aligned(data + 4);
+ if (g < start || g >= start + count)
+ return 0;
+ else
+ return Data::u16_aligned(data + LIST_HEADERSIZE + (g - start) * LIST_RECSIZE);
+ } else if (coverageFormat == T_RANGES) {
+ int l = 0, r = Data::u16_aligned(data + 2);
+ data += RANGES_HEADERSIZE;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ const uint8_t *rec = data + m * RANGES_RECSIZE;
+ if (g < Data::u16_aligned(rec))
+ r = m;
+ else if (g <= Data::u16_aligned(rec + 2))
+ return Data::u16_aligned(rec + 4);
+ else
+ l = m + 1;
+ }
+ return 0;
+ } else
+ return 0;
+}
+
+void
+ClassDef::unparse(StringAccum &sa) const noexcept
+{
+ const uint8_t *data = _str.udata();
+ if (_str.length() == 0)
+ sa << "@*#!";
+ else if (data[1] == T_LIST) {
+ Glyph start = Data::u16_aligned(data + 2);
+ int count = Data::u16_aligned(data + 4);
+ for (int i = 0; i < count; i++) {
+ if (i) sa << ',';
+ sa << start + i << '=' << Data::u16_aligned(data + LIST_HEADERSIZE + i*LIST_RECSIZE);
+ }
+ } else {
+ for (int pos = RANGES_HEADERSIZE; pos < _str.length(); pos += RANGES_RECSIZE) {
+ Glyph start = Data::u16_aligned(data + pos);
+ Glyph end = Data::u16_aligned(data + pos + 2);
+ if (pos > RANGES_HEADERSIZE) sa << ',';
+ sa << start;
+ if (end != start) sa << '.' << '.' << end;
+ sa << '=' << Data::u16_aligned(data + pos + 4);
+ }
+ }
+}
+
+String
+ClassDef::unparse() const noexcept
+{
+ StringAccum sa;
+ unparse(sa);
+ return sa.take_string();
+}
+
+
+/******************************
+ * ClassDef::class_iterator *
+ * *
+ ******************************/
+
+ClassDef::class_iterator::class_iterator(const String &str, int pos, int the_class, const Coverage::iterator &coviter)
+ : _str(str), _pos(pos), _class(the_class), _coviter(coviter)
+{
+ // XXX assume _str has been checked
+
+ // cannot handle the_class == 0 when coviter doesn't exist
+ if (_class == 0 && !_coviter)
+ throw Error("cannot iterate over ClassDef class 0");
+
+ // shrink _str to fit the coverage table, and create a fake coverage
+ // iterator if necessary
+ const uint8_t *data = _str.udata();
+ if (_str.length()) {
+ switch (Data::u16_aligned(data)) {
+ case T_LIST: {
+ Glyph start = Data::u16_aligned(data + 2);
+ int nglyphs = Data::u16_aligned(data + 4);
+ _str = _str.substring(0, LIST_HEADERSIZE + nglyphs*LIST_RECSIZE);
+ if (!_coviter)
+ _coviter = Coverage(start, start + nglyphs - 1).begin();
+ if (_class)
+ _coviter.forward_to(start);
+ break;
+ }
+ case T_RANGES: {
+ Glyph start = Data::u16_aligned(data + RANGES_HEADERSIZE);
+ int nranges = Data::u16_aligned(data + 2);
+ _str = _str.substring(0, RANGES_HEADERSIZE + nranges*RANGES_RECSIZE);
+ if (!_coviter) {
+ Glyph end = Data::u16_aligned(data + RANGES_HEADERSIZE + 2 + (nranges - 1)*RANGES_RECSIZE);
+ _coviter = Coverage(start, end).begin();
+ }
+ if (_class)
+ _coviter.forward_to(start);
+ break;
+ }
+ default:
+ _str = String();
+ break;
+ }
+ }
+
+ // move to the first relevant glyph
+ if (_pos >= _str.length())
+ _pos = _str.length();
+ else {
+ _pos = 0;
+ (*this)++;
+ }
+}
+
+void
+ClassDef::class_iterator::increment_class0()
+{
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ bool is_list = (data[1] == T_LIST);
+
+ if (_pos != 0)
+ _coviter++;
+ else
+ _pos = FIRST_POS;
+
+ if (_pos == FIRST_POS && _coviter) {
+ if (*_coviter < Data::u16_aligned(data + (is_list ? 2 : RANGES_HEADERSIZE)))
+ return;
+ _pos = (is_list ? LIST_HEADERSIZE : RANGES_HEADERSIZE);
+ }
+
+ while (_pos > 0 && _pos < len && _coviter) {
+ Glyph g = *_coviter;
+ if (is_list) {
+ _pos = LIST_HEADERSIZE + LIST_RECSIZE*(g - Data::u16_aligned(data + 2));
+ if (_pos >= len)
+ break;
+ else if (Data::u16_aligned(data + _pos) == 0) // _class == 0
+ return;
+ _coviter++;
+ } else {
+ if (g < Data::u16_aligned(data + _pos)) // in a zero range
+ return;
+ else if (g > Data::u16_aligned(data + _pos + 2))
+ _pos += RANGES_RECSIZE;
+ else if (Data::u16_aligned(data + _pos + 4) == 0) // _class == 0
+ return;
+ else
+ _coviter.forward_to(Data::u16_aligned(data + _pos + 2) + 1);
+ }
+ }
+
+ if (_coviter)
+ _pos = LAST_POS;
+ else
+ _pos = len;
+}
+
+void
+ClassDef::class_iterator::operator++(int)
+{
+ if (_class == 0) {
+ increment_class0();
+ return;
+ }
+
+ const uint8_t *data = _str.udata();
+ int len = _str.length();
+ bool is_list = (data[1] == T_LIST);
+
+ if (_pos != 0)
+ _coviter++;
+ else
+ _pos = (is_list ? LIST_HEADERSIZE : RANGES_HEADERSIZE);
+
+ while (_pos < len && _coviter) {
+ Glyph g = *_coviter;
+ if (is_list) {
+ _pos = LIST_HEADERSIZE + LIST_RECSIZE*(g - Data::u16_aligned(data + 2));
+ if (_pos >= len || Data::u16_aligned(data + _pos) == _class)
+ return;
+ _coviter++;
+ } else {
+ while (_pos < len && (g > Data::u16_aligned(data + _pos + 2)
+ || Data::u16_aligned(data + _pos + 4) != _class))
+ _pos += RANGES_RECSIZE;
+ // now, _pos >= len, or g <= rec.end && class == rec.class
+ if (_pos >= len || g >= Data::u16_aligned(data + _pos))
+ return;
+ _coviter.forward_to(Data::u16_aligned(data + _pos));
+ }
+ }
+
+ _pos = len;
+}
+
+
+}}
+
+
+// template instantiations
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc
new file mode 100644
index 00000000000..b91970c9600
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfcmap.cc
@@ -0,0 +1,462 @@
+// -*- related-file-name: "../include/efont/otfcmap.hh" -*-
+
+/* otfcmap.{cc,hh} -- OpenType cmap table
+ *
+ * Copyright (c) 2002-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfcmap.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <efont/otfdata.hh> // for ntohl()
+
+#define USHORT_AT(d) (Data::u16_aligned(d))
+#define SHORT_AT(d) (Data::s16_aligned(d))
+#define ULONG_AT(d) (Data::u32_aligned(d))
+#define ULONG_AT2(d) (Data::u32_aligned16(d))
+
+namespace Efont { namespace OpenType {
+
+Cmap::Cmap(const String &s, ErrorHandler *errh)
+ : _str(s)
+{
+ _str.align(4);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Cmap::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ // USHORT numTables
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF cmap too small"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\000'))
+ return errh->error("bad cmap version number"), -ERANGE;
+ _ntables = USHORT_AT(data + 2);
+ if (_ntables == 0)
+ return errh->error("OTF cmap contains no tables"), -EINVAL;
+ if (HEADER_SIZE + ENCODING_SIZE * _ntables > len)
+ return errh->error("cmap directory out of range"), -EFAULT;
+
+ // ENCODING ENTRY FORMAT:
+ // USHORT platformID
+ // USHORT encodingID
+ // ULONG offset
+ int last_platform = -1;
+ int last_encoding = -1;
+ int last_language = -1;
+ _first_unicode_table = -1;
+ for (int i = 0; i < _ntables; i++) {
+ int loc = HEADER_SIZE + ENCODING_SIZE * i;
+ int platform = USHORT_AT(data + loc);
+ int encoding = USHORT_AT(data + loc + 2);
+ uint32_t offset = ULONG_AT(data + loc + 4);
+ if (offset + 8 > (uint32_t) len) {
+ length_error:
+ return errh->error("encoding data for entry %d out of range", i);
+ }
+ int format = USHORT_AT(data + offset);
+ int language;
+ if (format == F_BYTE || format == F_HIBYTE || format == F_SEGMENTED
+ || format == F_TRIMMED) {
+ if (USHORT_AT(data + offset + 2) < 6)
+ goto length_error;
+ language = USHORT_AT(data + offset + 4);
+ } else if (format == F_HIBYTE32 || format == F_TRIMMED32
+ || format == F_SEGMENTED32) {
+ if (offset + 12 > (uint32_t) len || ULONG_AT2(data + offset + 4) < 12)
+ goto length_error;
+ language = ULONG_AT2(data + offset + 8);
+ } else
+ continue;
+ if (!(platform > last_platform
+ || (platform == last_platform
+ && (encoding > last_encoding
+ || (encoding == last_encoding
+ && language > last_language)))))
+ errh->warning("unsorted cmap encoding records at entry %d (%d,%d,%d follows %d,%d,%d)", i, platform, encoding, language, last_platform, last_encoding, last_language);
+ if ((platform == 0 || (platform == 3 && encoding == 1))
+ && _first_unicode_table < 0)
+ _first_unicode_table = i;
+ last_platform = platform, last_encoding = encoding, last_language = language;
+ }
+
+ _table_error.assign(_ntables, -2);
+ return 0;
+}
+
+int
+Cmap::first_table(int platform, int encoding) const
+{
+ if (error() < 0)
+ return -1;
+ const uint8_t *data = _str.udata();
+ data += HEADER_SIZE;
+ for (int i = 0; i < _ntables; i++, data += ENCODING_SIZE) {
+ int p = USHORT_AT(data), e = USHORT_AT(data + 2);
+ if (platform == p && (encoding < 0 || encoding == e))
+ return i;
+ }
+ return -1;
+}
+
+int
+Cmap::check_table(int t, ErrorHandler *errh) const
+{
+ if (!errh)
+ errh = ErrorHandler::silent_handler();
+ if (t == USE_FIRST_UNICODE_TABLE && _first_unicode_table == -1) {
+ errh->warning("font appears not to support Unicode");
+ _first_unicode_table = 0;
+ }
+ if (t == USE_FIRST_UNICODE_TABLE)
+ t = _first_unicode_table;
+ if (_error < 0 || t < 0 || t >= _ntables)
+ return errh->error("no such table");
+ if (_table_error[t] != -2)
+ return _table_error[t];
+ _table_error[t] = -1;
+
+ const uint8_t *data = table_data(t);
+ uint32_t left = _str.uend() - data;
+ int format = USHORT_AT(data);
+ uint32_t length = 0; // value not used
+
+ switch (format) {
+
+ case F_BYTE:
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length != 259)
+ return errh->error("bad table %d length (format %d)", t, format);
+ break;
+
+ case F_HIBYTE:
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 524)
+ return errh->error("bad table %d length (format %d)", t, format);
+ for (int hi_byte = 0; hi_byte < 256; hi_byte++)
+ if (uint32_t subh_key = USHORT_AT(data + 6 + 2 * hi_byte)) {
+ if ((subh_key & 7) || HIBYTE_SUBHEADERS + subh_key + 8 > length)
+ return errh->error("bad table %d subheader %d offset (format 2)", t, hi_byte);
+ const uint8_t *subh = data + HIBYTE_SUBHEADERS + subh_key;
+ int firstCode = USHORT_AT(subh);
+ int entryCount = USHORT_AT(subh + 2);
+ int idRangeOffset = USHORT_AT(subh + 6);
+ if (firstCode + entryCount > 256 || entryCount == 0)
+ return errh->error("bad table %d subheader %d contents (format 2)", t, hi_byte);
+ if ((HIBYTE_SUBHEADERS + subh_key + 6) // pos[idRangeOffset]
+ + idRangeOffset + entryCount * 2 > length)
+ return errh->error("bad table %d subheader %d length (format 2)", t, hi_byte);
+ }
+ break;
+
+ case F_SEGMENTED: {
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 16)
+ return errh->error("bad table %d length (format %d)", t, format);
+ int segCountX2 = USHORT_AT(data + 6);
+ int searchRange = USHORT_AT(data + 8);
+ int entrySelector = USHORT_AT(data + 10);
+ int rangeShift = USHORT_AT(data + 12);
+ if ((segCountX2 & 1)
+ || segCountX2 == 0
+ || (searchRange & (searchRange - 1)) /* not a power of 2? */
+ || searchRange <= segCountX2/2
+ || (searchRange>>1) > segCountX2/2
+ || 1 << (entrySelector + 1) != searchRange
+ || rangeShift != segCountX2 - searchRange)
+ return errh->error("bad table %d segment counts (format %d)", format);
+ uint32_t segCount = segCountX2 >> 1;
+ if (length < 16 + 8 * segCount)
+ return errh->error("bad table %d length (format %d, length %u, need %u)", t, format, length, 16 + 8 * segCount);
+ const uint8_t *endCodes = data + 14;
+ const uint8_t *startCodes = endCodes + 2 + segCountX2;
+ const uint8_t *idDeltas = startCodes + segCountX2;
+ const uint8_t *idRangeOffsets = idDeltas + segCountX2;
+ uint32_t idRangeOffsetsPos = idRangeOffsets - data;
+ int last_end = 0;
+ for (int i = 0; i < segCountX2; i += 2) {
+ int endCode = USHORT_AT(endCodes + i);
+ int startCode = USHORT_AT(startCodes + i);
+ /* int idDelta = SHORT_AT(idDeltas + i); // not needed */
+ int idRangeOffset = USHORT_AT(idRangeOffsets + i);
+ if (endCode < startCode || startCode < last_end)
+ return errh->error("bad table %d overlapping range %d (format %d)", t, i/2, format);
+ if (idRangeOffset
+ && idRangeOffset != 65535
+ && idRangeOffsetsPos + i + idRangeOffset + (endCode - startCode)*2 + 2 > length)
+ return errh->error("bad table %d range %d length (format %d, range %d-%d, idRangeOffset %d, length %u)", t, i/2, format, startCode, endCode, idRangeOffset, length);
+ last_end = endCode + 1;
+ }
+ if (USHORT_AT(endCodes + segCountX2 - 2) != 0xFFFF)
+ return errh->error("bad table %d incorrect final endCode (format 4)", t);
+ break;
+ }
+
+ case F_TRIMMED: {
+ if (left < 4
+ || (length = USHORT_AT(data + 2)) > left
+ || length < 10)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t entryCount = USHORT_AT(data + 8);
+ if (10 + entryCount * 2 > length)
+ return errh->error("bad table %d length (format %d)", t, format);
+ break;
+ }
+
+ case F_SEGMENTED32: {
+ if (left < 8
+ || (length = ULONG_AT(data + 4)) > left
+ || length < 16)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t nGroups = ULONG_AT(data + 16);
+ if ((length - 16) / 12 < nGroups)
+ return errh->error("bad table %d length (format %d)", t, format);
+ uint32_t last_post_end = 0;
+ data += 16;
+ for (uint32_t i = 0; i < nGroups; i++, data += 12) {
+ uint32_t startCharCode = ULONG_AT(data);
+ uint32_t endCharCode = ULONG_AT(data + 4);
+ if (startCharCode < last_post_end || endCharCode < startCharCode)
+ return errh->error("bad table %d overlapping range %d (format %d)", t, i, format);
+ last_post_end = endCharCode + 1;
+ }
+ break;
+ }
+
+ case F_HIBYTE32:
+ case F_TRIMMED32:
+ default:
+ return errh->error("bad table %d unsupported format %d", t, format);
+
+ }
+
+ _table_error[t] = t;
+ return t;
+}
+
+Glyph
+Cmap::map_table(int t, uint32_t uni, ErrorHandler *errh) const
+{
+ if ((t = check_table(t, errh)) < 0)
+ return 0;
+
+ const uint8_t *data = table_data(t);
+ switch (USHORT_AT(data)) {
+
+ case F_BYTE:
+ if (uni < 256)
+ return data[6 + uni];
+ else
+ return 0;
+
+ case F_HIBYTE: {
+ if (uni >= 65536)
+ return 0;
+ int hi_byte = (uni >> 8) & 255;
+ int subh = USHORT_AT(data + 6 + hi_byte * 2);
+ if (subh == 0 && hi_byte) // XXX?
+ return 0;
+ data += 524 + subh;
+ int firstCode = USHORT_AT(data);
+ int entryCount = USHORT_AT(data + 2);
+ int idDelta = SHORT_AT(data + 4);
+ int idRangeOffset = USHORT_AT(data + 6);
+ int lo_byte = uni & 255;
+ if (lo_byte < firstCode || lo_byte >= firstCode + entryCount)
+ return 0;
+ int answer = USHORT_AT(data + 6 + idRangeOffset + (lo_byte - firstCode) * 2);
+ if (answer == 0)
+ return 0;
+ return (answer + idDelta) & 65535;
+ }
+
+ case F_SEGMENTED: {
+ if (uni >= 65536)
+ return 0;
+ int segCount = USHORT_AT(data + 6) >> 1;
+ const uint8_t *endCounts = data + 14;
+ const uint8_t *startCounts = endCounts + (segCount << 1) + 2;
+ const uint8_t *idDeltas = startCounts + (segCount << 1);
+ const uint8_t *idRangeOffsets = idDeltas + (segCount << 1);
+ int l = 0, r = segCount;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ uint32_t endCount = USHORT_AT(endCounts + (m << 1));
+ uint32_t startCount = USHORT_AT(startCounts + (m << 1));
+ if (uni < startCount)
+ r = m;
+ else if (uni <= endCount) {
+ int idDelta = SHORT_AT(idDeltas + (m << 1));
+ int idRangeOffset = USHORT_AT(idRangeOffsets + (m << 1));
+ if (idRangeOffset == 0)
+ return (idDelta + uni) & 65535;
+ else if (idRangeOffset == 65535)
+ return 0;
+ int g = USHORT_AT(idRangeOffsets + (m << 1) + idRangeOffset + ((uni - startCount) << 1));
+ if (g == 0)
+ return 0;
+ return (idDelta + g) & 65535;
+ } else
+ l = m + 1;
+ }
+ return 0;
+ }
+
+ case F_TRIMMED: {
+ uint32_t firstCode = USHORT_AT(data + 6);
+ uint32_t entryCount = USHORT_AT(data + 8);
+ if (uni < firstCode || uni >= firstCode + entryCount)
+ return 0;
+ return USHORT_AT(data + 10 + ((uni - firstCode) << 1));
+ }
+
+ case F_SEGMENTED32: {
+ uint32_t nGroups = ULONG_AT2(data + 12);
+ uint32_t l = 0, r = nGroups;
+ const uint8_t *groups = data + 16;
+ while (l < r) {
+ uint32_t m = l + (r - l) / 2;
+ uint32_t startCharCode = ULONG_AT2(groups + m * 12);
+ uint32_t endCharCode = ULONG_AT2(groups + m * 12 + 4);
+ if (uni < startCharCode)
+ r = m;
+ else if (uni <= endCharCode)
+ return ULONG_AT2(groups + m * 12 + 8) + uni - startCharCode;
+ else
+ l = m + 1;
+ }
+ return 0;
+ }
+
+ default:
+ return 0;
+
+ }
+}
+
+void
+Cmap::dump_table(int t, Vector<std::pair<uint32_t, Glyph> > &ugp, ErrorHandler *errh) const
+{
+ if ((t = check_table(t, errh)) < 0)
+ return;
+
+ const uint8_t *data = table_data(t);
+ switch (USHORT_AT(data)) {
+
+ case F_BYTE:
+ for (uint32_t u = 0; u < 256; ++u)
+ if (int g = data[6 + u])
+ ugp.push_back(std::make_pair(u, g));
+ break;
+
+ case F_HIBYTE:
+ assert(USHORT_AT(data + 6) == 0);
+ for (int hi_byte = 0; hi_byte < 256; hi_byte++) {
+ int subh = USHORT_AT(data + 6 + hi_byte * 4);
+ if (subh == 0 && hi_byte > 0)
+ continue;
+ const uint8_t *tdata = data + 524 + subh;
+ int firstCode = USHORT_AT(tdata);
+ int entryCount = USHORT_AT(tdata + 2);
+ int idDelta = SHORT_AT(tdata + 4);
+ int idRangeOffset = USHORT_AT(tdata + 6);
+ const uint8_t *gdata = tdata + 6 + idRangeOffset;
+ for (int i = 0; i < entryCount; i++)
+ if (Glyph g = USHORT_AT(gdata + (i << 1))) {
+ g = (idDelta + g) & 65535;
+ uint32_t u = (hi_byte << 8) + firstCode + i;
+ ugp.push_back(std::make_pair(u, g));
+ }
+ }
+ break;
+
+ case F_SEGMENTED: {
+ int segCountX2 = USHORT_AT(data + 6);
+ const uint8_t *endCounts = data + 14;
+ const uint8_t *startCounts = endCounts + segCountX2 + 2;
+ const uint8_t *idDeltas = startCounts + segCountX2;
+ const uint8_t *idRangeOffsets = idDeltas + segCountX2;
+ for (int i = 0; i < segCountX2; i += 2) {
+ uint32_t endCount = USHORT_AT(endCounts + i);
+ uint32_t startCount = USHORT_AT(startCounts + i);
+ int idDelta = SHORT_AT(idDeltas + i);
+ int idRangeOffset = USHORT_AT(idRangeOffsets + i);
+ if (idRangeOffset == 0) {
+ for (uint32_t u = startCount; u <= endCount; ++u) {
+ Glyph g = (u + idDelta) & 65535;
+ ugp.push_back(std::make_pair(u, g));
+ }
+ } else {
+ const uint8_t *gdata = idRangeOffsets + i + idRangeOffset;
+ for (uint32_t u = startCount; u <= endCount; ++u, gdata += 2)
+ if (Glyph g = USHORT_AT(gdata)) {
+ g = (g + idDelta) & 65535;
+ ugp.push_back(std::make_pair(u, g));
+ }
+ }
+ }
+ break;
+ }
+
+ case F_TRIMMED: {
+ uint32_t firstCode = USHORT_AT(data + 6);
+ int entryCount = USHORT_AT(data + 8);
+ for (int i = 0; i < entryCount; i++)
+ if (Glyph g = USHORT_AT(data + 10 + (i << 1)))
+ ugp.push_back(std::make_pair(firstCode + i, g));
+ break;
+ }
+
+ case F_SEGMENTED32: {
+ uint32_t nGroups = ULONG_AT2(data + 12);
+ const uint8_t *groups = data + 16;
+ for (uint32_t i = 0; i < nGroups; i++, groups += 12) {
+ uint32_t startCharCode = ULONG_AT2(groups);
+ uint32_t nCharCodes = ULONG_AT2(groups + 4) - startCharCode;
+ Glyph startGlyphID = ULONG_AT2(groups + 8);
+ for (uint32_t i = 0; i <= nCharCodes; i++)
+ ugp.push_back(std::make_pair(startCharCode + i, startGlyphID + i));
+ }
+ break;
+ }
+
+ default:
+ break;
+
+ }
+}
+
+int
+Cmap::map_uni(const Vector<uint32_t> &vin, Vector<Glyph> &vout) const
+{
+ int t;
+ if ((t = check_table(USE_FIRST_UNICODE_TABLE)) < 0)
+ return -1;
+ vout.resize(vin.size(), 0);
+ for (int i = 0; i < vin.size(); i++)
+ vout[i] = map_table(t, vin[i]);
+ return 0;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc
new file mode 100644
index 00000000000..b2768c406a6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdata.cc
@@ -0,0 +1,43 @@
+// -*- related-file-name: "../include/efont/otfdata.hh" -*-
+
+/* otfdata.{cc,hh} -- OpenType bounds-checked string type
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfdata.hh>
+
+namespace Efont { namespace OpenType {
+
+Data
+Data::subtable(unsigned offset) const
+{
+ if (offset > (unsigned) _str.length())
+ throw Bounds();
+ return Data(_str.substring(offset));
+}
+
+Data
+Data::offset_subtable(unsigned offset_offset) const
+{
+ int offset = u16(offset_offset);
+ if (offset > _str.length())
+ throw Bounds();
+ return Data(_str.substring(offset));
+}
+
+}}
+
+// template instantiations
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc
new file mode 100644
index 00000000000..6046ade2fb0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfdescrip.cc
@@ -0,0 +1,717 @@
+/* otfdescrip.cc -- descriptions for OpenType tags
+ *
+ * Copyright (c) 2002-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otf.hh>
+
+struct Mapping {
+ uint32_t tag;
+ const char *description;
+};
+
+#define T(str) ((str)[0]<<24 | (str)[1]<<16 | (str)[2]<<8 | (str)[3])
+
+static const Mapping scripts[] = {
+ { T("DFLT"), "Default" },
+ { T("arab"), "Arabic" },
+ { T("armi"), "Imperial Aramaic" },
+ { T("armn"), "Armenian" },
+ { T("avst"), "Avestan" },
+ { T("bali"), "Balinese" },
+ { T("bamu"), "Bamum" },
+ { T("batk"), "Batak" },
+ { T("beng"), "Bengali" },
+ { T("bng2"), "Bengali v.2" },
+ { T("bopo"), "Bopomofo" },
+ { T("brah"), "Brahmi" },
+ { T("brai"), "Braille" },
+ { T("bugi"), "Buginese" },
+ { T("buhd"), "Buhid" },
+ { T("byzm"), "Byzantine Music" },
+ { T("cakm"), "Chakma" },
+ { T("cans"), "Canadian Syllabics" },
+ { T("cari"), "Carian" },
+ { T("cham"), "Cham" },
+ { T("cher"), "Cherokee" },
+ { T("copt"), "Coptic" },
+ { T("cprt"), "Cypriot Syllabary" },
+ { T("cyrl"), "Cyrillic" },
+ { T("dev2"), "Devanagari v.2" },
+ { T("deva"), "Devanagari" },
+ { T("dsrt"), "Deseret" },
+ { T("egyp"), "Egyptian heiroglyphs" },
+ { T("ethi"), "Ethiopic" },
+ { T("geor"), "Georgian" },
+ { T("gjr2"), "Gujarati v.2" },
+ { T("glag"), "Glagolitic" },
+ { T("goth"), "Gothic" },
+ { T("grek"), "Greek" },
+ { T("gujr"), "Gujarati" },
+ { T("gur2"), "Gurmukhi v.2" },
+ { T("guru"), "Gurmukhi" },
+ { T("hang"), "Hangul" },
+ { T("hani"), "CJK Ideographic" },
+ { T("hano"), "Hanunoo" },
+ { T("hebr"), "Hebrew" },
+ { T("ital"), "Old Italic" },
+ { T("jamo"), "Hangul Jamo" },
+ { T("java"), "Javanese" },
+ { T("kali"), "Kayah Li" },
+ { T("kana"), "Hiragana/Katakana" },
+ { T("khar"), "Kharosthi" },
+ { T("khmr"), "Khmer" },
+ { T("knd2"), "Kannada v.2" },
+ { T("knda"), "Kannada" },
+ { T("kthi"), "Kaithi" },
+ { T("lana"), "Tai Tham (Lanna)" },
+ { T("lao "), "Lao" },
+ { T("latn"), "Latin" },
+ { T("lepc"), "Lepcha" },
+ { T("limb"), "Limbu" },
+ { T("linb"), "Linear B" },
+ { T("lisu"), "Lisu (Fraser)" },
+ { T("lyci"), "Lycian" },
+ { T("lydi"), "Lydian" },
+ { T("mand"), "Mandaic, Mandaean" },
+ { T("math"), "Mathematical Alphanumeric Symbols" },
+ { T("merc"), "Meroitic Cursive" },
+ { T("mero"), "Meroitic Hieroglyphs" },
+ { T("mlm2"), "Malayalam v.2" },
+ { T("mlym"), "Malayalam" },
+ { T("mong"), "Mongolian" },
+ { T("mtei"), "Meitei Mayek (Meithei, Meetei)" },
+ { T("musc"), "Musical Symbols" },
+ { T("mymr"), "Myanmar" },
+ { T("nko "), "N'Ko" },
+ { T("ogam"), "Ogham" },
+ { T("olck"), "Ol Chiki" },
+ { T("orkh"), "Old Turkic, Orkhon Runic" },
+ { T("ory2"), "Odia v.2 (formerly Oriya v.2)" },
+ { T("orya"), "Odia (formerly Oriya)" },
+ { T("osma"), "Osmanya" },
+ { T("phag"), "Phags-pa" },
+ { T("phli"), "Inscriptional Pahlavi" },
+ { T("phnx"), "Phoenician" },
+ { T("prti"), "Inscriptional Parthian" },
+ { T("rjng"), "Rejang" },
+ { T("runr"), "Runic" },
+ { T("samr"), "Samaritan" },
+ { T("sarb"), "Old South Arabian" },
+ { T("saur"), "Saurashtra" },
+ { T("shaw"), "Shavian" },
+ { T("shrd"), "Sharada" },
+ { T("sinh"), "Sinhala" },
+ { T("sora"), "Sora Sompeng" },
+ { T("sund"), "Sundanese" },
+ { T("sylo"), "Syloti Nagri" },
+ { T("syrc"), "Syriac" },
+ { T("tagb"), "Tagbanwa" },
+ { T("takr"), "Takri" },
+ { T("tale"), "Tai Le" },
+ { T("talu"), "New Tai Lue" },
+ { T("taml"), "Tamil" },
+ { T("tavt"), "Tai Viet" },
+ { T("tel2"), "Telugu v.2" },
+ { T("telu"), "Telugu" },
+ { T("tfng"), "Tifinagh" },
+ { T("tglg"), "Tagalog" },
+ { T("thaa"), "Thaana" },
+ { T("thai"), "Thai" },
+ { T("tibt"), "Tibetan" },
+ { T("tml2"), "Tamil v.2" },
+ { T("ugar"), "Ugaritic Cuneiform" },
+ { T("vai "), "Vai" },
+ { T("xpeo"), "Old Persian Cuneiform" },
+ { T("xsux"), "Sumero-Akkadian Cuneiform" },
+ { T("yi "), "Yi" }
+};
+
+static const Mapping languages[] = {
+ { T("ABA "), "Abaza" },
+ { T("ABK "), "Abkhazian" },
+ { T("ADY "), "Adyghe" },
+ { T("AFK "), "Afrikaans" },
+ { T("AFR "), "Afar" },
+ { T("AGW "), "Agaw" },
+ { T("ALS "), "Alsatian" },
+ { T("ALT "), "Altai" },
+ { T("AMH "), "Amharic" },
+ { T("APPH"), "Phonetic transcription—Americanist conventions" },
+ { T("ARA "), "Arabic" },
+ { T("ARI "), "Aari" },
+ { T("ARK "), "Arakanese" },
+ { T("ASM "), "Assamese" },
+ { T("ATH "), "Athapaskan" },
+ { T("AVR "), "Avar" },
+ { T("AWA "), "Awadhi" },
+ { T("AYM "), "Aymara" },
+ { T("AZE "), "Azeri" },
+ { T("BAD "), "Badaga" },
+ { T("BAG "), "Baghelkhandi" },
+ { T("BAL "), "Balkar" },
+ { T("BAU "), "Baule" },
+ { T("BBR "), "Berber" },
+ { T("BCH "), "Bench" },
+ { T("BCR "), "Bible Cree" },
+ { T("BEL "), "Belarussian" },
+ { T("BEM "), "Bemba" },
+ { T("BEN "), "Bengali" },
+ { T("BGR "), "Bulgarian" },
+ { T("BHI "), "Bhili" },
+ { T("BHO "), "Bhojpuri" },
+ { T("BIK "), "Bikol" },
+ { T("BIL "), "Bilen" },
+ { T("BKF "), "Blackfoot" },
+ { T("BLI "), "Balochi" },
+ { T("BLN "), "Balante" },
+ { T("BLT "), "Balti" },
+ { T("BMB "), "Bambara" },
+ { T("BML "), "Bamileke" },
+ { T("BOS "), "Bosnian" },
+ { T("BRE "), "Breton" },
+ { T("BRH "), "Brahui" },
+ { T("BRI "), "Braj Bhasha" },
+ { T("BRM "), "Burmese" },
+ { T("BSH "), "Bashkir" },
+ { T("BTI "), "Beti" },
+ { T("CAT "), "Catalan" },
+ { T("CEB "), "Cebuano" },
+ { T("CHE "), "Chechen" },
+ { T("CHG "), "Chaha Gurage" },
+ { T("CHH "), "Chattisgarhi" },
+ { T("CHI "), "Chichewa" },
+ { T("CHK "), "Chukchi" },
+ { T("CHP "), "Chipewyan" },
+ { T("CHR "), "Cherokee" },
+ { T("CHU "), "Chuvash" },
+ { T("CMR "), "Comorian" },
+ { T("COP "), "Coptic" },
+ { T("COS "), "Corsican" },
+ { T("CRE "), "Cree" },
+ { T("CRR "), "Carrier" },
+ { T("CRT "), "Crimean Tatar" },
+ { T("CSL "), "Church Slavonic" },
+ { T("CSY "), "Czech" },
+ { T("DAN "), "Danish" },
+ { T("DAR "), "Dargwa" },
+ { T("DCR "), "Woods Cree" },
+ { T("DEU "), "German" },
+ { T("DGR "), "Dogri" },
+ { T("DHV "), "Dhivehi" }, // deprecated
+ { T("DIV "), "Dhivehi" },
+ { T("DJR "), "Djerma" },
+ { T("DNG "), "Dangme" },
+ { T("DNK "), "Dinka" },
+ { T("DRI "), "Dari" },
+ { T("DUN "), "Dungan" },
+ { T("DZN "), "Dzongkha" },
+ { T("EBI "), "Ebira" },
+ { T("ECR "), "Eastern Cree" },
+ { T("EDO "), "Edo" },
+ { T("EFI "), "Efik" },
+ { T("ELL "), "Greek" },
+ { T("ENG "), "English" },
+ { T("ERZ "), "Erzya" },
+ { T("ESP "), "Spanish" },
+ { T("ETI "), "Estonian" },
+ { T("EUQ "), "Basque" },
+ { T("EVK "), "Evenki" },
+ { T("EVN "), "Even" },
+ { T("EWE "), "Ewe" },
+ { T("FAN "), "French Antillean" },
+ { T("FAR "), "Farsi" },
+ { T("FIN "), "Finnish" },
+ { T("FJI "), "Fijian" },
+ { T("FLE "), "Flemish" },
+ { T("FNE "), "Forest Nenets" },
+ { T("FON "), "Fon" },
+ { T("FOS "), "Faroese" },
+ { T("FRA "), "French" },
+ { T("FRI "), "Frisian" },
+ { T("FRL "), "Friulian" },
+ { T("FTA "), "Futa" },
+ { T("FUL "), "Fulani" },
+ { T("GAD "), "Ga" },
+ { T("GAE "), "Gaelic" },
+ { T("GAG "), "Gagauz" },
+ { T("GAL "), "Galician" },
+ { T("GAR "), "Garshuni" },
+ { T("GAW "), "Garhwali" },
+ { T("GEZ "), "Ge'ez" },
+ { T("GIL "), "Gilyak" },
+ { T("GMZ "), "Gumuz" },
+ { T("GON "), "Gondi" },
+ { T("GRN "), "Greenlandic" },
+ { T("GRO "), "Garo" },
+ { T("GUA "), "Guarani" },
+ { T("GUJ "), "Gujarati" },
+ { T("HAI "), "Haitian" },
+ { T("HAL "), "Halam" },
+ { T("HAR "), "Harauti" },
+ { T("HAU "), "Hausa" },
+ { T("HAW "), "Hawaiian" },
+ { T("HBN "), "Hammer-Banna" },
+ { T("HIL "), "Hiligaynon" },
+ { T("HIN "), "Hindi" },
+ { T("HMA "), "High Mari" },
+ { T("HND "), "Hindko" },
+ { T("HO "), "Ho" },
+ { T("HRI "), "Harari" },
+ { T("HRV "), "Croatian" },
+ { T("HUN "), "Hungarian" },
+ { T("HYE "), "Armenian" },
+ { T("IBO "), "Igbo" },
+ { T("IJO "), "Ijo" },
+ { T("ILO "), "Ilokano" },
+ { T("IND "), "Indonesian" },
+ { T("ING "), "Ingush" },
+ { T("INU "), "Inuktitut" },
+ { T("IPPH"), "Phonetic transcription—IPA conventions" },
+ { T("IRI "), "Irish" },
+ { T("IRT "), "Irish Traditional" },
+ { T("ISL "), "Icelandic" },
+ { T("ISM "), "Inari Sami" },
+ { T("ITA "), "Italian" },
+ { T("IWR "), "Hebrew" },
+ { T("JAN "), "Japanese" },
+ { T("JAV "), "Javanese" },
+ { T("JII "), "Yiddish" },
+ { T("JUD "), "Judezmo" },
+ { T("JUL "), "Jula" },
+ { T("KAB "), "Kabardian" },
+ { T("KAC "), "Kachchi" },
+ { T("KAL "), "Kalenjin" },
+ { T("KAN "), "Kannada" },
+ { T("KAR "), "Karachay" },
+ { T("KAT "), "Georgian" },
+ { T("KAZ "), "Kazakh" },
+ { T("KEB "), "Kebena" },
+ { T("KGE "), "Khutsuri Georgian" },
+ { T("KHA "), "Khakass" },
+ { T("KHK "), "Khanty-Kazim" },
+ { T("KHM "), "Khmer" },
+ { T("KHS "), "Khanty-Shurishkar" },
+ { T("KHV "), "Khanty-Vakhi" },
+ { T("KHW "), "Khowar" },
+ { T("KIK "), "Kikuyu" },
+ { T("KIR "), "Kirghiz" },
+ { T("KIS "), "Kisii" },
+ { T("KKN "), "Kokni" },
+ { T("KLM "), "Kalmyk" },
+ { T("KMB "), "Kamba" },
+ { T("KMN "), "Kumaoni" },
+ { T("KMO "), "Komo" },
+ { T("KMS "), "Komso" },
+ { T("KNR "), "Kanuri" },
+ { T("KOD "), "Kodagu" },
+ { T("KOH "), "Korean Old Hangul" },
+ { T("KOK "), "Konkani" },
+ { T("KON "), "Kikongo" },
+ { T("KOP "), "Komi-Permyak" },
+ { T("KOR "), "Korean" },
+ { T("KOZ "), "Komi-Zyrian" },
+ { T("KPL "), "Kpelle" },
+ { T("KRI "), "Krio" },
+ { T("KRK "), "Karakalpak" },
+ { T("KRL "), "Karelian" },
+ { T("KRM "), "Karaim" },
+ { T("KRN "), "Karen" },
+ { T("KRT "), "Koorete" },
+ { T("KSH "), "Kashmiri" },
+ { T("KSI "), "Khasi" },
+ { T("KSM "), "Kildin Sami" },
+ { T("KUI "), "Kui" },
+ { T("KUL "), "Kulvi" },
+ { T("KUM "), "Kumyk" },
+ { T("KUR "), "Kurdish" },
+ { T("KUU "), "Kurukh" },
+ { T("KUY "), "Kuy" },
+ { T("KYK "), "Koryak" },
+ { T("LAD "), "Ladin" },
+ { T("LAH "), "Lahuli" },
+ { T("LAK "), "Lak" },
+ { T("LAM "), "Lambani" },
+ { T("LAO "), "Lao" },
+ { T("LAT "), "Latin" },
+ { T("LAZ "), "Laz" },
+ { T("LCR "), "L-Cree" },
+ { T("LDK "), "Ladakhi" },
+ { T("LEZ "), "Lezgi" },
+ { T("LIN "), "Lingala" },
+ { T("LMA "), "Low Mari" },
+ { T("LMB "), "Limbu" },
+ { T("LMW "), "Lomwe" },
+ { T("LSB "), "Lower Sorbian" },
+ { T("LSM "), "Lule Sami" },
+ { T("LTH "), "Lithuanian" },
+ { T("LTZ "), "Luxembourgish" },
+ { T("LUB "), "Luba" },
+ { T("LUG "), "Luganda" },
+ { T("LUH "), "Luhya" },
+ { T("LUO "), "Luo" },
+ { T("LVI "), "Latvian" },
+ { T("MAJ "), "Majang" },
+ { T("MAK "), "Makua" },
+ { T("MAL "), "Malayalam Traditional" },
+ { T("MAN "), "Mansi" },
+ { T("MAP "), "Mapudungun" },
+ { T("MAR "), "Marathi" },
+ { T("MAW "), "Marwari" },
+ { T("MBN "), "Mbundu" },
+ { T("MCH "), "Manchu" },
+ { T("MCR "), "Moose Cree" },
+ { T("MDE "), "Mende" },
+ { T("MEN "), "Me'en" },
+ { T("MIZ "), "Mizo" },
+ { T("MKD "), "Macedonian" },
+ { T("MLE "), "Male" },
+ { T("MLG "), "Malagasy" },
+ { T("MLN "), "Malinke" },
+ { T("MLR "), "Malayalam Reformed" },
+ { T("MLY "), "Malay" },
+ { T("MND "), "Mandinka" },
+ { T("MNG "), "Mongolian" },
+ { T("MNI "), "Manipuri" },
+ { T("MNK "), "Maninka" },
+ { T("MNX "), "Manx Gaelic" },
+ { T("MOH "), "Mohawk" },
+ { T("MOK "), "Moksha" },
+ { T("MOL "), "Moldavian" },
+ { T("MON "), "Mon" },
+ { T("MOR "), "Moroccan" },
+ { T("MRI "), "Maori" },
+ { T("MTH "), "Maithili" },
+ { T("MTS "), "Maltese" },
+ { T("MUN "), "Mundari" },
+ { T("NAG "), "Naga-Assamese" },
+ { T("NAN "), "Nanai" },
+ { T("NAS "), "Naskapi" },
+ { T("NCR "), "N-Cree" },
+ { T("NDB "), "Ndebele" },
+ { T("NDG "), "Ndonga" },
+ { T("NEP "), "Nepali" },
+ { T("NEW "), "Newari" },
+ { T("NGR "), "Nagari" },
+ { T("NHC "), "Norway House Cree" },
+ { T("NIS "), "Nisi" },
+ { T("NIU "), "Niuean" },
+ { T("NKL "), "Nkole" },
+ { T("NKO "), "N'Ko" },
+ { T("NLD "), "Dutch" },
+ { T("NOG "), "Nogai" },
+ { T("NOR "), "Norwegian" },
+ { T("NSM "), "Northern Sami" },
+ { T("NTA "), "Northern Tai" },
+ { T("NTO "), "Esperanto" },
+ { T("NYN "), "Nynorsk" },
+ { T("OCI "), "Occitan" },
+ { T("OCR "), "Oji-Cree" },
+ { T("OJB "), "Ojibway" },
+ { T("ORI "), "Odia (formerly Oriya)" },
+ { T("ORO "), "Oromo" },
+ { T("OSS "), "Ossetian" },
+ { T("PAA "), "Palestinian Aramaic" },
+ { T("PAL "), "Pali" },
+ { T("PAN "), "Punjabi" },
+ { T("PAP "), "Palpa" },
+ { T("PAS "), "Pashto" },
+ { T("PGR "), "Polytonic Greek" },
+ { T("PIL "), "Filipino" },
+ { T("PLG "), "Palaung" },
+ { T("PLK "), "Polish" },
+ { T("PRO "), "Provencal" },
+ { T("PTG "), "Portuguese" },
+ { T("QIN "), "Chin" },
+ { T("RAJ "), "Rajasthani" },
+ { T("RBU "), "Russian Buriat" },
+ { T("RCR "), "R-Cree" },
+ { T("RIA "), "Riang" },
+ { T("RMS "), "Rhaeto-Romanic" },
+ { T("ROM "), "Romanian" },
+ { T("ROY "), "Romany" },
+ { T("RSY "), "Rusyn" },
+ { T("RUA "), "Ruanda" },
+ { T("RUS "), "Russian" },
+ { T("SAD "), "Sadri" },
+ { T("SAN "), "Sanskrit" },
+ { T("SAT "), "Santali" },
+ { T("SAY "), "Sayisi" },
+ { T("SEK "), "Sekota" },
+ { T("SEL "), "Selkup" },
+ { T("SGO "), "Sango" },
+ { T("SHN "), "Shan" },
+ { T("SIB "), "Sibe" },
+ { T("SID "), "Sidamo" },
+ { T("SIG "), "Silte Gurage" },
+ { T("SKS "), "Skolt Sami" },
+ { T("SKY "), "Slovak" },
+ { T("SLA "), "Slavey" },
+ { T("SLV "), "Slovenian" },
+ { T("SML "), "Somali" },
+ { T("SMO "), "Samoan" },
+ { T("SNA "), "Sena" },
+ { T("SND "), "Sindhi" },
+ { T("SNH "), "Sinhalese" },
+ { T("SNK "), "Soninke" },
+ { T("SOG "), "Sodo Gurage" },
+ { T("SOT "), "Sotho" },
+ { T("SQI "), "Albanian" },
+ { T("SRB "), "Serbian" },
+ { T("SRK "), "Saraiki" },
+ { T("SRR "), "Serer" },
+ { T("SSL "), "South Slavey" },
+ { T("SSM "), "Southern Sami" },
+ { T("SUR "), "Suri" },
+ { T("SVA "), "Svan" },
+ { T("SVE "), "Swedish" },
+ { T("SWA "), "Swadaya Aramaic" },
+ { T("SWK "), "Swahili" },
+ { T("SWZ "), "Swazi" },
+ { T("SXT "), "Sutu" },
+ { T("SYR "), "Syriac" },
+ { T("TAB "), "Tabasaran" },
+ { T("TAJ "), "Tajiki" },
+ { T("TAM "), "Tamil" },
+ { T("TAT "), "Tatar" },
+ { T("TCR "), "TH-Cree" },
+ { T("TEL "), "Telugu" },
+ { T("TGN "), "Tongan" },
+ { T("TGR "), "Tigre" },
+ { T("TGY "), "Tigrinya" },
+ { T("THA "), "Thai" },
+ { T("THT "), "Tahitian" },
+ { T("TIB "), "Tibetan" },
+ { T("TKM "), "Turkmen" },
+ { T("TMN "), "Temne" },
+ { T("TNA "), "Tswana" },
+ { T("TNE "), "Tundra Nenets" },
+ { T("TNG "), "Tonga" },
+ { T("TOD "), "Todo" },
+ { T("TRK "), "Turkish" },
+ { T("TSG "), "Tsonga" },
+ { T("TUA "), "Turoyo Aramaic" },
+ { T("TUL "), "Tulu" },
+ { T("TUR "), "Turkish" }, // deprecated?
+ { T("TUV "), "Tuvin" },
+ { T("TWI "), "Twi" },
+ { T("UDM "), "Udmurt" },
+ { T("UKR "), "Ukrainian" },
+ { T("URD "), "Urdu" },
+ { T("USB "), "Upper Sorbian" },
+ { T("UYG "), "Uyghur" },
+ { T("UZB "), "Uzbek" },
+ { T("VEN "), "Venda" },
+ { T("VIT "), "Vietnamese" },
+ { T("WA "), "Wa" },
+ { T("WAG "), "Wagdi" },
+ { T("WCR "), "West-Cree" },
+ { T("WEL "), "Welsh" },
+ { T("WLF "), "Wolof" },
+ { T("XBD "), "Tai Lue" },
+ { T("XHS "), "Xhosa" },
+ { T("YAK "), "Sakha" },
+ { T("YBA "), "Yoruba" },
+ { T("YCR "), "Y-Cree" },
+ { T("YIC "), "Yi Classic" },
+ { T("YIM "), "Yi Modern" },
+ { T("ZHH "), "Chinese, Hong Kong SAR" },
+ { T("ZHP "), "Chinese Phonetic" },
+ { T("ZHS "), "Chinese Simplified" },
+ { T("ZHT "), "Chinese Traditional" },
+ { T("ZND "), "Zande" },
+ { T("ZUL "), "Zulu" }
+};
+
+static const Mapping features[] = {
+ { T("aalt"), "Access All Alternates" },
+ { T("abvf"), "Above-base Forms" },
+ { T("abvm"), "Above-base Mark Positioning" },
+ { T("abvs"), "Above-base Substitutions" },
+ { T("afrc"), "Alternative Fractions" },
+ { T("akhn"), "Akhands" },
+ { T("blwf"), "Below-base Forms" },
+ { T("blwm"), "Below-base Mark Positioning" },
+ { T("blws"), "Below-base Substitutions" },
+ { T("c2pc"), "Petite Capitals From Capitals" },
+ { T("c2sc"), "Small Capitals From Capitals" },
+ { T("calt"), "Contextual Alternates" },
+ { T("case"), "Case-Sensitive Forms" },
+ { T("ccmp"), "Glyph Composition/Decomposition" },
+ { T("cfar"), "Conjunct Form After Ro" },
+ { T("cjct"), "Conjunct Forms" },
+ { T("clig"), "Contextual Ligatures" },
+ { T("cpct"), "Centered CJK Punctuation" },
+ { T("cpsp"), "Capital Spacing" },
+ { T("cswh"), "Contextual Swash" },
+ { T("curs"), "Cursive Positioning" },
+ { T("cv01"), "Character Variants 1" },
+ { T("cv02"), "Character Variants 2" },
+ { T("cv03"), "Character Variants 3" },
+ { T("cv04"), "Character Variants 4" },
+ { T("cv05"), "Character Variants 5" },
+ { T("cv06"), "Character Variants 6" },
+ // ... up to cv99
+ { T("dist"), "Distances" },
+ { T("dlig"), "Discretionary Ligatures" },
+ { T("dnom"), "Denominators" },
+ { T("expt"), "Expert Forms" },
+ { T("falt"), "Final Glyph on Line Alternates" },
+ { T("fin2"), "Terminal Forms #2" },
+ { T("fin3"), "Terminal Forms #3" },
+ { T("fina"), "Terminal Forms" },
+ { T("frac"), "Fractions" },
+ { T("fwid"), "Full Widths" },
+ { T("half"), "Half Forms" },
+ { T("haln"), "Halant Forms" },
+ { T("halt"), "Alternate Half Widths" },
+ { T("hist"), "Historical Forms" },
+ { T("hkna"), "Horizontal Kana Alternates" },
+ { T("hlig"), "Historical Ligatures" },
+ { T("hngl"), "Hangul" },
+ { T("hojo"), "Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms)" },
+ { T("hwid"), "Half Widths" },
+ { T("init"), "Initial Forms" },
+ { T("isol"), "Isolated Forms" },
+ { T("ital"), "Italics" },
+ { T("jalt"), "Justification Alternates" },
+ { T("jp04"), "JIS2004 Forms" },
+ { T("jp78"), "JIS78 Forms" },
+ { T("jp83"), "JIS83 Forms" },
+ { T("jp90"), "JIS90 Forms" },
+ { T("kern"), "Kerning" },
+ { T("lfbd"), "Left Bounds" },
+ { T("liga"), "Standard Ligatures" },
+ { T("ljmo"), "Leading Jamo Forms" },
+ { T("lnum"), "Lining Figures" },
+ { T("locl"), "Localized Forms" },
+ { T("ltra"), "Left-to-right alternates" },
+ { T("ltrm"), "Left-to-right mirrored forms" },
+ { T("mark"), "Mark Positioning" },
+ { T("med2"), "Medial Forms #2" },
+ { T("medi"), "Medial Forms" },
+ { T("mgrk"), "Mathematical Greek" },
+ { T("mkmk"), "Mark to Mark Positioning" },
+ { T("mset"), "Mark Positioning via Substitution" },
+ { T("nalt"), "Alternate Annotation Forms" },
+ { T("nlck"), "NLC Kanji Forms" },
+ { T("nukt"), "Nukta Forms" },
+ { T("numr"), "Numerators" },
+ { T("onum"), "Oldstyle Figures" },
+ { T("opbd"), "Optical Bounds" },
+ { T("ordn"), "Ordinals" },
+ { T("ornm"), "Ornaments" },
+ { T("palt"), "Proportional Alternate Widths" },
+ { T("pcap"), "Petite Capitals" },
+ { T("pkna"), "Proportional Kana" },
+ { T("pnum"), "Proportional Figures" },
+ { T("pref"), "Pre-Base Forms" },
+ { T("pres"), "Pre-base Substitutions" },
+ { T("pstf"), "Post-base Forms" },
+ { T("psts"), "Post-base Substitutions" },
+ { T("pwid"), "Proportional Widths" },
+ { T("qwid"), "Quarter Widths" },
+ { T("rand"), "Randomize" },
+ { T("rkrf"), "Rakar Forms" },
+ { T("rlig"), "Required Ligatures" },
+ { T("rphf"), "Reph Forms" },
+ { T("rtbd"), "Right Bounds" },
+ { T("rtla"), "Right-to-left Alternates" },
+ { T("rtlm"), "Right-to-left Mirrored Forms" },
+ { T("ruby"), "Ruby Notation Forms" },
+ { T("salt"), "Stylistic Alternates" },
+ { T("sinf"), "Scientific Inferiors" },
+ { T("size"), "Optical Size" },
+ { T("smcp"), "Small Capitals" },
+ { T("smpl"), "Simplified Forms" },
+ { T("ss01"), "Stylistic Set 1" },
+ { T("ss02"), "Stylistic Set 2" },
+ { T("ss03"), "Stylistic Set 3" },
+ { T("ss04"), "Stylistic Set 4" },
+ { T("ss05"), "Stylistic Set 5" },
+ { T("ss06"), "Stylistic Set 6" },
+ { T("ss07"), "Stylistic Set 7" },
+ { T("ss08"), "Stylistic Set 8" },
+ { T("ss09"), "Stylistic Set 9" },
+ { T("ss10"), "Stylistic Set 10" },
+ { T("ss11"), "Stylistic Set 11" },
+ { T("ss12"), "Stylistic Set 12" },
+ { T("ss13"), "Stylistic Set 13" },
+ { T("ss14"), "Stylistic Set 14" },
+ { T("ss15"), "Stylistic Set 15" },
+ { T("ss16"), "Stylistic Set 16" },
+ { T("ss17"), "Stylistic Set 17" },
+ { T("ss18"), "Stylistic Set 18" },
+ { T("ss19"), "Stylistic Set 19" },
+ { T("ss20"), "Stylistic Set 20" },
+ { T("subs"), "Subscript" },
+ { T("sups"), "Superscript" },
+ { T("swsh"), "Swash" },
+ { T("titl"), "Titling" },
+ { T("tjmo"), "Trailing Jamo Forms" },
+ { T("tnam"), "Traditional Name Forms" },
+ { T("tnum"), "Tabular Figures" },
+ { T("trad"), "Traditional Forms" },
+ { T("twid"), "Third Widths" },
+ { T("unic"), "Unicase" },
+ { T("valt"), "Alternate Vertical Metrics" },
+ { T("vatu"), "Vattu Variants" },
+ { T("vert"), "Vertical Writing" },
+ { T("vhal"), "Alternate Vertical Half Metrics" },
+ { T("vjmo"), "Vowel Jamo Forms" },
+ { T("vkna"), "Vertical Kana Alternates" },
+ { T("vkrn"), "Vertical Kerning" },
+ { T("vpal"), "Proportional Alternate Vertical Metrics" },
+ { T("vrt2"), "Vertical Alternates and Rotation" },
+ { T("zero"), "Slashed Zero" }
+};
+
+namespace Efont { namespace OpenType {
+
+static const char *
+find_description(uint32_t tag, const Mapping *maps, int n)
+{
+ // should use STL...
+ int l = 0, r = n;
+ while (l < r) {
+ int m = l + (r - l) / 2;
+ if (maps[m].tag < tag)
+ l = m + 1;
+ else if (maps[m].tag == tag)
+ return maps[m].description;
+ else
+ r = m;
+ }
+ return 0;
+}
+
+const char *
+Tag::script_description() const
+{
+ return find_description(value(), scripts, sizeof(scripts) / sizeof(Mapping));
+}
+
+const char *
+Tag::language_description() const
+{
+ return find_description(value(), languages, sizeof(languages) / sizeof(Mapping));
+}
+
+const char *
+Tag::feature_description() const
+{
+ return find_description(value(), features, sizeof(features) / sizeof(Mapping));
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
new file mode 100644
index 00000000000..6c682b2f8e6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgpos.cc
@@ -0,0 +1,328 @@
+// -*- related-file-name: "../include/efont/otfgpos.hh" -*-
+
+/* otfgpos.{cc,hh} -- OpenType GPOS table
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfgpos.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+
+/**************************
+ * Gpos *
+ * *
+ **************************/
+
+Gpos::Gpos(const Data &d, ErrorHandler *errh)
+{
+ // Fixed Version
+ // Offset ScriptList
+ // Offset FeatureList
+ // Offset LookupList
+ if (d.length() == 0)
+ throw BlankTable("GPOS");
+ if (d.u16(0) != 1)
+ throw Format("GPOS");
+ if (_script_list.assign(d.offset_subtable(4), errh) < 0)
+ throw Format("GPOS script list");
+ if (_feature_list.assign(d.offset_subtable(6), errh) < 0)
+ throw Format("GPOS feature list");
+ _lookup_list = d.offset_subtable(8);
+}
+
+int
+Gpos::nlookups() const
+{
+ return _lookup_list.u16(0);
+}
+
+GposLookup
+Gpos::lookup(unsigned i) const
+{
+ if (i >= _lookup_list.u16(0))
+ throw Error("GPOS lookup out of range");
+ else
+ return GposLookup(_lookup_list.offset_subtable(2 + i*2));
+}
+
+
+/**************************
+ * GposValue *
+ * *
+ **************************/
+
+const int GposValue::nibble_bitcount_x2[] = { 0, 2, 2, 4, 2, 4, 4, 6,
+ 2, 4, 4, 6, 4, 6, 6, 8 };
+
+
+/**************************
+ * GposLookup *
+ * *
+ **************************/
+
+GposLookup::GposLookup(const Data &d)
+ : _d(d)
+{
+ if (_d.length() < 6)
+ throw Format("GPOS Lookup table");
+ _type = _d.u16(0);
+ if (_type == L_EXTENSION && _d.u16(4) != 0) {
+ Data first_subtable = _d.offset_subtable(HEADERSIZE);
+ if (first_subtable.length() < 8 || first_subtable.u16(0) != 1)
+ throw Format("GPOS Extension Lookup table");
+ _type = first_subtable.u16(2);
+ }
+}
+
+Data
+GposLookup::subtable(int i) const
+{
+ Data subd = _d.offset_subtable(HEADERSIZE + i*RECSIZE);
+ if (_d.u16(0) != L_EXTENSION)
+ return subd;
+ else if (subd.length() >= 8 && subd.u16(0) == 1 && subd.u16(2) == _type)
+ return subd.subtable(subd.u32(4));
+ else
+ return Data();
+}
+
+bool
+GposLookup::unparse_automatics(Vector<Positioning> &v, ErrorHandler *errh) const
+{
+ int nlookup = _d.u16(4), success = 0;
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++)
+ try {
+ GposSingle s(subtable(i));
+ s.unparse(v);
+ success++;
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ return success > 0;
+ case L_PAIR:
+ for (int i = 0; i < nlookup; i++)
+ try {
+ GposPair p(subtable(i));
+ p.unparse(v);
+ success++;
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ return success > 0;
+ default:
+ return false;
+ }
+}
+
+
+/**************************
+ * GposSingle *
+ * *
+ **************************/
+
+GposSingle::GposSingle(const Data &d)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GPOS Single Positioning");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 2 && coverage.size() > _d.u16(6)))
+ throw Format("GPOS Single Positioning coverage");
+}
+
+Coverage
+GposSingle::coverage() const noexcept
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+void
+GposSingle::unparse(Vector<Positioning> &v) const
+{
+ if (_d[1] == 1) {
+ int format = _d.u16(4);
+ Data value = _d.subtable(6);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Positioning(Position(*i, format, value)));
+ } else {
+ int format = _d.u16(4);
+ int size = GposValue::size(format);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ v.push_back(Positioning(Position(*i, format, _d.subtable(F2_HEADERSIZE + size*i.coverage_index()))));
+ }
+}
+
+
+/**************************
+ * GposPair *
+ * *
+ **************************/
+
+GposPair::GposPair(const Data &d)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GPOS Pair Positioning");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 1 && coverage.size() > _d.u16(8)))
+ throw Format("GPOS Pair Positioning coverage");
+}
+
+Coverage
+GposPair::coverage() const noexcept
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+void
+GposPair::unparse(Vector<Positioning> &v) const
+{
+ if (_d[1] == 1) {
+ int format1 = _d.u16(4);
+ int format2 = _d.u16(6);
+ int f2_pos = PAIRVALUE_HEADERSIZE + GposValue::size(format1);
+ int pairvalue_size = f2_pos + GposValue::size(format2);
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data pairset = _d.offset_subtable(F1_HEADERSIZE + i.coverage_index()*F1_RECSIZE);
+ int npair = pairset.u16(0);
+ for (int j = 0; j < npair; j++) {
+ Data pair = pairset.subtable(PAIRSET_HEADERSIZE + j*pairvalue_size);
+ v.push_back(Positioning(Position(*i, format1, pair.subtable(PAIRVALUE_HEADERSIZE)),
+ Position(pair.u16(0), format2, pair.subtable(f2_pos))));
+ }
+ }
+ } else { // _d[1] == 2
+ int format1 = _d.u16(4);
+ int format2 = _d.u16(6);
+ int f2_pos = GposValue::size(format1);
+ int recsize = f2_pos + GposValue::size(format2);
+ ClassDef class1(_d.offset_subtable(8));
+ ClassDef class2(_d.offset_subtable(10));
+ Coverage coverage = this->coverage();
+ int nclass1 = _d.u16(12);
+ int nclass2 = _d.u16(14);
+ int offset = F2_HEADERSIZE;
+ for (int c1 = 0; c1 < nclass1; c1++)
+ for (int c2 = 0; c2 < nclass2; c2++, offset += recsize) {
+ Position p1(format1, _d.subtable(offset));
+ Position p2(format2, _d.subtable(offset + f2_pos));
+ if (p1 || p2) {
+ for (ClassDef::class_iterator c1i = class1.begin(c1, coverage); c1i; c1i++)
+ for (ClassDef::class_iterator c2i = class2.begin(c2); c2i; c2i++)
+ v.push_back(Positioning(Position(*c1i, p1), Position(*c2i, p2)));
+ }
+ }
+ }
+}
+
+
+/**************************
+ * Positioning *
+ * *
+ **************************/
+
+static void
+unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns)
+{
+ if (!gns)
+ gns = &debug_glyph_names;
+ if (gid && gns && gns->size() > gid && (*gns)[gid])
+ sa << (*gns)[gid];
+ else
+ sa << "g" << gid;
+}
+
+void
+Position::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ unparse_glyphid(sa, g, gns);
+ if (placed())
+ sa << '@' << pdx << ',' << pdy;
+ sa << '+' << adx;
+ if (ady)
+ sa << '/' << ady;
+}
+
+String
+Position::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+bool
+Positioning::context_in(const Coverage &c) const
+{
+ return (c.covers(_left.g) || !_left.g) && (!_right.g || c.covers(_right.g));
+}
+
+bool
+Positioning::context_in(const GlyphSet &gs) const
+{
+ return (gs.covers(_left.g) || !_left.g) && (!_right.g || gs.covers(_right.g));
+}
+
+void
+Positioning::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ if (!*this)
+ sa << "NULL[]";
+ else if (is_single()) {
+ sa << "SINGLE[";
+ _left.unparse(sa, gns);
+ sa << ']';
+ } else if (is_pairkern()) {
+ sa << "KERN[";
+ unparse_glyphid(sa, _left.g, gns);
+ sa << ' ';
+ unparse_glyphid(sa, _right.g, gns);
+ sa << "+" << _left.adx << ']';
+ } else if (is_pair()) {
+ sa << "PAIR[";
+ _left.unparse(sa, gns);
+ sa << ' ';
+ _right.unparse(sa, gns);
+ sa << ']';
+ } else
+ sa << "UNKNOWN[]";
+}
+
+String
+Positioning::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+}}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc
new file mode 100644
index 00000000000..8527d04b5aa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfgsub.cc
@@ -0,0 +1,1398 @@
+// -*- related-file-name: "../include/efont/otfgsub.hh" -*-
+
+/* otfgsub.{cc,hh} -- OpenType GSUB table
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfgsub.hh>
+#include <efont/otfname.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+void
+Substitution::clear(Substitute &s, uint8_t &t)
+{
+ switch (t) {
+ case T_GLYPHS:
+ delete[] s.gids;
+ break;
+ case T_COVERAGE:
+ delete s.coverage;
+ break;
+ }
+ t = T_NONE;
+}
+
+void
+Substitution::assign_space(Substitute &s, uint8_t &t, int n)
+{
+ clear(s, t);
+ if (n == 1)
+ t = T_GLYPH;
+ else if (n > 1) {
+ s.gids = new Glyph[n + 1];
+ s.gids[0] = n;
+ t = T_GLYPHS;
+ }
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, Glyph gid)
+{
+ clear(s, t);
+ s.gid = gid;
+ t = T_GLYPH;
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, int ngids, const Glyph *gids)
+{
+ clear(s, t);
+ assert(ngids > 0);
+ if (ngids == 1) {
+ s.gid = gids[0];
+ t = T_GLYPH;
+ } else {
+ s.gids = new Glyph[ngids + 1];
+ s.gids[0] = ngids;
+ memcpy(s.gids + 1, gids, ngids * sizeof(Glyph));
+ t = T_GLYPHS;
+ }
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, const Coverage &coverage)
+{
+ clear(s, t);
+ s.coverage = new Coverage(coverage);
+ t = T_COVERAGE;
+}
+
+void
+Substitution::assign(Substitute &s, uint8_t &t, const Substitute &os, uint8_t ot)
+{
+ if (&s == &os)
+ return;
+ switch (ot) {
+ case T_NONE:
+ clear(s, t);
+ break;
+ case T_GLYPH:
+ assign(s, t, os.gid);
+ break;
+ case T_GLYPHS:
+ assign(s, t, os.gids[0], os.gids + 1);
+ break;
+ case T_COVERAGE:
+ assign(s, t, *os.coverage);
+ break;
+ default:
+ assert(0);
+ }
+}
+
+Substitution::Substitution(const Substitution &o)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE),
+ _alternate(o._alternate)
+{
+ assign(_left, _left_is, o._left, o._left_is);
+ assign(_in, _in_is, o._in, o._in_is);
+ assign(_out, _out_is, o._out, o._out_is);
+ assign(_right, _right_is, o._right, o._right_is);
+}
+
+Substitution::Substitution(Glyph in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_GLYPH), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ _in.gid = in;
+ _out.gid = out;
+}
+
+Substitution::Substitution(Glyph in, const Vector<Glyph> &out, bool is_alternate)
+ : _left_is(T_NONE), _in_is(T_GLYPH), _out_is(T_NONE), _right_is(T_NONE),
+ _alternate(is_alternate)
+{
+ assert(out.size() > 0);
+ _in.gid = in;
+ assign(_out, _out_is, out.size(), &out[0]);
+}
+
+Substitution::Substitution(Glyph in1, Glyph in2, Glyph out)
+ : _left_is(T_NONE), _in_is(T_GLYPHS), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ _in.gids = new Glyph[3];
+ _in.gids[0] = 2;
+ _in.gids[1] = in1;
+ _in.gids[2] = in2;
+ _out.gid = out;
+}
+
+Substitution::Substitution(const Vector<Glyph> &in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ assert(in.size() > 0);
+ assign(_in, _in_is, in.size(), &in[0]);
+ _out.gid = out;
+}
+
+Substitution::Substitution(int nin, const Glyph *in, Glyph out)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_GLYPH), _right_is(T_NONE)
+{
+ assert(nin > 0);
+ assign(_in, _in_is, nin, in);
+ _out.gid = out;
+}
+
+Substitution::Substitution(int nleft, int nin, int nout, int nright)
+ : _left_is(T_NONE), _in_is(T_NONE), _out_is(T_NONE), _right_is(T_NONE)
+{
+ if (nleft)
+ assign_space(_left, _left_is, nleft);
+ if (nin)
+ assign_space(_in, _in_is, nin);
+ if (nout)
+ assign_space(_out, _out_is, nout);
+ if (nright)
+ assign_space(_right, _right_is, nright);
+}
+
+Substitution::~Substitution()
+{
+ clear(_left, _left_is);
+ clear(_in, _in_is);
+ clear(_out, _out_is);
+ clear(_right, _right_is);
+}
+
+Substitution &
+Substitution::operator=(const Substitution &o)
+{
+ assign(_left, _left_is, o._left, o._left_is);
+ assign(_in, _in_is, o._in, o._in_is);
+ assign(_out, _out_is, o._out, o._out_is);
+ assign(_right, _right_is, o._right, o._right_is);
+ _alternate = o._alternate;
+ return *this;
+}
+
+bool
+Substitution::substitute_in(const Substitute &s, uint8_t t, const Coverage &c)
+{
+ switch (t) {
+ case T_NONE:
+ return true;
+ case T_GLYPH:
+ return c.covers(s.gid);
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ if (!c.covers(s.gids[i]))
+ return false;
+ return true;
+ case T_COVERAGE:
+ return *s.coverage <= c;
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+bool
+Substitution::substitute_in(const Substitute &s, uint8_t t, const GlyphSet &gs)
+{
+ switch (t) {
+ case T_NONE:
+ return true;
+ case T_GLYPH:
+ return gs.covers(s.gid);
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ if (!gs.covers(s.gids[i]))
+ return false;
+ return true;
+ case T_COVERAGE:
+ for (Coverage::iterator i = s.coverage->begin(); i; i++)
+ if (!gs.covers(*i))
+ return false;
+ return true;
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+bool
+Substitution::context_in(const Coverage &c) const
+{
+ return substitute_in(_left, _left_is, c)
+ && substitute_in(_in, _in_is, c)
+ && substitute_in(_right, _right_is, c);
+}
+
+bool
+Substitution::context_in(const GlyphSet &gs) const
+{
+ return substitute_in(_left, _left_is, gs)
+ && substitute_in(_in, _in_is, gs)
+ && substitute_in(_right, _right_is, gs);
+}
+
+Glyph
+Substitution::extract_glyph(const Substitute &s, uint8_t t) noexcept
+{
+ return (t == T_GLYPH ? s.gid : 0);
+}
+
+Glyph
+Substitution::extract_glyph(const Substitute &s, int which, uint8_t t) noexcept
+{
+ switch (t) {
+ case T_GLYPH:
+ return (which == 0 ? s.gid : 0);
+ case T_GLYPHS:
+ return (s.gids[0] > which ? s.gids[which + 1] : 0);
+ case T_COVERAGE:
+ for (Coverage::iterator ci = s.coverage->begin(); ci; ci++, which--)
+ if (which == 0)
+ return *ci;
+ return 0;
+ default:
+ return 0;
+ }
+}
+
+bool
+Substitution::extract_glyphs(const Substitute &s, uint8_t t, Vector<Glyph> &v, bool coverage_ok) noexcept
+{
+ switch (t) {
+ case T_GLYPH:
+ v.push_back(s.gid);
+ return true;
+ case T_GLYPHS:
+ for (int i = 1; i <= s.gids[0]; i++)
+ v.push_back(s.gids[i]);
+ return true;
+ case T_COVERAGE:
+ if (coverage_ok) {
+ for (Coverage::iterator i = s.coverage->begin(); i; i++)
+ v.push_back(*i);
+ return true;
+ } else
+ return false;
+ default:
+ return false;
+ }
+}
+
+Glyph *
+Substitution::extract_glyphptr(const Substitute &s, uint8_t t) noexcept
+{
+ switch (t) {
+ case T_GLYPH:
+ return const_cast<Glyph *>(&s.gid);
+ case T_GLYPHS:
+ return &s.gids[1];
+ default:
+ return 0;
+ }
+}
+
+int
+Substitution::extract_nglyphs(const Substitute &s, uint8_t t, bool coverage_ok) noexcept
+{
+ switch (t) {
+ case T_GLYPH:
+ return 1;
+ case T_GLYPHS:
+ return s.gids[0];
+ case T_COVERAGE:
+ return (coverage_ok ? 1 : 0);
+ default:
+ return 0;
+ }
+}
+
+bool
+Substitution::matches(const Substitute &s, uint8_t t, int pos, Glyph g) noexcept
+{
+ switch (t) {
+ case T_GLYPH:
+ return (pos == 0 && s.gid == g);
+ case T_GLYPHS:
+ return (pos >= 0 && pos < s.gids[0] && s.gids[1 + pos] == g);
+ case T_COVERAGE:
+ return (pos == 0 && s.coverage->covers(g));
+ default:
+ return false;
+ }
+}
+
+bool
+Substitution::is_noop() const
+{
+ return (_in_is == T_GLYPH && _out_is == T_GLYPH && _in.gid == _out.gid)
+ || (_in_is == T_GLYPHS && _out_is == T_GLYPHS
+ && _in.gids[0] == _out.gids[0]
+ && memcmp(_in.gids, _out.gids, (_in.gids[0] + 1) * sizeof(Glyph)) == 0);
+}
+
+bool
+Substitution::all_in_glyphs(Vector<Glyph> &gs) const
+{
+ bool ok = true;
+ gs.clear();
+ if (_left_is != T_NONE)
+ ok &= extract_glyphs(_left, _left_is, gs, false);
+ ok &= extract_glyphs(_in, _in_is, gs, false);
+ if (_right_is != T_NONE)
+ ok &= extract_glyphs(_right, _right_is, gs, false);
+ return ok;
+}
+
+bool
+Substitution::all_out_glyphs(Vector<Glyph> &v) const
+{
+ bool ok = true;
+ if (_left_is != T_NONE)
+ ok &= extract_glyphs(_left, _left_is, v, false);
+ ok &= extract_glyphs(_out, _out_is, v, false);
+ if (_right_is != T_NONE)
+ ok &= extract_glyphs(_right, _right_is, v, false);
+ return ok;
+}
+
+void
+Substitution::assign_append(Substitute &s, uint8_t &t, const Substitute &ls, uint8_t lt, const Substitute &rs, uint8_t rt)
+{
+ if (lt == T_NONE)
+ assign(s, t, rs, rt);
+ else if (rt == T_NONE)
+ assign(s, t, ls, lt);
+ else if (lt != T_COVERAGE && rt != T_COVERAGE) {
+ int nl = extract_nglyphs(ls, lt, false);
+ int nr = extract_nglyphs(rs, rt, false);
+ Glyph *gids = new Glyph[nl + nr + 1];
+ gids[0] = nl + nr;
+ memcpy(&gids[1], extract_glyphptr(ls, lt), nl * sizeof(Glyph));
+ memcpy(&gids[1 + nl], extract_glyphptr(rs, rt), nr * sizeof(Glyph));
+ clear(s, t);
+ s.gids = gids;
+ t = T_GLYPHS;
+ } else
+ throw Error();
+}
+
+void
+Substitution::assign_append(Substitute &s, uint8_t &t, const Substitute &ls, uint8_t lt, Glyph rg)
+{
+ Substitute rs;
+ rs.gid = rg;
+ assign_append(s, t, ls, lt, rs, T_GLYPH);
+}
+
+Substitution
+Substitution::in_out_append_glyph(Glyph g) const
+{
+ Substitution s;
+ assign(s._left, s._left_is, _left, _left_is);
+ assign(s._right, s._right_is, _right, _right_is);
+ assign_append(s._in, s._in_is, _in, _in_is, g);
+ assign_append(s._out, s._out_is, _out, _out_is, g);
+ return s;
+}
+
+void
+Substitution::add_outer_left(Glyph g)
+{
+ Substitute ls;
+ ls.gid = g;
+ assign_append(_left, _left_is, ls, T_GLYPH, _left, _left_is);
+}
+
+void
+Substitution::remove_outer_left()
+{
+ if (_left_is == T_GLYPH)
+ _left_is = T_NONE;
+ else if (_left_is == T_GLYPHS) {
+ if (_left.gids[0] == 2)
+ assign(_left, _left_is, _left.gids[2]);
+ else {
+ _left.gids[0]--;
+ memmove(_left.gids + 1, _left.gids + 2, _left.gids[0] * sizeof(Glyph));
+ }
+ }
+}
+
+void
+Substitution::add_outer_right(Glyph g)
+{
+ assign_append(_right, _right_is, _right, _right_is, g);
+}
+
+void
+Substitution::remove_outer_right()
+{
+ if (_right_is == T_GLYPH)
+ _right_is = T_NONE;
+ else if (_right_is == T_GLYPHS) {
+ if (_right.gids[0] == 2)
+ assign(_right, _right_is, _right.gids[1]);
+ else
+ _right.gids[0]--;
+ }
+}
+
+bool
+Substitution::out_alter(const Substitution &o, int pos) noexcept
+{
+ const Glyph *g = out_glyphptr();
+ int ng = out_nglyphs();
+ const Glyph *out_g = o.out_glyphptr();
+ int out_ng = o.out_nglyphs();
+ int in_ng = o.in_nglyphs();
+ if (pos + in_ng > ng || out_ng == 0)
+ return false;
+
+ // check that input substitution actually matches us
+ for (int i = 0; i < in_ng; i++)
+ if (!o.in_matches(i, g[pos+i]))
+ return false;
+
+ // actually change output
+ Vector<Glyph> new_g;
+ for (int i = 0; i < pos; i++)
+ new_g.push_back(g[i]);
+ for (int i = 0; i < out_ng; i++)
+ new_g.push_back(out_g[i]);
+ for (int i = pos + in_ng; i < ng; i++)
+ new_g.push_back(g[i]);
+ assign(_out, _out_is, new_g.size(), &new_g[0]);
+
+ return true;
+}
+
+static void
+unparse_glyphid(StringAccum &sa, Glyph gid, const Vector<PermString> *gns) noexcept
+{
+ if (gid > 0 && gns && gns->size() > gid && (*gns)[gid])
+ sa << (*gns)[gid];
+ else
+ sa << "g" << gid;
+}
+
+void
+Substitution::unparse_glyphids(StringAccum &sa, const Substitute &s, uint8_t t, const Vector<PermString> *gns) noexcept
+{
+ if (t == T_GLYPH)
+ unparse_glyphid(sa, s.gid, gns);
+ else if (t == T_GLYPHS) {
+ for (int i = 1; i <= s.gids[0]; i++) {
+ if (i != 1)
+ sa << ' ';
+ unparse_glyphid(sa, s.gids[i], gns);
+ }
+ } else if (t == T_COVERAGE)
+ sa << "<coverage>";
+ else
+ sa << "-";
+}
+
+void
+Substitution::unparse(StringAccum &sa, const Vector<PermString> *gns) const
+{
+ if (!*this)
+ sa << "NULL[]";
+ else {
+ if (is_single())
+ sa << "SINGLE[";
+ else if (is_ligature())
+ sa << "LIGATURE[";
+ else if (is_multiple())
+ sa << "MULTIPLE[";
+ else if (is_alternate())
+ sa << "ALTERNATE[";
+ else if (is_simple_context())
+ sa << "SIMPLECONTEXT[";
+ else
+ sa << "UNKNOWN[";
+
+ if (_left_is != T_NONE) {
+ unparse_glyphids(sa, _left, _left_is, gns);
+ sa << " | ";
+ }
+ unparse_glyphids(sa, _in, _in_is, gns);
+ sa << " => ";
+ unparse_glyphids(sa, _out, _out_is, gns);
+ if (_right_is != T_NONE) {
+ sa << " | ";
+ unparse_glyphids(sa, _right, _right_is, gns);
+ }
+
+ sa << ']';
+ }
+}
+
+String
+Substitution::unparse(const Vector<PermString> *gns) const
+{
+ StringAccum sa;
+ unparse(sa, gns);
+ return sa.take_string();
+}
+
+
+
+/**************************
+ * Gsub *
+ * *
+ **************************/
+
+Gsub::Gsub(const Data &d, const Font *otf, ErrorHandler *errh)
+ : _chaincontext_reverse_backtrack(false)
+{
+ // Fixed Version
+ // Offset ScriptList
+ // Offset FeatureList
+ // Offset LookupList
+ if (d.length() == 0)
+ throw BlankTable("GSUB");
+ if (d.u16(0) != 1)
+ throw Format("GSUB");
+ if (_script_list.assign(d.offset_subtable(4), errh) < 0)
+ throw Format("GSUB script list");
+ if (_feature_list.assign(d.offset_subtable(6), errh) < 0)
+ throw Format("GSUB feature list");
+ _lookup_list = d.offset_subtable(8);
+
+ if (!otf)
+ return;
+
+ // Check for "correct" chaining context rules, as suggested by Adobe's
+ // OpenType FDK
+ try {
+ Name nametable(otf->table("name"), ErrorHandler::silent_handler());
+ _chaincontext_reverse_backtrack = nametable.version_chaincontext_reverse_backtrack();
+ } catch (Error) {
+ }
+}
+
+int
+Gsub::nlookups() const
+{
+ return _lookup_list.u16(0);
+}
+
+GsubLookup
+Gsub::lookup(unsigned i) const
+{
+ if (i >= _lookup_list.u16(0))
+ throw Error("GSUB lookup out of range");
+ else
+ return GsubLookup(_lookup_list.offset_subtable(2 + i*2));
+}
+
+
+/**************************
+ * GsubLookup *
+ * *
+ **************************/
+
+GsubLookup::GsubLookup(const Data &d)
+ : _d(d)
+{
+ if (_d.length() < 6)
+ throw Format("GSUB Lookup table");
+ _type = _d.u16(0);
+ if (_type == L_EXTENSION && _d.u16(4) != 0) {
+ Data first_subtable = _d.offset_subtable(HEADERSIZE);
+ if (first_subtable.length() < 8 || first_subtable.u16(0) != 1)
+ throw Format("GSUB Extension Lookup table");
+ _type = first_subtable.u16(2);
+ }
+}
+
+Data
+GsubLookup::subtable(int i) const
+{
+ Data subd = _d.offset_subtable(HEADERSIZE + i*RECSIZE);
+ if (_d.u16(0) != L_EXTENSION)
+ return subd;
+ else if (subd.length() >= 8 && subd.u16(0) == 1 && subd.u16(2) == _type)
+ return subd.subtable(subd.u32(4));
+ else
+ return Data();
+}
+
+void
+GsubLookup::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i)); // this pattern makes gcc-3.3.4 happier
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ x.mark_out_glyphs(gmap);
+ }
+ return;
+ case L_CONTEXT:
+ for (int i = 0; i < nlookup; i++) {
+ GsubContext x(subtable(i));
+ x.mark_out_glyphs(gsub, gmap);
+ }
+ return;
+ case L_CHAIN:
+ for (int i = 0; i < nlookup; i++) {
+ GsubChainContext x(subtable(i));
+ x.mark_out_glyphs(gsub, gmap);
+ }
+ return;
+ }
+}
+
+bool
+GsubLookup::unparse_automatics(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i)); // this pattern makes gcc-3.3.4 happier
+ x.unparse(v, limit);
+ }
+ return true;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.unparse(v);
+ }
+ return true;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ x.unparse(v, true);
+ }
+ return true;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ x.unparse(v);
+ }
+ return true;
+ case L_CONTEXT: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++) {
+ GsubContext x(subtable(i));
+ understood &= x.unparse(gsub, v, limit);
+ }
+ return understood;
+ }
+ case L_CHAIN: {
+ bool understood = true;
+ for (int i = 0; i < nlookup; i++) {
+ GsubChainContext x(subtable(i));
+ understood &= x.unparse(gsub, v, limit);
+ }
+ return understood;
+ }
+ default:
+ return false;
+ }
+}
+
+bool
+GsubLookup::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int nlookup = _d.u16(4);
+ switch (_type) {
+ case L_SINGLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubSingle x(subtable(i));
+ if (x.apply(g, pos, n, s))
+ return true;
+ }
+ return false;
+ case L_MULTIPLE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ if (x.apply(g, pos, n, s))
+ return true;
+ }
+ return false;
+ case L_ALTERNATE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubMultiple x(subtable(i));
+ if (x.apply(g, pos, n, s, true))
+ return true;
+ }
+ return false;
+ case L_LIGATURE:
+ for (int i = 0; i < nlookup; i++) {
+ GsubLigature x(subtable(i));
+ if (x.apply(g, pos, n, s))
+ return true;
+ }
+ return false;
+ default: // XXX
+ return false;
+ }
+}
+
+
+/**************************
+ * GsubSingle *
+ * *
+ **************************/
+
+GsubSingle::GsubSingle(const Data &d)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || (_d[1] != 1 && _d[1] != 2))
+ throw Format("GSUB Single Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || (_d[1] == 2 && coverage.size() > _d.u16(4)))
+ throw Format("GSUB Single Substitution coverage");
+}
+
+Coverage
+GsubSingle::coverage() const noexcept
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+Glyph
+GsubSingle::map(Glyph g) const
+{
+ int ci = coverage().coverage_index(g);
+ if (ci < 0)
+ return g;
+ else if (_d[1] == 1)
+ return g + _d.s16(4);
+ else
+ return _d.u16(HEADERSIZE + FORMAT2_RECSIZE*ci);
+}
+
+void
+GsubSingle::mark_out_glyphs(Vector<bool> &gmap) const
+{
+ if (_d[1] == 1) {
+ int delta = _d.s16(4);
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ gmap[*i + delta] = true;
+ } else {
+ for (Coverage::iterator i = coverage().begin(); i; i++)
+ gmap[_d.u16(HEADERSIZE + i.coverage_index()*FORMAT2_RECSIZE)] = true;
+ }
+}
+
+void
+GsubSingle::unparse(Vector<Substitution> &v, const Coverage &limit) const
+{
+ if (_d[1] == 1) {
+ int delta = _d.s16(4);
+ for (Coverage::iterator it = coverage().begin(); it; ++it)
+ if (limit.covers(*it))
+ v.push_back(Substitution(*it, *it + delta));
+ } else {
+ for (Coverage::iterator it = coverage().begin(); it; ++it)
+ if (limit.covers(*it))
+ v.push_back(Substitution(*it, _d.u16(HEADERSIZE + it.coverage_index()*FORMAT2_RECSIZE)));
+ }
+}
+
+bool
+GsubSingle::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ if (_d[1] == 1)
+ s = Substitution(g[pos], g[pos] + _d.s16(4));
+ else
+ s = Substitution(g[pos], _d.u16(HEADERSIZE + ci*FORMAT2_RECSIZE));
+ return true;
+ } else
+ return false;
+}
+
+
+/**************************
+ * GsubMultiple *
+ * *
+ **************************/
+
+GsubMultiple::GsubMultiple(const Data &d)
+ : _d(d)
+{
+ if (_d[0] != 0 || _d[1] != 1)
+ throw Format("GSUB Multiple Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || coverage.size() > _d.u16(4))
+ throw Format("GSUB Multiple Substitution coverage");
+}
+
+Coverage
+GsubMultiple::coverage() const noexcept
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+bool
+GsubMultiple::map(Glyph g, Vector<Glyph> &v) const
+{
+ v.clear();
+ int ci = coverage().coverage_index(g);
+ if (ci < 0) {
+ v.push_back(g);
+ return false;
+ } else {
+ Data seq = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ for (int i = 0; i < seq.u16(0); i++)
+ v.push_back(seq.u16(SEQ_HEADERSIZE + i*SEQ_RECSIZE));
+ return true;
+ }
+}
+
+void
+GsubMultiple::mark_out_glyphs(Vector<bool> &gmap) const
+{
+ for (Coverage::iterator i = coverage().begin(); i; ++i) {
+ Data seq = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ for (int j = 0; j < seq.u16(0); ++j)
+ gmap[seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE)] = true;
+ }
+}
+
+void
+GsubMultiple::unparse(Vector<Substitution> &v, bool is_alternate) const
+{
+ Vector<Glyph> result;
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data seq = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ result.clear();
+ for (int j = 0; j < seq.u16(0); j++)
+ result.push_back(seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE));
+ v.push_back(Substitution(*i, result, is_alternate));
+ }
+}
+
+bool
+GsubMultiple::apply(const Glyph *g, int pos, int n, Substitution &s, bool is_alternate) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ Vector<Glyph> result;
+ Data seq = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ for (int j = 0; j < seq.u16(0); j++)
+ result.push_back(seq.u16(SEQ_HEADERSIZE + j*SEQ_RECSIZE));
+ s = Substitution(g[pos], result, is_alternate);
+ return true;
+ } else
+ return false;
+}
+
+
+/**************************
+ * GsubLigature *
+ * *
+ **************************/
+
+GsubLigature::GsubLigature(const Data &d)
+ : _d(d)
+{
+ if (_d[0] != 0
+ || _d[1] != 1)
+ throw Format("GSUB Ligature Substitution");
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || coverage.size() > _d.u16(4))
+ throw Format("GSUB Ligature Substitution coverage");
+}
+
+Coverage
+GsubLigature::coverage() const noexcept
+{
+ return Coverage(_d.offset_subtable(2), 0, false);
+}
+
+bool
+GsubLigature::map(const Vector<Glyph> &gs, Glyph &result, int &consumed) const
+{
+ assert(gs.size() > 0);
+ result = gs[0];
+ consumed = 1;
+ int ci = coverage().coverage_index(gs[0]);
+ if (ci < 0)
+ return false;
+ Data ligset = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ int nligset = ligset.u16(0);
+ for (int i = 0; i < nligset; i++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + i*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ if (nlig > gs.size() - 1)
+ goto bad;
+ for (int j = 0; j < nlig - 1; j++)
+ if (lig.u16(LIG_HEADERSIZE + j*LIG_RECSIZE) != gs[j + 1])
+ goto bad;
+ result = lig.u16(0);
+ consumed = nlig + 1;
+ return true;
+ bad: ;
+ }
+ return false;
+}
+
+void
+GsubLigature::mark_out_glyphs(Vector<bool> &gmap) const
+{
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data ligset = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ int nligset = ligset.u16(0);
+ Vector<Glyph> components(1, *i);
+ for (int j = 0; j < nligset; j++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + j*SET_RECSIZE);
+ gmap[lig.u16(0)] = true;
+ }
+ }
+}
+
+void
+GsubLigature::unparse(Vector<Substitution> &v) const
+{
+ for (Coverage::iterator i = coverage().begin(); i; i++) {
+ Data ligset = _d.offset_subtable(HEADERSIZE + i.coverage_index()*RECSIZE);
+ int nligset = ligset.u16(0);
+ Vector<Glyph> components(1, *i);
+ for (int j = 0; j < nligset; j++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + j*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ components.resize(1);
+ for (int k = 0; k < nlig - 1; k++)
+ components.push_back(lig.u16(LIG_HEADERSIZE + k*LIG_RECSIZE));
+ v.push_back(Substitution(components, lig.u16(0)));
+ }
+ }
+}
+
+bool
+GsubLigature::apply(const Glyph *g, int pos, int n, Substitution &s) const
+{
+ int ci;
+ if (pos < n && (ci = coverage().coverage_index(g[pos])) >= 0) {
+ Data ligset = _d.offset_subtable(HEADERSIZE + ci*RECSIZE);
+ int nligset = ligset.u16(0);
+ for (int j = 0; j < nligset; j++) {
+ Data lig = ligset.offset_subtable(SET_HEADERSIZE + j*SET_RECSIZE);
+ int nlig = lig.u16(2);
+ if (pos + nlig <= n) {
+ for (int k = 0; k < nlig - 1; k++)
+ if (lig.u16(LIG_HEADERSIZE + k*LIG_RECSIZE) != g[pos + k + 1])
+ goto ligature_failed;
+ s = Substitution(nlig, &g[pos], lig.u16(0));
+ return true;
+ }
+ ligature_failed: ;
+ }
+ }
+ return false;
+}
+
+
+/**************************
+ * GsubContext *
+ * *
+ **************************/
+
+GsubContext::GsubContext(const Data &d)
+ : _d(d)
+{
+ switch (_d.u16(0)) {
+ case 1:
+ case 2:
+ break;
+ case 3: {
+ int ninput = _d.u16(2);
+ if (ninput < 1)
+ throw Format("GSUB Context Substitution input sequence");
+ Coverage coverage(_d.offset_subtable(F3_HSIZE));
+ if (!coverage.ok())
+ throw Format("GSUB Context Substitution coverage");
+ break;
+ }
+ default:
+ throw Format("GSUB Context Substitution");
+ }
+}
+
+Coverage
+GsubContext::coverage() const noexcept
+{
+ if (_d[1] == 3)
+ return Coverage(_d.offset_subtable(F3_HSIZE), 0, false);
+ else
+ return Coverage();
+}
+
+void
+GsubContext::subruleset_mark_out_glyphs(const Data &data, int nsub,
+ int subtab_offset, const Gsub &gsub,
+ Vector<bool> &gmap)
+{
+ for (int j = 0; j < nsub; ++j) {
+ int lookup_index = data.u16(subtab_offset + SUBRECSIZE*j + 2);
+ gsub.lookup(lookup_index).mark_out_glyphs(gsub, gmap);
+ }
+}
+
+void
+GsubContext::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ if (_d.u16(0) != 3) // XXX
+ return;
+ int nglyph = _d.u16(2);
+ int nsubst = _d.u16(4);
+ subruleset_mark_out_glyphs(_d, nsubst, F3_HSIZE + nglyph*2, gsub, gmap);
+}
+
+bool
+GsubContext::f1_unparse(const Data& data,
+ int nsub, int subtab_offset,
+ const Gsub& gsub, Vector<Substitution>& outsubs,
+ Substitution s) {
+ Substitution subtab_sub;
+ int napplied = 0;
+ for (int j = 0; j < nsub; j++) {
+ int seq_index = data.u16(subtab_offset + SUBRECSIZE*j);
+ int lookup_index = data.u16(subtab_offset + SUBRECSIZE*j + 2);
+ // XXX check seq_index against size of output glyphs?
+ if (gsub.lookup(lookup_index).apply(s.out_glyphptr(), seq_index, s.out_nglyphs(), subtab_sub)) {
+ napplied++;
+ s.out_alter(subtab_sub, seq_index);
+ }
+ }
+ outsubs.push_back(s);
+ return true;
+}
+
+bool
+GsubContext::f3_unparse(const Data &data,
+ int nglyph, int glyphtab_offset, const Coverage &limit,
+ int nsub, int subtab_offset,
+ const Gsub &gsub, Vector<Substitution> &outsubs,
+ const Substitution &prototype_sub)
+{
+ Vector<Substitution> subs;
+ subs.push_back(prototype_sub);
+ Vector<Substitution> work_subs;
+
+ // get array of possible substitutions including contexts
+ for (int i = 0; i < nglyph; i++) {
+ assert(!work_subs.size());
+ Coverage c(data.offset_subtable(glyphtab_offset + i*2));
+ for (Coverage::iterator ci = (c & limit).begin(); ci; ci++)
+ for (int j = 0; j < subs.size(); j++)
+ work_subs.push_back(subs[j].in_out_append_glyph(*ci));
+ subs.clear();
+ subs.swap(work_subs);
+ }
+
+ // now, apply referred lookups to the resulting substitution array
+ Substitution subtab_sub;
+ for (int i = 0; i < subs.size(); i++) {
+ Substitution &s = subs[i];
+ int napplied = 0;
+ for (int j = 0; j < nsub; j++) {
+ int seq_index = data.u16(subtab_offset + SUBRECSIZE*j);
+ int lookup_index = data.u16(subtab_offset + SUBRECSIZE*j + 2);
+ // XXX check seq_index against size of output glyphs?
+ if (gsub.lookup(lookup_index).apply(s.out_glyphptr(), seq_index, s.out_nglyphs(), subtab_sub)) {
+ napplied++;
+ s.out_alter(subtab_sub, seq_index);
+ }
+ }
+ // 26.Jun.2003 -- always push substitution back, since the no-op might
+ // override a following substitution
+ outsubs.push_back(s);
+ }
+
+ return true; // XXX
+}
+
+bool
+GsubContext::unparse(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ if (_d.u16(0) != 3) // XXX
+ return false;
+ int nglyph = _d.u16(2);
+ int nsubst = _d.u16(4);
+ return f3_unparse(_d, nglyph, F3_HSIZE, limit, nsubst, F3_HSIZE + nglyph*2, gsub, v, Substitution());
+}
+
+
+/**************************
+ * GsubChainContext *
+ * *
+ **************************/
+
+GsubChainContext::GsubChainContext(const Data &d)
+ : _d(d)
+{
+ switch (_d.u16(0)) {
+ case 1: {
+ Coverage coverage(_d.offset_subtable(2));
+ if (!coverage.ok()
+ || coverage.size() != _d.u16(4))
+ throw Format("ChainContext Substitution coverage");
+ break;
+ }
+ case 2:
+ break;
+ case 3: {
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ if (ninput < 1)
+ throw Format("GSUB ChainContext Substitution input sequence");
+ Coverage coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE));
+ if (!coverage.ok())
+ throw Format("GSUB ChainContext Substitution coverage");
+ break;
+ }
+ default:
+ throw Format("GSUB ChainContext Substitution");
+ }
+}
+
+Coverage
+GsubChainContext::coverage() const noexcept
+{
+ switch (_d.u16(0)) {
+ case 1:
+ return Coverage(_d.offset_subtable(2), 0, false);
+ case 3: {
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ return Coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE), 0, false);
+ }
+ default:
+ return Coverage();
+ }
+}
+
+void
+GsubChainContext::mark_out_glyphs(const Gsub &gsub, Vector<bool> &gmap) const
+{
+ switch (_d.u16(0)) {
+ case 1: {
+ int nsubruleset = _d.u16(4);
+ for (int i = 0; i != nsubruleset; ++i) {
+ int srs_offset = _d.u16(6 + i*2);
+ int nsubrule = _d.u16(srs_offset);
+ for (int j = 0; j != nsubrule; ++j) {
+ int subrule_offset = srs_offset + _d.u16(srs_offset + 2 + j*2);
+ int nbacktrack = _d.u16(subrule_offset);
+ int input_offset = subrule_offset + 2 + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ int lookahead_offset = input_offset + 2 + (ninput-1)*2;
+ int nlookahead = _d.u16(lookahead_offset);
+ int subst_offset = lookahead_offset + 2 + nlookahead*2;
+ int nsubst = _d.u16(subst_offset);
+
+ GsubContext::subruleset_mark_out_glyphs(_d, nsubst, subst_offset + 2, gsub, gmap);
+ }
+ }
+ break;
+ }
+ case 3: {
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ int lookahead_offset = input_offset + F3_INPUT_HSIZE + ninput*2;
+ int nlookahead = _d.u16(lookahead_offset);
+ int subst_offset = lookahead_offset + F3_LOOKAHEAD_HSIZE + nlookahead*2;
+ int nsubst = _d.u16(subst_offset);
+
+ GsubContext::subruleset_mark_out_glyphs(_d, nsubst, subst_offset + F3_SUBST_HSIZE, gsub, gmap);
+ break;
+ }
+ default:
+ return;
+ }
+}
+
+bool
+GsubChainContext::f1_unparse(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ Coverage input0_coverage(_d.offset_subtable(2), 0, false);
+ Coverage::iterator i0iter = input0_coverage.begin();
+
+ for (int i0index = 0; i0index != input0_coverage.size();
+ ++i0index, ++i0iter) {
+ int srs_offset = _d.u16(6 + i0index*2);
+ int nsubrule = _d.u16(srs_offset);
+ for (int srindex = 0; srindex != nsubrule; ++srindex) {
+ int sr_offset = srs_offset + _d.u16(srs_offset + 2 + srindex*2);
+ int nbacktrack = _d.u16(sr_offset);
+ int input_offset = sr_offset + 2 + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ int lookahead_offset = input_offset + 2 + (ninput-1)*2;
+ int nlookahead = _d.u16(lookahead_offset);
+ int subst_offset = lookahead_offset + 2 + nlookahead*2;
+ int nsubst = _d.u16(subst_offset);
+ int subtab_offset = subst_offset + 2;
+
+ Substitution s(nbacktrack, ninput, ninput, nlookahead);
+ if (gsub.chaincontext_reverse_backtrack()) {
+ for (int i = 0; i != nbacktrack; ++i)
+ s.left_glyphptr()[i] = _d.u16(sr_offset + 2 + i*2);
+ } else {
+ for (int i = nbacktrack - 1; i != -1; --i)
+ s.left_glyphptr()[nbacktrack - 1 - i] = _d.u16(sr_offset + 2 + i*2);
+ }
+ Glyph* in_begin = s.in_glyphptr();
+ Glyph* out_begin = s.out_glyphptr();
+ in_begin[0] = out_begin[0] = *i0iter;
+ for (int i = 1; i != ninput; ++i)
+ in_begin[i] = out_begin[i] = _d.u16(input_offset + 2 + (i-1)*2);
+ for (int i = 0; i != ninput; ++i)
+ if (!limit.covers(in_begin[i]))
+ goto skip;
+ for (int i = 0; i != nlookahead; ++i)
+ s.right_glyphptr()[i] = _d.u16(lookahead_offset + 2 + i*2);
+
+ // now, apply referred lookups to the resulting substitution array
+ GsubContext::f1_unparse(_d, nsubst, subtab_offset, gsub, v, s);
+ skip: ;
+ }
+ }
+
+ return true;
+}
+
+bool
+GsubChainContext::f3_unparse(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ int nbacktrack = _d.u16(2);
+ int input_offset = F3_HSIZE + nbacktrack*2;
+ int ninput = _d.u16(input_offset);
+ int lookahead_offset = input_offset + F3_INPUT_HSIZE + ninput*2;
+ int nlookahead = _d.u16(lookahead_offset);
+ int subst_offset = lookahead_offset + F3_LOOKAHEAD_HSIZE + nlookahead*2;
+ int nsubst = _d.u16(subst_offset);
+
+ Vector<Coverage> backtrackc;
+ Vector<Coverage> lookaheadc;
+ if (gsub.chaincontext_reverse_backtrack()) {
+ for (int i = 0; i < nbacktrack; i++)
+ backtrackc.push_back(Coverage(_d.offset_subtable(F3_HSIZE + i*2)) & limit);
+ } else {
+ for (int i = nbacktrack - 1; i >= 0; i--)
+ backtrackc.push_back(Coverage(_d.offset_subtable(F3_HSIZE + i*2)) & limit);
+ }
+ for (int i = 0; i < nlookahead; i++)
+ lookaheadc.push_back(Coverage(_d.offset_subtable(lookahead_offset + F3_LOOKAHEAD_HSIZE + i*2)) & limit);
+
+ // give up if would generate too many substitutions
+ double n = 1;
+ for (int i = 0; i < nbacktrack; ++i)
+ n *= backtrackc[i].size();
+ for (int i = 0; i < nlookahead; ++i)
+ n *= lookaheadc[i].size();
+ for (int i = 0; i < ninput; ++i)
+ n *= (Coverage(_d.offset_subtable(input_offset + F3_INPUT_HSIZE + i*2)) & limit).size();
+ if (n > 1000000) // arbitrary cutoff
+ return false;
+
+ Vector<Coverage::iterator> backtracki;
+ Vector<Coverage::iterator> lookaheadi;
+ for (int i = 0; i < nbacktrack; i++)
+ backtracki.push_back(backtrackc[i].begin());
+ for (int i = 0; i < nlookahead; i++)
+ lookaheadi.push_back(lookaheadc[i].begin());
+
+ bool any = false;
+
+ while (1) {
+
+ // run GsubContext
+ Substitution s(nbacktrack, 0, 0, nlookahead);
+ Glyph *left_begin = s.left_glyphptr();
+ for (int i = 0; i < nbacktrack; i++)
+ left_begin[i] = *backtracki[i];
+ Glyph *right_begin = s.right_glyphptr();
+ for (int i = 0; i < nlookahead; i++)
+ right_begin[i] = *lookaheadi[i];
+
+ any |= GsubContext::f3_unparse(_d, ninput, input_offset + F3_INPUT_HSIZE, limit, nsubst, subst_offset + F3_SUBST_HSIZE, gsub, v, s);
+
+ // step iterators
+ for (int i = nlookahead - 1; i >= 0; i--) {
+ lookaheadi[i]++;
+ if (lookaheadi[i])
+ goto next;
+ lookaheadi[i] = lookaheadc[i].begin();
+ }
+ for (int i = nbacktrack - 1; i >= 0; i--) {
+ backtracki[i]++;
+ if (backtracki[i])
+ goto next;
+ backtracki[i] = backtrackc[i].begin();
+ }
+ break;
+
+ next: ;
+ }
+
+ return any;
+}
+
+bool
+GsubChainContext::unparse(const Gsub &gsub, Vector<Substitution> &v, const Coverage &limit) const
+{
+ if (_d.u16(0) == 1)
+ return f1_unparse(gsub, v, limit);
+ else if (_d.u16(0) == 3)
+ return f3_unparse(gsub, v, limit);
+ else
+ return false;
+}
+
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc
new file mode 100644
index 00000000000..0e8e4e4f6b2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfname.cc
@@ -0,0 +1,194 @@
+// -*- related-file-name: "../include/efont/otfname.hh" -*-
+
+/* otfname.{cc,hh} -- OpenType name table
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfname.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+#define USHORT_AT(d) (Data::u16_aligned(d))
+
+namespace Efont { namespace OpenType {
+
+static const uint16_t mac_roman_encoding[] = {
+ // 0x80-0x8F
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, // Adieresis Aring Ccedilla Eacute
+ 0x00D1, 0x00D6, 0x00DC, 0x00E1, // Ntilde Odieresis Udieresis aacute
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, // agrave acircumflex adieresis atilde
+ 0x00E5, 0x00E7, 0x00E9, 0x00E8, // aring ccedilla eacute egrave
+ // 0x90-0x9F
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, // ecircumflex edieresis iacute igrave
+ 0x00EE, 0x00EF, 0x00F1, 0x00F3, // icircumflex idieresis ntilde oacute
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, // ograve ocircumflex odieresis otilde
+ 0x00FA, 0x00F9, 0x00FB, 0x00FC, // uacute ugrave ucircumflex udieresis
+ // 0xA0-0xAF
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, // dagger degree cent sterling
+ 0x00A7, 0x2022, 0x00B6, 0x00DF, // section bullet paragraph germandbls
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, // registered copyright trademark acute
+ 0x00A8, 0x2260, 0x00C6, 0x00D8, // dieresis notequal AE Oslash
+ // 0xB0-0xBF
+ 0x221E, 0x00B1, 0x2264, 0x2265, // infinity plusminus lessequal greaterequal
+ 0x00A5, 0x00B5, 0x2202, 0x2211, // yen mu partialdiff summation
+ 0x220F, 0x03C0, 0x222B, 0x00AA, // product pi integral ordfeminine
+ 0x00BA, 0x03A9, 0x00E6, 0x00F8, // ordmasculine Omegagreek ae oslash
+ // 0xC0-0xCF
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, // questiondown exclamdown logicalnot radical
+ 0x0192, 0x2248, 0x2206, 0x00AB, // florin approxequal increment guillemotleft
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, // guillemotright ellipsis nbspace Agrave
+ 0x00C3, 0x00D5, 0x0152, 0x0153, // Atilde Otilde OE oe
+ // 0xD0-0xDF
+ 0x2013, 0x2014, 0x201C, 0x201D, // endash emdash quotedblleft quotedblright
+ 0x2018, 0x2019, 0x00F7, 0x25CA, // quoteleft quoteright divide lozenge
+ 0x00FF, 0x0178, 0x2044, 0x20AC, // ydieresis Ydieresis fraction Euro
+ 0x2039, 0x203A, 0xFB01, 0xFB02, // guilsinglleft guilsinglright fi fl
+ // 0xE0-0xEF
+ 0x2021, 0x00B7, 0x201A, 0x201E, // daggerdbl middot quotesinglbase quotedblbase
+ 0x2030, 0x00C2, 0x00CA, 0x00C1, // perthousand Acircumflex Ecircumflex Aacute
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, // Edieresis Egrave Iacute Icircumflex
+ 0x00CF, 0x00CC, 0x00D3, 0x00D4, // Idieresis Igrave Oacute Ocircumflex
+ // 0xF0-0xFF
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, // apple Ograve Uacute Ucircumflex
+ 0x00D9, 0x0131, 0x02C6, 0x02DC, // Ugrave dotlessi circumflex tilde
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, // macron breve dotaccent ring
+ 0x00B8, 0x02DD, 0x02DB, 0x02C7 // cedilla hungarumlaut ogonek caron
+};
+
+
+Name::Name(const String &s, ErrorHandler *errh)
+ : _str(s) {
+ _str.align(2);
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Name::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ // USHORT numTables
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (len == 0)
+ return errh->error("font has no %<name%> table"), -EFAULT;
+ if (HEADER_SIZE > len)
+ return errh->error("%<name%> table too small"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\000'))
+ return errh->error("bad %<name%> version number"), -ERANGE;
+ int count = USHORT_AT(data + 2);
+ if (HEADER_SIZE + count*NAMEREC_SIZE > len)
+ return errh->error("%<name%> table too small"), -EFAULT;
+ return 0;
+}
+
+String
+Name::name(const_iterator i) const
+{
+ if (i < end()) {
+ int stringOffset = USHORT_AT(_str.udata() + 4);
+ int length = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 8);
+ int offset = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 10);
+ if (stringOffset + offset + length <= _str.length())
+ return _str.substring(stringOffset + offset, length);
+ }
+ return String();
+}
+
+String
+Name::utf8_name(const_iterator i) const
+{
+ // This code can handle Microsoft Unicode BMP and Mac Roman encodings,
+ // but that's it
+ if (!(i < end()))
+ return String();
+ int stringOffset = USHORT_AT(_str.udata() + 4);
+ int length = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 8);
+ int offset = USHORT_AT(reinterpret_cast<const uint8_t *>(i) + 10);
+ if (stringOffset + offset + length > _str.length())
+ return String();
+ const unsigned char *begins = _str.udata() + stringOffset + offset;
+ const unsigned char *ends = begins + length;
+ if (platform(*i) == P_MICROSOFT && encoding(*i) == E_MS_UNICODE_BMP) {
+ StringAccum sa;
+ for (const unsigned char *s = begins; s + 1 < ends; s += 2)
+ sa.append_utf8(Data::u16(s));
+ return sa.take_string();
+ } else if (platform(*i) == P_MACINTOSH && encoding(*i) == E_MAC_ROMAN) {
+ StringAccum sa;
+ for (const unsigned char *s = begins; s < ends; s++)
+ if (*s >= 0x80) {
+ sa.append(begins, s);
+ sa.append_utf8(mac_roman_encoding[*s & 0x7F]);
+ begins = s + 1;
+ }
+ if (!sa)
+ return _str.substring(begins, ends);
+ else {
+ sa.append(begins, ends);
+ return sa.take_string();
+ }
+ } else
+ return _str.substring(begins, ends);
+}
+
+String
+Name::english_name(int nameid) const
+{
+ const_iterator end = this->end();
+ const_iterator it = std::find_if(begin(), end, PlatformPred(nameid, P_MICROSOFT, E_MS_UNICODE_BMP, L_MS_ENGLISH_AMERICAN));
+ if (it == end)
+ it = std::find_if(begin(), end, PlatformPred(nameid, P_MACINTOSH, E_MAC_ROMAN, 0));
+ return utf8_name(it);
+}
+
+bool
+Name::version_chaincontext_reverse_backtrack() const
+{
+ String vstr = name(std::find_if(begin(), end(), PlatformPred(N_VERSION, 1, 0, 0)));
+ const char *v = vstr.begin(), *endv = vstr.end();
+ if (v + 20 <= endv) {
+ if (v[0] != 'O' || v[1] != 'T' || v[2] != 'F' || v[3] == ';')
+ goto try_core;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 3 >= endv || v[1] != 'P' || v[2] != 'S' || v[3] == ';')
+ goto try_core;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 11 >= endv || memcmp(v + 1, "Core 1.0.", 9) != 0
+ || (v[10] != '2' && v[10] != '3')
+ || (v[11] < '0' || v[11] > '9'))
+ goto try_core;
+ return true;
+ }
+ try_core:
+ v = vstr.begin();
+ if (v + 16 > endv
+ || v[0] != 'C' || v[1] != 'o' || v[2] != 'r' || v[3] != 'e')
+ return false;
+ for (v += 4; v < endv && *v != ';'; v++)
+ /* do nothing */;
+ if (v + 12 > endv || memcmp(v, ";makeotf.lib", 12) != 0)
+ return false;
+ return true;
+}
+
+} // namespace Efont::OpenType
+} // namespace Efont
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc
new file mode 100644
index 00000000000..de06d4904b9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfos2.cc
@@ -0,0 +1,47 @@
+// -*- related-file-name: "../include/efont/otfos2.hh" -*-
+
+/* otfos2.{cc,hh} -- OpenType OS/2 table
+ *
+ * Copyright (c) 2005-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfos2.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+namespace Efont { namespace OpenType {
+
+Os2::Os2(const Data &data, ErrorHandler *errh)
+ : _data(data)
+{
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+ if (_error < 0)
+ _data = Data();
+}
+
+int
+Os2::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // USHORT version
+ if (HEADER_SIZE > _data.length())
+ return errh->error("OTF OS/2 table too small"), -EFAULT;
+ if (_data.u16(0) > 5)
+ return errh->error("unexpected OS/2 version number %d", _data.u16(0)), -ERANGE;
+ return 0;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc
new file mode 100644
index 00000000000..af04b19edcb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/otfpost.cc
@@ -0,0 +1,200 @@
+// -*- related-file-name: "../include/efont/otfpost.hh" -*-
+
+/* otfpost.{cc,hh} -- OpenType post table
+ *
+ * Copyright (c) 2006-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/otfpost.hh>
+#include <lcdf/error.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <efont/otfdata.hh> // for ntohl()
+
+#define USHORT_AT(d) (Data::u16_aligned(d))
+#define SHORT_AT(d) (Data::s16_aligned(d))
+#define ULONG_AT(d) (Data::u32_aligned(d))
+#define LONG_AT(d) (Data::s32_aligned(d))
+
+namespace Efont { namespace OpenType {
+
+static const char * const mac_names[] = {
+ ".notdef", ".null", "nonmarkingreturn", "space", // 0-3
+ "exclam", "quotedbl", "numbersign", "dollar", // 4-7
+ "percent", "ampersand", "quotesingle", "parenleft", // 8-11
+ "parenright", "asterisk", "plus", "comma", // 12-15
+ "hyphen", "period", "slash", "zero", // 16-19
+ "one", "two", "three", "four", // 20-23
+ "five", "six", "seven", "eight", // 24-27
+ "nine", "colon", "semicolon", "less", // 28-31
+ "equal", "greater", "question", "at", // 32-35
+ "A", "B", "C", "D", // 36-39
+ "E", "F", "G", "H", // 40-43
+ "I", "J", "K", "L", // 44-47
+ "M", "N", "O", "P", // 48-51
+ "Q", "R", "S", "T", // 52-55
+ "U", "V", "W", "X", // 56-59
+ "Y", "Z", "bracketleft", "backslash", // 60-63
+ "bracketright", "asciicircum", "underscore", "grave", // 64-67
+ "a", "b", "c", "d", // 68-71
+ "e", "f", "g", "h", // 72-75
+ "i", "j", "k", "l", // 76-79
+ "m", "n", "o", "p", // 80-83
+ "q", "r", "s", "t", // 84-87
+ "u", "v", "w", "x", // 88-91
+ "y", "z", "braceleft", "bar", // 92-95
+ "braceright", "asciitilde", "Adieresis", "Aring", // 96-99
+ "Ccedilla", "Eacute", "Ntilde", "Odieresis", // 100-103
+ "Udieresis", "aacute", "agrave", "acircumflex", // 104-107
+ "adieresis", "atilde", "aring", "ccedilla", // 108-111
+ "eacute", "egrave", "ecircumflex", "edieresis", // 112-115
+ "iacute", "igrave", "icircumflex", "idieresis", // 116-119
+ "ntilde", "oacute", "ograve", "ocircumflex", // 120-123
+ "odieresis", "otilde", "uacute", "ugrave", // 124-127
+ "ucircumflex", "udieresis", "dagger", "degree", // 128-131
+ "cent", "sterling", "section", "bullet", // 132-135
+ "paragraph", "germandbls", "registered", "copyright", // 136-139
+ "trademark", "acute", "dieresis", "notequal", // 140-143
+ "AE", "Oslash", "infinity", "plusminus", // 144-147
+ "lessequal", "greaterequal", "yen", "mu", // 148-151
+ "partialdiff", "summation", "product", "pi", // 152-155
+ "integral", "ordfeminine", "ordmasculine", "Omega", // 156-159
+ "ae", "oslash", "questiondown", "exclamdown", // 160-163
+ "logicalnot", "radical", "florin", "approxequal", // 164-167
+ "Delta", "guillemotleft", "guillemotright", "ellipsis", // 168-171
+ "nonbreakingspace", "Agrave", "Atilde", "Otilde", // 172-175
+ "OE", "oe", "endash", "emdash", // 176-179
+ "quotedblleft", "quotedblright", "quoteleft", "quoteright", // 180-183
+ "divide", "lozenge", "ydieresis", "Ydieresis", // 184-187
+ "fraction", "currency", "guilsinglleft", "guilsinglright", // 188-191
+ "fi", "fl", "daggerdbl", "periodcentered", // 192-195
+ "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", // 196-199
+ "Ecircumflex", "Aacute", "Edieresis", "Egrave", // 200-203
+ "Iacute", "Icircumflex", "Idieresis", "Igrave", // 204-207
+ "Oacute", "Ocircumflex", "apple", "Ograve", // 208-211
+ "Uacute", "Ucircumflex", "Ugrave", "dotlessi", // 212-215
+ "circumflex", "tilde", "macron", "breve", // 216-219
+ "dotaccent", "ring", "cedilla", "hungarumlaut", // 220-223
+ "ogonek", "caron", "Lslash", "lslash", // 224-227
+ "Scaron", "scaron", "Zcaron", "zcaron", // 228-231
+ "brokenbar", "Eth", "eth", "Yacute", // 232-235
+ "yacute", "Thorn", "thorn", "minus", // 236-239
+ "multiply", "onesuperior", "twosuperior", "threesuperior", // 240-243
+ "onehalf", "onequarter", "threequarters", "franc", // 244-247
+ "Gbreve", "gbreve", "Idotaccent", "Scedilla", // 248-251
+ "scedilla", "Cacute", "cacute", "Ccaron", // 252-255
+ "ccaron", "dcroat" // 256-257
+};
+
+
+Post::Post(const String &s, ErrorHandler *errh)
+ : _str(s), _version(0)
+{
+ _str.align_long();
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Post::parse_header(ErrorHandler *errh)
+{
+ // HEADER FORMAT:
+ // 0 FIXED version
+ // 4 FIXED italicAngle
+ // 8 FWORD underlinePosition
+ // 10 FWORD underlineThickness
+ // 12 ULONG isFixedPitch
+ // 16 ULONG minMemType42
+ // 20 ULONG maxMemType42
+ // 24 ULONG minMemType1
+ // 28 ULONG maxMemType1
+ int len = _str.length();
+ const uint8_t *data = _str.udata();
+ if (HEADER_SIZE > len)
+ return errh->error("OTF post table too small"), -EFAULT;
+ _version = USHORT_AT(data); // ignore minor version number
+ // except that version 2.5 isn't compatible
+ if (_version < 1 || _version > 3
+ || (_version == 2 && USHORT_AT(data + 2) == 0x5000))
+ return errh->error("bad post version number"), -ERANGE;
+ if (_version == 2) {
+ // VERSION 2.0 GLYPH NAMES FORMAT:
+ // 32 USHORT numberOfGlyphs
+ // 34 USHORT glyphNameIndex[mumberOfGlyphs]
+ // CHAR names[...]
+ if (HEADER_SIZE + 2 > len
+ || ((_nglyphs = USHORT_AT(data + HEADER_SIZE)),
+ HEADER_SIZE + 2 + 2 * _nglyphs > len))
+ return errh->error("OTF post table too small for glyph map"), -EFAULT;
+ int pos = HEADER_SIZE + 2 + 2 * _nglyphs;
+ while (pos < len && pos + data[pos] < len) {
+ _extend_glyph_names.push_back(pos);
+ pos += 1 + data[pos];
+ }
+ const uint8_t *gni = data + HEADER_SIZE + 2;
+ for (int i = 0, g; i < _nglyphs; ++i, gni += 2)
+ if ((g = USHORT_AT(gni)) >= _extend_glyph_names.size() + N_MAC_GLYPHS)
+ return errh->error("bad glyph name index in post");
+ } else if (_version == 1)
+ _nglyphs = N_MAC_GLYPHS;
+ else
+ _nglyphs = -1;
+
+ return 0;
+}
+
+double
+Post::italic_angle() const
+{
+ if (error() < 0)
+ return -1;
+ return (double) LONG_AT(_str.udata() + 4) / 65536.;
+}
+
+bool
+Post::is_fixed_pitch() const
+{
+ if (error() < 0)
+ return false;
+ return ULONG_AT(_str.udata() + 12) != 0;
+}
+
+bool
+Post::glyph_names(Vector<PermString> &gnames) const
+{
+ gnames.clear();
+ if (error() < 0)
+ return false;
+ if (_version == 1) {
+ for (int i = 0; i < N_MAC_GLYPHS; i++)
+ gnames.push_back(mac_names[i]);
+ return true;
+ } else if (_version == 2) {
+ const uint8_t *data = _str.udata();
+ const uint8_t *gni = data + HEADER_SIZE + 2;
+ for (int i = 0; i < _nglyphs; i++, gni += 2) {
+ int g = USHORT_AT(gni);
+ if (g < N_MAC_GLYPHS)
+ gnames.push_back(mac_names[g]);
+ else {
+ const uint8_t *n = data + _extend_glyph_names[g - N_MAC_GLYPHS];
+ gnames.push_back(PermString((const char *) n + 1, *n));
+ }
+ }
+ return true;
+ } else
+ return false;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc
new file mode 100644
index 00000000000..03d04e9097e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/pairop.cc
@@ -0,0 +1,153 @@
+// -*- related-file-name: "../include/efont/pairop.hh" -*-
+
+/* pairop.{cc,hh} -- ligature/kern font metrics
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/pairop.hh>
+#include <stdio.h>
+namespace Efont {
+
+PairProgram::PairProgram(const PairProgram &o)
+ : _reversed(o._reversed),
+ _left_map(o._left_map),
+ _op(o._op)
+{
+}
+
+
+void
+PairProgram::reserve_glyphs(int e)
+{
+ if (e <= _left_map.size()) return;
+ _left_map.resize(e, -1);
+}
+
+
+PairOpIndex
+PairProgram::find(GlyphIndex leftgi, GlyphIndex rightgi) const
+{
+ PairOpIndex opi = find_left(leftgi);
+ while (opi >= 0) {
+ if (op(opi).right() == rightgi)
+ return opi;
+ opi = op(opi).next_left();
+ }
+ return -1;
+}
+
+
+bool
+PairProgram::add_kern(GlyphIndex left, GlyphIndex right, int ki)
+{
+ PairOp newop(left, right, ki, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+bool
+PairProgram::add_lig(GlyphIndex left, GlyphIndex right, GlyphIndex result,
+ int kind)
+{
+ PairOp newop(left, right, result, kind, _left_map[left]);
+ int newopi = _op.size();
+ _op.push_back(newop);
+ _left_map[left] = newopi;
+
+ //PairOpIndex duplicate = map[newop];
+ //map.add(newop, newopi);
+
+ return false;
+}
+
+
+void
+PairProgram::unreverse()
+{
+ if (!_reversed) return;
+
+ _left_map.assign(_left_map.size(), -1);
+
+ for (PairOpIndex opi = _op.size() - 1; opi >= 0; opi--) {
+ PairOp &o = _op[opi];
+ PairOpIndex l = o.left();
+ o.set_next(_left_map[l]);
+ _left_map[l] = opi;
+ }
+
+ _reversed = false;
+}
+
+
+void
+PairProgram::optimize()
+{
+ /* PairOpIndex opi;
+
+ // Get rid of 0-valued kerns.
+ for (opi = 0; opi < opcount(); opi++) {
+ PairOp &o = op(opi);
+ if (o.is_kern() && o.value() == 0)
+ o.noopify();
+ }*/
+}
+
+
+inline const char *
+PairProgram::print_name(GlyphIndex) const
+{
+#if 0
+ if (gi == opAnychar) return "*";
+ else return glyph(gi).name();
+#endif
+ return 0;
+}
+
+
+void
+PairProgram::print() const
+{
+#if 0
+ for (GlyphIndex gi = 0; gi < glyphblock.size(); gi++)
+ if (glyphblock[gi] != -1)
+ printf("%s->B%d ", glyph(gi).name().c_str(), glyphblock[gi]);
+ printf("\n");
+
+ for (int i = 0; i < blocks.size(); i++) {
+ printf("B%-2d: ", i);
+ PairOpBlock &opb = *blocks[i];
+ for (int j = 0; j < opb.size(); j++)
+ if (opb[j].is_lig())
+ printf("%s->%s ", printname(opb[j].right()),
+ printname(opb[j].result()));
+ else if (opb[j].is_kern())
+ printf("%s[%g] ", printname(opb[j].right()), kern(opb[j].value()));
+ else if (opb[j].is_noop())
+ printf(". ");
+ if (blocks[i]->nextblock != -1)
+ printf(" :B%d", blocks[i]->nextblock);
+ printf("\n");
+ }
+#endif
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc
new file mode 100644
index 00000000000..dc3c7e8da23
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/psres.cc
@@ -0,0 +1,419 @@
+// -*- related-file-name: "../include/efont/psres.hh" -*-
+
+/* psres.{cc,hh} -- PSres.upr files
+ *
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <lcdf/slurper.hh>
+/* Get the correct functions for directory searching */
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define DIR_NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define DIR_NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif
+#include <string.h>
+namespace Efont {
+
+PsresDatabase::PsresDatabase()
+ : _section_map(0)
+{
+ _sections.push_back((PsresDatabaseSection *)0);
+}
+
+PsresDatabase::~PsresDatabase()
+{
+ for (int i = 1; i < _sections.size(); i++)
+ delete _sections[i];
+}
+
+
+PsresDatabaseSection::PsresDatabaseSection(PermString section_name)
+ : _section_name(section_name), _map(0)
+{
+ _directories.push_back(PermString());
+ _values.push_back(String());
+ _value_escaped.push_back(true);
+}
+
+
+/* read_ps_line - gathers a line in `slurper', returns true if it is a normal
+ line, false on end of file or a separator line (starts with `.'). Handles
+ continuation lines but not backslash escaping. Stores location of first
+ non-backslashed equals sign in `*equals_pos', or -1 if none. */
+
+static bool
+read_psres_line(Slurper &slurper, int *equals_pos)
+{
+ if (equals_pos) *equals_pos = -1;
+
+ char *s = slurper.next_line();
+ if (!s) return false;
+
+ bool is_terminator = s[0] == '.';
+ unsigned len, pos = 0, last_escape = ~0;
+ bool found_eq = false;
+
+ while (true) {
+ len = slurper.cur_line_length();
+ if (len == 0) break;
+
+ // process backslash escapes
+ for (; pos < len - 1; pos++) {
+ if (s[pos] == '\\') {
+ // quote the next character
+ pos++;
+ last_escape = pos;
+ } else if (!found_eq && s[pos] == '=') {
+ // an equals sign: store its position
+ if (equals_pos) *equals_pos = pos;
+ found_eq = true;
+ } else if (s[pos] == '%') {
+ // unescaped '%' is a comment; return immediately after shortening line
+ len = pos;
+ goto done;
+ }
+ }
+
+ // stop processing if not a continuation line
+ if (pos == len || s[pos] != '\\') break;
+
+ slurper.shorten_line(pos);
+ s = slurper.append_next_line();
+ }
+
+ if (pos < len && !found_eq && s[pos] == '=' && equals_pos)
+ *equals_pos = pos;
+
+ done:
+ // eat trailing whitespace, except for the space in `\ ' if it ends the line
+ // -- unless the `\' is the second `\' in a `\\'!
+ for (pos = len; pos > 0 && (s[pos-1] == ' ' || s[pos-1] == '\t'); pos--)
+ /* nada */;
+ if (pos == last_escape)
+ pos++;
+ slurper.shorten_line(pos);
+ return !is_terminator;
+}
+
+/* psres_escape: backslash escaping */
+
+static unsigned
+psres_escape(char *s, unsigned len)
+{
+ unsigned pos = 0, delta = 0;
+ while (pos < len) {
+ if (s[pos] == '\\') pos++, delta++;
+ if (delta) s[pos-delta] = s[pos];
+ pos++;
+ }
+ s[pos-delta] = 0;
+ return len-delta;
+}
+
+void
+PsresDatabaseSection::add_psres_file_section
+ (Slurper &slurper, PermString directory, bool override)
+{
+ int equals_pos;
+ bool first_line = true;
+
+ while (read_psres_line(slurper, &equals_pos)) {
+ char *s = slurper.cur_line();
+
+ // check for a directory line
+ if (first_line) {
+ first_line = false;
+ if (s[0] == '/') {
+ psres_escape(s + 1, slurper.cur_line_length() - 1);
+ directory = PermString(s + 1);
+ continue;
+ }
+ }
+
+ if (equals_pos < 0) {
+ // report error?
+ continue;
+ }
+
+ // get the key
+ unsigned len = psres_escape(s, equals_pos);
+ PermString key = PermString(s, len);
+ int index = _map[key];
+ if (!override && index > 0)
+ continue;
+
+ // double equals means absolute pathname
+ if (s[equals_pos + 1] == '=')
+ equals_pos++;
+
+ // get the value. Don't escape it yet
+ len = slurper.cur_line_length() - (equals_pos + 1);
+ String value = String(s + equals_pos + 1, len);
+
+ // stick key and value into our data structure
+ if (index == 0) {
+ index = _directories.size();
+ _directories.push_back(directory);
+ _values.push_back(value);
+ _value_escaped.push_back(false);
+ _map.insert(key, index);
+ } else {
+ _directories[index] = directory;
+ _values[index] = value;
+ _value_escaped[index] = false;
+ }
+ }
+}
+
+
+PsresDatabaseSection *
+PsresDatabase::force_section(PermString name)
+{
+ if (_section_map[name] > 0)
+ return _sections[_section_map[name]];
+ else {
+ PsresDatabaseSection *s = new PsresDatabaseSection(name);
+ int index = _sections.size();
+ _sections.push_back(s);
+ _section_map.insert(name, index);
+ return s;
+ }
+}
+
+bool
+PsresDatabase::add_one_psres_file(Slurper &slurper, bool override)
+{
+ if (!read_psres_line(slurper, 0))
+ return /* error */ false;
+
+ char *s = slurper.cur_line();
+ unsigned len = slurper.cur_line_length();
+ if (len < 12 || memcmp(s, "PS-Resources", 12) != 0)
+ return /* error */ false;
+
+ bool exclusive = (len >= 22 && memcmp(s+12, "-Exclusive", 10) == 0);
+
+ // skip list of sections
+ while (read_psres_line(slurper, 0))
+ /* nada */;
+
+ // now, read each section
+ PermString directory = slurper.filename().directory();
+
+ while (read_psres_line(slurper, 0)) {
+ s = slurper.cur_line();
+ len = psres_escape(s, slurper.cur_line_length());
+ PsresDatabaseSection *section = force_section(PermString(s, len));
+ section->add_psres_file_section(slurper, directory, override);
+ }
+
+ return exclusive;
+}
+
+bool
+PsresDatabase::add_psres_file(Filename &filename, bool override)
+{
+ Slurper slurpy(filename);
+ return add_one_psres_file(slurpy, override);
+}
+
+
+#ifndef WIN32
+
+void
+PsresDatabase::add_psres_directory(PermString directory)
+{
+ DIR *dir = opendir(directory.c_str());
+ if (!dir) return;
+
+ while (struct dirent *dirent = readdir(dir)) {
+ int len = DIR_NAMLEN(dirent);
+ if (len > 4 && dirent->d_name[0] != '.'
+ && memcmp(dirent->d_name + len - 4, ".upr", 4) == 0
+ && (len != 9 || memcmp(dirent->d_name, "PSres.upr", 9) != 0)) {
+ Filename fn(directory, PermString(dirent->d_name, len));
+ add_psres_file(fn, false);
+ }
+ }
+
+ closedir(dir);
+}
+
+#else /* WIN32 */
+
+void
+PsresDatabase::add_psres_directory(PermString directory)
+{
+ WIN32_FIND_DATA find_file_data;
+ HANDLE hnd;
+ int proceed = TRUE;
+
+ PermString search_str = permcat(directory, "/*.*");
+ hnd = FindFirstFile(search_str.c_str(), &find_file_data);
+
+ if (hnd == INVALID_HANDLE_VALUE) {
+ return;
+ }
+ while (proceed) {
+ int len = strlen(find_file_data.cFileName);
+ if (len > 4 && find_file_data.cFileName[0] != '.'
+ && _strnicmp(find_file_data.cFileName + len - 4, ".upr", 4) == 0
+ && (len != 9 || _strnicmp(find_file_data.cFileName, "PSres.upr", 9) != 0)) {
+ Filename fn(directory, PermString(find_file_data.cFileName, len));
+ add_psres_file(fn, false);
+ }
+ proceed = FindNextFile (hnd, &find_file_data);
+ }
+ FindClose(hnd);
+}
+
+#endif /* WIN32 */
+
+
+void
+PsresDatabase::add_psres_path(const char *path, const char *default_path,
+ bool override)
+{
+ if (!path && !default_path)
+ return;
+ else if (!path) {
+ path = default_path;
+ default_path = 0;
+ }
+
+ if (override && _sections.size() > 1) {
+ PsresDatabase new_db;
+ new_db.add_psres_path(path, default_path, false);
+ add_database(&new_db, true);
+ return;
+ }
+
+ while (*path) {
+ const char *epath = path;
+ while (*epath && *epath != ':') epath++;
+
+ PermString directory(path, epath - path);
+ Filename filename(directory, "PSres.upr");
+ if (epath == path) {
+ add_psres_path(default_path, 0, false);
+ default_path = 0; // don't use default path twice
+ } else if (!filename.readable() || !add_psres_file(filename, false))
+ add_psres_directory(directory);
+
+ path = (*epath ? epath+1 : epath);
+ }
+}
+
+
+void
+PsresDatabase::add_database(PsresDatabase *db, bool override)
+{
+ for (int i = 1; i < db->_sections.size(); i++) {
+ PermString section_name = db->_sections[i]->section_name();
+ PsresDatabaseSection *section = force_section(section_name);
+ section->add_section(db->_sections[i], override);
+ }
+}
+
+void
+PsresDatabaseSection::add_section(PsresDatabaseSection *s, bool override)
+{
+ for (HashMap<PermString, int>::const_iterator i = s->_map.begin(); i; i++) {
+ int value = i.value();
+ if (_map[i.key()] <= 0) {
+ int my_index = _directories.size();
+ _directories.push_back(s->_directories[value]);
+ _values.push_back(s->_values[value]);
+ _value_escaped.push_back(s->_value_escaped[value]);
+ _map.insert(i.key(), my_index);
+ } else if (override) {
+ int my_index = _map[i.key()];
+ _directories[my_index] = s->_directories[value];
+ _values[my_index] = s->_values[value];
+ _value_escaped[my_index] = s->_value_escaped[value];
+ }
+ }
+}
+
+
+const String &
+PsresDatabaseSection::value(int index)
+{
+ if (_value_escaped[index])
+ return _values[index];
+ else {
+ char *data = _values[index].mutable_data();
+ int len = psres_escape(data, _values[index].length());
+ _values[index] = _values[index].substring(0, len);
+ _value_escaped[index] = true;
+ return _values[index];
+ }
+}
+
+Filename
+PsresDatabaseSection::filename_value(PermString key)
+{
+ int index = _map[key];
+ if (!index)
+ return Filename();
+ else if (!_directories[index])
+ return Filename(value(index));
+ else
+ return Filename(_directories[index], value(index));
+}
+
+const String &
+PsresDatabase::value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->value(key);
+ else
+ return String::make_empty();
+}
+
+const String &
+PsresDatabase::unescaped_value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->unescaped_value(key);
+ else
+ return String::make_empty();
+}
+
+Filename
+PsresDatabase::filename_value(PermString sec, PermString key) const
+{
+ PsresDatabaseSection *s = section(sec);
+ if (s)
+ return s->filename_value(key);
+ else
+ return Filename();
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc
new file mode 100644
index 00000000000..3766af2f58a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1bounds.cc
@@ -0,0 +1,165 @@
+// -*- related-file-name: "../include/efont/t1bounds.hh" -*-
+
+/* t1bounds.{cc,hh} -- charstring bounding box finder
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1bounds.hh>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+namespace Efont {
+
+CharstringBounds::CharstringBounds()
+ : _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _last_xf_program(0)
+{
+}
+
+CharstringBounds::CharstringBounds(const Transform& nonfont_xf)
+ : _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _nonfont_xf(nonfont_xf), _last_xf_program(0)
+{
+}
+
+CharstringBounds::CharstringBounds(const Transform &nonfont_xf, const Vector<double> &weight)
+ : CharstringInterp(weight),
+ _lb(UNKDOUBLE, UNKDOUBLE), _rt(UNKDOUBLE, UNKDOUBLE),
+ _nonfont_xf(nonfont_xf), _last_xf_program(0)
+{
+}
+
+void
+CharstringBounds::clear()
+{
+ _lb = _rt = Point(UNKDOUBLE, UNKDOUBLE);
+ _width = Point(0, 0);
+}
+
+void
+CharstringBounds::xf_mark(const Bezier &b)
+{
+ Bezier b1, b2;
+ b.halve(b1, b2);
+ xf_mark(b1.point(3));
+ if (!xf_controls_inside(b1))
+ xf_mark(b1);
+ if (!xf_controls_inside(b2))
+ xf_mark(b2);
+}
+
+void
+CharstringBounds::act_width(int, const Point &w)
+{
+ _width = w * _xf;
+}
+
+void
+CharstringBounds::act_line(int, const Point &p0, const Point &p1)
+{
+ mark(p0);
+ mark(p1);
+}
+
+void
+CharstringBounds::act_curve(int, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Point q0 = p0 * _xf;
+ Point q1 = p1 * _xf;
+ Point q2 = p2 * _xf;
+ Point q3 = p3 * _xf;
+
+ xf_mark(q0);
+ xf_mark(q3);
+
+ if (!xf_inside(q1) || !xf_inside(q2)) {
+ Bezier b(q0, q1, q2, q3);
+ xf_mark(b);
+ }
+}
+
+void
+CharstringBounds::set_xf(const CharstringProgram *program)
+{
+ if (_last_xf_program != program) {
+ _last_xf_program = program;
+ double matrix[6];
+ program->font_matrix(matrix);
+ Transform font_xf = Transform(matrix).scaled(program->units_per_em());
+ font_xf.check_null(0.001);
+ _xf = _nonfont_xf * font_xf;
+ }
+}
+
+bool
+CharstringBounds::char_bounds(const CharstringContext &g, bool shift)
+{
+ set_xf(g.program);
+ CharstringInterp::interpret(g);
+ if (shift) {
+ _xf.raw_translate(_width - _xf.translation());
+ _nonfont_xf.raw_translate(_width - _nonfont_xf.translation());
+ _width = Point(0, 0);
+ }
+ return error() >= 0;
+}
+
+void
+CharstringBounds::translate(double dx, double dy)
+{
+ _xf.translate(dx, dy);
+ _nonfont_xf.translate(dx, dy);
+}
+
+bool
+CharstringBounds::output(double bb[4], double& width, bool use_cur_width) const
+{
+ if (!KNOWN(_lb.x))
+ bb[0] = bb[1] = bb[2] = bb[3] = 0;
+ else {
+ bb[0] = _lb.x;
+ bb[1] = _lb.y;
+ bb[2] = _rt.x;
+ bb[3] = _rt.y;
+ }
+ if (use_cur_width)
+ width = _width.x;
+ else {
+ Point p = Point(0, 0) * _xf;
+ width = p.x;
+ }
+ return error() >= 0;
+}
+
+bool
+CharstringBounds::bounds(const Transform& transform, const CharstringContext& g,
+ double bb[4], double& width)
+{
+ CharstringBounds b(transform);
+ b.char_bounds(g, false);
+ return b.output(bb, width, true);
+}
+
+bool
+CharstringBounds::bounds(const CharstringContext &g,
+ double bb[4], double& width)
+{
+ CharstringBounds b;
+ b.char_bounds(g, false);
+ return b.output(bb, width, true);
+}
+
+} // namespace Efont
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc
new file mode 100644
index 00000000000..f4060e607b9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1cs.cc
@@ -0,0 +1,369 @@
+// -*- related-file-name: "../include/efont/t1cs.hh" -*-
+
+/* t1cs.{cc,hh} -- Type 1/2 charstrings
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1cs.hh>
+#include <efont/t1interp.hh>
+#include <string.h>
+namespace Efont {
+
+const char * const Charstring::command_names[] = {
+ "error", "hstem", "UNKNOWN_2", "vstem", "vmoveto",
+ "rlineto", "hlineto", "vlineto", "rrcurveto", "closepath",
+
+ "callsubr", "return", "escape", "hsbw", "endchar",
+ "UNKNOWN_15", "blend", "UNKNOWN_17", "hstemhm", "hintmask",
+
+ "cntrmask", "rmoveto", "hmoveto", "vstemhm", "rcurveline",
+ "rlinecurve", "vvcurveto", "hhcurveto", "shortint", "callgsubr",
+
+ "vhcurveto", "hvcurveto", "dotsection", "vstem3", "hstem3",
+ "and", "or", "not", "seac", "sbw",
+
+ "store", "abs", "add", "sub", "div",
+ "load", "neg", "eq", "callothersubr", "pop",
+
+ "drop", "UNKNOWN_12_19", "put", "get", "ifelse",
+ "random", "mul", "UNKNOWN_12_25", "sqrt", "dup",
+
+ "exch", "index", "roll", "UNKNOWN_12_31", "UNKNOWN_12_32",
+ "setcurrentpoint", "hflex", "flex", "hflex1", "flex1"
+};
+
+const char * const Charstring::standard_encoding[256] = {
+ /* 00x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 01x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 02x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 03x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 04x */ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent",
+ "ampersand", "quoteright",
+ /* 05x */ "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen",
+ "period", "slash",
+ /* 06x */ "zero", "one", "two", "three", "four", "five", "six", "seven",
+ /* 07x */ "eight", "nine", "colon", "semicolon", "less", "equal",
+ "greater", "question",
+ /* 10x */ "at", "A", "B", "C", "D", "E", "F", "G",
+ /* 11x */ "H", "I", "J", "K", "L", "M", "N", "O",
+ /* 12x */ "P", "Q", "R", "S", "T", "U", "V", "W",
+ /* 13x */ "X", "Y", "Z", "bracketleft", "backslash", "bracketright",
+ "asciicircum", "underscore",
+ /* 14x */ "quoteleft", "a", "b", "c", "d", "e", "f", "g",
+ /* 15x */ "h", "i", "j", "k", "l", "m", "n", "o",
+ /* 16x */ "p", "q", "r", "s", "t", "u", "v", "w",
+ /* 17x */ "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", 0,
+ /* 20x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 21x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 22x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 23x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 24x */ 0, "exclamdown", "cent", "sterling", "fraction", "yen",
+ "florin", "section",
+ /* 25x */ "currency", "quotesingle", "quotedblleft", "guillemotleft",
+ "guilsinglleft", "guilsinglright", "fi", "fl",
+ /* 26x */ 0, "endash", "dagger", "daggerdbl", "periodcentered", 0,
+ "paragraph", "bullet",
+ /* 27x */ "quotesinglbase", "quotedblbase", "quotedblright",
+ "guillemotright", "ellipsis", "perthousand", 0, "questiondown",
+ /* 30x */ 0, "grave", "acute", "circumflex", "tilde", "macron",
+ "breve", "dotaccent",
+ /* 31x */ "dieresis", 0, "ring", "cedilla", 0, "hungarumlaut",
+ "ogonek", "caron",
+ /* 32x */ "emdash", 0, 0, 0, 0, 0, 0, 0,
+ /* 33x */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 34x */ 0, "AE", 0, "ordfeminine", 0, 0, 0, 0,
+ /* 35x */ "Lslash", "Oslash", "OE", "ordmasculine", 0, 0, 0, 0,
+ /* 36x */ 0, "ae", 0, 0, 0, "dotlessi", 0, 0,
+ /* 37x */ "lslash", "oslash", "oe", "germandbls", 0, 0, 0, 0,
+};
+
+
+Charstring::~Charstring()
+{
+}
+
+String
+Charstring::command_name(int cmd)
+{
+ if (cmd >= 0 && cmd <= cLastCommand)
+ return command_names[cmd];
+ else if (cmd < cEscapeDelta + 256)
+ return String("COMMAND_12_") + String(cmd - cEscapeDelta);
+ else
+ return String("<INVALID>");
+}
+
+
+Type1Charstring::Type1Charstring(int lenIV, const String &s)
+ : Charstring(), _key(-1)
+{
+ if (lenIV < 0) // no charstring encryption
+ _s = s;
+ else if (lenIV < s.length()) {
+ const unsigned char *d = reinterpret_cast<const unsigned char*>(s.data());
+ _key = t1R_cs;
+ for (int i = 0; i < lenIV; i++, d++)
+ _key = ((*d + _key) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ _s = s.substring(lenIV);
+ }
+}
+
+void
+Type1Charstring::prepend(const Type1Charstring &t1cs)
+{
+ if (_key >= 0)
+ decrypt();
+ if (t1cs._key >= 0)
+ t1cs.decrypt();
+ _s = t1cs._s + _s;
+}
+
+void
+Type1Charstring::decrypt() const
+{
+ if (_key >= 0) {
+ int r = _key;
+ uint8_t *d = reinterpret_cast<uint8_t *>(_s.mutable_data());
+ for (int i = 0; i < _s.length(); i++, d++) {
+ uint8_t encrypted = *d;
+ *d = encrypted ^ (r >> 8);
+ r = ((encrypted + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ }
+ _key = -1;
+ }
+}
+
+bool
+Type1Charstring::process(CharstringInterp &interp) const
+{
+ const uint8_t *data = Type1Charstring::data();
+ int left = _s.length();
+
+ while (left > 0) {
+ bool more;
+ int ahead;
+
+ if (*data >= 32 && *data <= 246) { // push small number
+ more = interp.number(data[0] - 139);
+ ahead = 1;
+
+ } else if (*data < 32) { // a command
+ if (*data == cEscape) {
+ if (left < 2)
+ goto runoff_error;
+ more = interp.type1_command(cEscapeDelta + data[1]);
+ ahead = 2;
+ } else if (*data == cShortint) { // short integer
+ if (left < 3)
+ goto runoff_error;
+ int16_t val = (data[1] << 8) | data[2];
+ more = interp.number(val);
+ ahead = 3;
+ } else {
+ more = interp.type1_command(data[0]);
+ ahead = 1;
+ }
+
+ } else if (*data >= 247 && *data <= 250) { // push medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = + ((data[0] - 247) << 8) + 108 + data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else if (*data >= 251 && *data <= 254) { // push negative medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = - ((data[0] - 251) << 8) - 108 - data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else { // 255: push huge number
+ if (left < 5)
+ goto runoff_error;
+ int32_t val = ((uint32_t) data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ more = interp.number(val);
+ ahead = 5;
+ }
+
+ if (!more)
+ return interp.error() == CharstringInterp::errOK;
+
+ data += ahead;
+ left -= ahead;
+ }
+
+ runoff_error:
+ interp.error(CharstringInterp::errRunoff);
+ return false;
+}
+
+int
+Type1Charstring::first_caret_after(int pos) const
+{
+ const uint8_t *data = Type1Charstring::data();
+ const uint8_t *edata = data + (pos < length() ? pos : length());
+
+ while (data < edata) {
+ if (*data >= 32 && *data <= 246) // push small number
+ data++;
+ else if (*data < 32) { // a command
+ if (*data == cEscape)
+ data += 2;
+ else if (*data == cShortint)
+ data += 3;
+ else
+ data++;
+ } else if (*data >= 247 && *data <= 254) // push medium number
+ data += 2;
+ else // 255: push huge number
+ data += 5;
+ }
+
+ const uint8_t *odata = Type1Charstring::data();
+ return (data > odata + length() ? length() : data - odata);
+}
+
+void
+Type1Charstring::assign_substring(int pos, int len, const String &cs)
+{
+ if (_key >= 0)
+ decrypt();
+ if (pos < 0 || len < 0 || pos + len >= _s.length())
+ /* do nothing */;
+ else if (cs.length() == len) {
+ char *d = _s.mutable_data();
+ memcpy(d + pos, cs.data(), cs.length());
+ } else if (cs.length() <= len) {
+ char *d = _s.mutable_data();
+ memcpy(d + pos, cs.data(), cs.length());
+ memmove(d + pos + cs.length(), d + pos + len, _s.length() - pos - len);
+ _s = _s.substring(0, cs.length() - len);
+ } else
+ _s = _s.substring(0, pos) + cs + _s.substring(pos + len);
+}
+
+
+bool
+Type2Charstring::process(CharstringInterp &interp) const
+{
+ const uint8_t *data = Type2Charstring::data();
+ int left = _s.length();
+
+ while (left > 0) {
+ bool more;
+ int ahead;
+
+ if (*data >= 32 && *data <= 246) { // push small number
+ more = interp.number(data[0] - 139);
+ ahead = 1;
+
+ } else if (*data < 32) { // a command
+ if (*data == cEscape) {
+ if (left < 2)
+ goto runoff_error;
+ more = interp.type2_command(cEscapeDelta + data[1], 0, 0);
+ ahead = 2;
+ } else if (*data == cShortint) { // short integer
+ if (left < 3)
+ goto runoff_error;
+ int16_t val = (data[1] << 8) | data[2];
+ more = interp.number(val);
+ ahead = 3;
+ } else if (*data == cHintmask || *data == cCntrmask) {
+ int left_ptr = left - 1;
+ more = interp.type2_command(data[0], data + 1, &left_ptr);
+ ahead = 1 + (left - 1) - left_ptr;
+ } else {
+ more = interp.type2_command(data[0], 0, 0);
+ ahead = 1;
+ }
+
+ } else if (*data >= 247 && *data <= 250) { // push medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = + ((data[0] - 247) << 8) + 108 + data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else if (*data >= 251 && *data <= 254) { // push negative medium number
+ if (left < 2)
+ goto runoff_error;
+ int val = - ((data[0] - 251) << 8) - 108 - data[1];
+ more = interp.number(val);
+ ahead = 2;
+
+ } else { // 255: push huge number
+ if (left < 5)
+ goto runoff_error;
+ int32_t val = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+ more = interp.number(val / 65536.);
+ ahead = 5;
+ }
+
+ if (!more)
+ return interp.error() == CharstringInterp::errOK;
+
+ data += ahead;
+ left -= ahead;
+ }
+
+ runoff_error:
+ interp.error(CharstringInterp::errRunoff);
+ return false;
+}
+
+
+CharstringProgram::CharstringProgram(unsigned units_per_em)
+ : _parent_program(false),
+ _units_per_em(units_per_em ? units_per_em : 1000) {
+}
+
+const CharstringProgram *
+CharstringProgram::child_program(int) const
+{
+ return this;
+}
+
+void
+CharstringProgram::font_matrix(double matrix[6]) const
+{
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+}
+
+void
+CharstringProgram::glyph_names(Vector<PermString> &gnames) const
+{
+ int n = nglyphs();
+ gnames.resize(n);
+ for (int i = 0; i < n; i++)
+ gnames[i] = glyph_name(i);
+}
+
+Vector<double> *
+CharstringProgram::mm_vector(VectorType, bool) const
+{
+ return 0;
+}
+
+double
+CharstringProgram::global_width_x(bool) const
+{
+ return UNKDOUBLE;
+}
+
+}
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc
new file mode 100644
index 00000000000..7c970374fe2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1csgen.cc
@@ -0,0 +1,636 @@
+// -*- related-file-name: "../include/efont/t1csgen.hh" -*-
+
+/* t1csgen.{cc,hh} -- Type 1 charstring generation
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1csgen.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <math.h>
+namespace Efont {
+
+static const char * const command_desc[] = {
+ 0, 0, 0, 0, "y",
+ "xy", "x", "y", "xyxyxy", 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, "xy", "x", 0, 0,
+ 0, 0, 0, 0, 0,
+
+ "yxyx", "xxyy", 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0,
+ "XY", 0, 0, 0, 0
+};
+
+Type1CharstringGen::Type1CharstringGen(int precision)
+{
+ if (precision >= 1 && precision <= 107)
+ _precision = precision;
+ else
+ _precision = 5;
+ _f_precision = _precision;
+ clear();
+}
+
+void
+Type1CharstringGen::clear()
+{
+ _ncs.clear();
+ _true = _false = Point(0, 0);
+ _state = S_INITIAL;
+}
+
+
+void
+Type1CharstringGen::gen_rational(int big_val, int divisor)
+{
+ int frac = big_val % divisor;
+ int val = (frac == 0 ? big_val / divisor : big_val);
+
+ if (val >= -107 && val <= 107)
+ _ncs.append((char)(val + 139));
+
+ else if (val >= -1131 && val <= 1131) {
+ int base = val < 0 ? 251 : 247;
+ if (val < 0) val = -val;
+ val -= 108;
+ int w = val % 256;
+ val = (val - w) / 256;
+ _ncs.append((char)(val + base));
+ _ncs.append((char)w);
+
+ } else {
+ _ncs.append('\377');
+ long l = val;
+ _ncs.append((char)((l >> 24) & 0xFF));
+ _ncs.append((char)((l >> 16) & 0xFF));
+ _ncs.append((char)((l >> 8) & 0xFF));
+ _ncs.append((char)((l >> 0) & 0xFF));
+ }
+
+ if (frac != 0) {
+ _ncs.append((char)(divisor + 139));
+ _ncs.append((char)Charstring::cEscape);
+ _ncs.append((char)(Charstring::cDiv - Charstring::cEscapeDelta));
+ }
+}
+
+void
+Type1CharstringGen::gen_number(double float_val, int kind)
+{
+ switch (kind) {
+ case 'x':
+ _true.x += float_val;
+ float_val = _true.x - _false.x;
+ break;
+ case 'y':
+ _true.y += float_val;
+ float_val = _true.y - _false.y;
+ break;
+ case 'X':
+ _true.x = float_val;
+ break;
+ case 'Y':
+ _true.y = float_val;
+ break;
+ }
+
+ // 30.Jul.2003 - Avoid rounding differences between platforms with the
+ // extra 0.00001.
+ int big_val = (int)floor(float_val * _f_precision + 0.50001);
+
+ gen_rational(big_val, _precision);
+
+ float_val = big_val / _f_precision;
+ switch (kind) {
+ case 'x':
+ _false.x += float_val;
+ break;
+ case 'y':
+ _false.y += float_val;
+ break;
+ case 'X':
+ _false.x = float_val;
+ break;
+ case 'Y':
+ _false.y = float_val;
+ break;
+ }
+}
+
+
+void
+Type1CharstringGen::gen_command(int command)
+{
+ if (command >= Charstring::cEscapeDelta) {
+ _ncs.append((char)Charstring::cEscape);
+ _ncs.append((char)(command - Charstring::cEscapeDelta));
+ if (command != Charstring::cSbw)
+ _state = S_GEN;
+ } else {
+ _ncs.append((char)command);
+ if (command > Charstring::cVmoveto && command != Charstring::cHsbw)
+ _state = S_GEN;
+ }
+}
+
+bool
+Type1CharstringGen::gen_stem3_stack(CharstringInterp &interp)
+{
+ // special handling to ensure rounding doesn't generate an invalid stem3
+ // hint
+ if (interp.size() < 6)
+ return false;
+
+ // sort hints
+ int i0, i1, i2;
+ if (interp.at(0) > interp.at(2))
+ i0 = 2, i1 = 0;
+ else
+ i0 = 0, i1 = 2;
+ if (interp.at(4) < interp.at(i0))
+ i2 = i1, i1 = i0, i0 = 4;
+ else if (interp.at(4) < interp.at(i1))
+ i2 = i1, i1 = 4;
+ else
+ i2 = 4;
+
+ // check constraints. count "almost equal" as equal
+ double stemw0 = interp.at(i0+1), stemw2 = interp.at(i2+1);
+ if ((int)(1024*(stemw0 - stemw2) + .5) != 0)
+ return false;
+
+ double c0 = interp.at(i0) + interp.at(i0+1)/2;
+ double c1 = interp.at(i1) + interp.at(i1+1)/2;
+ double c2 = interp.at(i2) + interp.at(i2+1)/2;
+ if ((int)(1024*((c1 - c0) - (c2 - c1)) + .5) != 0)
+ return false;
+
+ // if all constraints are satisfied now, make sure they are also satisfied
+ // after rounding
+ int big_v0 = (int)floor(interp.at(i0) * _f_precision + 0.50001);
+ int big_v2 = (int)floor(interp.at(i2) * _f_precision + 0.50001);
+ int big_stemw0 = (int)floor(stemw0 * _f_precision + 0.50001);
+ int big_stemw1 = (int)floor(interp.at(i1+1) * _f_precision + 0.50001);
+
+ int big_v1_times2 = big_v0 + big_v2 + big_stemw0 - big_stemw1;
+
+ gen_rational(big_v0, _precision);
+ gen_rational(big_stemw0, _precision);
+ if (big_v1_times2 % 2)
+ gen_rational(big_v1_times2, 2 * _precision);
+ else
+ gen_rational(big_v1_times2 / 2, _precision);
+ gen_rational(big_stemw1, _precision);
+ gen_rational(big_v2, _precision);
+ gen_rational(big_stemw0, _precision);
+
+ interp.clear();
+ return true;
+}
+
+void
+Type1CharstringGen::gen_stack(CharstringInterp &interp, int for_cmd)
+{
+ const char *str = ((unsigned)for_cmd <= Charstring::cLastCommand ? command_desc[for_cmd] : (const char *)0);
+ if ((for_cmd == Charstring::cHstem3 || for_cmd == Charstring::cVstem3)
+ && gen_stem3_stack(interp))
+ return;
+
+ int i;
+ for (i = 0; str && *str && i < interp.size(); i++, str++)
+ gen_number(interp.at(i), *str);
+ for (; i < interp.size(); i++)
+ gen_number(interp.at(i));
+ interp.clear();
+}
+
+void
+Type1CharstringGen::gen_moveto(const Point &p, bool closepath, bool always)
+{
+ // make sure we generate some moveto on the first command
+
+ Point d = p - _true;
+ int big_dx = (int)floor(d.x * _f_precision + 0.50001);
+ int big_dy = (int)floor(d.y * _f_precision + 0.50001);
+
+ if (big_dx == 0 && big_dy == 0 && _state != S_INITIAL && !always)
+ /* do nothing */;
+ else {
+ if (closepath)
+ gen_command(Charstring::cClosepath);
+ if (big_dy == 0) {
+ gen_number(d.x, 'x');
+ gen_command(Charstring::cHmoveto);
+ } else if (big_dx == 0) {
+ gen_number(d.y, 'y');
+ gen_command(Charstring::cVmoveto);
+ } else {
+ gen_number(d.x, 'x');
+ gen_number(d.y, 'y');
+ gen_command(Charstring::cRmoveto);
+ }
+ }
+
+ _true = p;
+}
+
+void
+Type1CharstringGen::append_charstring(const String &s)
+{
+ _ncs << s;
+}
+
+Type1Charstring *
+Type1CharstringGen::output()
+{
+ return new Type1Charstring(take_string());
+}
+
+void
+Type1CharstringGen::output(Type1Charstring &cs)
+{
+ cs.assign(take_string());
+}
+
+String
+Type1CharstringGen::callsubr_string(int subr)
+{
+ Type1CharstringGen csg;
+ csg.gen_number(subr);
+ csg.gen_command(Charstring::cCallsubr);
+ return csg._ncs.take_string();
+}
+
+
+/*****
+ * Type1CharstringGenInterp
+ **/
+
+Type1CharstringGenInterp::Type1CharstringGenInterp(int precision)
+ : _csgen(precision), _hint_csgen(precision),
+ _direct_hr(false), _hr_storage(0),
+ _max_flex_height(0),
+ _had_flex(false), _had_bad_flex(false), _had_hr(false)
+{
+}
+
+void
+Type1CharstringGenInterp::set_hint_replacement_storage(Type1Font *font)
+{
+ _hr_storage = font;
+ _hr_firstsubr = font->nsubrs();
+}
+
+
+// generating charstring commands
+
+inline void
+Type1CharstringGenInterp::gen_number(double n, int what)
+{
+ _csgen.gen_number(n, what);
+}
+
+inline void
+Type1CharstringGenInterp::gen_command(int what)
+{
+ _csgen.gen_command(what);
+}
+
+void
+Type1CharstringGenInterp::gen_sbw(bool hints_follow)
+{
+ if (!hints_follow && nhints())
+ act_hintmask(Cs::cHintmask, 0, nhints());
+ else if (left_sidebearing().y == 0 && _width.y == 0) {
+ gen_number(left_sidebearing().x, 'X');
+ gen_number(_width.x);
+ gen_command(Cs::cHsbw);
+ } else {
+ gen_number(left_sidebearing().x, 'X');
+ gen_number(left_sidebearing().y, 'Y');
+ gen_number(_width.x);
+ gen_number(_width.y);
+ gen_command(Cs::cSbw);
+ }
+ _state = S_CLOSED;
+}
+
+void
+Type1CharstringGenInterp::act_width(int, const Point &p)
+{
+ _width = p;
+}
+
+void
+Type1CharstringGenInterp::act_seac(int, double asb, double adx, double ady, int bchar, int achar)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ gen_number(asb);
+ gen_number(adx);
+ gen_number(ady);
+ gen_number(bchar);
+ gen_number(achar);
+ gen_command(Cs::cSeac);
+ _state = S_SEAC;
+}
+
+void
+Type1CharstringGenInterp::swap_stem_hints()
+{
+ _stem_pos.clear();
+ _stem_width.clear();
+ _stem_hstem.clear();
+ _in_hr = true;
+}
+
+void
+Type1CharstringGenInterp::act_hstem(int, double pos, double width)
+{
+ if (_state != S_INITIAL && !_in_hr)
+ swap_stem_hints();
+ _stem_pos.push_back(pos);
+ _stem_width.push_back(width);
+ _stem_hstem.push_back(1);
+}
+
+void
+Type1CharstringGenInterp::act_vstem(int, double pos, double width)
+{
+ if (_state != S_INITIAL && !_in_hr)
+ swap_stem_hints();
+ _stem_pos.push_back(pos);
+ _stem_width.push_back(width);
+ _stem_hstem.push_back(0);
+}
+
+String
+Type1CharstringGenInterp::gen_hints(const unsigned char *data, int nhints) const
+{
+ _hint_csgen.clear();
+ unsigned char mask = 0x80;
+ for (int i = 0; i < nhints; i++) {
+ if (*data & mask) {
+ double offset = (_stem_hstem[i] ? left_sidebearing().y : left_sidebearing().x);
+ _hint_csgen.gen_number(_stem_pos[i] - offset);
+ _hint_csgen.gen_number(_stem_width[i]);
+ _hint_csgen.gen_command(_stem_hstem[i] ? Cs::cHstem : Cs::cVstem);
+ }
+ if ((mask >>= 1) == 0)
+ data++, mask = 0x80;
+ }
+ return _hint_csgen.take_string();
+}
+
+void
+Type1CharstringGenInterp::act_hintmask(int cmd, const unsigned char *data, int nhints)
+{
+ if (cmd == Cs::cCntrmask || nhints > Type1CharstringGenInterp::nhints())
+ return;
+
+ String data_holder;
+ if (!data) {
+ data_holder = String::make_fill('\377', ((nhints - 1) >> 3) + 1);
+ data = data_holder.udata();
+ }
+
+ String hints = gen_hints(data, nhints);
+ _in_hr = false;
+
+ if (_state == S_INITIAL || _direct_hr) {
+ _last_hints = hints;
+ if (_state == S_INITIAL)
+ gen_sbw(true);
+ _csgen.append_charstring(hints);
+ } else if (_hr_storage && hints != _last_hints) {
+ _last_hints = hints;
+ hints += (char)(Cs::cReturn);
+
+ int subrno = -1, nsubrs = _hr_storage->nsubrs();
+ for (int i = _hr_firstsubr; i < nsubrs; i++)
+ if (Type1Subr *s = _hr_storage->subr_x(i))
+ if (s->t1cs() == hints) {
+ subrno = i;
+ break;
+ }
+
+ if (subrno < 0 && _hr_storage->set_subr(nsubrs, Type1Charstring(hints)))
+ subrno = nsubrs;
+
+ if (subrno >= 0) {
+ _had_hr = true;
+ _csgen.gen_number(subrno);
+ _csgen.gen_number(4);
+ _csgen.gen_command(Cs::cCallsubr);
+ }
+ }
+}
+
+void
+Type1CharstringGenInterp::act_line(int cmd, const Point &a, const Point &b)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(a, _state == S_OPEN, false);
+ _state = S_OPEN;
+ if (a.x == b.x) {
+ gen_number(b.y - a.y, 'y');
+ gen_command(Cs::cVlineto);
+ } else if (a.y == b.y) {
+ gen_number(b.x - a.x, 'x');
+ gen_command(Cs::cHlineto);
+ } else {
+ gen_number(b.x - a.x, 'x');
+ gen_number(b.y - a.y, 'y');
+ gen_command(Cs::cRlineto);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_curve(int cmd, const Point &a, const Point &b, const Point &c, const Point &d)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(a, _state == S_OPEN, false);
+ _state = S_OPEN;
+ if (b.y == a.y && d.x == c.x) {
+ gen_number(b.x - a.x, 'x');
+ gen_number(c.x - b.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.y - c.y, 'y');
+ gen_command(Cs::cHvcurveto);
+ } else if (b.x == a.x && d.y == c.y) {
+ gen_number(b.y - a.y, 'y');
+ gen_number(c.x - a.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.x - c.x, 'x');
+ gen_command(Cs::cVhcurveto);
+ } else {
+ gen_number(b.x - a.x, 'x');
+ gen_number(b.y - a.y, 'y');
+ gen_number(c.x - b.x, 'x');
+ gen_number(c.y - b.y, 'y');
+ gen_number(d.x - c.x, 'x');
+ gen_number(d.y - c.y, 'y');
+ gen_command(Cs::cRrcurveto);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ _csgen.gen_moveto(p0, _state == S_OPEN, false);
+ _state = S_OPEN;
+
+ // 1. Outer endpoints must have same x (or y) coordinate
+ bool v_ok = (p0.x == p7.x);
+ bool h_ok = (p0.y == p7.y);
+
+ // 2. Join point and its neighboring controls must be at an extreme
+ if (v_ok && p2.x == p3_4.x && p3_4.x == p5.x) {
+ double distance = fabs(p3_4.x - p0.x);
+ int sign = (p3_4.x < p0.x ? -1 : 1);
+ if (sign * (p1.x - p0.x) < 0 || sign * (p1.x - p0.x) > distance
+ || sign * (p6.x - p0.x) < 0 || sign * (p6.x - p0.x) > distance)
+ v_ok = false;
+ } else
+ v_ok = false;
+
+ if (h_ok && p2.y == p3_4.y && p3_4.y == p5.y) {
+ double distance = fabs(p3_4.y - p0.y);
+ int sign = (p3_4.y < p0.y ? -1 : 1);
+ if (sign * (p1.y - p0.y) < 0 || sign * (p1.y - p0.y) > distance
+ || sign * (p6.y - p0.y) < 0 || sign * (p6.y - p0.y) > distance)
+ h_ok = false;
+ } else
+ h_ok = false;
+
+ // 3. Flex height <= 20
+ if (v_ok && fabs(p3_4.x - p0.x) > 20)
+ v_ok = false;
+ if (h_ok && fabs(p3_4.y - p0.y) > 20)
+ h_ok = false;
+
+ // generate flex commands
+ if (v_ok || h_ok) {
+ _had_flex = true;
+ Point p_reference = (h_ok ? Point(p3_4.x, p0.y) : Point(p0.x, p3_4.y));
+
+ _csgen.gen_number(1);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p_reference, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p1, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p2, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p3_4, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p5, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p6, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_moveto(p7, false, true);
+ _csgen.gen_number(2);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ _csgen.gen_number(flex_depth);
+ _csgen.gen_number(p7.x, 'X');
+ _csgen.gen_number(p7.y, 'Y');
+ _csgen.gen_number(0);
+ _csgen.gen_command(Cs::cCallsubr);
+
+ double flex_height = fabs(h_ok ? p3_4.y - p0.y : p3_4.x - p0.x);
+ if (flex_height > _max_flex_height)
+ _max_flex_height = flex_height;
+ } else {
+ _had_bad_flex = true;
+ act_curve(cmd, p0, p1, p2, p3_4);
+ act_curve(cmd, p3_4, p5, p6, p7);
+ }
+}
+
+void
+Type1CharstringGenInterp::act_closepath(int cmd)
+{
+ if (_in_hr)
+ act_hintmask(cmd, 0, nhints());
+ gen_command(Cs::cClosepath);
+ _state = S_CLOSED;
+}
+
+void
+Type1CharstringGenInterp::intermediate_output(Type1Charstring &out)
+{
+ _csgen.output(out);
+ _state = S_INITIAL;
+ act_hintmask(Cs::cEndchar, 0, nhints());
+}
+
+void
+Type1CharstringGenInterp::run(const CharstringContext &g, Type1Charstring &out)
+{
+ _width = Point(0, 0);
+ _csgen.clear();
+ swap_stem_hints();
+ _state = S_INITIAL;
+ _in_hr = false;
+
+ CharstringInterp::interpret(g);
+
+ if (_state == S_INITIAL)
+ gen_sbw(false);
+ else if (_in_hr)
+ act_hintmask(Cs::cEndchar, 0, nhints());
+ if (_state != S_SEAC)
+ _csgen.gen_command(Cs::cEndchar);
+
+ _csgen.output(out);
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc
new file mode 100644
index 00000000000..82ab06e0389
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1font.cc
@@ -0,0 +1,916 @@
+// -*- related-file-name: "../include/efont/t1font.hh" -*-
+
+/* t1font.{cc,hh} -- Type 1 font
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+namespace Efont {
+
+static PermString::Initializer initializer;
+static PermString lenIV_str = "lenIV";
+static PermString FontInfo_str = "FontInfo";
+
+Type1Font::Type1Font(PermString name)
+ : CharstringProgram(1000),
+ _cached_defs(false), _built(true), _font_name(name), _glyph_map(-1),
+ _encoding(0), _cached_mmspace(0), _mmspace(0), _synthetic_item(0)
+{
+ _dict = new HashMap<PermString, Type1Definition *>[dLast];
+ for (int i = 0; i < dLast; i++) {
+ _index[i] = -1;
+ _dict_deltas[i] = 0;
+ _dict[i].set_default_value((Type1Definition *)0);
+ }
+}
+
+Type1Font::Type1Font(Type1Reader &reader)
+ : CharstringProgram(1000),
+ _cached_defs(false), _built(false), _glyph_map(-1), _encoding(0),
+ _cached_mmspace(0), _mmspace(0), _synthetic_item(0)
+{
+ _dict = new HashMap<PermString, Type1Definition *>[dLast];
+ for (int i = 0; i < dLast; i++) {
+ _index[i] = -1;
+ _dict_deltas[i] = 0;
+ _dict[i].set_default_value((Type1Definition *)0);
+ }
+ read(reader);
+}
+
+Type1Font::~Type1Font()
+{
+ delete[] _dict;
+ for (int i = 0; i < _items.size(); i++)
+ delete _items[i];
+ delete _mmspace;
+ for (int i = 0; i < _subrs.size(); i++)
+ delete _subrs[i];
+ if (!_synthetic_item)
+ for (int i = 0; i < _glyphs.size(); i++)
+ delete _glyphs[i];
+}
+
+void
+Type1Font::set_item(int i, Type1Item *it)
+{
+ delete _items[i];
+ _items[i] = it;
+}
+
+static const char * const dict_starters[] = {
+ "0 dict begin", "/FontInfo 0 dict dup begin", "dup /Private 0 dict dup begin", "/Blend 0 dict dup begin", 0, 0
+};
+
+void
+Type1Font::add_definition(int dict, Type1Definition *t1d)
+{
+ if (_index[dict] < 0) {
+ if (_built && dict_starters[dict])
+ add_item(new Type1CopyItem(dict_starters[dict]));
+ _index[dict] = _items.size();
+ }
+ add_item(t1d);
+ set_dict(dict, t1d->name(), t1d);
+}
+
+void
+Type1Font::add_type1_encoding(Type1Encoding *e)
+{
+ if (_encoding) {
+ for (Type1Item** t1i = _items.begin(); t1i < _items.end(); t1i++)
+ if (*t1i == _encoding) {
+ delete _encoding;
+ *t1i = _encoding = e;
+ return;
+ }
+ }
+ _encoding = e;
+ add_item(e);
+}
+
+void
+Type1Font::add_glyph(Type1Subr *s)
+{
+ int &g = _glyph_map.find_force(s->name(), _glyphs.size());
+ if (g == _glyphs.size())
+ _glyphs.push_back(s);
+ else {
+ delete _glyphs[g];
+ _glyphs[g] = s;
+ }
+}
+
+int
+Type1Font::read(Type1Reader &reader)
+{
+ Dict cur_dict = dFont;
+ int eexec_state = 0;
+ bool have_subrs = false;
+ bool have_charstrings = false;
+ int lenIV = 4;
+ Type1SubrGroupItem *cur_group = 0;
+ int cur_group_count = 0;
+
+ StringAccum accum;
+ while (reader.next_line(accum)) {
+
+ // check for NULL STRING
+ int x_length = accum.length();
+ if (!x_length)
+ continue;
+ const char *x = accum.c_str(); // ensure we don't run off the string
+
+ // check for CHARSTRINGS
+ if (reader.was_charstring()) {
+ Type1Subr *fcs = Type1Subr::make(x, x_length, reader.charstring_start(), reader.charstring_length(), lenIV);
+
+ if (fcs->is_subr()) {
+ if (fcs->subrno() >= _subrs.size())
+ _subrs.resize(fcs->subrno() + 30, (Type1Subr *)0);
+ if (_subrs[fcs->subrno()]) // hybrid font program
+ delete _subrs[fcs->subrno()];
+ _subrs[fcs->subrno()] = fcs;
+ if (!have_subrs && _items.size()) {
+ if (Type1CopyItem *item = _items.back()->cast_copy()) {
+ cur_group = new Type1SubrGroupItem
+ (this, true, item->value());
+ cur_group_count = 0;
+ _items.back() = cur_group;
+ delete item;
+ }
+ have_subrs = true;
+ }
+
+ } else {
+ add_glyph(fcs);
+ if (!have_charstrings && _items.size()) {
+ if (Type1CopyItem *item = _items.back()->cast_copy()) {
+ cur_group = new Type1SubrGroupItem
+ (this, false, item->value());
+ cur_group_count = 0;
+ _items.back() = cur_group;
+ delete item;
+ }
+ have_charstrings = true;
+ }
+ }
+
+ accum.clear();
+ continue;
+ }
+
+ // check for COMMENTS
+ if (x[0] == '%') {
+ add_item(new Type1CopyItem(accum.take_string()));
+ continue;
+ }
+
+ // check for CHARSTRING START
+ // 5/29/1999: beware of charstring start-like things that don't have
+ // `readstring' in them!
+ if (!_charstring_definer
+ && strstr(x, "string currentfile") != 0
+ && strstr(x, "readstring") != 0) {
+ const char *sb = x;
+ while (*sb && *sb != '/')
+ sb++;
+ const char *se = sb + 1;
+ while (*sb && *se && *se != ' ' && *se != '{')
+ se++;
+ if (*sb && *se) {
+ _charstring_definer = permprintf(" %*s ", se - sb - 1, sb + 1);
+ reader.set_charstring_definer(_charstring_definer);
+ add_item(new Type1CopyItem(accum.take_string()));
+ continue;
+ }
+ }
+
+ // check for ENCODING
+ if (!_encoding && strncmp(x, "/Encoding ", 10) == 0) {
+ read_encoding(reader, x + 10);
+ accum.clear();
+ continue;
+ }
+
+ // check for a DEFINITION
+ if (x[0] == '/') {
+ definition_succeed:
+ Type1Definition *t1d = Type1Definition::make(accum, &reader);
+ if (!t1d)
+ goto definition_fail;
+ if (t1d->name() == lenIV_str)
+ t1d->value_int(lenIV);
+ add_definition(cur_dict, t1d);
+ accum.clear();
+ continue;
+ } else if (x[0] == ' ') {
+ const char *y;
+ for (y = x; y[0] == ' '; y++)
+ ;
+ if (y[0] == '/')
+ goto definition_succeed;
+ }
+
+ definition_fail:
+
+ // check for ZEROS special case
+ if (eexec_state == 2) {
+ // In eexec_state 2 (right after turning off eexec), the opening
+ // part of the string will have some 0 bytes followed by '0's.
+ // Change the 0 bytes into textual '0's.
+ int zeros = 0;
+ while (x[zeros] == 0 && x_length > 0)
+ zeros++, x_length--;
+ add_item(new Type1CopyItem(String::make_fill('0', zeros * 2 + x_length)));
+ eexec_state = 3;
+ accum.clear();
+ continue;
+ }
+
+ // check for MODIFIED FONT
+ if (eexec_state == 1 && strstr(x, "FontDirectory") != 0
+ && read_synthetic_font(reader, x, accum)) {
+ accum.clear();
+ continue;
+ }
+
+ // check for END-OF-CHARSTRING-GROUP TEXT
+ if (cur_group) {
+ if (cur_group_count == 0
+ || ((strstr(x, "end") != 0 || strstr(x, "put") != 0)
+ && strchr(x, '/') == 0)) {
+ cur_group->add_end_text(x);
+ cur_group_count++;
+ accum.clear();
+ continue;
+ }
+ cur_group = 0;
+ }
+
+ // add COPY ITEM
+ String s = accum.take_string();
+ add_item(new Type1CopyItem(s));
+ x = s.data();
+
+ if (eexec_state == 0 && strncmp(x, "currentfile eexec", 17) == 0 && (isspace((unsigned char) x[17]) || !x[17])) {
+ // allow arbitrary whitespace after "currentfile eexec".
+ // note: strlen("currentfile eexec") == 17
+ for (x += 17; isspace((unsigned char) *x); x++)
+ /* nada */;
+ reader.switch_eexec(true, (unsigned char *)x, (s.data() + s.length()) - x);
+ set_item(nitems() - 1, new Type1EexecItem(true));
+ eexec_state = 1;
+ } else if (eexec_state == 1 && strstr(x, "currentfile closefile") != 0) {
+ reader.switch_eexec(false, 0, 0);
+ add_item(new Type1EexecItem(false));
+ eexec_state = 2;
+ } else if (strstr(x, "begin") != 0) {
+ // 30.Sep.2002: NuevaMM's BlendFontInfo dict starts with a simple
+ // "/FontInfo ... begin" inside a "/Blend ... begin".
+ Dict was_dict = cur_dict;
+ if (strstr(x, "/Private") != 0)
+ cur_dict = dPrivate;
+ else if (strstr(x, "/FontInfo") != 0)
+ cur_dict = dFontInfo;
+ else
+ cur_dict = dFont;
+ if (strstr(x, "/Blend") != 0)
+ cur_dict = (Dict)(cur_dict + dBlend);
+ else if (was_dict == dBlend && cur_dict == dFontInfo)
+ cur_dict = (Dict)(cur_dict + dBlend);
+ } else if (cur_dict == dFontInfo && strstr(x, "end") != 0)
+ cur_dict = dFont;
+ }
+
+ // set dictionary deltas
+ for (int i = dFI; i < dLast; i++)
+ _dict_deltas[i] = get_dict_size(i) - _dict[i].size();
+ // borrow glyphs and glyph map from _synthetic_item
+ if (!_glyphs.size() && _synthetic_item) {
+ _glyphs = _synthetic_item->included_font()->_glyphs;
+ _glyph_map = _synthetic_item->included_font()->_glyph_map;
+ }
+
+ return (ok() ? 0 : -1);
+}
+
+bool
+Type1Font::ok() const
+{
+ return font_name() && _glyphs.size() > 0;
+}
+
+static char *skip_comment_space(char *s)
+{
+ while (1) {
+ if (isspace((unsigned char) *s))
+ ++s;
+ else if (*s == '%') {
+ for (++s; *s != '\r' && *s != '\n' && *s != '\0'; ++s)
+ /* nada */;
+ } else
+ return s;
+ }
+}
+
+void
+Type1Font::read_encoding(Type1Reader &reader, const char *first_line)
+{
+ while (isspace((unsigned char) *first_line))
+ first_line++;
+ if (strncmp(first_line, "StandardEncoding", 16) == 0) {
+ add_type1_encoding(Type1Encoding::standard_encoding());
+ return;
+ }
+
+ add_type1_encoding(new Type1Encoding);
+
+ bool got_any = false;
+ StringAccum accum;
+
+ while (reader.next_line(accum)) {
+
+ // check for NULL STRING
+ if (!accum.length())
+ continue;
+ accum.append('\0'); // ensure we don't run off the string
+ char *pos = accum.data();
+
+ // skip to first `dup' token
+ if (!got_any) {
+ if (!(pos = strstr(pos, "dup"))) {
+ pos = accum.data();
+ goto check_done;
+ }
+ }
+
+ // parse as many `dup INDEX */CHARNAME put' as there are in the line
+ while (1) {
+ // skip spaces, look for `dup '
+ while (isspace((unsigned char) pos[0]))
+ ++pos;
+ if (pos[0] == '%')
+ pos = skip_comment_space(pos);
+ if (pos[0] != 'd' || pos[1] != 'u' || pos[2] != 'p' || !isspace((unsigned char) pos[3]))
+ break;
+
+ // look for `INDEX */'
+ char *scan;
+ int char_value = strtol(pos + 4, &scan, 10);
+ if (scan[0] == '#' && char_value > 0 && char_value < 37
+ && isalnum((unsigned char) scan[1]))
+ char_value = strtol(scan + 1, &scan, char_value);
+ while (isspace((unsigned char) scan[0]))
+ scan++;
+ if (char_value < 0 || char_value >= 256 || scan[0] != '/')
+ break;
+
+ // look for `CHARNAME put'
+ scan++;
+ char *name_pos = scan;
+ while (!isspace((unsigned char) scan[0]) && scan[0] != '\0')
+ ++scan;
+ char *name_end = scan;
+ while (isspace((unsigned char) scan[0]))
+ ++scan;
+ if (scan[0] != 'p' || scan[1] != 'u' || scan[2] != 't')
+ break;
+
+ _encoding->put(char_value, PermString(name_pos, name_end - name_pos));
+ got_any = true;
+ pos = scan + 3;
+ }
+
+ check_done:
+ // check for end of encoding section
+ // if not over, add COPY ITEM for leftovers we didn't parse
+ if ((strstr(pos, "readonly") != 0 || strstr(pos, "def") != 0)
+ && (got_any || strstr(pos, "for") == 0)) {
+ _encoding->set_definer(String(pos));
+ return;
+ } else if (got_any && *pos)
+ add_item(new Type1CopyItem(String(pos)));
+
+ accum.clear();
+ }
+}
+
+static bool
+read_synthetic_string(Type1Reader &reader, StringAccum &wrong_accum,
+ const char *format, int *value)
+{
+ StringAccum accum;
+ if (!reader.next_line(accum))
+ return false;
+ wrong_accum << accum;
+ accum.append('\0'); // ensure we don't run off the string
+ int n = 0;
+ if (value)
+ sscanf(accum.data(), format, value, &n);
+ else
+ sscanf(accum.data(), format, &n);
+ return (n != 0 && (isspace((unsigned char) accum[n]) || accum[n] == '\0'));
+}
+
+bool
+Type1Font::read_synthetic_font(Type1Reader &reader, const char *first_line,
+ StringAccum &wrong_accum)
+{
+ // read font name
+ PermString font_name;
+ {
+ char *x = new char[strlen(first_line) + 1];
+ int n = 0;
+ sscanf(first_line, "FontDirectory /%[^] \t\r\n[{}/] known {%n", x, &n);
+ if (n && (isspace((unsigned char) first_line[n]) || first_line[n] == 0))
+ font_name = x;
+ delete[] x;
+ if (!font_name)
+ return false;
+ }
+
+ // check UniqueID
+ int unique_id;
+ {
+ StringAccum accum;
+ if (!reader.next_line(accum))
+ return false;
+ wrong_accum << accum;
+ accum.c_str(); // ensure we don't run off the string
+ const char *y = accum.data();
+ if (*y != '/' || strncmp(y + 1, font_name.c_str(), font_name.length()) != 0)
+ return false;
+ int n = 0;
+ sscanf(y + font_name.length() + 1, " findfont%n", &n);
+ y = strstr(y, "/UniqueID get ");
+ if (n == 0 || y == 0)
+ return false;
+ n = 0;
+ sscanf(y + 14, "%d%n", &unique_id, &n);
+ if (n == 0)
+ return false;
+ }
+
+ // check lines that say how much text
+ int multiplier;
+ if (!read_synthetic_string(reader, wrong_accum, "save userdict /fbufstr %d string put%n", &multiplier))
+ return false;
+
+ int multiplicand;
+ if (!read_synthetic_string(reader, wrong_accum, "%d {currentfile fbufstr readstring { pop } { clear currentfile%n", &multiplicand))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "closefile /fontdownload /unexpectedEOF /.error cvx exec } ifelse } repeat%n", 0))
+ return false;
+
+ int extra;
+ if (!read_synthetic_string(reader, wrong_accum, "currentfile %d string readstring { pop } { clear currentfile%n", &extra))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "closefile /fontdownload /unexpectedEOF /.error cvx exec } ifelse%n", 0))
+ return false;
+
+ if (!read_synthetic_string(reader, wrong_accum, "restore } if } if%n", 0))
+ return false;
+
+ Type1SubsetReader subreader(&reader, multiplier*multiplicand + extra);
+ Type1Font *synthetic = new Type1Font(subreader);
+ if (!synthetic->ok())
+ delete synthetic;
+ else {
+ _synthetic_item = new Type1IncludedFont(synthetic, unique_id);
+ add_item(_synthetic_item);
+ }
+ return true;
+}
+
+
+void
+Type1Font::undo_synthetic()
+{
+ // A synthetic font doesn't share arbitrary code with its base font; it
+ // shares just the CharStrings dictionary, according to Adobe Type 1 Font
+ // Format. We take advantage of this.
+
+ if (!_synthetic_item)
+ return;
+
+ int mod_ii;
+ for (mod_ii = nitems() - 1; mod_ii >= 0; mod_ii--)
+ if (_items[mod_ii] == _synthetic_item)
+ break;
+ if (mod_ii < 0)
+ return;
+
+ // remove synthetic item and the reference to the included font
+ _items[mod_ii] = new Type1NullItem;
+ if (Type1CopyItem *copy = _items[mod_ii+1]->cast_copy())
+ if (copy->value().find_left("findfont") >= 0) {
+ delete copy;
+ _items[mod_ii+1] = new Type1NullItem;
+ }
+
+ Type1Font *f = _synthetic_item->included_font();
+ // its glyphs are already stored in our _glyphs array
+
+ // copy SubrGroupItem from `f' into `this'
+ Type1SubrGroupItem *oth_subrs = 0, *oth_glyphs = 0;
+ for (int i = 0; i < f->nitems(); i++)
+ if (Type1SubrGroupItem *subr_grp = f->_items[i]->cast_subr_group()) {
+ if (subr_grp->is_subrs())
+ oth_subrs = subr_grp;
+ else
+ oth_glyphs = subr_grp;
+ }
+
+ assert(oth_glyphs != 0);
+
+ for (int i = nitems() - 1; i >= 0; i--)
+ if (Type1SubrGroupItem *subr_grp = _items[i]->cast_subr_group()) {
+ assert(subr_grp->is_subrs());
+ if (oth_subrs)
+ subr_grp->set_end_text(oth_subrs->end_text());
+ shift_indices(i + 1, 1);
+ Type1SubrGroupItem *nsubr = new Type1SubrGroupItem(*oth_glyphs, this);
+ _items[i + 1] = nsubr;
+ break;
+ }
+
+ // delete included font
+ f->_glyphs.clear(); // don't delete glyphs; we've stolen them
+ delete _synthetic_item;
+ _synthetic_item = 0;
+}
+
+
+Type1Charstring *
+Type1Font::subr(int e) const
+{
+ if (e >= 0 && e < _subrs.size() && _subrs[e])
+ return &_subrs[e]->t1cs();
+ else
+ return 0;
+}
+
+PermString
+Type1Font::glyph_name(int i) const
+{
+ if (i >= 0 && i < _glyphs.size() && _glyphs[i])
+ return _glyphs[i]->name();
+ else
+ return PermString();
+}
+
+Type1Charstring *
+Type1Font::glyph(int i) const
+{
+ if (i >= 0 && i < _glyphs.size() && _glyphs[i])
+ return &_glyphs[i]->t1cs();
+ else
+ return 0;
+}
+
+Type1Charstring *
+Type1Font::glyph(PermString name) const
+{
+ int i = _glyph_map[name];
+ if (i >= 0)
+ return &_glyphs[i]->t1cs();
+ else
+ return 0;
+}
+
+
+bool
+Type1Font::set_subr(int e, const Type1Charstring &t1cs, PermString definer)
+{
+ if (e < 0)
+ return false;
+ if (e >= _subrs.size())
+ _subrs.resize(e + 1, (Type1Subr *)0);
+
+ if (!definer) {
+ Type1Subr *pattern_subr = _subrs[e];
+ for (int i = 0; i < _subrs.size() && !pattern_subr; i++)
+ pattern_subr = _subrs[i];
+ if (!pattern_subr)
+ return false;
+ definer = pattern_subr->definer();
+ }
+
+ delete _subrs[e];
+ _subrs[e] = Type1Subr::make_subr(e, t1cs, definer);
+ return true;
+}
+
+bool
+Type1Font::remove_subr(int e)
+{
+ if (e < 0 || e >= _subrs.size())
+ return false;
+ delete _subrs[e];
+ _subrs[e] = 0;
+ return true;
+}
+
+void
+Type1Font::fill_in_subrs()
+{
+ while (_subrs.size() && _subrs.back() == 0)
+ _subrs.pop_back();
+ for (int i = 0; i < _subrs.size(); i++)
+ if (!_subrs[i])
+ set_subr(i, Type1Charstring(String::make_stable("\013", 1)));
+}
+
+void
+Type1Font::renumber_subrs(const Vector<int> &renumbering)
+{
+ Vector<Type1Subr *> old_subrs;
+ old_subrs.swap(_subrs);
+ for (int i = 0; i < old_subrs.size() && i < renumbering.size(); i++) {
+ int r = renumbering[i];
+ Type1Subr *s = old_subrs[i];
+ if (r >= 0 && s)
+ set_subr(r, s->t1cs(), s->definer());
+ else
+ delete s;
+ }
+ for (int i = renumbering.size(); i < old_subrs.size(); i++)
+ delete old_subrs[i];
+}
+
+
+void
+Type1Font::shift_indices(int move_index, int delta)
+{
+ if (delta > 0) {
+ _items.resize(_items.size() + delta, (Type1Item *)0);
+ memmove(&_items[move_index + delta], &_items[move_index],
+ sizeof(Type1Item *) * (_items.size() - move_index - delta));
+
+ for (int i = dFont; i < dLast; i++)
+ if (_index[i] > move_index)
+ _index[i] += delta;
+
+ } else {
+ memmove(&_items[move_index], &_items[move_index - delta],
+ sizeof(Type1Item *) * (_items.size() - (move_index - delta)));
+ _items.resize(_items.size() + delta);
+
+ for (int i = dFont; i < dLast; i++)
+ if (_index[i] >= move_index) {
+ if (_index[i] < move_index - delta)
+ _index[i] = move_index;
+ else
+ _index[i] += delta;
+ }
+ }
+}
+
+Type1Definition *
+Type1Font::ensure(Dict dict, PermString name)
+{
+ assert(_index[dict] >= 0);
+ Type1Definition *def = _dict[dict][name];
+ if (!def) {
+ def = new Type1Definition(name, 0, "def");
+ int move_index = _index[dict];
+ shift_indices(move_index, 1);
+ _items[move_index] = def;
+ set_dict(dict, name, def);
+ }
+ return def;
+}
+
+void
+Type1Font::add_header_comment(const String &comment)
+{
+ int i;
+ for (i = 0; i < _items.size(); i++) {
+ Type1CopyItem *copy = _items[i]->cast_copy();
+ if (!copy || copy->value()[0] != '%')
+ break;
+ }
+ shift_indices(i, 1);
+ _items[i] = new Type1CopyItem(comment);
+}
+
+
+Type1Item *
+Type1Font::dict_size_item(int d) const
+{
+ switch (d) {
+
+ case dF:
+ if (_built && _index[d] > 0)
+ return _items[_index[d] - 1];
+ break;
+
+ case dFI: case dP: case dB:
+ if (_index[d] > 0)
+ return _items[_index[d] - 1];
+ break;
+
+ case dBFI:
+ if (Type1Item *t1i = b_dict("FontInfo"))
+ return t1i;
+ else if (_index[dBFI] > 0)
+ return _items[_index[dBFI] - 1];
+ break;
+
+ case dBP:
+ if (Type1Item *t1i = b_dict("Private"))
+ return t1i;
+ else if (_index[dBP] > 0)
+ return _items[_index[dBP] - 1];
+ break;
+
+ }
+ return 0;
+}
+
+int
+Type1Font::get_dict_size(int d) const
+{
+ Type1Item *item = dict_size_item(d);
+ if (!item)
+ /* nada */;
+ else if (Type1Definition *t1d = item->cast_definition()) {
+ int num;
+ if (strstr(t1d->definer().c_str(), "dict") && t1d->value_int(num))
+ return num;
+ } else if (Type1CopyItem *copy = item->cast_copy()) {
+ String value = copy->value();
+ int pos = value.find_left(" dict");
+ if (pos >= 1 && isdigit((unsigned char) value[pos - 1])) {
+ while (pos >= 1 && isdigit((unsigned char) value[pos - 1]))
+ pos--;
+ return strtol(value.data() + pos, 0, 10);
+ }
+ }
+ return -1;
+}
+
+void
+Type1Font::set_dict_size(int d, int size)
+{
+ Type1Item *item = dict_size_item(d);
+ if (!item)
+ return;
+ if (Type1Definition *t1d = item->cast_definition()) {
+ int num;
+ if (strstr(t1d->definer().c_str(), "dict") && t1d->value_int(num))
+ t1d->set_int(size);
+ } else if (Type1CopyItem *copy = item->cast_copy()) {
+ String value = copy->value();
+ int pos = value.find_left(" dict");
+ if (pos >= 1 && isdigit((unsigned char) value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit((unsigned char) value[numpos - 1]))
+ numpos--;
+ StringAccum accum;
+ accum << value.substring(0, numpos) << size << value.substring(pos);
+ copy->set_value(accum.take_string());
+ }
+ }
+}
+
+void
+Type1Font::write(Type1Writer &w)
+{
+ Type1Definition *lenIV_def = p_dict("lenIV");
+ int lenIV = 4;
+ if (lenIV_def)
+ lenIV_def->value_int(lenIV);
+ w.set_charstring_start(_charstring_definer);
+ w.set_lenIV(lenIV);
+
+ // change dict sizes
+ for (int i = dF; i < dLast; i++)
+ set_dict_size(i, _dict[i].size() + _dict_deltas[i]);
+ // XXX what if dict had nothing, but now has something?
+
+ for (int i = 0; i < _items.size(); i++)
+ _items[i]->gen(w);
+
+ w.flush();
+}
+
+void
+Type1Font::cache_defs() const
+{
+ Type1Definition *t1d = dict("FontName");
+ if (t1d)
+ t1d->value_name(_font_name);
+ _cached_defs = true;
+}
+
+MultipleMasterSpace *
+Type1Font::mmspace() const
+{
+ if (!_cached_mmspace)
+ create_mmspace();
+ return _mmspace;
+}
+
+MultipleMasterSpace *
+Type1Font::create_mmspace(ErrorHandler *errh) const
+{
+ if (_cached_mmspace)
+ return _mmspace;
+ _cached_mmspace = 1;
+
+ Type1Definition *t1d;
+
+ Vector< Vector<double> > master_positions;
+ t1d = fi_dict("BlendDesignPositions");
+ if (!t1d || !t1d->value_numvec_vec(master_positions))
+ return 0;
+
+ int nmasters = master_positions.size();
+ if (nmasters <= 0) {
+ errh->error("bad BlendDesignPositions");
+ return 0;
+ }
+ int naxes = master_positions[0].size();
+ _mmspace = new MultipleMasterSpace(font_name(), naxes, nmasters);
+ _mmspace->set_master_positions(master_positions);
+
+ Vector< Vector<double> > normalize_in, normalize_out;
+ t1d = fi_dict("BlendDesignMap");
+ if (t1d && t1d->value_normalize(normalize_in, normalize_out))
+ _mmspace->set_normalize(normalize_in, normalize_out);
+
+ Vector<PermString> axis_types;
+ t1d = fi_dict("BlendAxisTypes");
+ if (t1d && t1d->value_namevec(axis_types) && axis_types.size() == naxes)
+ for (int a = 0; a < naxes; a++)
+ _mmspace->set_axis_type(a, axis_types[a]);
+
+ int ndv, cdv;
+ Type1Charstring *cs;
+ t1d = p_dict("NDV");
+ if (t1d && t1d->value_int(ndv) && (cs = subr(ndv)))
+ _mmspace->set_ndv(*cs);
+ t1d = p_dict("CDV");
+ if (t1d && t1d->value_int(cdv) && (cs = subr(cdv)))
+ _mmspace->set_cdv(*cs);
+
+ Vector<double> design_vector;
+ t1d = dict("DesignVector");
+ if (t1d && t1d->value_numvec(design_vector))
+ _mmspace->set_design_vector(design_vector);
+
+ Vector<double> weight_vector;
+ t1d = dict("WeightVector");
+ if (t1d && t1d->value_numvec(weight_vector))
+ _mmspace->set_weight_vector(weight_vector);
+
+ if (!_mmspace->check(errh)) {
+ delete _mmspace;
+ _mmspace = 0;
+ }
+ return _mmspace;
+}
+
+void
+Type1Font::uncache_defs()
+{
+ _cached_defs = false;
+}
+
+void
+Type1Font::font_matrix(double matrix[6]) const
+{
+ Vector<double> t1d_matrix;
+ Type1Definition *t1d = dict("FontMatrix");
+ if (t1d && t1d->value_numvec(t1d_matrix) && t1d_matrix.size() == 6)
+ memcpy(&matrix[0], &t1d_matrix[0], sizeof(double) * 6);
+ else {
+ matrix[0] = matrix[3] = 0.001;
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+ }
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc
new file mode 100644
index 00000000000..c62e25a392a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1fontskel.cc
@@ -0,0 +1,332 @@
+/* t1fontskel.cc -- Type 1 font skeleton
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+namespace Efont {
+
+#if HAVE_ADOBE_CODE
+
+static const char* othersubrs_code =
+// This version of the OtherSubrs code for old PostScript interpreters comes from
+// https://github.com/adobe-type-tools/afdko/blob/master/FDK/Tools/Programs/public/lib/source/t1write/t1write_flexothers.txt
+// (commit 3f4eeec). The Adobe Font Development Kit is licensed by the Apache
+// License, 2.0, which permits this embedding.
+"% Copyright 1987-1990 Adobe Systems Incorporated. All rights reserved.\n"
+"/OtherSubrs[systemdict/internaldict known{1183615869 systemdict/internaldict\n"
+"get exec/FlxProc known{save true}{false}ifelse}{userdict/internaldict known\n"
+"not{userdict/internaldict{count 0 eq{/internaldict errordict/invalidaccess get\n"
+"exec}if dup type/integertype ne{/internaldict errordict/invalidaccess get exec\n"
+"}if dup 1183615869 eq{pop 0}{/internaldict errordict/invalidaccess get exec}\n"
+"ifelse}dup 14 get 1 25 dict put bind executeonly put}if 1183615869 userdict\n"
+"/internaldict get exec/FlxProc known{save true}{false}ifelse}ifelse[systemdict\n"
+"/internaldict known not{100 dict/begin cvx/mtx matrix/def cvx}if systemdict\n"
+"/currentpacking known{currentpacking true setpacking}if{systemdict\n"
+"/internaldict known{1183615869 systemdict/internaldict get exec dup/$FlxDict\n"
+"known not{dup dup length exch maxlength eq{pop userdict dup/$FlxDict known not\n"
+"{100 dict begin/mtx matrix def dup/$FlxDict currentdict put end}if}{100 dict\n"
+"begin/mtx matrix def dup/$FlxDict currentdict put end}ifelse}if/$FlxDict get\n"
+"begin}if grestore/exdef{exch def}def/dmin exch abs 100 div def/epX exdef/epY\n"
+"exdef/c4y2 exdef/c4x2 exdef/c4y1 exdef/c4x1 exdef/c4y0 exdef/c4x0 exdef/c3y2\n"
+"exdef/c3x2 exdef/c3y1 exdef/c3x1 exdef/c3y0 exdef/c3x0 exdef/c1y2 exdef/c1x2\n"
+"exdef/c2x2 c4x2 def/c2y2 c4y2 def/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt\n"
+"def/PickCoords{{c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}{\n"
+"c3x0 c3y0 c3x1 c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}ifelse/y5 exdef/x5\n"
+"exdef/y4 exdef/x4 exdef/y3 exdef/x3 exdef/y2 exdef/x2 exdef/y1 exdef/x1 exdef\n"
+"/y0 exdef/x0 exdef}def mtx currentmatrix pop mtx 0 get abs 1e-05 lt mtx 3 get\n"
+"abs 1e-05 lt or{/flipXY -1 def}{mtx 1 get abs 1e-05 lt mtx 2 get abs 1e-05 lt\n"
+"or{/flipXY 1 def}{/flipXY 0 def}ifelse}ifelse/erosion 1 def systemdict\n"
+"/internaldict known{1183615869 systemdict/internaldict get exec dup/erosion\n"
+"known{/erosion get/erosion exch def}{pop}ifelse}if yflag{flipXY 0 eq c3y2 c4y2\n"
+"eq or{false PickCoords}{/shrink c3y2 c4y2 eq{0}{c1y2 c4y2 sub c3y2 c4y2 sub\n"
+"div abs}ifelse def/yshrink{c4y2 sub shrink mul c4y2 add}def/c1y0 c3y0 yshrink\n"
+"def/c1y1 c3y1 yshrink def/c2y0 c4y0 yshrink def/c2y1 c4y1 yshrink def/c1x0\n"
+"c3x0 def/c1x1 c3x1 def/c2x0 c4x0 def/c2x1 c4x1 def/dY 0 c3y2 c1y2 sub round\n"
+"dtransform flipXY 1 eq{exch}if pop abs def dY dmin lt PickCoords y2 c1y2 sub\n"
+"abs .001 gt{c1x2 c1y2 transform flipXY 1 eq{exch}if/cx exch def/cy exch def/dY\n"
+"0 y2 c1y2 sub round dtransform flipXY 1 eq{exch}if pop def dY round dup 0 ne{\n"
+"/dY exdef}{pop dY 0 lt{-1}{1}ifelse/dY exdef}ifelse/erode PaintType 2 ne\n"
+"erosion .5 ge and def erode{/cy cy .5 sub def}if/ey cy dY add def/ey ey\n"
+"ceiling ey sub ey floor add def erode{/ey ey .5 add def}if ey cx flipXY 1 eq{\n"
+"exch}if itransform exch pop y2 sub/eShift exch def/y1 y1 eShift add def/y2 y2\n"
+"eShift add def/y3 y3 eShift add def}if}ifelse}{flipXY 0 eq c3x2 c4x2 eq or{\n"
+"false PickCoords}{/shrink c3x2 c4x2 eq{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs}\n"
+"ifelse def/xshrink{c4x2 sub shrink mul c4x2 add}def/c1x0 c3x0 xshrink def/c1x1\n"
+"c3x1 xshrink def/c2x0 c4x0 xshrink def/c2x1 c4x1 xshrink def/c1y0 c3y0 def\n"
+"/c1y1 c3y1 def/c2y0 c4y0 def/c2y1 c4y1 def/dX c3x2 c1x2 sub round 0 dtransform\n"
+"flipXY -1 eq{exch}if pop abs def dX dmin lt PickCoords x2 c1x2 sub abs .001 gt\n"
+"{c1x2 c1y2 transform flipXY -1 eq{exch}if/cy exch def/cx exch def/dX x2 c1x2\n"
+"sub round 0 dtransform flipXY -1 eq{exch}if pop def dX round dup 0 ne{/dX\n"
+"exdef}{pop dX 0 lt{-1}{1}ifelse/dX exdef}ifelse/erode PaintType 2 ne erosion\n"
+".5 ge and def erode{/cx cx .5 sub def}if/ex cx dX add def/ex ex ceiling ex sub\n"
+"ex floor add def erode{/ex ex .5 add def}if ex cy flipXY -1 eq{exch}if\n"
+"itransform pop x2 sub/eShift exch def/x1 x1 eShift add def/x2 x2 eShift add\n"
+"def/x3 x3 eShift add def}if}ifelse}ifelse x2 x5 eq y2 y5 eq or{x5 y5 lineto}{\n"
+"x0 y0 x1 y1 x2 y2 curveto x3 y3 x4 y4 x5 y5 curveto}ifelse epY epX}systemdict\n"
+"/currentpacking known{exch setpacking}if/exec cvx/end cvx]cvx executeonly exch\n"
+"{pop true exch restore}{systemdict/internaldict known not{1183615869 userdict\n"
+"/internaldict get exec exch/FlxProc exch put true}{1183615869 systemdict\n"
+"/internaldict get exec dup length exch maxlength eq{false}{1183615869\n"
+"systemdict/internaldict get exec exch/FlxProc exch put true}ifelse}ifelse}\n"
+"ifelse{systemdict/internaldict known{{1183615869 systemdict/internaldict get\n"
+"exec/FlxProc get exec}}{{1183615869 userdict/internaldict get exec/FlxProc get\n"
+"exec}}ifelse executeonly}if{gsave currentpoint newpath moveto}executeonly{\n"
+"currentpoint grestore gsave currentpoint newpath moveto}executeonly{systemdict\n"
+"/internaldict known not{pop 3}{1183615869 systemdict/internaldict get exec dup\n"
+"/startlock known{/startlock get exec}{dup/strtlck known{/strtlck get exec}{pop\n"
+"3}ifelse}ifelse}ifelse}executeonly]def";
+
+#else
+
+static const char* othersubrs_code = "/OtherSubrs\n"
+"[\n"
+"{pop pop pop grestore 12 6 roll curveto curveto pop pop} executeonly\n"
+"{gsave currentpoint newpath moveto} executeonly\n"
+"{currentpoint currentpoint newpath moveto} executeonly\n"
+"{} executeonly\n"
+"] noaccess def";
+
+#endif
+
+
+Type1Font *
+Type1Font::skeleton_make(PermString font_name, const String &version)
+{
+ Type1Font *output = new Type1Font(font_name);
+
+ // %!PS-Adobe-Font comment
+ StringAccum sa;
+ sa << "%!PS-AdobeFont-1.0: " << font_name;
+ if (version)
+ sa << ' ' << version;
+ output->add_item(new Type1CopyItem(sa.take_string()));
+
+ output->_dict_deltas[dF] = 3; // Private, FontInfo, Encoding
+ output->_dict_deltas[dP] = 3; // OtherSubrs, Subrs, CharStrings
+
+ return output;
+}
+
+void
+Type1Font::skeleton_comments_end()
+{
+ // count members of font dictionary
+ add_definition(dF, new Type1Definition("FontName", "/" + String(_font_name), "def"));
+}
+
+void
+Type1Font::skeleton_fontinfo_end()
+{
+ if (first_dict_item(Type1Font::dFI) >= 0)
+ add_item(new Type1CopyItem("end readonly def"));
+ else
+ add_item(new Type1CopyItem("% no FontInfo dict"));
+}
+
+void
+Type1Font::skeleton_fontdict_end()
+{
+ // switch to eexec
+ add_item(new Type1CopyItem("currentdict end"));
+ add_item(new Type1EexecItem(true));
+
+ // Private dictionary
+ add_definition(Type1Font::dP, Type1Definition::make_literal("-|", "{string currentfile exch readstring pop}", "executeonly def"));
+ set_charstring_definer(" -| ");
+ add_definition(Type1Font::dP, Type1Definition::make_literal("|-", "{noaccess def}", "executeonly def"));
+ add_definition(Type1Font::dP, Type1Definition::make_literal("|", "{noaccess put}", "executeonly def"));
+}
+
+void
+Type1Font::skeleton_private_end()
+{
+ add_item(new Type1CopyItem(othersubrs_code));
+
+ // Subrs
+ add_item(new Type1SubrGroupItem(this, true, "/Subrs 0 array"));
+ add_item(new Type1CopyItem("|-"));
+
+ // CharStrings
+ add_item(new Type1SubrGroupItem(this, false, "2 index /CharStrings 0 dict dup begin"));
+
+ // completion
+ add_item(new Type1CopyItem("end\n\
+end\n\
+readonly put\n\
+noaccess put\n\
+dup /FontName get exch definefont pop\n\
+mark currentfile closefile"));
+ add_item(new Type1EexecItem(false));
+ add_item(new Type1CopyItem("\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+0000000000000000000000000000000000000000000000000000000000000000\n\
+cleartomark"));
+}
+
+void
+Type1Font::skeleton_common_subrs()
+{
+ // - first four Subrs have fixed definitions
+ // - 0: "3 0 callothersubr pop pop setcurrentpoint return"
+ set_subr(0, Type1Charstring(String::make_stable("\216\213\014\020\014\021\014\021\014\041\013", 11)), " |");
+ // - 1: "0 1 callothersubr return"
+ set_subr(1, Type1Charstring(String::make_stable("\213\214\014\020\013", 5)), " |");
+ // - 2: "0 2 callothersubr return"
+ set_subr(2, Type1Charstring(String::make_stable("\213\215\014\020\013", 5)), " |");
+ // - 3: "return"
+ set_subr(3, Type1Charstring(String::make_stable("\013", 1)), " |");
+ // - 4: "1 3 callothersubr pop callsubr return"
+ set_subr(4, Type1Charstring(String::make_stable("\214\216\014\020\014\021\012\013", 8)), " |");
+}
+
+
+static void
+add_number_def(Type1Font *output, int dict, PermString name, const Type1Font *font)
+{
+ double v;
+ if (Type1Definition *t1d = font->dict(dict, name))
+ if (t1d->value_num(v))
+ output->add_definition(dict, Type1Definition::make(name, v, "def"));
+}
+
+static void
+add_copy_def(Type1Font *output, int dict, PermString name, const Type1Font *font, const char *definer = "def")
+{
+ if (Type1Definition *t1d = font->dict(dict, name))
+ output->add_definition(dict, Type1Definition::make_literal(name, t1d->value(), definer));
+}
+
+static String
+font_dict_string(const Type1Font *font, int dict, PermString name)
+{
+ String s;
+ if (Type1Definition *d = font->dict(dict, name))
+ if (d->value_string(s))
+ return s;
+ return String();
+}
+
+Type1Font *
+Type1Font::skeleton_make_copy(const Type1Font *font, PermString font_name, const Vector<double> *xuid_extension)
+{
+ String version = font_dict_string(font, dFI, "version");
+ Type1Font *output = skeleton_make(font_name, version);
+
+ // other comments from font header
+ for (int i = 0; i < font->nitems(); i++)
+ if (Type1CopyItem *c = font->item(i)->cast_copy()) {
+ if (c->length() > 1 && c->value()[0] == '%') {
+ if (c->value()[1] != '!')
+ output->add_item(new Type1CopyItem(c->value()));
+ } else
+ break;
+ } else
+ break;
+
+ output->skeleton_comments_end();
+
+ // FontInfo dictionary
+ if (version)
+ output->add_definition(dFI, Type1Definition::make_string("version", version, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Notice"))
+ output->add_definition(dFI, Type1Definition::make_string("Notice", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Copyright"))
+ output->add_definition(dFI, Type1Definition::make_string("Copyright", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "FullName"))
+ output->add_definition(dFI, Type1Definition::make_string("FullName", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "FamilyName"))
+ output->add_definition(dFI, Type1Definition::make_string("FamilyName", s, "readonly def"));
+ if (String s = font_dict_string(font, dFI, "Weight"))
+ output->add_definition(dFI, Type1Definition::make_string("Weight", s, "readonly def"));
+ if (Type1Definition *t1d = font->fi_dict("isFixedPitch")) {
+ bool v;
+ if (t1d->value_bool(v))
+ output->add_definition(dFI, Type1Definition::make_literal("isFixedPitch", (v ? "true" : "false"), "def"));
+ }
+ add_number_def(output, dFI, "ItalicAngle", font);
+ add_number_def(output, dFI, "UnderlinePosition", font);
+ add_number_def(output, dFI, "UnderlineThickness", font);
+ output->skeleton_fontinfo_end();
+
+ // Encoding, other font dictionary entries
+ output->add_type1_encoding(new Type1Encoding(*font->type1_encoding()));
+ add_number_def(output, dF, "PaintType", font);
+ add_number_def(output, dF, "FontType", font);
+ add_copy_def(output, dF, "FontMatrix", font, "readonly def");
+ add_number_def(output, dF, "StrokeWidth", font);
+ if (!xuid_extension)
+ add_number_def(output, dF, "UniqueID", font);
+ add_copy_def(output, dF, "XUID", font, "readonly def");
+ if (xuid_extension) {
+ Vector<double> xuid;
+ if (Type1Definition *xuid_def = output->dict("XUID"))
+ xuid_def->value_numvec(xuid);
+ if (!xuid.size()) {
+ Type1Definition *uid_def = font->dict("UniqueID");
+ int uid;
+ if (uid_def && uid_def->value_int(uid)) {
+ xuid.push_back(1);
+ xuid.push_back(uid);
+ }
+ }
+ if (xuid.size()) {
+ for (int i = 0; i < xuid_extension->size(); i++)
+ xuid.push_back((*xuid_extension)[i]);
+ Type1Definition *xuid_def = output->ensure(dF, "XUID");
+ xuid_def->set_numvec(xuid);
+ }
+ }
+ add_copy_def(output, dF, "FontBBox", font, "readonly def");
+ output->skeleton_fontdict_end();
+
+ // Private dictionary
+ add_copy_def(output, dP, "BlueValues", font);
+ add_copy_def(output, dP, "OtherBlues", font);
+ add_copy_def(output, dP, "FamilyBlues", font);
+ add_copy_def(output, dP, "FamilyOtherBlues", font);
+ add_number_def(output, dP, "BlueScale", font);
+ add_number_def(output, dP, "BlueShift", font);
+ add_number_def(output, dP, "BlueFuzz", font);
+ add_copy_def(output, dP, "StdHW", font);
+ add_copy_def(output, dP, "StdVW", font);
+ add_copy_def(output, dP, "StemSnapH", font);
+ add_copy_def(output, dP, "StemSnapV", font);
+ add_copy_def(output, dP, "ForceBold", font);
+ add_number_def(output, dP, "LanguageGroup", font);
+ add_number_def(output, dP, "ExpansionFactor", font);
+ if (!xuid_extension)
+ add_number_def(output, dP, "UniqueID", font);
+ output->add_definition(dP, Type1Definition::make_literal("MinFeature", "{16 16}", "|-"));
+ output->add_definition(dP, Type1Definition::make_literal("password", "5839", "def"));
+ output->add_definition(dP, Type1Definition::make_literal("lenIV", "0", "def"));
+ output->skeleton_private_end();
+
+ return output;
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc
new file mode 100644
index 00000000000..59200f0981b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1interp.cc
@@ -0,0 +1,1377 @@
+// -*- related-file-name: "../include/efont/t1interp.hh" -*-
+
+/* t1interp.{cc,hh} -- Type 1/2 charstring interpretation
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1interp.hh>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef WIN32
+# define random() rand()
+#endif
+
+#define CHECK_STACK(numargs) do { if (size() < numargs) return error(errUnderflow, cmd); } while (0)
+#define CHECK_STATE() do { if (_state < S_IPATH) return error(errOrdering, cmd); } while (0)
+#define CHECK_PATH_START() do { _state = S_PATH; } while (0)
+#define CHECK_PATH_END() do { if (_state == S_PATH) { act_closepath(cmd); } _state = S_IPATH; } while (0)
+
+#ifndef static_assert
+# define static_assert(c, msg) switch ((int) (c)) case 0: case (c):
+#endif
+
+namespace Efont {
+
+static const char * const error_formats[] = {
+ "charstring OK", // errOK
+ "charstring internal error in '%C'", // errInternal
+ "charstring commands past end", // errRunoff
+ "charstring command '%C' unimplemented", // errUnimplemented
+ "charstring stack overflow", // errOverflow
+ "charstring stack underflow in '%C'", // errUnderflow
+ "charstring bad vector operation in '%C'", // errVector
+ "charstring bad value in '%C'", // errValue
+ "charstring bad subroutine number %d", // errSubr
+ "charstring bad glyph number '%d'", // errGlyph
+ "charstring no current point in '%C'", // errCurrentPoint
+ "charstring flex error", // errFlex
+ "charstring multiple master error in '%C'", // errMultipleMaster
+ "charstring open stroke", // errOpenStroke
+ "charstring late sidebearing command '%C'", // errLateSidebearing
+ "charstring bad othersubr number %d", // errOthersubr
+ "charstring ordering constraints violated at '%C'", // errOrdering
+ "charstring inappropriate hintmask", // errHintmask
+ "charstring subrs nested too deep at '%d'" // errSubrDepth
+};
+
+double CharstringInterp::double_for_error;
+
+
+CharstringInterp::CharstringInterp()
+ : _error(errOK), _careful(false), _sp(0), _ps_sp(0),
+ _scratch_vector(SCRATCH_SIZE, 0), _program(0)
+{
+}
+
+CharstringInterp::CharstringInterp(const Vector<double> &weight_vector)
+ : _error(errOK), _careful(false), _sp(0), _ps_sp(0),
+ _weight_vector(weight_vector),
+ _scratch_vector(SCRATCH_SIZE, 0), _program(0)
+{
+}
+
+void
+CharstringInterp::initialize()
+{
+ clear();
+ ps_clear();
+ _lsb = _cp = _seac_origin = Point(0, 0);
+ _state = S_INITIAL;
+ _flex = false;
+ _t2nhints = 0;
+ _subr_depth = 0;
+ _done = false;
+ _error = errOK;
+}
+
+bool
+CharstringInterp::interpret(const CharstringProgram *program, const Charstring *cs)
+{
+ if (cs) {
+ initialize();
+ _program = program;
+ cs->process(*this);
+ return _error == errOK;
+ } else
+ return error(errGlyph, 0);
+}
+
+bool
+CharstringInterp::error(int err, int error_data)
+{
+ _error = err;
+ _error_data = error_data;
+ return false;
+}
+
+String
+CharstringInterp::error_string(int error, int error_data)
+{
+ static_assert(-errLastError == (sizeof(error_formats) / sizeof(error_formats[0])) - 1,
+ "errLastError defined incorrectly");
+ if (error >= 0)
+ return error_formats[0];
+ else if (error < errLastError)
+ return "charstring unknown error number " + String(error);
+ String format = error_formats[-error];
+ int percent = format.find_left('%');
+ if (percent >= 0 && format[percent + 1] == 'C')
+ return format.substring(0, percent) + Charstring::command_name(error_data) + format.substring(percent + 2);
+ else if (percent >= 0 && format[percent + 1] == 'd')
+ return format.substring(0, percent) + String(error_data) + format.substring(percent + 2);
+ else
+ return format;
+}
+
+bool
+CharstringInterp::number(double v)
+{
+ push(v);
+ return true;
+}
+
+void
+CharstringInterp::fetch_weight_vector()
+{
+ if (_program)
+ if (Vector<double> *wv = _program->mm_vector(CharstringProgram::VEC_WEIGHT, false))
+ _weight_vector = *wv;
+}
+
+bool
+CharstringInterp::vector_command(int cmd)
+{
+ CharstringProgram::VectorType which_vector;
+ int vectoroff, offset, num, i;
+ Vector<double> *v = 0;
+
+ switch (cmd) {
+
+ case Cs::cPut:
+ CHECK_STACK(2);
+ offset = (int)top(0);
+ vec(&_scratch_vector, offset) = top(1);
+ pop(2);
+ break;
+
+ case Cs::cGet:
+ CHECK_STACK(1);
+ offset = (int)top();
+ top() = vec(&_scratch_vector, offset);
+ break;
+
+ case Cs::cStore:
+ CHECK_STACK(4);
+ which_vector = (CharstringProgram::VectorType)((int)top(3));
+ vectoroff = (int)top(2);
+ offset = (int)top(1);
+ num = (int)top(0);
+ pop(4);
+
+ if (!_program)
+ return error(errVector, cmd);
+ v = _program->mm_vector(which_vector, true);
+ if (!v)
+ return error(errVector, cmd);
+
+ for (i = 0; i < num; i++, offset++, vectoroff++)
+ vec(v, vectoroff) = vec(&_scratch_vector, offset);
+ // erase our weight vector if the global weight vector has changed
+ if (which_vector == CharstringProgram::VEC_WEIGHT)
+ _weight_vector.clear();
+ break;
+
+ case Cs::cLoad:
+ CHECK_STACK(3);
+ which_vector = (CharstringProgram::VectorType)((int)top(2));
+ offset = (int)top(1);
+ num = (int)top(0);
+ pop(3);
+
+ if (!_program)
+ return error(errVector, cmd);
+ v = _program->mm_vector(which_vector, false);
+ // use our weight vector if appropriate
+ if (!v && which_vector == CharstringProgram::VEC_WEIGHT && _weight_vector.size())
+ v = &_weight_vector;
+ if (!v)
+ return error(errVector, cmd);
+
+ for (i = 0; i < num; i++, offset++)
+ vec(&_scratch_vector, offset) = vec(v, i);
+ break;
+
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ return true;
+}
+
+bool
+CharstringInterp::blend_command()
+{
+ const int cmd = Cs::cBlend;
+ CHECK_STACK(1);
+ int nargs = (int)pop();
+
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, cmd);
+
+ int nmasters = _weight_vector.size();
+ CHECK_STACK(nargs * nmasters);
+
+ int base = _sp - nargs * nmasters;
+ int off = base + nargs;
+ for (int j = 0; j < nargs; j++) {
+ double &val = _s[base + j];
+ for (int i = 1; i < nmasters; i++, off++)
+ val += _weight_vector.at_u(i) * _s[off];
+ }
+
+ pop(nargs * (nmasters - 1));
+ return true;
+}
+
+bool
+CharstringInterp::roll_command()
+{
+ const int cmd = Cs::cRoll;
+ CHECK_STACK(2);
+ int amount = (int)pop();
+ int n = (int)pop();
+ if (n <= 0)
+ return error(errValue, cmd);
+ CHECK_STACK(n);
+
+ int base = _sp - n;
+ while (amount < 0)
+ amount += n;
+
+ int i;
+ double copy_stack[STACK_SIZE];
+ for (i = 0; i < n; i++)
+ copy_stack[i] = _s[ base + (i+amount) % n ];
+ for (i = 0; i < n; i++)
+ _s[base + i] = copy_stack[i];
+
+ return true;
+}
+
+bool
+CharstringInterp::arith_command(int cmd)
+{
+ int i;
+ double d;
+
+ switch (cmd) {
+
+ case Cs::cBlend:
+ return blend_command();
+
+ case Cs::cAbs:
+ CHECK_STACK(1);
+ if (top() < 0)
+ top() = -top();
+ break;
+
+ case Cs::cAdd:
+ CHECK_STACK(1);
+ d = pop();
+ top() += d;
+ break;
+
+ case Cs::cSub:
+ CHECK_STACK(1);
+ d = pop();
+ top() -= d;
+ break;
+
+ case Cs::cDiv:
+ CHECK_STACK(2);
+ d = pop();
+ top() /= d;
+ break;
+
+ case Cs::cNeg:
+ CHECK_STACK(1);
+ top() = -top();
+ break;
+
+ case Cs::cRandom: {
+ double d;
+ do {
+ d = random() / ((double)RAND_MAX);
+ } while (d == 0);
+ push(d);
+ break;
+ }
+
+ case Cs::cMul:
+ CHECK_STACK(2);
+ d = pop();
+ top() *= d;
+ break;
+
+ case Cs::cSqrt:
+ CHECK_STACK(1);
+ if (top() < 0)
+ return error(errValue, cmd);
+ top() = sqrt(top());
+ break;
+
+ case Cs::cDrop:
+ CHECK_STACK(1);
+ pop();
+ break;
+
+ case Cs::cExch:
+ CHECK_STACK(2);
+ d = top(0);
+ top(0) = top(1);
+ top(1) = d;
+ break;
+
+ case Cs::cIndex:
+ CHECK_STACK(1);
+ i = (int)top();
+ if (i < 0)
+ return error(errValue, cmd);
+ CHECK_STACK(i + 2);
+ top() = top(i+1);
+ break;
+
+ case Cs::cRoll:
+ return roll_command();
+
+ case Cs::cDup:
+ CHECK_STACK(1);
+ push(top());
+ break;
+
+ case Cs::cAnd:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() != 0) && (d != 0);
+ break;
+
+ case Cs::cOr:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() != 0) || (d != 0);
+ break;
+
+ case Cs::cNot:
+ CHECK_STACK(1);
+ top() = (top() == 0);
+ break;
+
+ case Cs::cEq:
+ CHECK_STACK(2);
+ d = pop();
+ top() = (top() == d);
+ break;
+
+ case Cs::cIfelse:
+ CHECK_STACK(4);
+ if (top(1) > top(0))
+ top(3) = top(2);
+ pop(3);
+ break;
+
+ case Cs::cPop:
+ if (ps_size() < 1)
+ return error(errUnderflow, cmd);
+ push(ps_pop());
+ break;
+
+ case 15:
+ // this command is found with no explanation in JansonText-Roman
+ CHECK_STACK(2);
+ pop(2);
+ return true;
+
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ return true;
+}
+
+bool
+CharstringInterp::callsubr_command()
+{
+ const int cmd = Cs::cCallsubr;
+ CHECK_STACK(1);
+ int which = (int)pop();
+
+ Charstring *subr_cs = get_subr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ if (_subr_depth >= MAX_SUBR_DEPTH)
+ return error(errSubrDepth, which);
+ _subr_depth++;
+
+ subr_cs->process(*this);
+
+ _subr_depth--;
+ if (_error != errOK)
+ return false;
+ return !done();
+}
+
+bool
+CharstringInterp::callgsubr_command()
+{
+ const int cmd = Cs::cCallgsubr;
+ CHECK_STACK(1);
+ int which = (int)pop();
+
+ Charstring *subr_cs = get_gsubr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ if (_subr_depth >= MAX_SUBR_DEPTH)
+ return error(errSubrDepth, which);
+ _subr_depth++;
+
+ subr_cs->process(*this);
+
+ _subr_depth--;
+ if (_error != errOK)
+ return false;
+ return !done();
+}
+
+bool
+CharstringInterp::mm_command(int command, int on_stack)
+{
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, command);
+
+ int nargs;
+ switch (command) {
+ case Cs::othcMM1: nargs = 1; break;
+ case Cs::othcMM2: nargs = 2; break;
+ case Cs::othcMM3: nargs = 3; break;
+ case Cs::othcMM4: nargs = 4; break;
+ case Cs::othcMM6: nargs = 6; break;
+ default: return error(errInternal, command);
+ }
+
+ int nmasters = _weight_vector.size();
+ if (size() < nargs * nmasters
+ || on_stack != nargs * nmasters)
+ return error(errMultipleMaster, command);
+
+ int base = size() - on_stack;
+
+ int off = base + nargs;
+ for (int j = 0; j < nargs; j++) {
+ double &val = at(base + j);
+ for (int i = 1; i < nmasters; i++, off++)
+ val += _weight_vector.at_u(i) * at(off);
+ }
+
+ for (int i = nargs - 1; i >= 0; i--)
+ ps_push(at(base + i));
+
+ pop(on_stack);
+ return true;
+}
+
+bool
+CharstringInterp::itc_command(int command, int on_stack)
+{
+ ensure_weight_vector();
+ if (!_weight_vector.size())
+ return error(errVector, command);
+
+ int base = size() - on_stack;
+ switch (command) {
+
+ case Cs::othcITC_load: {
+ if (on_stack != 1)
+ return error(errOthersubr, command);
+ int offset = (int)at(base);
+ for (int i = 0; i < _weight_vector.size(); i++)
+ vec(&_scratch_vector, offset+i) = _weight_vector.at_u(i);
+ break;
+ }
+
+ case Cs::othcITC_put: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ int offset = (int)at(base+1);
+ vec(&_scratch_vector, offset) = at(base);
+ break;
+ }
+
+ case Cs::othcITC_get: {
+ if (on_stack != 1)
+ return error(errOthersubr, command);
+ int offset = (int)at(base);
+ ps_push(vec(&_scratch_vector, offset));
+ break;
+ }
+
+ case Cs::othcITC_add: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) + at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_sub: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) - at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_mul: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) * at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_div: {
+ if (on_stack != 2)
+ return error(errOthersubr, command);
+ ps_push(at(base) / at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_ifelse: {
+ if (on_stack != 4)
+ return error(errOthersubr, command);
+ if (at(base+2) <= at(base+3))
+ ps_push(at(base));
+ else
+ ps_push(at(base+1));
+ break;
+ }
+
+ default:
+ return error(errOthersubr, command);
+
+ }
+
+ pop(on_stack);
+ return true;
+}
+
+
+inline void
+CharstringInterp::actp_rmoveto(int /*cmd*/, double dx, double dy)
+{
+ _cp.shift(dx, dy);
+}
+
+inline void
+CharstringInterp::actp_rlineto(int cmd, double dx, double dy)
+{
+ Point p0(_cp);
+ _cp.shift(dx, dy);
+ act_line(cmd, p0, _cp);
+}
+
+void
+CharstringInterp::actp_rrcurveto(int cmd, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3)
+{
+ Point p0(_cp);
+ Point p1(p0, dx1, dy1);
+ Point p2(p1, dx2, dy2);
+ _cp = p2.shifted(dx3, dy3);
+ act_curve(cmd, p0, p1, p2, _cp);
+}
+
+void
+CharstringInterp::actp_rrflex(int cmd, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3, double dx4, double dy4, double dx5, double dy5, double dx6, double dy6, double flex_depth)
+{
+ Point p0(_cp);
+ Point p1(p0, dx1, dy1);
+ Point p2(p1, dx2, dy2);
+ Point p3_4(p2, dx3, dy3);
+ Point p5(p3_4, dx4, dy4);
+ Point p6(p5, dx5, dy5);
+ _cp = p6.shifted(dx6, dy6);
+ act_flex(cmd, p0, p1, p2, p3_4, p5, p6, _cp, flex_depth);
+}
+
+
+bool
+CharstringInterp::callothersubr_command(int othersubrnum, int n)
+{
+ switch (othersubrnum) {
+
+ case Cs::othcFlexend:
+ if (n != 3)
+ goto unknown;
+ if (!_flex || ps_size() != 16)
+ return error(errFlex);
+ CHECK_PATH_START();
+ act_flex(Cs::cCallothersubr, Point(ps_at(0), ps_at(1)),
+ Point(ps_at(4), ps_at(5)), Point(ps_at(6), ps_at(7)),
+ Point(ps_at(8), ps_at(9)), Point(ps_at(10), ps_at(11)),
+ Point(ps_at(12), ps_at(13)), Point(ps_at(14), ps_at(15)),
+ top(2));
+ ps_clear();
+ ps_push(top(0));
+ ps_push(top(1));
+ _flex = false;
+ _state = S_PATH;
+ break;
+
+ case Cs::othcFlexbegin:
+ if (n != 0)
+ goto unknown;
+ if (_flex)
+ return error(errFlex);
+ ps_clear();
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _flex = true;
+ _state = S_IPATH;
+ break;
+
+ case Cs::othcFlexmiddle:
+ if (n != 0)
+ goto unknown;
+ if (!_flex)
+ return error(errFlex);
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ break;
+
+ case Cs::othcReplacehints:
+ if (n != 1)
+ goto unknown;
+ ps_clear();
+ ps_push(top());
+ break;
+
+ case Cs::othcMM1:
+ case Cs::othcMM2:
+ case Cs::othcMM3:
+ case Cs::othcMM4:
+ case Cs::othcMM6:
+ return mm_command(othersubrnum, n);
+
+ case Cs::othcITC_load:
+ case Cs::othcITC_add:
+ case Cs::othcITC_sub:
+ case Cs::othcITC_mul:
+ case Cs::othcITC_div:
+ case Cs::othcITC_put:
+ case Cs::othcITC_get:
+ case Cs::othcITC_unknown:
+ case Cs::othcITC_ifelse:
+ case Cs::othcITC_random:
+ return itc_command(othersubrnum, n);
+
+ default: // unknown
+ unknown:
+ ps_clear();
+ for (int i = 0; i < n; i++)
+ ps_push(top(i));
+ break;
+
+ }
+
+ pop(n);
+ return true;
+}
+
+bool
+CharstringInterp::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cReturn:
+ return false;
+
+ case Cs::cHsbw:
+ CHECK_STACK(2);
+ if (_state > S_SEAC && _careful)
+ return error(errOrdering, cmd);
+ else {
+ _lsb = _cp = _seac_origin.shifted(at(0), 0);
+ if (_state == S_INITIAL) {
+ act_sidebearing(cmd, _lsb);
+ act_width(cmd, Point(at(1), 0));
+ }
+ if (_state <= S_SEAC)
+ _state = S_SBW;
+ }
+ break;
+
+ case Cs::cSbw:
+ CHECK_STACK(4);
+ if (_state > S_SEAC && _careful)
+ return error(errOrdering, cmd);
+ else {
+ _lsb = _cp = _seac_origin.shifted(at(0), at(1));
+ if (_state == S_INITIAL) {
+ act_sidebearing(cmd, _lsb);
+ act_width(cmd, Point(at(2), at(3)));
+ }
+ if (_state <= S_SEAC)
+ _state = S_SBW;
+ }
+ break;
+
+ case Cs::cSeac:
+ CHECK_STACK(5);
+ if (_state > S_SBW)
+ return error(errOrdering, cmd);
+ act_seac(cmd, at(0), at(1), at(2), (int)at(3), (int)at(4));
+ clear();
+ return false;
+
+ case Cs::cCallsubr:
+ return callsubr_command();
+
+ case Cs::cCallothersubr: {
+ CHECK_STACK(2);
+ int othersubrnum = (int)top(0);
+ int n = (int)top(1);
+ pop(2);
+ if (othersubrnum < 0 || size() < n)
+ return error(errOthersubr, cmd);
+ return callothersubr_command(othersubrnum, n);
+ }
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ case Cs::cPop:
+ return arith_command(cmd);
+
+ case Cs::cHlineto:
+ CHECK_STACK(1);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, at(0), 0);
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK(1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(0), 0);
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK(4);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, at(0), 0, at(1), at(2), 0, at(3));
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK(2);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, at(0), at(1));
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK(2);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(0), at(1));
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK(6);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, at(0), at(1), at(2), at(3), at(4), at(5));
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK(4);
+ CHECK_PATH_START();
+ actp_rrcurveto(cmd, 0, at(0), at(1), at(2), at(3), 0);
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK(1);
+ CHECK_PATH_START();
+ actp_rlineto(cmd, 0, at(0));
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK(1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, 0, at(0));
+ break;
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cHstem:
+ CHECK_STACK(2);
+ act_hstem(cmd, _lsb.y + at(0), at(1));
+ break;
+
+ case Cs::cHstem3:
+ CHECK_STACK(6);
+ act_hstem3(cmd, _lsb.y + at(0), at(1), _lsb.y + at(2), at(3), _lsb.y + at(4), at(5));
+ break;
+
+ case Cs::cVstem:
+ CHECK_STACK(2);
+ act_vstem(cmd, _lsb.x + at(0), at(1));
+ break;
+
+ case Cs::cVstem3:
+ CHECK_STACK(6);
+ act_vstem3(cmd, _lsb.x + at(0), at(1), _lsb.x + at(2), at(3), _lsb.x + at(4), at(5));
+ break;
+
+ case Cs::cSetcurrentpoint:
+ CHECK_STACK(2);
+ _cp = Point(at(0), at(1));
+ break;
+
+ case Cs::cClosepath:
+ CHECK_PATH_END();
+ break;
+
+ case Cs::cEndchar:
+ CHECK_PATH_END();
+ set_done();
+ return false;
+
+ case Cs::cError:
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+ clear();
+ return error() >= 0;
+}
+
+
+#undef DEBUG_TYPE2
+
+int
+CharstringInterp::type2_handle_width(int cmd, bool have_width)
+{
+ _cp = _lsb = _seac_origin;
+ if (_state != S_INITIAL)
+ /* ignore width */;
+ else if (have_width)
+ act_nominal_width_delta(cmd, at(0));
+ else
+ act_default_width(cmd);
+ return (have_width ? 1 : 0);
+}
+
+bool
+CharstringInterp::type2_command(int cmd, const uint8_t *data, int *left)
+{
+ int bottom = 0;
+
+#ifdef DEBUG_TYPE2
+ fprintf(stderr, "%s [%d/%d]\n", Charstring::command_name(cmd).c_str(), _t2nhints, size());
+#endif
+
+ switch (cmd) {
+
+ case Cs::cHstem:
+ case Cs::cHstemhm:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ if (_state > S_HSTEM)
+ return error(errOrdering, cmd);
+ _state = S_HSTEM;
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_hstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ break;
+
+ case Cs::cVstem:
+ case Cs::cVstemhm:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ if (_state > S_VSTEM)
+ return error(errOrdering, cmd);
+ _state = S_VSTEM;
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_vstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ break;
+
+ case Cs::cHintmask:
+ case Cs::cCntrmask:
+ if (_state <= S_SEAC && size() >= 1) {
+ bottom = type2_handle_width(cmd, (size() % 2) == 1);
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_hstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ }
+ if ((_state == S_HSTEM || _state == S_VSTEM) && size() >= 2)
+ for (double pos = 0; bottom + 1 < size(); bottom += 2) {
+ _t2nhints++;
+ act_vstem(cmd, pos + at(bottom), at(bottom + 1));
+ pos += at(bottom) + at(bottom + 1);
+ }
+ if (_state < S_HINTMASK)
+ _state = S_HINTMASK;
+ if (_t2nhints == 0)
+ return error(errHintmask, cmd);
+ if (!data || !left)
+ return error(errInternal, cmd);
+ if (((_t2nhints - 1) >> 3) + 1 > *left)
+ return error(errRunoff, cmd);
+ act_hintmask(cmd, data, _t2nhints);
+ *left -= ((_t2nhints - 1) >> 3) + 1;
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK(2);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 2);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(bottom), at(bottom + 1));
+#if DEBUG_TYPE2
+ bottom += 2;
+#endif
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK(1);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, at(bottom), 0);
+#if DEBUG_TYPE2
+ bottom++;
+#endif
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK(1);
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 1);
+ CHECK_PATH_END();
+ actp_rmoveto(cmd, 0, at(bottom));
+#if DEBUG_TYPE2
+ bottom++;
+#endif
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK(2);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 1 < size(); bottom += 2)
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+ break;
+
+ case Cs::cHlineto:
+ CHECK_STACK(1);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom < size()) {
+ actp_rlineto(cmd, at(bottom++), 0);
+ if (bottom < size())
+ actp_rlineto(cmd, 0, at(bottom++));
+ }
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK(1);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom < size()) {
+ actp_rlineto(cmd, 0, at(bottom++));
+ if (bottom < size())
+ actp_rlineto(cmd, at(bottom++), 0);
+ }
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK(6);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 5 < size(); bottom += 6)
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+ break;
+
+ case Cs::cHhcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ if (size() % 2 == 1) {
+ actp_rrcurveto(cmd, at(bottom + 1), at(bottom), at(bottom + 2), at(bottom + 3), at(bottom + 4), 0);
+ bottom += 5;
+ }
+ for (; bottom + 3 < size(); bottom += 4)
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), at(bottom + 3), 0);
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom + 3 < size()) {
+ double dx3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), dx3, at(bottom + 3));
+ bottom += 4;
+ if (bottom + 3 < size()) {
+ double dy3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), dy3);
+ bottom += 4;
+ }
+ }
+#if DEBUG_TYPE2
+ if (bottom + 1 == size())
+ bottom++;
+#endif
+ break;
+
+ case Cs::cRcurveline:
+ CHECK_STACK(8);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 7 < size(); bottom += 6)
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+#if DEBUG_TYPE2
+ bottom += 2;
+#endif
+ break;
+
+ case Cs::cRlinecurve:
+ CHECK_STACK(8);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ for (; bottom + 7 < size(); bottom += 2)
+ actp_rlineto(cmd, at(bottom), at(bottom + 1));
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), at(bottom + 4), at(bottom + 5));
+#if DEBUG_TYPE2
+ bottom += 6;
+#endif
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ while (bottom + 3 < size()) {
+ double dy3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), dy3);
+ bottom += 4;
+ if (bottom + 3 < size()) {
+ double dx3 = (bottom + 5 == size() ? at(bottom + 4) : 0);
+ actp_rrcurveto(cmd, at(bottom), 0, at(bottom + 1), at(bottom + 2), dx3, at(bottom + 3));
+ bottom += 4;
+ }
+ }
+#if DEBUG_TYPE2
+ if (bottom + 1 == size())
+ bottom++;
+#endif
+ break;
+
+ case Cs::cVvcurveto:
+ CHECK_STACK(4);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ if (size() % 2 == 1) {
+ actp_rrcurveto(cmd, at(bottom), at(bottom + 1), at(bottom + 2), at(bottom + 3), 0, at(bottom + 4));
+ bottom += 5;
+ }
+ for (; bottom + 3 < size(); bottom += 4)
+ actp_rrcurveto(cmd, 0, at(bottom), at(bottom + 1), at(bottom + 2), 0, at(bottom + 3));
+ break;
+
+ case Cs::cFlex:
+ CHECK_STACK(13);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), at(10), at(11),
+ at(12));
+#if DEBUG_TYPE2
+ bottom += 13;
+#endif
+ break;
+
+ case Cs::cHflex:
+ CHECK_STACK(7);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), 0, at(1), at(2), at(3), 0,
+ at(4), 0, at(5), -at(2), at(6), 0,
+ 50);
+#if DEBUG_TYPE2
+ bottom += 7;
+#endif
+ break;
+
+ case Cs::cHflex1:
+ CHECK_STACK(9);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), 0,
+ at(5), 0, at(6), at(7), at(8), -(at(1) + at(3) + at(7)),
+ 50);
+#if DEBUG_TYPE2
+ bottom += 9;
+#endif
+ break;
+
+ case Cs::cFlex1: {
+ CHECK_STACK(11);
+ CHECK_STATE();
+ CHECK_PATH_START();
+ assert(bottom == 0);
+ double dx = at(0) + at(2) + at(4) + at(6) + at(8);
+ double dy = at(1) + at(3) + at(5) + at(7) + at(9);
+ if (fabs(dx) > fabs(dy))
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), at(10), -dy,
+ 50);
+ else
+ actp_rrflex(cmd,
+ at(0), at(1), at(2), at(3), at(4), at(5),
+ at(6), at(7), at(8), at(9), -dx, at(10),
+ 50);
+ break;
+#if DEBUG_TYPE2
+ bottom += 11;
+#endif
+ }
+
+ case Cs::cEndchar:
+ if (_state <= S_SEAC)
+ bottom = type2_handle_width(cmd, size() > 0 && size() != 4);
+ if (bottom + 3 < size() && _state == S_INITIAL)
+ act_seac(cmd, 0, at(bottom), at(bottom + 1), (int)at(bottom + 2), (int)at(bottom + 3));
+ CHECK_PATH_END();
+ set_done();
+ clear();
+ return false;
+
+ case Cs::cReturn:
+ return false;
+
+ case Cs::cCallsubr:
+ return callsubr_command();
+
+ case Cs::cCallgsubr:
+ return callgsubr_command();
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ case Cs::cPop:
+ return arith_command(cmd);
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cError:
+ default:
+ return error(errUnimplemented, cmd);
+
+ }
+
+#if DEBUG_TYPE2
+ if (bottom != size())
+ fprintf(stderr, "[left %d on stack] ", size() - bottom);
+#endif
+
+ clear();
+ return error() >= 0;
+}
+
+
+void
+CharstringInterp::act_sidebearing(int, const Point &)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_width(int, const Point &)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_default_width(int cmd)
+{
+ double d = (_program ? _program->global_width_x(false) : UNKDOUBLE);
+ if (KNOWN(d))
+ act_width(cmd, Point(d, 0));
+}
+
+void
+CharstringInterp::act_nominal_width_delta(int cmd, double delta)
+{
+ double d = (_program ? _program->global_width_x(true) : UNKDOUBLE);
+ if (KNOWN(d))
+ act_width(cmd, Point(d + delta, 0));
+}
+
+void
+CharstringInterp::act_seac(int cmd, double asb, double adx, double ady, int bchar, int achar)
+{
+ Charstring *acs = 0, *bcs = 0;
+ if (achar < 0 || achar >= 256 || bchar < 0 || bchar >= 256
+ || !_program || _program->parent_program()
+ || !(acs = get_glyph(Charstring::standard_encoding[achar]))
+ || !(bcs = get_glyph(Charstring::standard_encoding[bchar]))) {
+ error(errGlyph, cmd);
+ return;
+ }
+
+ Point apos = Point(adx + _lsb.x - asb, ady + _lsb.y);
+ Point save_lsb = _lsb;
+ Point save_seac_origin = _seac_origin;
+
+ CharstringInterp::initialize();
+ _seac_origin = apos;
+ _state = S_SEAC;
+ acs->process(*this);
+ if (error() == errOK) {
+ CharstringInterp::initialize();
+ _seac_origin = save_seac_origin;
+ _state = S_SEAC;
+ bcs->process(*this);
+ }
+
+ _lsb = save_lsb;
+}
+
+void
+CharstringInterp::act_line(int cmd, const Point &p0, const Point &p1)
+{
+ act_curve(cmd, p0, p0, p1, p1);
+}
+
+void
+CharstringInterp::act_curve(int cmd, const Point &, const Point &, const Point &, const Point &)
+{
+ error(errUnimplemented, cmd);
+}
+
+void
+CharstringInterp::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ (void) flex_depth;
+ act_curve(cmd, p0, p1, p2, p3_4);
+ act_curve(cmd, p3_4, p5, p6, p7);
+}
+
+void
+CharstringInterp::act_closepath(int)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_hstem(int, double, double)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_vstem(int, double, double)
+{
+ /* do nothing */
+}
+
+void
+CharstringInterp::act_hstem3(int cmd, double y0, double dy0, double y1, double dy1, double y2, double dy2)
+{
+ act_hstem(cmd, y0, dy0);
+ act_hstem(cmd, y1, dy1);
+ act_hstem(cmd, y2, dy2);
+}
+
+void
+CharstringInterp::act_vstem3(int cmd, double x0, double dx0, double x1, double dx1, double x2, double dx2)
+{
+ act_vstem(cmd, x0, dx0);
+ act_vstem(cmd, x1, dx1);
+ act_vstem(cmd, x2, dx2);
+}
+
+void
+CharstringInterp::act_hintmask(int, const uint8_t *, int)
+{
+ /* do nothing */
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc
new file mode 100644
index 00000000000..d9e2b614ef4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1item.cc
@@ -0,0 +1,861 @@
+// -*- related-file-name: "../include/efont/t1item.hh" -*-
+
+/* t1item.{cc,hh} -- items in a Type 1 font
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1interp.hh>
+#include <efont/t1font.hh>
+#include <lcdf/strtonum.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/stat.h>
+#ifndef WIN32
+# include <unistd.h>
+#endif
+#if HAVE_BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+namespace Efont {
+
+/*****
+ * Type1NullItem
+ **/
+
+void
+Type1NullItem::gen(Type1Writer &)
+{
+}
+
+/*****
+ * Type1CopyItem
+ **/
+
+void
+Type1CopyItem::gen(Type1Writer &w)
+{
+ w << _value << '\n';
+}
+
+
+/*****
+ * Type1EexecItem
+ **/
+
+void
+Type1EexecItem::gen(Type1Writer &w)
+{
+ if (_eexec_on)
+ w << "currentfile eexec\n";
+ w.switch_eexec(_eexec_on);
+}
+
+
+/*****
+ * Type1Definition
+ **/
+
+typedef Vector<double> NumVector;
+
+
+Type1Definition::Type1Definition(PermString n, const String &v, PermString d)
+ : _name(n), _val(v), _definer(d)
+{
+ _val.c_str(); // ensure it ends with '\0'
+}
+
+Type1Definition *
+Type1Definition::make_string(PermString n, const String &v, PermString d)
+{
+ Type1Definition *t1d = new Type1Definition(n, "", d);
+ t1d->set_string(v);
+ return t1d;
+}
+
+int
+Type1Definition::slurp_string(StringAccum &accum, int pos, Type1Reader *reader)
+{
+ int paren_level = 0;
+ char *s = accum.data() + pos;
+
+ do {
+ switch (*s++) {
+ case '(': paren_level++; break;
+ case ')': paren_level--; break;
+ case '\\': if (paren_level && *s) s++; break;
+ case 0:
+ if (!reader) return -1;
+ pos = s - accum.data();
+ accum.append('\n'); // add \n
+ if (!reader->next_line(accum)) return -1;
+ accum.c_str(); // ensure null termination
+ s = accum.data() + pos;
+ break;
+ }
+ } while (paren_level);
+
+ return s - accum.data();
+}
+
+int
+Type1Definition::slurp_proc(StringAccum &accum, int pos, Type1Reader *reader)
+{
+ int paren_level = 0;
+ int brace_level = 0;
+ char *s = accum.data() + pos;
+
+ do {
+ switch (*s++) {
+ case '{': if (!paren_level) brace_level++; break;
+ case '}': if (!paren_level) brace_level--; break;
+ case '(': paren_level++; break;
+ case ')': paren_level--; break;
+ case '\\': if (paren_level && *s) s++; break;
+ case '%':
+ if (!paren_level)
+ while (*s != '\n' && *s != '\r' && *s)
+ s++;
+ break;
+ case 0:
+ if (!reader) return -1;
+ pos = s - accum.data();
+ accum.append('\n'); // add \n
+ if (!reader->next_line(accum)) return -1;
+ accum.c_str(); // ensure null termination
+ s = accum.data() + pos;
+ break;
+ }
+ } while (brace_level);
+
+ return s - accum.data();
+}
+
+Type1Definition *
+Type1Definition::make(StringAccum &accum, Type1Reader *reader,
+ bool force_definition)
+{
+ char *s = accum.data();
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s != '/')
+ return 0;
+ s++;
+ int name_start_pos = s - accum.data();
+
+ // find NAME LENGTH
+ while (!isspace((unsigned char) *s) && *s != '[' && *s != '{' && *s != '('
+ && *s != ']' && *s != '}' && *s != ')' && *s)
+ s++;
+ if (!*s)
+ return 0;
+ int name_end_pos = s - accum.data();
+
+ while (isspace((unsigned char) *s))
+ s++;
+ int val_pos = s - accum.data();
+ int val_end_pos = -1;
+ bool check_def = false;
+
+ if (*s == '}' || *s == ']' || *s == ')' || *s == 0)
+ return 0;
+
+ else if (*s == '(')
+ val_end_pos = slurp_string(accum, val_pos, reader);
+
+ else if (*s == '{')
+ val_end_pos = slurp_proc(accum, val_pos, reader);
+
+ else if (*s == '[') {
+ int brack_level = 0;
+ do {
+ switch (*s++) {
+ case '[': brack_level++; break;
+ case ']': brack_level--; break;
+ case '(': case ')': case 0: return 0;
+ }
+ } while (brack_level);
+ val_end_pos = s - accum.data();
+
+ } else {
+ while (!isspace((unsigned char) *s) && *s)
+ s++;
+ val_end_pos = s - accum.data();
+ if (!force_definition) check_def = true;
+ }
+
+ if (val_end_pos < 0)
+ return 0;
+ s = accum.data() + val_end_pos;
+ while (isspace((unsigned char) *s))
+ s++;
+ if (check_def && (s[0] != 'd' || s[1] != 'e' || s[2] != 'f'))
+ if (strncmp(s, "dict def", 8) != 0)
+ return 0;
+
+ PermString name(accum.data()+name_start_pos, name_end_pos - name_start_pos);
+ PermString def(s, accum.length() - (s - accum.data()));
+ String value = String(accum.data() + val_pos, val_end_pos - val_pos);
+ return new Type1Definition(name, value, def);
+}
+
+void
+Type1Definition::gen(Type1Writer &w)
+{
+ w << '/' << _name << ' ' << _val << ' ' << _definer << '\n';
+}
+
+void
+Type1Definition::gen(StringAccum &sa)
+{
+ sa << '/' << _name << ' ' << _val << ' ' << _definer;
+}
+
+
+bool
+Type1Definition::value_bool(bool &b) const
+{
+ if (_val == "true") {
+ b = true;
+ return true;
+ } else if (_val == "false") {
+ b = false;
+ return true;
+ } else
+ return false;
+}
+
+bool
+Type1Definition::value_int(int &i) const
+{
+ char *s;
+ i = strtol(_val.data(), &s, 10);
+ return (*s == 0);
+}
+
+bool
+Type1Definition::value_num(double &d) const
+{
+ char *s;
+ d = strtonumber(_val.data(), &s);
+ return (*s == 0);
+}
+
+bool
+Type1Definition::value_string(String &str) const
+{
+ if (_val.length() == 0 || _val[0] != '(' || _val.back() != ')')
+ return false;
+ StringAccum sa;
+ int pos, first_pos = 1, len = _val.length() - 1;
+ for (pos = 1; pos < len; pos++)
+ if (_val[pos] == '\\') {
+ sa.append(_val.data() + first_pos, pos - first_pos);
+ pos++;
+ switch (pos < len ? _val[pos] : -1) {
+ case '\r':
+ pos++;
+ if (pos < len && _val[pos] == '\n')
+ pos++;
+ break;
+ case '\n':
+ pos++;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7': {
+ int c = _val[pos++] - '0';
+ for (int i = 1; pos < len && i < 3 && _val[pos] >= '0' && _val[pos] <= '7'; i++, pos++)
+ c = (c << 3) | (_val[pos] - '0');
+ sa.append((char) c);
+ break;
+ }
+ case 'n':
+ sa << '\n';
+ pos++;
+ break;
+ case 'r':
+ sa << '\r';
+ pos++;
+ break;
+ case 't':
+ sa << '\t';
+ pos++;
+ break;
+ case 'b':
+ sa << '\b';
+ pos++;
+ break;
+ case 'f':
+ sa << '\f';
+ pos++;
+ break;
+ default:
+ sa << _val[pos];
+ pos++;
+ break;
+ }
+ first_pos = pos;
+ }
+ sa.append(_val.data() + first_pos, len - first_pos);
+ str = sa.take_string();
+ return true;
+}
+
+bool
+Type1Definition::value_name(PermString &str) const
+{
+ if (_val.length() == 0 || _val[0] != '/')
+ return false;
+ int pos;
+ for (pos = 1; pos < _val.length(); pos++)
+ if (isspace((unsigned char) _val[pos]) || _val[pos] == '/')
+ return false;
+ str = PermString(_val.data() + 1, pos - 1);
+ return true;
+}
+
+static bool
+strtonumvec(const char *f, const char **endf, NumVector &v)
+{
+ v.clear();
+ char *s = (char *)f;
+ if (*s != '[' && *s != '{')
+ return false;
+ s++;
+ while (1) {
+ while (isspace((unsigned char) *s))
+ s++;
+ if (isdigit((unsigned char) *s) || *s == '.' || *s == '-')
+ v.push_back( strtonumber(s, &s) );
+ else {
+ if (endf)
+ *endf = s + 1;
+ return (*s == ']' || *s == '}');
+ }
+ }
+}
+
+bool
+Type1Definition::value_numvec(NumVector &v) const
+{
+ return strtonumvec(_val.data(), 0, v);
+}
+
+static bool
+strtonumvec_vec(const char *f, const char **endf, Vector<NumVector> &v)
+{
+ v.clear();
+ const char *s = f;
+ if (*s != '[' && *s != '{')
+ return false;
+ s++;
+ while (1) {
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s == '[' || *s == '{') {
+ NumVector subv;
+ if (!strtonumvec(s, &s, subv))
+ return false;
+ v.push_back(subv);
+ } else {
+ if (endf)
+ *endf = s + 1;
+ return (*s == ']' || *s == '}');
+ }
+ }
+}
+
+bool
+Type1Definition::value_numvec_vec(Vector<NumVector> &v) const
+{
+ return strtonumvec_vec(_val.data(), 0, v);
+}
+
+bool
+Type1Definition::value_normalize(Vector<NumVector> &in,
+ Vector<NumVector> &out) const
+{
+ in.clear();
+ out.clear();
+ const char *s = _val.data();
+ if (*s++ != '[')
+ return false;
+ while (1) {
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s == '[') {
+ Vector<NumVector> sub;
+ if (!strtonumvec_vec(s, &s, sub))
+ return false;
+
+ NumVector subin;
+ NumVector subout;
+ for (int i = 0; i < sub.size(); i++)
+ if (sub[i].size() == 2) {
+ subin.push_back(sub[i][0]);
+ subout.push_back(sub[i][1]);
+ } else
+ return false;
+ in.push_back(subin);
+ out.push_back(subout);
+ } else
+ return (*s == ']');
+ }
+}
+
+bool
+Type1Definition::value_namevec(Vector<PermString> &v) const
+{
+ v.clear();
+ const char *s = _val.data();
+ if (*s++ != '[')
+ return false;
+ while (1) {
+ while (isspace((unsigned char) *s))
+ s++;
+ if (*s == '/')
+ s++;
+ if (isalnum((unsigned char) *s)) {
+ const char *start = s;
+ while (*s && !isspace((unsigned char) *s) && *s != ']' && *s != '/')
+ s++;
+ v.push_back(PermString(start, s - start));
+ } else
+ return (*s == ']');
+ }
+}
+
+
+void
+Type1Definition::set_bool(bool b)
+{
+ set_val(b ? "true" : "false");
+}
+
+void
+Type1Definition::set_int(int i)
+{
+ set_val(String(i));
+}
+
+void
+Type1Definition::set_num(double n)
+{
+ set_val(String(n));
+}
+
+void
+Type1Definition::set_string(const String &v)
+{
+ const char *s = v.data();
+ int len = v.length();
+ int left = 0;
+ StringAccum sa;
+ sa << '(';
+ for (int pos = 0; pos < len; pos++)
+ if ((s[pos] < ' ' && !isspace((unsigned char) s[pos])) || ((unsigned char)s[pos]) > 0176 || s[pos] == '(' || s[pos] == ')' || s[pos] == '\\') {
+ sa << v.substring(left, pos - left) << '\\';
+ if (s[pos] == '(' || s[pos] == ')' || s[pos] == '\\')
+ sa << s[pos];
+ else
+ sprintf(sa.reserve(8), "%03o", (unsigned char) (s[pos]));
+ left = pos + 1;
+ }
+ sa << v.substring(left) << ')';
+ _val = sa.take_string();
+}
+
+void
+Type1Definition::set_name(PermString str, bool name)
+{
+ StringAccum sa;
+ if (name)
+ sa << '/';
+ sa << str;
+ set_val(sa);
+}
+
+static void
+accum_numvec(StringAccum &sa, const NumVector &nv, bool executable)
+{
+ char open = (executable ? '{' : '[');
+ for (int i = 0; i < nv.size(); i++)
+ sa << (i ? ' ' : open) << nv[i];
+ sa << (executable ? '}' : ']');
+}
+
+void
+Type1Definition::set_numvec(const NumVector &nv, bool executable)
+{
+ StringAccum sa;
+ accum_numvec(sa, nv, executable);
+ set_val(sa);
+}
+
+void
+Type1Definition::set_numvec_vec(const Vector<NumVector> &nv)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < nv.size(); i++)
+ accum_numvec(sa, nv[i], false);
+ sa << ']';
+ set_val(sa);
+}
+
+void
+Type1Definition::set_normalize(const Vector<NumVector> &vin,
+ const Vector<NumVector> &vout)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < vin.size(); i++) {
+ const NumVector &vini = vin[i];
+ const NumVector &vouti = vout[i];
+ sa << '[';
+ for (int j = 0; j < vini.size(); j++)
+ sa << '[' << vini[j] << ' ' << vouti[j] << ']';
+ sa << ']';
+ }
+ sa << ']';
+ set_val(sa);
+}
+
+void
+Type1Definition::set_namevec(const Vector<PermString> &v, bool executable)
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < v.size(); i++) {
+ if (i) sa << ' ';
+ if (executable) sa << '/';
+ sa << v[i];
+ }
+ sa << ']';
+ set_val(sa);
+}
+
+
+/*****
+ * Type1Encoding
+ **/
+
+static PermString::Initializer initializer;
+static PermString dot_notdef(".notdef");
+
+
+Type1Encoding::Type1Encoding()
+ : _v(new PermString[256]), _copy_of(0), _definer("readonly def")
+{
+ for (int i = 0; i < 256; i++)
+ _v[i] = dot_notdef;
+}
+
+Type1Encoding::Type1Encoding(const Type1Encoding &o)
+ : Type1Item(), _definer(o._definer)
+{
+ if (o._copy_of) {
+ _v = o._v;
+ _copy_of = o._copy_of;
+ } else {
+ _v = new PermString[256];
+ _copy_of = 0;
+ for (int i = 0; i < 256; i++)
+ _v[i] = o._v[i];
+ }
+}
+
+Type1Encoding::Type1Encoding(Type1Encoding *copy_of)
+ : _v(copy_of->_v), _copy_of(copy_of), _definer(copy_of->_definer)
+{
+}
+
+Type1Encoding::~Type1Encoding()
+{
+ if (!_copy_of)
+ delete[] _v;
+}
+
+void
+Type1Encoding::unshare()
+{
+ if (_copy_of) {
+ PermString *new_v = new PermString[256];
+ memcpy(new_v, _v, sizeof(PermString) * 256);
+ _v = new_v;
+ _copy_of = 0;
+ }
+}
+
+void
+Type1Encoding::clear()
+{
+ unshare();
+ for (int i = 0; i < 256; i++)
+ _v[i] = dot_notdef;
+}
+
+
+static Type1Encoding *canonical_standard_encoding;
+
+Type1Encoding *
+Type1Encoding::standard_encoding()
+{
+ if (!canonical_standard_encoding) {
+ canonical_standard_encoding = new Type1Encoding;
+ for (int i = 0; i < 256; i++)
+ if (Charstring::standard_encoding[i])
+ canonical_standard_encoding->put(i, Charstring::standard_encoding[i]);
+ }
+ // Return a copy of the cached encoding. When it's deleted, we won't be.
+ return new Type1Encoding(canonical_standard_encoding);
+}
+
+
+void
+Type1Encoding::gen(Type1Writer &w)
+{
+ if (_copy_of && _copy_of == canonical_standard_encoding)
+ w << "/Encoding StandardEncoding def\n";
+ else {
+ w << "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n";
+ for (int i = 0; i < 256; i++)
+ if (_v[i] != dot_notdef)
+ w << "dup " << i << " /" << _v[i] << " put\n";
+ w << _definer << '\n';
+ }
+}
+
+
+/*****
+ * Type1Subr
+ **/
+
+Type1Subr::Type1Subr(PermString n, int num, PermString definer,
+ int lenIV, const String &s)
+ : _name(n), _subrno(num), _definer(definer), _cs(lenIV, s)
+{
+}
+
+Type1Subr::Type1Subr(PermString n, int num, PermString definer,
+ const Type1Charstring &t1cs)
+ : _name(n), _subrno(num), _definer(definer), _cs(t1cs)
+{
+}
+
+Type1Subr *
+Type1Subr::make(const char *s_in, int s_len, int cs_pos, int cs_len, int lenIV)
+{
+ /* USAGE NOTE: You must ensure that s_in contains a valid subroutine string
+ before calling Type1Subr::make. Type1Reader::was_charstring() is a good
+ guarantee of this.
+ A valid subroutine string is one of the following:
+ /[char_name] ### charstring_start ........
+ dup [subrno] ### charstring_start .... */
+
+ const char *s = s_in;
+ PermString name;
+ int subrno = 0;
+
+ // Force literal spaces rather than isspace().
+ if (*s == '/') {
+ const char *nstart = ++s;
+ while (!isspace((unsigned char) *s) && *s)
+ s++;
+ name = PermString(nstart, s - nstart);
+
+ } else {
+ // dup [subrno] ...
+ s += 3;
+ while (isspace((unsigned char) *s))
+ s++;
+ subrno = strtol(s, (char **)&s, 10);
+ }
+
+ s = s_in + cs_pos;
+
+ // Lazily decrypt the charstring.
+ PermString definer = PermString(s + cs_len, s_len - cs_len - cs_pos);
+ return new Type1Subr(name, subrno, definer, lenIV, String(s, cs_len));
+}
+
+Type1Subr *
+Type1Subr::make_subr(int subrno, const Type1Charstring &cs, PermString definer)
+{
+ return new Type1Subr(PermString(), subrno, definer, cs);
+}
+
+Type1Subr *
+Type1Subr::make_glyph(PermString glyph, const Type1Charstring &cs, PermString definer)
+{
+ return new Type1Subr(glyph, -1, definer, cs);
+}
+
+
+void
+Type1Subr::gen(Type1Writer &w)
+{
+ int len = _cs.length();
+ const unsigned char *data = _cs.data();
+
+ if (is_subr())
+ w << "dup " << _subrno << ' ' << len + w.lenIV() << w.charstring_start();
+ else
+ w << '/' << _name << ' ' << len + w.lenIV() << w.charstring_start();
+
+ if (w.lenIV() < 0) {
+ // lenIV < 0 means charstrings are unencrypted
+ w.print((const char *)data, len);
+
+ } else {
+ // PERFORMANCE NOTE: Putting the charstring in a buffer of known length
+ // and printing that buffer rather than one char at a time is an OK
+ // optimization. (around 10%)
+ unsigned char *buf = new unsigned char[len + w.lenIV()];
+ unsigned char *t = buf;
+
+ int r = t1R_cs;
+ for (int i = 0; i < w.lenIV(); i++) {
+ unsigned char c = (unsigned char)(r >> 8);
+ *t++ = c;
+ r = ((c + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ }
+ for (int i = 0; i < len; i++, data++) {
+ unsigned char c = (*data ^ (r >> 8));
+ *t++ = c;
+ r = ((c + r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ }
+
+ w.print((char *)buf, len + w.lenIV());
+ delete[] buf;
+ }
+
+ w << _definer << '\n';
+}
+
+/*****
+ * Type1SubrGroupItem
+ **/
+
+Type1SubrGroupItem::Type1SubrGroupItem(Type1Font *font, bool is_subrs, const String &value)
+ : _font(font), _is_subrs(is_subrs), _value(value)
+{
+}
+
+Type1SubrGroupItem::Type1SubrGroupItem(const Type1SubrGroupItem &from, Type1Font *font)
+ : _font(font), _is_subrs(from._is_subrs),
+ _value(from._value), _end_text(from._end_text)
+{
+}
+
+void
+Type1SubrGroupItem::add_end_text(const String &s)
+{
+ _end_text += s + "\n";
+}
+
+void
+Type1SubrGroupItem::gen(Type1Writer &w)
+{
+ Type1Font *font = _font;
+
+ int pos = _value.find_left(_is_subrs ? " array" : " dict");
+ if (pos >= 1 && isdigit((unsigned char) _value[pos - 1])) {
+ int numpos = pos - 1;
+ while (numpos >= 1 && isdigit((unsigned char) _value[numpos - 1]))
+ numpos--;
+
+ int n;
+ if (_is_subrs) {
+ n = font->nsubrs();
+ while (n && !font->subr(n - 1))
+ n--;
+ } else
+ n = font->nglyphs();
+
+ w << _value.substring(0, numpos) << n << _value.substring(pos);
+ } else
+ w << _value;
+
+ w << '\n';
+
+ if (_is_subrs) {
+ int count = font->nsubrs();
+ for (int i = 0; i < count; i++)
+ if (Type1Subr *g = font->subr_x(i))
+ g->gen(w);
+ } else {
+ int count = font->nglyphs();
+ for (int i = 0; i < count; i++)
+ if (Type1Subr *g = font->glyph_x(i))
+ g->gen(w);
+ }
+
+ w << _end_text;
+}
+
+/*****
+ * Type1IncludedFont
+ **/
+
+Type1IncludedFont::Type1IncludedFont(Type1Font *font, int unique_id)
+ : _included_font(font), _unique_id(unique_id)
+{
+}
+
+Type1IncludedFont::~Type1IncludedFont()
+{
+ delete _included_font;
+}
+
+void
+Type1IncludedFont::gen(Type1Writer &w)
+{
+ FILE *f = tmpfile();
+ if (!f)
+ return;
+
+ // write included font
+ Type1PFAWriter new_w(f);
+ _included_font->write(new_w);
+ fflush(f);
+
+ struct stat s;
+ fstat(fileno(f), &s);
+
+ w << "FontDirectory /" << _included_font->font_name() << " known{\n"
+ << "/" << _included_font->font_name()
+ << " findfont dup /UniqueID known {dup /UniqueID get "
+ << _unique_id
+ << " eq exch /FontType get 1 eq and}{pop false}ifelse {\nsave userdict/fbufstr 512 string put\n"
+ << (int)(s.st_size / 512)
+ << "{currentfile fbufstr readstring{pop}{clear currentfile\nclosefile/fontdownload/unexpectedEOF/.error cvx exec}ifelse}repeat\ncurrentfile "
+ << (int)(s.st_size % 512)
+ << " string readstring{pop}{clear currentfile\nclosefile/fontdownload/unexpectedEOF/.error cvx exec}ifelse\nrestore}if}if\n";
+
+ rewind(f);
+ char str[2048];
+ while (1) {
+ int r = fread(str, 1, 2048, f);
+ if (r <= 0)
+ break;
+ w.print(str, r);
+ }
+
+ fclose(f);
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc
new file mode 100644
index 00000000000..c49eafa6e87
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1mm.cc
@@ -0,0 +1,393 @@
+// -*- related-file-name: "../include/efont/t1mm.hh" -*-
+
+/* t1mm.{cc,hh} -- Type 1 multiple master font information
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1mm.hh>
+#include <efont/t1interp.hh>
+#include <lcdf/error.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+namespace Efont {
+
+MultipleMasterSpace::MultipleMasterSpace(PermString fn, int na, int nm)
+ : CharstringProgram(1000),
+ _ok(false), _font_name(fn), _naxes(na), _nmasters(nm),
+ _axis_types(na, PermString()), _axis_labels(na, PermString()),
+ _design_vector(0), _norm_design_vector(0), _weight_vector(0)
+{
+}
+
+
+void
+MultipleMasterSpace::set_master_positions(const Vector<NumVector> &mp)
+{
+ _master_positions = mp;
+}
+
+void
+MultipleMasterSpace::set_normalize(const Vector<NumVector> &nin,
+ const Vector<NumVector> &nout)
+{
+ _normalize_in = nin;
+ _normalize_out = nout;
+}
+
+void
+MultipleMasterSpace::set_axis_type(int ax, PermString t)
+{
+ _axis_types[ax] = t;
+}
+
+void
+MultipleMasterSpace::set_axis_label(int ax, PermString t)
+{
+ _axis_labels[ax] = t;
+}
+
+void
+MultipleMasterSpace::set_design_vector(const NumVector &v)
+{
+ _default_design_vector = v;
+}
+
+void
+MultipleMasterSpace::set_weight_vector(const NumVector &v)
+{
+ _default_weight_vector = v;
+}
+
+
+PermString
+MultipleMasterSpace::axis_abbreviation(PermString atype)
+{
+ if (atype == "Weight")
+ return "wt";
+ else if (atype == "Width")
+ return "wd";
+ else if (atype == "OpticalSize")
+ return "op";
+ else if (atype == "Style")
+ return "st";
+ else
+ return atype;
+}
+
+
+bool
+MultipleMasterSpace::error(ErrorHandler *errh, const char *s, ...) const
+{
+ if (errh) {
+ char buf[1024];
+ va_list val;
+ va_start(val, s);
+ assert(strlen(s) < 800);
+ sprintf(buf, (s[0] == ' ' ? "%.200s%s" : "%.200s: %s"),
+ _font_name.c_str(), s);
+ errh->xmessage(ErrorHandler::e_error, buf, val);
+ va_end(val);
+ }
+ return false;
+}
+
+
+bool
+MultipleMasterSpace::check(ErrorHandler *errh)
+{
+ if (_ok)
+ return true;
+
+ if (_nmasters <= 0 || _nmasters > 16)
+ return error(errh, "number of masters must be between 1 and 16");
+ if (_naxes <= 0 || _naxes > 4)
+ return error(errh, "number of axes must be between 1 and 4");
+
+ if (_master_positions.size() != _nmasters)
+ return error(errh, "bad BlendDesignPositions");
+ for (int i = 0; i < _nmasters; i++)
+ if (_master_positions[i].size() != _naxes)
+ return error(errh, "inconsistent BlendDesignPositions");
+
+ if (_normalize_in.size() != _naxes || _normalize_out.size() != _naxes)
+ return error(errh, "bad BlendDesignMap");
+ for (int i = 0; i < _naxes; i++)
+ if (_normalize_in[i].size() != _normalize_out[i].size())
+ return error(errh, "bad BlendDesignMap");
+
+ if (!_axis_types.size())
+ _axis_types.assign(_naxes, PermString());
+ if (_axis_types.size() != _naxes)
+ return error(errh, "bad BlendAxisTypes");
+
+ if (!_axis_labels.size())
+ _axis_labels.assign(_naxes, PermString());
+ if (_axis_labels.size() != _naxes)
+ return error(errh, "bad axis labels");
+
+ if (!_default_design_vector.size())
+ _default_design_vector.assign(_naxes, UNKDOUBLE);
+ if (_default_design_vector.size() != _naxes)
+ return error(errh, "inconsistent design vector");
+
+ if (!_default_weight_vector.size())
+ _default_weight_vector.assign(_nmasters, UNKDOUBLE);
+ if (_default_weight_vector.size() != _nmasters)
+ return error(errh, "inconsistent weight vector");
+
+ _ok = true;
+ return true;
+}
+
+bool
+MultipleMasterSpace::check_intermediate(ErrorHandler *errh)
+{
+ if (!_ok || _cdv)
+ return true;
+
+ for (int a = 0; a < _naxes; a++)
+ for (int m = 0; m < _nmasters; m++)
+ if (_master_positions[m][a] != 0 && _master_positions[m][a] != 1) {
+ if (errh)
+ errh->warning("%s requires intermediate master conversion programs",
+ _font_name.c_str());
+ return false;
+ }
+
+ return true;
+}
+
+
+int
+MultipleMasterSpace::axis(PermString ax) const
+{
+ for (int a = 0; a < _naxes; a++)
+ if (_axis_types[a] == ax || _axis_labels[a] == ax)
+ return a;
+ return -1;
+}
+
+double
+MultipleMasterSpace::axis_low(int ax) const
+{
+ return _normalize_in[ax][0];
+}
+
+double
+MultipleMasterSpace::axis_high(int ax) const
+{
+ return _normalize_in[ax].back();
+}
+
+
+Vector<double>
+MultipleMasterSpace::empty_design_vector() const
+{
+ return Vector<double>(_naxes, UNKDOUBLE);
+}
+
+bool
+MultipleMasterSpace::set_design(NumVector &design_vector, int ax, double value,
+ ErrorHandler *errh) const
+{
+ if (ax < 0 || ax >= _naxes)
+ return error(errh, " has only %d axes", _naxes);
+
+ if (value < axis_low(ax)) {
+ value = axis_low(ax);
+ if (errh)
+ errh->warning("raising %s's %s to %g", _font_name.c_str(),
+ _axis_types[ax].c_str(), value);
+ }
+ if (value > axis_high(ax)) {
+ value = axis_high(ax);
+ if (errh)
+ errh->warning("lowering %s's %s to %g", _font_name.c_str(),
+ _axis_types[ax].c_str(), value);
+ }
+
+ design_vector[ax] = value;
+ return true;
+}
+
+bool
+MultipleMasterSpace::set_design(NumVector &design_vector, PermString ax_name,
+ double val, ErrorHandler *errh) const
+{
+ int ax = axis(ax_name);
+ if (ax < 0)
+ return error(errh, " has no `%s' axis", ax_name.c_str());
+ else
+ return set_design(design_vector, ax, val, errh);
+}
+
+
+bool
+MultipleMasterSpace::normalize_vector(ErrorHandler *errh) const
+{
+ NumVector &design = *_design_vector;
+ NumVector &norm_design = *_norm_design_vector;
+
+ for (int a = 0; a < _naxes; a++)
+ if (!KNOWN(design[a])) {
+ if (errh)
+ errh->error("must specify %s's %s coordinate", _font_name.c_str(), _axis_types[a].c_str());
+ return false;
+ }
+
+ // Move to normalized design coordinates.
+ norm_design.assign(_naxes, UNKDOUBLE);
+
+ if (_ndv) {
+ CharstringInterp ai;
+ if (!ai.interpret(this, &_ndv))
+ return error(errh, "%s in NDV program", ai.error_string().c_str());
+
+ } else
+ for (int a = 0; a < _naxes; a++) {
+ double d = design[a];
+ double nd = UNKDOUBLE;
+ const Vector<double> &norm_in = _normalize_in[a];
+ const Vector<double> &norm_out = _normalize_out[a];
+
+ if (d < norm_in[0])
+ nd = norm_out[0];
+ for (int i = 1; i < norm_in.size(); i++)
+ if (d >= norm_in[i-1] && d < norm_in[i]) {
+ nd = norm_out[i-1]
+ + ((d - norm_in[i-1])
+ * (norm_out[i] - norm_out[i-1])
+ / (norm_in[i] - norm_in[i-1]));
+ goto done;
+ }
+ if (d >= norm_in.back())
+ nd = norm_out.back();
+
+ done:
+ norm_design[a] = nd;
+ }
+
+ for (int a = 0; a < _naxes; a++)
+ if (!KNOWN(norm_design[a]))
+ return error(errh, "bad normalization");
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::convert_vector(ErrorHandler *errh) const
+{
+ NumVector &norm_design = *_norm_design_vector;
+ NumVector &weight = *_weight_vector;
+
+ weight.assign(_nmasters, 1);
+
+ if (_cdv) {
+ CharstringInterp ai;
+ if (!ai.interpret(this, &_cdv))
+ return error(errh, "%s in CDV program", ai.error_string().c_str());
+
+ } else
+ for (int a = 0; a < _naxes; a++)
+ for (int m = 0; m < _nmasters; m++) {
+ if (_master_positions[m][a] == 0)
+ weight[m] *= 1 - norm_design[a];
+ else if (_master_positions[m][a] == 1)
+ weight[m] *= norm_design[a];
+ else
+ return error(errh, " requires intermediate master conversion programs");
+ }
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::design_to_norm_design(const NumVector &design_in,
+ NumVector &norm_design,
+ ErrorHandler *errh) const
+{
+ NumVector design(design_in);
+ NumVector weight;
+
+ _design_vector = &design;
+ _norm_design_vector = &norm_design;
+ _weight_vector = &weight;
+ if (!normalize_vector(errh))
+ return false;
+ _design_vector = _norm_design_vector = _weight_vector = 0;
+
+ return true;
+}
+
+
+bool
+MultipleMasterSpace::design_to_weight(const NumVector &design_in, NumVector &weight, ErrorHandler *errh) const
+{
+ NumVector design(design_in);
+ NumVector norm_design;
+
+ bool dirty = false;
+ for (int i = 0; i < _naxes; i++)
+ if (design[i] != _default_design_vector[i])
+ dirty = true;
+
+ if (dirty) {
+ _design_vector = &design;
+ _norm_design_vector = &norm_design;
+ _weight_vector = &weight;
+ if (!normalize_vector(errh))
+ return false;
+ if (!convert_vector(errh))
+ return false;
+ _design_vector = _norm_design_vector = _weight_vector = 0;
+ } else
+ weight = _default_weight_vector;
+
+ double sum = 0;
+ for (int m = 0; m < _nmasters; m++)
+ sum += weight[m];
+ if (sum < 0.9999 || sum > 1.0001)
+ return error(errh, "bad conversion: weight vector doesn't sum to 1");
+
+ // adjust weight vector to max 4 decimal digits of precision, and make it
+ // sum to exactly 1
+ sum = 0;
+ for (int m = 0; m < _nmasters - 1; m++) {
+ weight[m] = floor(weight[m] * 10000. + 0.5) / 10000.;
+ sum += weight[m];
+ }
+ weight[_nmasters - 1] = 1 - sum;
+
+ return true;
+}
+
+
+Vector<double> *
+MultipleMasterSpace::mm_vector(VectorType t, bool writable) const
+{
+ if (t == VEC_WEIGHT)
+ return _weight_vector;
+ else if (t == VEC_NORM_DESIGN)
+ return _norm_design_vector;
+ else if (t == VEC_DESIGN && !writable)
+ return _design_vector;
+ else
+ return 0;
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc
new file mode 100644
index 00000000000..35e9f57a72c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1rw.cc
@@ -0,0 +1,613 @@
+// -*- related-file-name: "../include/efont/t1rw.hh" -*-
+
+/* t1rw.{cc,hh} -- Type 1 font reading and writing
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1rw.hh>
+#include <efont/t1cs.hh>
+#include <lcdf/straccum.hh>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+namespace Efont {
+
+unsigned char Type1Reader::xvalue_store[257];
+unsigned char *Type1Reader::xvalue = &Type1Reader::xvalue_store[1];
+
+void
+Type1Reader::static_initialize()
+{
+ if (xvalue['A'])
+ return;
+ // rely on static data being initialized to 0
+ xvalue['0'] = 0; xvalue['1'] = 1; xvalue['2'] = 2; xvalue['3'] = 3;
+ xvalue['4'] = 4; xvalue['5'] = 5; xvalue['6'] = 6; xvalue['7'] = 7;
+ xvalue['8'] = 8; xvalue['9'] = 9;
+ xvalue['A'] = 10; xvalue['B'] = 11; xvalue['C'] = 12; xvalue['D'] = 13;
+ xvalue['E'] = 14; xvalue['F'] = 15;
+ xvalue['a'] = 10; xvalue['b'] = 11; xvalue['c'] = 12; xvalue['d'] = 13;
+ xvalue['e'] = 14; xvalue['f'] = 15;
+}
+
+
+Type1Reader::Type1Reader()
+ : _data(new unsigned char[DATA_SIZE]), _len(0), _pos(0),
+ _ungot(-1), _eexec(false)
+{
+ static_initialize();
+}
+
+Type1Reader::~Type1Reader()
+{
+ delete[] _data;
+}
+
+
+void
+Type1Reader::set_charstring_definer(PermString x)
+{
+ _charstring_definer = x;
+}
+
+void
+Type1Reader::switch_eexec(bool on, unsigned char *data, int len)
+{
+ if (on) {
+ if (_pos < len + 3) {
+ unsigned char *new_data = new unsigned char[len + 3 + DATA_SIZE];
+ assert(_len <= DATA_SIZE);
+ memcpy(new_data + len + 3, _data + _pos, _len - _pos);
+ _len = len + 3 + _len - _pos;
+ _pos = len + 3;
+ delete[] _data;
+ _data = new_data;
+ }
+ int original_pos = _pos;
+ // don't forget _ungot!!
+ if (_ungot >= 0)
+ _data[--_pos] = _ungot, _ungot = -1;
+ if (_crlf == 0 || _crlf == 2)
+ _data[--_pos] = '\n';
+ if (_crlf == 1 || _crlf == 2)
+ _data[--_pos] = '\r';
+ memcpy(_data + _pos - len, data, len);
+ _pos -= len;
+ start_eexec(original_pos - _pos);
+ }
+ _eexec = on;
+}
+
+
+int
+Type1Reader::more_data()
+{
+ _pos = 0;
+ _len = more_data(_data, DATA_SIZE);
+ if (_len < 0)
+ return -1;
+ else
+ return _data[_pos++];
+}
+
+
+inline int
+Type1Reader::get_base()
+{
+ if (_pos >= _len)
+ return more_data();
+ else
+ return _data[_pos++];
+}
+
+
+inline int
+Type1Reader::eexec(int c)
+{
+ unsigned char answer = (unsigned char)(c ^ (_r >> 8));
+ _r = (((unsigned char)c + _r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ return answer;
+}
+
+
+int
+Type1Reader::ascii_eexec_get()
+{
+ int d1 = get_base();
+ while (isspace(d1))
+ d1 = get_base();
+
+ int d2 = get_base();
+ while (isspace(d2))
+ d2 = get_base();
+ if (d2 < 0)
+ return -1;
+
+ return eexec((xvalue[d1] << 4) | (xvalue[d2]));
+}
+
+
+inline int
+Type1Reader::get()
+{
+ if (!_eexec)
+ return get_base();
+
+ else if (_binary_eexec) {
+ int c = get_base();
+ return c < 0 ? c : eexec(c);
+
+ } else
+ return ascii_eexec_get();
+}
+
+
+void
+Type1Reader::start_eexec(int initial_ascii)
+{
+ /* God damn this _ungot thing!! It makes sense not to check it on every
+ char fetch, since it can only be set at the end of next_line; therefore,
+ only the first get() into a user-visible function might need to check
+ _ungot. The problem is I forgot start_eexec() was such a function! */
+ int c = _ungot < 0 ? get_base() : _ungot;
+ initial_ascii--;
+ _ungot = -1;
+
+ /* Strictly speaking, I should look for whitespace even in binary sections
+ of PFB fonts; but it turns out some PFBs would be unreadable with that
+ pedantic rule. */
+ while (isspace(c) && (initial_ascii >= 0 || !preserve_whitespace()))
+ c = get_base(), initial_ascii--;
+
+ /* Differentiate between ASCII eexec and binary eexec. */
+ int rand_bytes[4];
+ _binary_eexec = false;
+ for (int i = 0; i < 4; i++) {
+ if (i)
+ c = get_base();
+ rand_bytes[i] = c;
+ if (!isxdigit(c))
+ _binary_eexec = true;
+ }
+
+ _r = t1R_ee;
+ if (_binary_eexec)
+ for (int i = 0; i < 4; i++)
+ eexec(rand_bytes[i]);
+ else {
+ for (int i = 0; i < 2; i++) {
+ c = xvalue[rand_bytes[i*2]] * 16 + xvalue[rand_bytes[i*2+1]];
+ eexec(c);
+ }
+ ascii_eexec_get();
+ ascii_eexec_get();
+ }
+}
+
+
+bool
+Type1Reader::test_charstring(StringAccum &str)
+{
+ /* PERFORMANCE NOTE: This function is definitely a bottleneck. Making it
+ more efficient cut time by about 40%. */
+
+ if (!_charstring_definer)
+ return false;
+ if (_charstring_len >= 0)
+ return str.length() <= _charstring_start + _charstring_len;
+
+ str.append('\0'); // protect against running off end of string
+ char *s = str.data();
+ char *start;
+ while (*s == ' ')
+ s++;
+
+ if (s[0] == '/')
+ s++;
+ else if (s[0] == 'd' && s[1] == 'u' && s[2] == 'p' && isspace((unsigned char) s[3])) {
+ s += 4;
+ // 17.Jan.2000 -- some fonts have extra space here.
+ while (isspace((unsigned char) *s))
+ s++;
+ } else
+ goto not_charstring;
+
+ // Force one literal space rather than isspace().
+ // Why? Consistency: we force 1 literal space around _charstring_definer.
+ while (*s != ' ' && *s)
+ s++;
+ if (*s++ != ' ' || !isdigit((unsigned char) *s))
+ goto not_charstring;
+ start = s;
+ s++;
+ while (*s != ' ' && *s)
+ s++;
+ if (strncmp(s, _charstring_definer.c_str(), _charstring_definer.length()) != 0)
+ goto not_charstring;
+
+ _charstring_len = strtol(start, 0, 10);
+ _charstring_start = (s - str.data()) + _charstring_definer.length();
+ str.pop_back();
+ return str.length() <= _charstring_start + _charstring_len;
+
+ not_charstring:
+ str.pop_back();
+ return false;
+}
+
+
+/* PERFORMANCE NOTE: All kinds of speedup tricks tried with eexec -- buffering
+ (doing eexec processing at more_data time), etc., and all this stuff -- and
+ found to have essentially zero effect for PFB fonts. Now, it might be
+ effective for PFAs; but who cares? I hate PFAs. */
+
+bool
+Type1Reader::next_line(StringAccum &s)
+{
+ if (_len < 0)
+ return false;
+
+ // Can't be a charstring if incoming accumulator has nonzero length.
+ _charstring_start = 0;
+ _charstring_len = (s.length() > 0 ? 0 : -1);
+
+ int first_char = _ungot < 0 ? get() : _ungot;
+ _ungot = -1;
+
+ for (int c = first_char; c >= 0; c = get())
+ switch (c) {
+
+ case '\n':
+ if (test_charstring(s))
+ goto normal;
+ else {
+ _crlf = 0;
+ goto done;
+ }
+
+ case '\r':
+ // check for \r\n (counts as only one line ending)
+ if (test_charstring(s))
+ goto normal;
+ c = get();
+ if (c != '\n' || preserve_whitespace())
+ _ungot = c, _crlf = 1;
+ else
+ _crlf = 2;
+ goto done;
+
+ normal:
+ default:
+ s.append((char)c);
+ break;
+
+ }
+
+ done:
+ return true;
+}
+
+
+int
+Type1Reader::get_data(unsigned char *data, int len)
+{
+ if (_len < 0)
+ return -1;
+ if (len <= 0)
+ return 0;
+
+ int pos = 0;
+ if (_ungot >= 0) {
+ *data++ = _ungot;
+ pos++;
+ _ungot = -1;
+ }
+
+ for (; pos < len; pos++) {
+ int c = get();
+ if (c < 0)
+ break;
+ *data++ = c;
+ }
+
+ return pos;
+}
+
+
+/*****
+ * Type1PFAReader
+ **/
+
+Type1PFAReader::Type1PFAReader(FILE *f)
+ : _f(f)
+{
+}
+
+int
+Type1PFAReader::more_data(unsigned char *data, int len)
+{
+ size_t size = fread(data, 1, len, _f);
+ return size ? (int)size : -1;
+}
+
+
+/*****
+ * Type1PFBReader
+ **/
+
+Type1PFBReader::Type1PFBReader(FILE *f)
+ : _f(f), _binary(false), _left(0)
+{
+}
+
+int
+Type1PFBReader::more_data(unsigned char *data, int len)
+{
+ while (_left == 0) {
+ int c = getc(_f);
+ if (c != 128)
+ return -1;
+
+ c = getc(_f);
+ if (c == 3 || c < 1 || c > 3)
+ return -1;
+ _binary = (c == 2);
+
+ _left = getc(_f);
+ _left |= getc(_f) << 8;
+ _left |= getc(_f) << 16;
+ _left |= getc(_f) << 24;
+ }
+
+ if (_left < 0)
+ return -1;
+
+ if (len > _left)
+ len = _left;
+ _left -= len;
+
+ return fread(data, 1, len, _f);
+}
+
+bool
+Type1PFBReader::preserve_whitespace() const
+{
+ return _binary;
+}
+
+
+/*****
+ * Type1SubsetReader
+ **/
+
+Type1SubsetReader::Type1SubsetReader(Type1Reader *r, int left)
+ : _reader(r), _left(left)
+{
+}
+
+int
+Type1SubsetReader::more_data(unsigned char *data, int len)
+{
+ if (_left <= 0)
+ return -1;
+ if (len > _left)
+ len = _left;
+ int how_much = _reader->get_data(data, len);
+ if (how_much > 0)
+ _left -= how_much;
+ return how_much;
+}
+
+bool
+Type1SubsetReader::preserve_whitespace() const
+{
+ return _reader->preserve_whitespace();
+}
+
+
+/*****
+ * Writer
+ **/
+
+Type1Writer::Type1Writer()
+ : _buf(new unsigned char[BufSize]), _pos(0),
+ _eexec(false), _eexec_start(-1), _eexec_end(-1), _lenIV(4)
+{
+}
+
+
+Type1Writer::~Type1Writer()
+{
+ assert(!_pos);
+ delete[] _buf;
+}
+
+
+inline unsigned char
+Type1Writer::eexec(int p)
+{
+ unsigned char c = ((unsigned char)p ^ (_r >> 8)) & 0xFF;
+ _r = ((c + _r) * (uint32_t) t1C1 + t1C2) & 0xFFFF;
+ return c;
+}
+
+
+void
+Type1Writer::flush()
+{
+ local_flush();
+}
+
+
+/* PERFORMANCE NOTE: Doing eexec processing during flush -- which streamlines
+ code for the print() methods -- seems to save some time (4-5%). It also
+ makes write performance more consistent. But I have mixed feelings. */
+
+void
+Type1Writer::local_flush()
+{
+ if (_eexec_start >= 0 && _eexec_end < 0)
+ _eexec_end = _pos;
+ for (int p = _eexec_start; p < _eexec_end; p++)
+ _buf[p] = eexec(_buf[p]);
+ print0(_buf, _pos);
+ _pos = 0;
+ _eexec_start = _eexec ? 0 : -1;
+ _eexec_end = -1;
+}
+
+
+void
+Type1Writer::print(const char *s, int n)
+{
+ while (n > 0) {
+ if (_pos >= BufSize)
+ local_flush();
+ int copy = BufSize - _pos;
+ if (copy > n) copy = n;
+ memcpy(_buf + _pos, s, copy);
+ _pos += copy;
+ s += copy;
+ n -= copy;
+ }
+}
+
+
+Type1Writer &
+Type1Writer::operator<<(int x)
+{
+ char str[128];
+ sprintf(str, "%d", x);
+ print(str, strlen(str));
+ return *this;
+}
+
+
+Type1Writer &
+Type1Writer::operator<<(double x)
+{
+ char str[256];
+ sprintf(str, "%g", x);
+ print(str, strlen(str));
+ return *this;
+}
+
+
+void
+Type1Writer::switch_eexec(bool on)
+{
+ _eexec = on;
+ if (_eexec) {
+ _eexec_start = _pos;
+ _r = t1R_ee;
+ print("SUCK", 4);
+ } else
+ _eexec_end = _pos;
+}
+
+
+/*****
+ * Type1PFAWriter
+ **/
+
+Type1PFAWriter::Type1PFAWriter(FILE *f)
+ : _f(f), _hex_line(0)
+{
+}
+
+Type1PFAWriter::~Type1PFAWriter()
+{
+ flush();
+}
+
+
+void
+Type1PFAWriter::switch_eexec(bool on)
+{
+ flush();
+ _hex_line = 0;
+ Type1Writer::switch_eexec(on);
+}
+
+void
+Type1PFAWriter::print0(const unsigned char *c, int l)
+{
+ if (eexecing()) {
+ const char *hex = "0123456789ABCDEF";
+ for (; l; c++, l--) {
+ putc(hex[*c / 16], _f);
+ putc(hex[*c % 16], _f);
+ if (++_hex_line == 39) {
+ putc('\n', _f);
+ _hex_line = 0;
+ }
+ }
+ } else {
+ ssize_t result = fwrite(c, 1, l, _f);
+ (void) result;
+ }
+}
+
+
+/*****
+ * Type1PFBWriter
+ **/
+
+Type1PFBWriter::Type1PFBWriter(FILE *f)
+ : _f(f), _binary(false)
+{
+}
+
+Type1PFBWriter::~Type1PFBWriter()
+{
+ flush();
+ fputc(128, _f);
+ fputc(3, _f);
+}
+
+void
+Type1PFBWriter::flush()
+{
+ Type1Writer::flush();
+ if (_save.length()) {
+ fputc(128, _f);
+ fputc(_binary ? 2 : 1, _f);
+ long l = _save.length();
+ fputc(l & 0xFF, _f);
+ fputc((l >> 8) & 0xFF, _f);
+ fputc((l >> 16) & 0xFF, _f);
+ fputc((l >> 24) & 0xFF, _f);
+ ssize_t result = fwrite(_save.data(), 1, _save.length(), _f);
+ (void) result;
+ _save.clear();
+ }
+}
+
+void
+Type1PFBWriter::switch_eexec(bool on)
+{
+ flush();
+ Type1Writer::switch_eexec(on);
+ _binary = on;
+}
+
+void
+Type1PFBWriter::print0(const unsigned char *c, int l)
+{
+ char *m = _save.extend(l);
+ memcpy(m, c, l);
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc
new file mode 100644
index 00000000000..e38aa37a9d7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/t1unparser.cc
@@ -0,0 +1,137 @@
+// -*- related-file-name: "../include/efont/t1unparser.hh" -*-
+
+/* t1unparser.{cc,hh} -- debug printing of Type 1 fonts
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1unparser.hh>
+namespace Efont {
+
+CharstringUnparser::CharstringUnparser()
+ : CharstringInterp(),
+ _one_command_per_line(false), _start_of_line(true)
+{
+}
+
+CharstringUnparser::CharstringUnparser(const CharstringUnparser &o)
+ : CharstringInterp(o),
+ _one_command_per_line(o._one_command_per_line),
+ _start_of_line(o._start_of_line)
+{
+}
+
+void
+CharstringUnparser::clear()
+{
+ _sa.clear();
+ _start_of_line = true;
+}
+
+bool
+CharstringUnparser::number(double n)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+ _sa << n;
+ return true;
+}
+
+bool
+CharstringUnparser::type1_command(int cmd)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+ if (cmd >= 0 && cmd <= Cs::cLastCommand)
+ _sa << Cs::command_names[cmd];
+ else
+ _sa << "UNKNOWN_12_" << (cmd - 32);
+ if (_one_command_per_line) {
+ _sa << '\n';
+ _start_of_line = true;
+ }
+ return true;
+}
+
+bool
+CharstringUnparser::type2_command(int cmd, const unsigned char *data, int *left)
+{
+ if (_start_of_line) {
+ _sa << _indent;
+ _start_of_line = false;
+ } else
+ _sa << ' ';
+
+ if (cmd >= 0 && cmd <= Cs::cLastCommand)
+ _sa << Cs::command_names[cmd];
+ else
+ _sa << "UNKNOWN_12_" << (cmd - 32);
+
+ switch (cmd) {
+ case Cs::cHstem: case Cs::cHstemhm: case Cs::cVstem: case Cs::cVstemhm:
+ case Cs::cHintmask: case Cs::cCntrmask:
+ CharstringInterp::type2_command(cmd, data, left);
+ break;
+ }
+
+ if (_one_command_per_line) {
+ _sa << '\n';
+ _start_of_line = true;
+ }
+
+ return true;
+}
+
+void
+CharstringUnparser::act_hintmask(int, const unsigned char *data, int nhints)
+{
+ _sa << '[';
+ for (int i = 0; i < nhints; i++, data++)
+ sprintf(_sa.extend(2), "%02X", *data);
+ _sa << ']';
+}
+
+String
+CharstringUnparser::value()
+{
+ _start_of_line = true;
+ return _sa.take_string();
+}
+
+String
+CharstringUnparser::unparse(const Charstring *cs)
+{
+ if (cs) {
+ CharstringUnparser u;
+ u.interpret(0, cs);
+ return u.value();
+ } else
+ return "(null)";
+}
+
+String
+CharstringUnparser::unparse(const Charstring &cs)
+{
+ CharstringUnparser u;
+ u.interpret(0, &cs);
+ return u.value();
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc
new file mode 100644
index 00000000000..eef06084ced
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfcs.cc
@@ -0,0 +1,232 @@
+// -*- related-file-name: "../include/efont/ttfcs.hh" -*-
+
+/* ttfcs.{cc,hh} -- TrueType "charstring" emulation
+ *
+ * Copyright (c) 2006-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/ttfcs.hh>
+#include <efont/ttfhead.hh>
+#include <efont/t1csgen.hh>
+#include <efont/otfpost.hh>
+#include <efont/otfcmap.hh>
+#include <lcdf/hashmap.hh>
+#include <algorithm>
+namespace Efont {
+typedef OpenType::Glyph Glyph;
+
+TrueTypeBoundsCharstringProgram::TrueTypeBoundsCharstringProgram(const OpenType::Font* otf)
+ : CharstringProgram(otf->units_per_em()),
+ _otf(otf), _nglyphs(-1), _loca_long(false),
+ _loca(otf->table("loca")), _glyf(otf->table("glyf")),
+ _hmtx(otf->table("hmtx")), _got_glyph_names(false), _got_unicodes(false)
+{
+ OpenType::Data maxp(otf->table("maxp"));
+ if (maxp.length() >= 6)
+ _nglyphs = maxp.u16(4);
+
+ OpenType::Head head(otf->table("head"), 0);
+ if (head.ok())
+ _loca_long = head.index_to_loc_format() != 0;
+ if (_loca_long)
+ _loca.align_long();
+ int loca_onesize = (_loca_long ? 4 : 2);
+ if (_nglyphs >= _loca.length() / loca_onesize)
+ _nglyphs = (_loca.length() / loca_onesize) - 1;
+
+ // horizontal metrics
+ OpenType::Data hhea(_otf->table("hhea"));
+ // HHEA format:
+ // 0 Fixed Table version number 0x00010000 for version 1.0.
+ // 4 FWORD Ascender
+ // 6 FWORD Descender
+ // 8 FWORD LineGap
+ // 10 UFWORD advanceWidthMax
+ // 12 FWORD minLeftSideBearing
+ // 14 FWORD minRightSideBearing
+ // 16 FWORD xMaxExtent
+ // 18 SHORT caretSlopeRise
+ // 20 SHORT caretSlopeRun
+ // 22 SHORT caretOffset
+ // 24 SHORT (reserved)
+ // 26 SHORT (reserved)
+ // 28 SHORT (reserved)
+ // 30 SHORT (reserved)
+ // 32 SHORT metricDataFormat
+ // 34 USHORT numberOfHMetrics
+ if (hhea.length() >= 36
+ && hhea.u32(0) == 0x10000)
+ _nhmtx = hhea.u16(34);
+ if (_nhmtx * 4 > _hmtx.length())
+ _nhmtx = _hmtx.length() / 4;
+}
+
+TrueTypeBoundsCharstringProgram::~TrueTypeBoundsCharstringProgram()
+{
+ for (Charstring **cs = _charstrings.begin(); cs < _charstrings.end(); cs++)
+ delete *cs;
+}
+
+void TrueTypeBoundsCharstringProgram::font_matrix(double matrix[6]) const {
+ matrix[0] = matrix[3] = 1.0 / _otf->units_per_em();
+ matrix[1] = matrix[2] = matrix[4] = matrix[5] = 0;
+}
+
+int
+TrueTypeBoundsCharstringProgram::nglyphs() const
+{
+ return _nglyphs;
+}
+
+PermString
+TrueTypeBoundsCharstringProgram::glyph_name(int gi) const
+{
+ // generate glyph names based on what pdftex can understand
+ if (gi == 0)
+ return PermString(".notdef");
+
+ // try 'post' table glyph names
+ if (!_got_glyph_names) {
+ OpenType::Post post(_otf->table("post"));
+ if (post.ok())
+ post.glyph_names(_glyph_names);
+ HashMap<PermString, int> name2glyph(-1);
+ // some 'post' tables are bogus, reject multiply-encoded names
+ for (int gi = 0; gi < _glyph_names.size(); ++gi) {
+ int& xgi = name2glyph.find_force(_glyph_names[gi]);
+ if (xgi == -1)
+ xgi = gi;
+ else if (xgi == 0)
+ _glyph_names[gi] = PermString();
+ else
+ _glyph_names[gi] = _glyph_names[xgi] = PermString();
+ }
+ _got_glyph_names = true;
+ }
+ if (gi >= 0 && gi < _glyph_names.size() && _glyph_names[gi])
+ return _glyph_names[gi];
+
+ // try 'uniXXXX' names
+ if (!_got_unicodes) {
+ OpenType::Cmap cmap(_otf->table("cmap"));
+ if (cmap.ok()) {
+ Vector<std::pair<uint32_t, Glyph> > ugp;
+ cmap.unmap_all(ugp);
+ std::sort(ugp.begin(), ugp.end());
+ for (Vector<std::pair<uint32_t, Glyph> >::iterator it = ugp.begin();
+ it != ugp.end(); ) {
+ Vector<std::pair<uint32_t, Glyph> >::iterator nit = it + 1;
+ // ignore code points with multiple glyph mappings
+ if (nit == ugp.end() || nit->first != it->first) {
+ if (it->second >= _unicodes.size())
+ _unicodes.resize(it->second + 1, 0);
+ if (!_unicodes[it->second])
+ _unicodes[it->second] = it->first;
+ } else
+ while (nit != ugp.end() && nit->first == it->first)
+ ++nit;
+ it = nit;
+ }
+ }
+ _got_unicodes = true;
+ }
+
+ if (gi >= 0 && gi < _unicodes.size() && _unicodes[gi] > 0 && _unicodes[gi] <= 0xFFFF) {
+ char buf[10];
+ sprintf(buf, "uni%04X", _unicodes[gi]);
+ return PermString(buf);
+ } else
+ return permprintf("index%d", gi);
+}
+
+void
+TrueTypeBoundsCharstringProgram::glyph_names(Vector<PermString> &gn) const
+{
+ gn.clear();
+ for (int gi = 0; gi < _nglyphs; gi++)
+ gn.push_back(glyph_name(gi));
+}
+
+Charstring *
+TrueTypeBoundsCharstringProgram::glyph(int gi) const
+{
+ if (gi < 0 || gi >= _nglyphs)
+ return 0;
+ if (_charstrings.size() <= gi)
+ _charstrings.resize(gi + 1, (Charstring *) 0);
+ if (!_charstrings[gi]) {
+ // calculate glyf offsets
+ uint32_t offset, end_offset;
+ if (_loca_long) {
+ offset = _loca.u32(gi * 4);
+ end_offset = _loca.u32(gi * 4 + 4);
+ } else {
+ offset = _loca.u16(gi * 2) * 2;
+ end_offset = _loca.u16(gi * 2 + 2) * 2;
+ }
+
+ // fetch bounding box from glyf
+ int ncontours, xmin, ymin, xmax, ymax;
+ if (offset != end_offset) {
+ if (offset > end_offset || offset + 10 > end_offset
+ || end_offset > (uint32_t) _glyf.length())
+ return 0;
+
+ ncontours = _glyf.s16(offset);
+ xmin = _glyf.s16(offset + 2);
+ ymin = _glyf.s16(offset + 4);
+ xmax = _glyf.s16(offset + 6);
+ ymax = _glyf.s16(offset + 8);
+ } else
+ ncontours = xmin = ymin = xmax = ymax = 0;
+
+ // fetch horizontal metrics
+ int advance_width, lsb;
+ if (gi >= _nhmtx) {
+ advance_width = (_nhmtx ? _hmtx.u16((_nhmtx - 1) * 4) : 0);
+ int hmtx_offset = _nhmtx * 4 + (gi - _nhmtx) * 2;
+ lsb = (hmtx_offset + 2 <= _hmtx.length() ? _hmtx.s16(hmtx_offset) : 0);
+ } else {
+ advance_width = _hmtx.u16(gi * 4);
+ lsb = _hmtx.s16(gi * 4 + 2);
+ }
+
+ // make charstring
+ Type1CharstringGen gen;
+ if (ncontours == 0) {
+ gen.gen_number(0, 'X');
+ gen.gen_number(advance_width);
+ gen.gen_command(Charstring::cHsbw);
+ } else {
+ gen.gen_number(lsb, 'X');
+ gen.gen_number(advance_width);
+ gen.gen_command(Charstring::cHsbw);
+ gen.gen_moveto(Point(xmin, ymin), false, false);
+ if (xmax != xmin || ymax == ymin)
+ gen.gen_number(xmax - xmin, 'x');
+ if (ymax != ymin)
+ gen.gen_number(ymax - ymin, 'y');
+ gen.gen_command(ymax == ymin ? Charstring::cHlineto
+ : (xmax == xmin ? Charstring::cVlineto
+ : Charstring::cRlineto));
+ gen.gen_command(Charstring::cClosepath);
+ }
+ gen.gen_command(Charstring::cEndchar);
+
+ _charstrings[gi] = gen.output();
+ }
+ return _charstrings[gi];
+}
+
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc
new file mode 100644
index 00000000000..6dc36e7e8fc
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfhead.cc
@@ -0,0 +1,69 @@
+// -*- related-file-name: "../include/efont/ttfhead.hh" -*-
+
+/* ttfhead.{cc,hh} -- TrueType head table
+ *
+ * Copyright (c) 2007-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/ttfhead.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+Head::Head(const String &s, ErrorHandler *errh)
+ : _d(s)
+{
+ _error = parse_header(errh ? errh : ErrorHandler::silent_handler());
+}
+
+int
+Head::parse_header(ErrorHandler *errh)
+{
+ // HEAD format:
+ // 0 Fixed Table version number 0x00010000 (ver. 1.0)
+ // 4 Fixed fontRevision
+ // 8 ULONG checkSumAdjustment
+ // 12 ULONG magicNumber Set to 0x5F0F3CF5
+ // 16 USHORT flags
+ // 18 USHORT unitsPerEm
+ // 20 LONGDATETIME created
+ // 28 LONGDATETIME modified
+ // 36 USHORT xMin
+ // 38 SHORT yMin
+ // 40 SHORT xMax
+ // 42 SHORT yMax
+ // 44 USHORT macStyle
+ // 46 USHORT lowestRecPPEM
+ // 48 SHORT fontDirectionHint
+ // 50 SHORT indexToLocFormat
+ // 52 SHORT glyphDataFormat
+ int len = _d.length();
+ const uint8_t *data = _d.udata();
+ if (len == 0)
+ return errh->error("font has no 'head' table"), -EFAULT;
+ if (54 > len)
+ return errh->error("'head' table too small"), -EFAULT;
+ if (!(data[0] == '\000' && data[1] == '\001'))
+ return errh->error("bad 'head' version number"), -ERANGE;
+ if (_d.u32(12) != 0x5F0F3CF5)
+ return errh->error("bad 'head' magic number"), -ERANGE;
+ return 0;
+}
+
+}}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc
new file mode 100644
index 00000000000..8690f2c672c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/libefont/ttfkern.cc
@@ -0,0 +1,116 @@
+// -*- related-file-name: "../include/efont/ttfkern.hh" -*-
+
+/* ttfkern.{cc,hh} -- TrueType kern table
+ *
+ * Copyright (c) 2009-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/ttfkern.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+namespace Efont { namespace OpenType {
+
+inline Data
+KernTable::subtable(uint32_t &off_in_out) const
+{
+ uint32_t off = off_in_out, len;
+ if (_version == 0) {
+ if (_d.u16(off) != 0)
+ throw new Format("kern subtable");
+ len = _d.u16(off + 2);
+ } else
+ len = _d.u32(off);
+ if (len < 6 || off + len > (uint32_t) _d.length())
+ throw new Bounds();
+ off_in_out = off + len;
+ return _d.substring(off, len);
+}
+
+KernTable::KernTable(const Data &d, ErrorHandler *)
+ : _d(d), _error(-1)
+{
+ // USHORT Version
+ // USHORT nTables
+ if (d.length() == 0)
+ throw BlankTable("kern");
+
+ uint32_t ntables, off;
+ if (d.u16(0) == 0) {
+ ntables = d.u16(2);
+ _version = 0;
+ off = 4;
+ } else if (d.u16(0) == 1) {
+ ntables = d.u32(4);
+ _version = 1;
+ off = 8;
+ } else
+ throw Format("kern");
+
+ for (uint32_t i = 0; i < ntables; ++i)
+ (void) subtable(off);
+
+ _error = 0;
+}
+
+bool
+KernTable::unparse_automatics(Vector<Positioning> &v, ErrorHandler *errh) const
+{
+ uint32_t ntables = this->ntables();
+ uint32_t off = first_offset();
+ int success = 0;
+ if (_error < 0)
+ return false;
+
+ for (uint16_t i = 0; i < ntables; ++i) {
+ Data subt = _d.subtable(off);
+ uint16_t coverage = subt.u16(4);
+
+ if (_version == 0) {
+ if ((coverage & COV_V0_HORIZONTAL) == 0
+ || (coverage & (COV_V0_MINIMUM | COV_V0_CROSS_STREAM
+ | COV_V0_OVERRIDE)) != 0
+ || (coverage & COV_V0_FORMAT) != COV_V0_FORMAT0)
+ continue;
+ } else {
+ if ((coverage & (COV_V1_VERTICAL | COV_V1_CROSS_STREAM
+ | COV_V1_VARIATION)) != 0
+ || (coverage & COV_V1_FORMAT) != COV_V1_FORMAT0)
+ continue;
+ }
+
+ try {
+ uint32_t off = (_version ? 16 : 14);
+ uint16_t npairs = subt.u16(off - 8);
+ for (uint16_t j = 0; j < npairs; ++j, off += 6) {
+ v.push_back(Positioning(Position(subt.u16(off), 0, 0, subt.s16(off + 4), 0),
+ Position(subt.u16(off + 2), 0, 0, 0, 0)));
+ ++success;
+ }
+ } catch (Error e) {
+ if (errh)
+ errh->warning("%s, continuing", e.description.c_str());
+ }
+ }
+
+ return success > 0;
+}
+
+}}
+
+#include <lcdf/vector.cc>
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.am
new file mode 100644
index 00000000000..f096b1c41bf
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.am
@@ -0,0 +1,31 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+noinst_LIBRARIES = liblcdf.a
+
+liblcdf_a_SOURCES = bezier.cc \
+ clp.c \
+ error.cc \
+ filename.cc \
+ globmatch.cc \
+ landmark.cc \
+ md5.c \
+ permstr.cc \
+ point.cc \
+ slurper.cc \
+ straccum.cc \
+ string.cc \
+ strtonum.c \
+ transform.cc \
+ vectorv.cc
+
+if FIXLIBC
+liblcdf_a_SOURCES += fixlibc.c
+endif FIXLIBC
+
+liblcdf_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+
+EXTRA_DIST = fixlibc.c
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.in
new file mode 100644
index 00000000000..30d406ea760
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/Makefile.in
@@ -0,0 +1,736 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@FIXLIBC_TRUE@am__append_1 = fixlibc.c
+subdir = lcdf-typetools-src/liblcdf
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+liblcdf_a_AR = $(AR) $(ARFLAGS)
+liblcdf_a_DEPENDENCIES =
+am__liblcdf_a_SOURCES_DIST = bezier.cc clp.c error.cc filename.cc \
+ globmatch.cc landmark.cc md5.c permstr.cc point.cc slurper.cc \
+ straccum.cc string.cc strtonum.c transform.cc vectorv.cc \
+ fixlibc.c
+@FIXLIBC_TRUE@am__objects_1 = fixlibc.$(OBJEXT)
+am_liblcdf_a_OBJECTS = bezier.$(OBJEXT) clp.$(OBJEXT) error.$(OBJEXT) \
+ filename.$(OBJEXT) globmatch.$(OBJEXT) landmark.$(OBJEXT) \
+ md5.$(OBJEXT) permstr.$(OBJEXT) point.$(OBJEXT) \
+ slurper.$(OBJEXT) straccum.$(OBJEXT) string.$(OBJEXT) \
+ strtonum.$(OBJEXT) transform.$(OBJEXT) vectorv.$(OBJEXT) \
+ $(am__objects_1)
+liblcdf_a_OBJECTS = $(am_liblcdf_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/bezier.Po ./$(DEPDIR)/clp.Po \
+ ./$(DEPDIR)/error.Po ./$(DEPDIR)/filename.Po \
+ ./$(DEPDIR)/fixlibc.Po ./$(DEPDIR)/globmatch.Po \
+ ./$(DEPDIR)/landmark.Po ./$(DEPDIR)/md5.Po \
+ ./$(DEPDIR)/permstr.Po ./$(DEPDIR)/point.Po \
+ ./$(DEPDIR)/slurper.Po ./$(DEPDIR)/straccum.Po \
+ ./$(DEPDIR)/string.Po ./$(DEPDIR)/strtonum.Po \
+ ./$(DEPDIR)/transform.Po ./$(DEPDIR)/vectorv.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(liblcdf_a_SOURCES)
+DIST_SOURCES = $(am__liblcdf_a_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+noinst_LIBRARIES = liblcdf.a
+liblcdf_a_SOURCES = bezier.cc clp.c error.cc filename.cc globmatch.cc \
+ landmark.cc md5.c permstr.cc point.cc slurper.cc straccum.cc \
+ string.cc strtonum.c transform.cc vectorv.cc $(am__append_1)
+liblcdf_a_LIBADD = @TEMPLATE_OBJS@
+CLEANFILES = @TEMPLATE_OBJS@
+AM_CPPFLAGS = -I$(srcdir)/../include
+EXTRA_DIST = fixlibc.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/liblcdf/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/liblcdf/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+liblcdf.a: $(liblcdf_a_OBJECTS) $(liblcdf_a_DEPENDENCIES) $(EXTRA_liblcdf_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f liblcdf.a
+ $(AM_V_AR)$(liblcdf_a_AR) liblcdf.a $(liblcdf_a_OBJECTS) $(liblcdf_a_LIBADD)
+ $(AM_V_at)$(RANLIB) liblcdf.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bezier.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixlibc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globmatch.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/landmark.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permstr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/point.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slurper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/straccum.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtonum.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorv.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/bezier.Po
+ -rm -f ./$(DEPDIR)/clp.Po
+ -rm -f ./$(DEPDIR)/error.Po
+ -rm -f ./$(DEPDIR)/filename.Po
+ -rm -f ./$(DEPDIR)/fixlibc.Po
+ -rm -f ./$(DEPDIR)/globmatch.Po
+ -rm -f ./$(DEPDIR)/landmark.Po
+ -rm -f ./$(DEPDIR)/md5.Po
+ -rm -f ./$(DEPDIR)/permstr.Po
+ -rm -f ./$(DEPDIR)/point.Po
+ -rm -f ./$(DEPDIR)/slurper.Po
+ -rm -f ./$(DEPDIR)/straccum.Po
+ -rm -f ./$(DEPDIR)/string.Po
+ -rm -f ./$(DEPDIR)/strtonum.Po
+ -rm -f ./$(DEPDIR)/transform.Po
+ -rm -f ./$(DEPDIR)/vectorv.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/bezier.Po
+ -rm -f ./$(DEPDIR)/clp.Po
+ -rm -f ./$(DEPDIR)/error.Po
+ -rm -f ./$(DEPDIR)/filename.Po
+ -rm -f ./$(DEPDIR)/fixlibc.Po
+ -rm -f ./$(DEPDIR)/globmatch.Po
+ -rm -f ./$(DEPDIR)/landmark.Po
+ -rm -f ./$(DEPDIR)/md5.Po
+ -rm -f ./$(DEPDIR)/permstr.Po
+ -rm -f ./$(DEPDIR)/point.Po
+ -rm -f ./$(DEPDIR)/slurper.Po
+ -rm -f ./$(DEPDIR)/straccum.Po
+ -rm -f ./$(DEPDIR)/string.Po
+ -rm -f ./$(DEPDIR)/strtonum.Po
+ -rm -f ./$(DEPDIR)/transform.Po
+ -rm -f ./$(DEPDIR)/vectorv.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-libtool clean-noinstLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc
new file mode 100644
index 00000000000..c296a4b4aa3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/bezier.cc
@@ -0,0 +1,376 @@
+// -*- related-file-name: "../include/lcdf/bezier.hh" -*-
+
+/* bezier.{cc,hh} -- cubic Bezier curves
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/bezier.hh>
+
+//
+// bounding box
+//
+
+void
+Bezier::make_bb() const noexcept
+{
+ _bb = 0;
+ for (int i = 1; i < 4; i++) {
+ if (_p[i].x > bb_right_x())
+ _bb = (_bb & ~0x03) | (i << 0);
+ else if (_p[i].x < bb_left_x())
+ _bb = (_bb & ~0x0C) | (i << 2);
+ if (_p[i].y > bb_top_x())
+ _bb = (_bb & ~0x30) | (i << 4);
+ else if (_p[i].y < bb_bottom_x())
+ _bb = (_bb & ~0xC0) | (i << 6);
+ }
+}
+
+
+//
+// is_flat, eval
+//
+
+bool
+Bezier::is_flat(double t) const noexcept
+{
+ return (_p[2].on_segment(_p[0], _p[3], t)
+ && _p[1].on_segment(_p[0], _p[3], t));
+}
+
+static Point
+eval_bezier(Point *b_in, int degree, double u)
+{
+ assert(degree < 4);
+ Point b[4];
+ for (int i = 0; i <= degree; i++)
+ b[i] = b_in[i];
+
+ double m = 1.0 - u;
+ for (int i = 1; i <= degree; i++)
+ for (int j = 0; j <= degree - i; j++)
+ b[j] = b[j]*m + b[j+1]*u;
+ return b[0];
+}
+
+Point
+Bezier::eval(double u) const noexcept
+{
+ Bezier b = *this;
+ double m = 1.0 - u;
+ for (int i = 1; i < 4; i++)
+ for (int j = 0; j < 4 - i; j++)
+ b._p[j] = m * b._p[j] + u * b._p[j+1];
+ return b._p[0];
+}
+
+
+//
+// halve
+//
+
+void
+Bezier::halve(Bezier &l, Bezier &r) const noexcept
+{
+ Point half = Point::midpoint(_p[1], _p[2]);
+ l._p[0] = _p[0];
+ l._p[1] = Point::midpoint(_p[0], _p[1]);
+ l._p[2] = Point::midpoint(l._p[1], half);
+ r._p[3] = _p[3];
+ r._p[2] = Point::midpoint(_p[2], _p[3]);
+ r._p[1] = Point::midpoint(r._p[2], half);
+ r._p[0] = l._p[3] = Point::midpoint(l._p[2], r._p[1]);
+}
+
+
+//
+// hit testing
+//
+
+bool
+Bezier::in_bb(const Point &p, double tolerance) const noexcept
+{
+ ensure_bb();
+ if (bb_right() + tolerance < p.x
+ || bb_left() - tolerance > p.x
+ || bb_top() + tolerance < p.y
+ || bb_bottom() - tolerance > p.y)
+ return false;
+ else
+ return true;
+}
+
+double
+Bezier::hit_recurse(const Point &p, double tolerance, double leftd,
+ double rightd, double leftt, double rightt) const noexcept
+{
+ Bezier left, right;
+ double middled, resultt;
+
+ if (is_flat(tolerance)) {
+ if (p.on_segment(_p[0], _p[3], tolerance))
+ return (leftt + rightt) / 2;
+ else
+ return -1;
+ }
+
+ if (leftd < tolerance * tolerance)
+ return leftt;
+ if (rightd < tolerance * tolerance)
+ return rightt;
+
+ if (!in_bb(p, tolerance))
+ return -1;
+
+ halve(left, right);
+ middled = (right._p[0] - p).squared_length();
+ resultt = left.hit_recurse
+ (p, tolerance, leftd, middled, leftt, (leftt + rightt) / 2);
+ if (resultt >= 0)
+ return resultt;
+
+ return right.hit_recurse
+ (p, tolerance, middled, rightd, (leftt + rightt) / 2, rightt);
+}
+
+bool
+Bezier::hit(const Point &p, double tolerance) const noexcept
+{
+ double leftd = (_p[0] - p).squared_length();
+ double rightd = (_p[3] - p).squared_length();
+ double resultt = hit_recurse(p, tolerance, leftd, rightd, 0, 1);
+ return resultt >= 0;
+}
+
+
+//
+// segmentize to list of points
+//
+// uses recursive subdivision
+//
+
+void
+Bezier::segmentize(Vector<Point> &v, bool first) const
+{
+ if (is_flat(0.5)) {
+ if (first)
+ v.push_back(_p[0]);
+ v.push_back(_p[3]);
+ } else {
+ Bezier left, right;
+ halve(left, right);
+ left.segmentize(v, first);
+ right.segmentize(v, false);
+ }
+}
+
+
+//
+// curve fitting
+//
+// code after Philip J. Schneider's algorithm described, with code, in the
+// first Graphics Gems
+//
+
+static void
+chord_length_parameterize(const Point *d, int nd, Vector<double> &result)
+{
+ assert(result.size() == 0);
+ result.reserve(nd);
+ result.push_back(0);
+ for (int i = 1; i < nd; i++)
+ result.push_back(result.back() + Point::distance(d[i-1], d[i]));
+ double last_dist = result.back();
+ for (int i = 1; i < nd; i++)
+ result[i] /= last_dist;
+}
+
+static inline double
+B0(double u)
+{
+ double m = 1.0 - u;
+ return m*m*m;
+}
+
+static inline double
+B1(double u)
+{
+ double m = 1.0 - u;
+ return 3*m*m*u;
+}
+
+static inline double
+B2(double u)
+{
+ double m = 1.0 - u;
+ return 3*m*u*u;
+}
+
+static inline double
+B3(double u)
+{
+ return u*u*u;
+}
+
+static Bezier
+generate_bezier(const Point *d, int nd, const Vector<double> &parameters,
+ const Point &left_tangent, const Point &right_tangent)
+{
+ Point *a0 = new Point[nd];
+ Point *a1 = new Point[nd];
+
+ for (int i = 0; i < nd; i++) {
+ a0[i] = left_tangent * B1(parameters[i]);
+ a1[i] = right_tangent * B2(parameters[i]);
+ }
+
+ double c[2][2], x[2];
+ c[0][0] = c[0][1] = c[1][0] = c[1][1] = x[0] = x[1] = 0.0;
+
+ int last = nd - 1;
+ for (int i = 0; i < nd; i++) {
+ c[0][0] += Point::dot(a0[i], a0[i]);
+ c[0][1] += Point::dot(a0[i], a1[i]);
+ c[1][1] += Point::dot(a1[i], a1[i]);
+
+ Point tmp = d[i] - (d[0] * (B0(parameters[i]) + B1(parameters[i]))
+ + d[last] * (B2(parameters[i]) + B3(parameters[i])));
+ x[0] += Point::dot(a0[i], tmp);
+ x[1] += Point::dot(a1[i], tmp);
+ }
+ c[1][0] = c[0][1];
+
+ // compute determinants
+ double det_c0_c1 = c[0][0]*c[1][1] - c[1][0]*c[0][1];
+ double det_c0_x = c[0][0]*x[1] - c[0][1]*x[0];
+ double det_x_c1 = x[0]*c[1][1] - x[1]*c[0][1];
+
+ // finally, derive alpha values
+ if (det_c0_c1 == 0.0)
+ det_c0_c1 = c[0][0]*c[1][1] * 10e-12;
+ double alpha_l = det_x_c1 / det_c0_c1;
+ double alpha_r = det_c0_x / det_c0_c1;
+
+ // if alpha negative, use the Wu/Barsky heuristic
+ if (alpha_l < 0.0 || alpha_r < 0.0) {
+ double distance = Point::distance(d[0], d[last]) / 3;
+ return Bezier(d[0], d[0] + left_tangent*distance,
+ d[last] + right_tangent*distance, d[last]);
+ } else
+ return Bezier(d[0], d[0] + left_tangent*alpha_l,
+ d[last] + right_tangent*alpha_r, d[last]);
+}
+
+static double
+newton_raphson_root_find(const Bezier &b, const Point &p, double u)
+{
+ const Point *b_pts = b.points();
+
+ Point b_det[3];
+ for (int i = 0; i < 3; i++)
+ b_det[i] = (b_pts[i+1] - b_pts[i]) * 3;
+
+ Point b_det_det[2];
+ for (int i = 0; i < 2; i++)
+ b_det_det[i] = (b_det[i+1] - b_det[i]) * 2;
+
+ Point b_u = b.eval(u);
+ Point b_det_u = eval_bezier(b_det, 2, u);
+ Point b_det_det_u = eval_bezier(b_det_det, 1, u);
+
+ double numerator = Point::dot(b_u - p, b_det_u);
+ double denominator = Point::dot(b_det_u, b_det_u) +
+ Point::dot(b_u - p, b_det_det_u);
+
+ return u - numerator/denominator;
+}
+
+static void
+reparameterize(const Point *d, int nd, Vector<double> &parameters,
+ const Bezier &b)
+{
+ for (int i = 0; i < nd; i++)
+ parameters[i] = newton_raphson_root_find(b, d[i], parameters[i]);
+}
+
+static double
+compute_max_error(const Point *d, int nd, const Bezier &b,
+ const Vector<double> &parameters, int *split_point)
+{
+ *split_point = nd/2;
+ double max_dist = 0.0;
+ for (int i = 1; i < nd - 1; i++) {
+ double dist = (b.eval(parameters[i]) - d[i]).squared_length();
+ if (dist >= max_dist) {
+ max_dist = dist;
+ *split_point = i;
+ }
+ }
+ return max_dist;
+}
+
+static void
+fit0(const Point *d, int nd, Point left_tangent, Point right_tangent,
+ double error, Vector<Bezier> &result)
+{
+ // Use a heuristic for small regions (only two points)
+ if (nd == 2) {
+ double dist = Point::distance(d[0], d[1]) / 3;
+ result.push_back(Bezier(d[0],
+ d[0] + dist*left_tangent,
+ d[1] + dist*right_tangent,
+ d[1]));
+ return;
+ }
+
+ // Parameterize points and attempt to fit curve
+ Vector<double> parameters;
+ chord_length_parameterize(d, nd, parameters);
+ Bezier b = generate_bezier(d, nd, parameters, left_tangent, right_tangent);
+
+ // find max error
+ int split_point;
+ double max_error = compute_max_error(d, nd, b, parameters, &split_point);
+ if (max_error < error) {
+ result.push_back(b);
+ return;
+ }
+
+ // if error not too large, try iteration and reparameterization
+ if (max_error < error*error)
+ for (int i = 0; i < 4; i++) {
+ reparameterize(d, nd, parameters, b);
+ b = generate_bezier(d, nd, parameters, left_tangent, right_tangent);
+ max_error = compute_max_error(d, nd, b, parameters, &split_point);
+ if (max_error < error) {
+ result.push_back(b);
+ return;
+ }
+ }
+
+ // fitting failed -- split at max error point and fit again
+ Point center_tangent = ((d[split_point-1] - d[split_point+1])/2).normal();
+ fit0(d, split_point+1, left_tangent, center_tangent, error, result);
+ fit0(d+split_point, nd-split_point, -center_tangent, right_tangent, error, result);
+}
+
+void
+Bezier::fit(const Vector<Point> &points, double error, Vector<Bezier> &result)
+{
+ int npoints = points.size();
+ Point left_tangent = (points[1] - points[0]).normal();
+ Point right_tangent = (points[npoints-2] - points[npoints-1]).normal();
+ fit0(&points[0], npoints, left_tangent, right_tangent, error, result);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c
new file mode 100644
index 00000000000..1555f2298d4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/clp.c
@@ -0,0 +1,2359 @@
+/* -*- related-file-name: "../include/lcdf/clp.h" -*- */
+/* clp.c - Complete source code for CLP.
+ * This file is part of CLP, the command line parser package.
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler, ekohler@gmail.com
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file, which is available in full at
+ * http://www.pdos.lcs.mit.edu/click/license.html. The conditions include: you
+ * must preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/clp.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+/* By default, assume we have strtoul. */
+#if !defined(HAVE_STRTOUL) && !defined(HAVE_CONFIG_H)
+# define HAVE_STRTOUL 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** @file clp.h
+ * @brief Functions for parsing command line options.
+ *
+ * The CLP functions are used to parse command line arugments into options.
+ * It automatically handles value parsing, error messages, long options with
+ * minimum prefix matching, short options, and negated options.
+ *
+ * The CLP model works like this.
+ *
+ * <ol>
+ * <li>The user declares an array of Clp_Option structures that define the
+ * options their program accepts.</li>
+ * <li>The user creates a Clp_Parser object using Clp_NewParser(), passing in
+ * the command line arguments to parse and the Clp_Option structures.</li>
+ * <li>A loop repeatedly calls Clp_Next() to parse the arguments.</li>
+ * </ol>
+ *
+ * Unlike many command line parsing libraries, CLP steps through all arguments
+ * one at a time, rather than slurping up all options at once. This makes it
+ * meaningful to give an option more than once.
+ *
+ * Here's an example.
+ *
+ * @code
+ * #define ANIMAL_OPT 1
+ * #define VEGETABLE_OPT 2
+ * #define MINERALS_OPT 3
+ * #define USAGE_OPT 4
+ *
+ * static const Clp_Option options[] = {
+ * { "animal", 'a', ANIMAL_OPT, Clp_ValString, 0 },
+ * { "vegetable", 'v', VEGETABLE_OPT, Clp_ValString, Clp_Negate | Clp_Optional },
+ * { "minerals", 'm', MINERALS_OPT, Clp_ValInt, 0 },
+ * { "usage", 0, USAGE_OPT, 0, 0 }
+ * };
+ *
+ * int main(int argc, char *argv[]) {
+ * Clp_Parser *clp = Clp_NewParser(argc, argv,
+ * sizeof(options) / sizeof(options[0]), options);
+ * int opt;
+ * while ((opt = Clp_Next(clp)) != Clp_Done)
+ * switch (opt) {
+ * case ANIMAL_OPT:
+ * fprintf(stderr, "animal is %s\n", clp->val.s);
+ * break;
+ * case VEGETABLE_OPT:
+ * if (clp->negated)
+ * fprintf(stderr, "no vegetables!\n");
+ * else if (clp->have_val)
+ * fprintf(stderr, "vegetable is %s\n", clp->val.s);
+ * else
+ * fprintf(stderr, "vegetables OK\n");
+ * break;
+ * case MINERALS_OPT:
+ * fprintf(stderr, "%d minerals\n", clp->val.i);
+ * break;
+ * case USAGE_OPT:
+ * fprintf(stderr, "Usage: 20q [--animal=ANIMAL] [--vegetable[=VEGETABLE]] [--minerals=N]\n");
+ * break;
+ * case Clp_NotOption:
+ * fprintf(stderr, "non-option %s\n", clp->vstr);
+ * break;
+ * }
+ * }
+ * }
+ * @endcode
+ *
+ * Here are a couple of executions.
+ *
+ * <pre>
+ * % ./20q --animal=cat
+ * animal is cat
+ * % ./20q --animal=cat -a dog -afish --animal bird --an=snake
+ * animal is cat
+ * animal is dog
+ * animal is fish
+ * animal is bird
+ * animal is snake
+ * % ./20q --no-vegetables
+ * no vegetables!
+ * % ./20q -v
+ * vegetables OK
+ * % ./20q -vkale
+ * vegetable is kale
+ * % ./20q -m10
+ * 10 minerals
+ * % ./20q -m foo
+ * '-m' expects an integer, not 'foo'
+ * </pre>
+ */
+
+
+/* Option types for Clp_SetOptionChar */
+#define Clp_DoubledLong (Clp_LongImplicit * 2)
+
+#define Clp_InitialValType 8
+#define MAX_AMBIGUOUS_VALUES 4
+
+typedef struct {
+ int val_type;
+ Clp_ValParseFunc func;
+ int flags;
+ void *user_data;
+} Clp_ValType;
+
+typedef struct {
+ unsigned ilong : 1;
+ unsigned ishort : 1;
+ unsigned imandatory : 1;
+ unsigned ioptional : 1;
+ unsigned ipos : 1;
+ unsigned ineg : 1;
+ unsigned iprefmatch : 1;
+ unsigned lmmpos_short : 1;
+ unsigned lmmneg_short : 1;
+ unsigned char ilongoff;
+ int lmmpos;
+ int lmmneg;
+} Clp_InternOption;
+
+
+#define Clp_OptionCharsSize 5
+
+typedef struct {
+ int c;
+ int type;
+} Clp_Oclass;
+#define Clp_OclassSize 10
+
+typedef struct Clp_Internal {
+ const Clp_Option *opt;
+ Clp_InternOption *iopt;
+ int nopt;
+ unsigned opt_generation;
+
+ Clp_ValType *valtype;
+ int nvaltype;
+
+ const char * const *argv;
+ int argc;
+
+ Clp_Oclass oclass[Clp_OclassSize];
+ int noclass;
+ int long1pos;
+ int long1neg;
+ int utf8;
+
+ char option_chars[Clp_OptionCharsSize];
+ const char *xtext;
+
+ const char *program_name;
+ void (*error_handler)(Clp_Parser *, const char *);
+
+ int option_processing;
+ int current_option;
+
+ unsigned char is_short;
+ unsigned char whole_negated; /* true if negated by an option character */
+ unsigned char could_be_short;
+ unsigned char current_short;
+ unsigned char negated_by_no;
+
+ int ambiguous;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES];
+} Clp_Internal;
+
+
+struct Clp_ParserState {
+ const char * const *argv;
+ int argc;
+
+ char option_chars[Clp_OptionCharsSize];
+ const char *xtext;
+
+ int option_processing;
+
+ unsigned opt_generation;
+ int current_option;
+ unsigned char is_short;
+ unsigned char whole_negated;
+ unsigned char current_short;
+ unsigned char negated_by_no;
+};
+
+
+typedef struct Clp_StringList {
+
+ Clp_Option *items;
+ Clp_InternOption *iopt;
+ int nitems;
+
+ int allow_int;
+ int nitems_invalid_report;
+
+} Clp_StringList;
+
+
+static const Clp_Option clp_option_sentinel[] = {
+ {"", 0, Clp_NotOption, 0, 0},
+ {"", 0, Clp_Done, 0, 0},
+ {"", 0, Clp_BadOption, 0, 0},
+ {"", 0, Clp_Error, 0, 0}
+};
+
+
+static int parse_string(Clp_Parser *, const char *, int, void *);
+static int parse_int(Clp_Parser *, const char *, int, void *);
+static int parse_bool(Clp_Parser *, const char *, int, void *);
+static int parse_double(Clp_Parser *, const char *, int, void *);
+static int parse_string_list(Clp_Parser *, const char *, int, void *);
+
+static int ambiguity_error(Clp_Parser *, int, int *, const Clp_Option *,
+ const Clp_InternOption *, const char *, const char *,
+ ...);
+
+
+/*******
+ * utf8
+ **/
+
+#define U_REPLACEMENT 0xFFFD
+
+static char *
+encode_utf8(char *s, int n, int c)
+{
+ if (c < 0 || c >= 0x110000 || (c >= 0xD800 && c <= 0xDFFF))
+ c = U_REPLACEMENT;
+ if (c <= 0x7F && n >= 1)
+ *s++ = c;
+ else if (c <= 0x7FF && n >= 2) {
+ *s++ = 0xC0 | (c >> 6);
+ goto char1;
+ } else if (c <= 0xFFFF && n >= 3) {
+ *s++ = 0xE0 | (c >> 12);
+ goto char2;
+ } else if (n >= 4) {
+ *s++ = 0xF0 | (c >> 18);
+ *s++ = 0x80 | ((c >> 12) & 0x3F);
+ char2:
+ *s++ = 0x80 | ((c >> 6) & 0x3F);
+ char1:
+ *s++ = 0x80 | (c & 0x3F);
+ }
+ return s;
+}
+
+static int
+decode_utf8(const char *s, const char **cp)
+{
+ int c;
+ if ((unsigned char) *s <= 0x7F) /* 1 byte: 0x000000-0x00007F */
+ c = *s++;
+ else if ((unsigned char) *s <= 0xC1) /* bad/overlong encoding */
+ goto replacement;
+ else if ((unsigned char) *s <= 0xDF) { /* 2 bytes: 0x000080-0x0007FF */
+ if ((s[1] & 0xC0) != 0x80) /* bad encoding */
+ goto replacement;
+ c = (*s++ & 0x1F) << 6;
+ goto char1;
+ } else if ((unsigned char) *s <= 0xEF) { /* 3 bytes: 0x000800-0x00FFFF */
+ if ((s[1] & 0xC0) != 0x80 /* bad encoding */
+ || (s[2] & 0xC0) != 0x80 /* bad encoding */
+ || ((unsigned char) *s == 0xE0 /* overlong encoding */
+ && (s[1] & 0xE0) == 0x80)
+ || ((unsigned char) *s == 0xED /* encoded surrogate */
+ && (s[1] & 0xE0) == 0xA0))
+ goto replacement;
+ c = (*s++ & 0x0F) << 12;
+ goto char2;
+ } else if ((unsigned char) *s <= 0xF4) { /* 4 bytes: 0x010000-0x10FFFF */
+ if ((s[1] & 0xC0) != 0x80 /* bad encoding */
+ || (s[2] & 0xC0) != 0x80 /* bad encoding */
+ || (s[3] & 0xC0) != 0x80 /* bad encoding */
+ || ((unsigned char) *s == 0xF0 /* overlong encoding */
+ && (s[1] & 0xF0) == 0x80)
+ || ((unsigned char) *s == 0xF4 /* encoded value > 0x10FFFF */
+ && (unsigned char) s[1] >= 0x90))
+ goto replacement;
+ c = (*s++ & 0x07) << 18;
+ c += (*s++ & 0x3F) << 12;
+ char2:
+ c += (*s++ & 0x3F) << 6;
+ char1:
+ c += (*s++ & 0x3F);
+ } else {
+ replacement:
+ c = U_REPLACEMENT;
+ for (s++; (*s & 0xC0) == 0x80; s++)
+ /* nothing */;
+ }
+ if (cp)
+ *cp = s;
+ return c;
+}
+
+static int
+utf8_charlen(const char *s)
+{
+ const char *sout;
+ (void) decode_utf8(s, &sout);
+ return sout - s;
+}
+
+static int
+clp_utf8_charlen(const Clp_Internal *cli, const char *s)
+{
+ return (cli->utf8 ? utf8_charlen(s) : 1);
+}
+
+
+/*******
+ * Clp_NewParser, etc.
+ **/
+
+static int
+min_different_chars(const char *s, const char *t)
+ /* Returns the minimum number of bytes required to distinguish
+ s from t.
+ If s is shorter than t, returns strlen(s). */
+{
+ const char *sfirst = s;
+ while (*s && *t && *s == *t)
+ s++, t++;
+ if (!*s)
+ return s - sfirst;
+ else
+ return s - sfirst + 1;
+}
+
+static int
+long_as_short(const Clp_Internal *cli, const Clp_Option *o,
+ Clp_InternOption *io, int failure)
+{
+ if ((cli->long1pos || cli->long1neg) && io->ilong) {
+ const char *name = o->long_name + io->ilongoff;
+ if (cli->utf8) {
+ int c = decode_utf8(name, &name);
+ if (!*name && c && c != U_REPLACEMENT)
+ return c;
+ } else if (name[0] && !name[1])
+ return (unsigned char) name[0];
+ }
+ return failure;
+}
+
+static void
+compare_options(Clp_Parser *clp, const Clp_Option *o1, Clp_InternOption *io1,
+ const Clp_Option *o2, Clp_InternOption *io2)
+{
+ Clp_Internal *cli = clp->internal;
+ int short1, shortx1;
+
+ /* ignore meaningless combinations */
+ if ((!io1->ishort && !io1->ilong) || (!io2->ishort && !io2->ilong)
+ || !((io1->ipos && io2->ipos) || (io1->ineg && io2->ineg))
+ || o1->option_id == o2->option_id)
+ return;
+
+ /* look for duplication of short options */
+ short1 = (io1->ishort ? o1->short_name : -1);
+ shortx1 = long_as_short(cli, o1, io1, -2);
+ if (short1 >= 0 || shortx1 >= 0) {
+ int short2 = (io2->ishort ? o2->short_name : -3);
+ int shortx2 = long_as_short(cli, o2, io2, -4);
+ if (short1 == short2)
+ Clp_OptionError(clp, "CLP internal error: more than 1 option has short name %<%c%>", short1);
+ else if ((short1 == shortx2 || shortx1 == short2 || shortx1 == shortx2)
+ && ((io1->ipos && io2->ipos && cli->long1pos)
+ || (io1->ineg && io2->ineg && cli->long1neg)))
+ Clp_OptionError(clp, "CLP internal error: 1-char long name conflicts with short name %<%c%>", (short1 == shortx2 ? shortx2 : shortx1));
+ }
+
+ /* analyze longest minimum match */
+ if (io1->ilong) {
+ const char *name1 = o1->long_name + io1->ilongoff;
+
+ /* long name's first character matches short name */
+ if (io2->ishort && !io1->iprefmatch) {
+ int name1char = (cli->utf8 ? decode_utf8(name1, 0) : (unsigned char) *name1);
+ if (name1char == o2->short_name) {
+ if (io1->ipos && io2->ipos)
+ io1->lmmpos_short = 1;
+ if (io1->ineg && io2->ineg)
+ io1->lmmneg_short = 1;
+ }
+ }
+
+ /* match long name to long name */
+ if (io2->ilong) {
+ const char *name2 = o2->long_name + io2->ilongoff;
+ if (strcmp(name1, name2) == 0)
+ Clp_OptionError(clp, "CLP internal error: duplicate long name %<%s%>", name1);
+ if (io1->ipos && io2->ipos && !strncmp(name1, name2, io1->lmmpos)
+ && (!io1->iprefmatch || strncmp(name1, name2, strlen(name1))))
+ io1->lmmpos = min_different_chars(name1, name2);
+ if (io1->ineg && io2->ineg && !strncmp(name1, name2, io1->lmmneg)
+ && (!io1->iprefmatch || strncmp(name1, name2, strlen(name1))))
+ io1->lmmneg = min_different_chars(name1, name2);
+ }
+ }
+}
+
+static void
+calculate_lmm(Clp_Parser *clp, const Clp_Option *opt, Clp_InternOption *iopt, int nopt)
+{
+ int i, j;
+ for (i = 0; i < nopt; ++i) {
+ iopt[i].lmmpos = iopt[i].lmmneg = 1;
+ iopt[i].lmmpos_short = iopt[i].lmmneg_short = 0;
+ for (j = 0; j < nopt; ++j)
+ compare_options(clp, &opt[i], &iopt[i], &opt[j], &iopt[j]);
+ }
+}
+
+/** @param argc number of arguments
+ * @param argv argument array
+ * @param nopt number of option definitions
+ * @param opt option definition array
+ * @return the parser
+ *
+ * The new Clp_Parser that will parse the arguments in @a argv according to
+ * the option definitions in @a opt.
+ *
+ * The Clp_Parser is created with the following characteristics:
+ *
+ * <ul>
+ * <li>The "-" character introduces short options (<tt>Clp_SetOptionChar(clp,
+ * '-', Clp_Short)</tt>).</li>
+ * <li>Clp_ProgramName is set from the first argument in @a argv, if any. The
+ * first argument returned by Clp_Next() will be the second argument in @a
+ * argv. Note that this behavior differs from Clp_SetArguments.</li>
+ * <li>UTF-8 support is on iff the <tt>LANG</tt> environment variable contains
+ * one of the substrings "UTF-8", "UTF8", or "utf8". Override this with
+ * Clp_SetUTF8().</li>
+ * <li>The Clp_ValString, Clp_ValStringNotOption, Clp_ValInt, Clp_ValUnsigned,
+ * Clp_ValBool, and Clp_ValDouble types are installed.</li>
+ * <li>Errors are reported to standard error.</li>
+ * </ul>
+ *
+ * You may also create a Clp_Parser with no arguments or options
+ * (<tt>Clp_NewParser(0, 0, 0, 0)</tt>) and set the arguments and options
+ * later.
+ *
+ * Returns NULL if there isn't enough memory to construct the parser.
+ *
+ * @note The CLP library will not modify the contents of @a argv or @a opt.
+ * The calling program must not modify @a opt. It may modify @a argv in
+ * limited cases.
+ */
+Clp_Parser *
+Clp_NewParser(int argc, const char * const *argv, int nopt, const Clp_Option *opt)
+{
+ Clp_Parser *clp = (Clp_Parser *)malloc(sizeof(Clp_Parser));
+ Clp_Internal *cli = (Clp_Internal *)malloc(sizeof(Clp_Internal));
+ Clp_InternOption *iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nopt);
+ if (cli)
+ cli->valtype = (Clp_ValType *)malloc(sizeof(Clp_ValType) * Clp_InitialValType);
+ if (!clp || !cli || !iopt || !cli->valtype)
+ goto failed;
+
+ clp->option = &clp_option_sentinel[-Clp_Done];
+ clp->negated = 0;
+ clp->have_val = 0;
+ clp->vstr = 0;
+ clp->user_data = 0;
+ clp->internal = cli;
+
+ cli->opt = opt;
+ cli->nopt = nopt;
+ cli->iopt = iopt;
+ cli->opt_generation = 0;
+ cli->error_handler = 0;
+
+ /* Assign program name (now so we can call Clp_OptionError) */
+ if (argc > 0) {
+ const char *slash = strrchr(argv[0], '/');
+ cli->program_name = slash ? slash + 1 : argv[0];
+ } else
+ cli->program_name = 0;
+
+ /* Assign arguments, skipping program name */
+ Clp_SetArguments(clp, argc - 1, argv + 1);
+
+ /* Initialize UTF-8 status and option classes */
+ {
+ char *s = getenv("LANG");
+ cli->utf8 = (s && (strstr(s, "UTF-8") != 0 || strstr(s, "UTF8") != 0
+ || strstr(s, "utf8") != 0));
+ }
+ cli->oclass[0].c = '-';
+ cli->oclass[0].type = Clp_Short;
+ cli->noclass = 1;
+ cli->long1pos = cli->long1neg = 0;
+
+ /* Add default type parsers */
+ cli->nvaltype = 0;
+ Clp_AddType(clp, Clp_ValString, 0, parse_string, 0);
+ Clp_AddType(clp, Clp_ValStringNotOption, Clp_DisallowOptions, parse_string, 0);
+ Clp_AddType(clp, Clp_ValInt, 0, parse_int, 0);
+ Clp_AddType(clp, Clp_ValUnsigned, 0, parse_int, (void *)cli);
+ Clp_AddType(clp, Clp_ValBool, 0, parse_bool, 0);
+ Clp_AddType(clp, Clp_ValDouble, 0, parse_double, 0);
+
+ /* Set options */
+ Clp_SetOptions(clp, nopt, opt);
+
+ return clp;
+
+ failed:
+ if (cli && cli->valtype)
+ free(cli->valtype);
+ if (cli)
+ free(cli);
+ if (clp)
+ free(clp);
+ if (iopt)
+ free(iopt);
+ return 0;
+}
+
+/** @param clp the parser
+ *
+ * All memory associated with @a clp is freed. */
+void
+Clp_DeleteParser(Clp_Parser *clp)
+{
+ int i;
+ Clp_Internal *cli;
+ if (!clp)
+ return;
+
+ cli = clp->internal;
+
+ /* get rid of any string list types */
+ for (i = 0; i < cli->nvaltype; i++)
+ if (cli->valtype[i].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *)cli->valtype[i].user_data;
+ free(clsl->items);
+ free(clsl->iopt);
+ free(clsl);
+ }
+
+ free(cli->valtype);
+ free(cli->iopt);
+ free(cli);
+ free(clp);
+}
+
+
+/** @param clp the parser
+ * @param errh error handler function
+ * @return previous error handler function
+ *
+ * The error handler function is called when CLP encounters an error while
+ * parsing the command line. It is called with the arguments "<tt>(*errh)(@a
+ * clp, s)</tt>", where <tt>s</tt> is a description of the error terminated by
+ * a newline. The <tt>s</tt> descriptions produced by CLP itself are prefixed
+ * by the program name, if any. */
+Clp_ErrorHandler
+Clp_SetErrorHandler(Clp_Parser *clp, void (*errh)(Clp_Parser *, const char *))
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_ErrorHandler old = cli->error_handler;
+ cli->error_handler = errh;
+ return old;
+}
+
+/** @param clp the parser
+ * @param utf8 does the parser support UTF-8?
+ * @return previous UTF-8 mode
+ *
+ * In UTF-8 mode, all input strings (arguments and long names for options) are
+ * assumed to be encoded via UTF-8, and all character names
+ * (Clp_SetOptionChar() and short names for options) may cover the whole
+ * Unicode range. Out of UTF-8 mode, all input strings are treated as binary,
+ * and all character names must be unsigned char values.
+ *
+ * Furthermore, error messages in UTF-8 mode may contain Unicode quote
+ * characters. */
+int
+Clp_SetUTF8(Clp_Parser *clp, int utf8)
+{
+ Clp_Internal *cli = clp->internal;
+ int old_utf8 = cli->utf8;
+ cli->utf8 = utf8;
+ calculate_lmm(clp, cli->opt, cli->iopt, cli->nopt);
+ return old_utf8;
+}
+
+/** @param clp the parser
+ * @param c character
+ * @return option character treatment
+ *
+ * Returns an integer specifying how CLP treats arguments that begin
+ * with character @a c. See Clp_SetOptionChar for possibilities.
+ */
+int
+Clp_OptionChar(Clp_Parser *clp, int c)
+{
+ Clp_Internal *cli = clp->internal;
+ int i, oclass = 0;
+ if (cli->noclass > 0 && cli->oclass[0].c == 0)
+ oclass = cli->oclass[0].type;
+ for (i = 0; i < cli->noclass; ++i)
+ if (cli->oclass[i].c == c)
+ oclass = cli->oclass[i].type;
+ return oclass;
+}
+
+/** @param clp the parser
+ * @param c character
+ * @param type option character treatment
+ * @return previous option character treatment, or -1 on error
+ *
+ * @a type specifies how CLP treats arguments that begin with character @a c.
+ * Possibilities are:
+ *
+ * <dl>
+ * <dt>Clp_NotOption (or 0)</dt>
+ * <dd>The argument cannot be an option.</dd>
+ * <dt>Clp_Long</dt>
+ * <dd>The argument is a long option.</dd>
+ * <dt>Clp_Short</dt>
+ * <dd>The argument is a set of short options.</dd>
+ * <dt>Clp_Short|Clp_Long</dt>
+ * <dd>The argument is either a long option or, if no matching long option is
+ * found, a set of short options.</dd>
+ * <dt>Clp_LongNegated</dt>
+ * <dd>The argument is a negated long option. For example, after
+ * Clp_SetOptionChar(@a clp, '^', Clp_LongNegated), the argument "^foo" is
+ * equivalent to "--no-foo".</dd>
+ * <dt>Clp_ShortNegated</dt>
+ * <dd>The argument is a set of negated short options.</dd>
+ * <dt>Clp_ShortNegated|Clp_LongNegated</dt>
+ * <dd>The argument is either a negated long option or, if no matching long
+ * option is found, a set of negated short options.</dd>
+ * <dt>Clp_LongImplicit</dt>
+ * <dd>The argument may be a long option, where the character @a c is actually
+ * part of the long option name. For example, after Clp_SetOptionChar(@a clp,
+ * 'f', Clp_LongImplicit), the argument "foo" may be equivalent to
+ * "--foo".</dd>
+ * </dl>
+ *
+ * In UTF-8 mode, @a c may be any Unicode character. Otherwise, @a c must be
+ * an unsigned char value. The special character 0 assigns @a type to @em
+ * every character.
+ *
+ * It is an error if @a c is out of range, @a type is illegal, or there are
+ * too many character definitions stored in @a clp already. The function
+ * returns -1 on error.
+ *
+ * A double hyphen "--" always introduces a long option. This behavior cannot
+ * currently be changed with Clp_SetOptionChar().
+ */
+int
+Clp_SetOptionChar(Clp_Parser *clp, int c, int type)
+{
+ int i, long1pos, long1neg;
+ int old = Clp_OptionChar(clp, c);
+ Clp_Internal *cli = clp->internal;
+
+ if (type != Clp_NotOption && type != Clp_Short && type != Clp_Long
+ && type != Clp_ShortNegated && type != Clp_LongNegated
+ && type != Clp_LongImplicit && type != (Clp_Short | Clp_Long)
+ && type != (Clp_ShortNegated | Clp_LongNegated))
+ return -1;
+ if (c < 0 || c >= (cli->utf8 ? 0x110000 : 256))
+ return -1;
+
+ if (c == 0)
+ cli->noclass = 0;
+ for (i = 0; i < cli->noclass; ++i)
+ if (cli->oclass[i].c == c)
+ break;
+ if (i == Clp_OclassSize)
+ return -1;
+
+ cli->oclass[i].c = c;
+ cli->oclass[i].type = type;
+ if (cli->noclass == i)
+ cli->noclass = i + 1;
+
+ long1pos = long1neg = 0;
+ for (i = 0; i < cli->noclass; ++i) {
+ if ((cli->oclass[i].type & Clp_Short)
+ && (cli->oclass[i].type & Clp_Long))
+ long1pos = 1;
+ if ((cli->oclass[i].type & Clp_ShortNegated)
+ && (cli->oclass[i].type & Clp_LongNegated))
+ long1neg = 1;
+ }
+
+ if (long1pos != cli->long1pos || long1neg != cli->long1neg) {
+ /* Must recheck option set */
+ cli->long1pos = long1pos;
+ cli->long1neg = long1neg;
+ calculate_lmm(clp, cli->opt, cli->iopt, cli->nopt);
+ }
+
+ return old;
+}
+
+/** @param clp the parser
+ * @param nopt number of option definitions
+ * @param opt option definition array
+ * @return 0 on success, -1 on failure
+ *
+ * Installs the option definitions in @a opt. Future option parsing will
+ * use @a opt to search for options.
+ *
+ * Also checks @a opt's option definitions for validity. "CLP internal
+ * errors" are reported via Clp_OptionError() if:
+ *
+ * <ul>
+ * <li>An option has a negative ID.</li>
+ * <li>Two different short options have the same name.</li>
+ * <li>Two different long options have the same name.</li>
+ * <li>A short and a long option are ambiguous, in that some option character
+ * might introduce either a short or a long option (e.g., Clp_SetOptionChar(@a
+ * clp, '-', Clp_Long|Clp_Short)), and a short name equals a long name.</li>
+ * </ul>
+ *
+ * If necessary memory cannot be allocated, this function returns -1 without
+ * modifying the parser.
+ *
+ * @note The CLP library will not modify the contents of @a argv or @a opt.
+ * The calling program must not modify @a opt either until another call to
+ * Clp_SetOptions() or the parser is destroyed.
+ */
+int
+Clp_SetOptions(Clp_Parser *clp, int nopt, const Clp_Option *opt)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_InternOption *iopt;
+ int i;
+ static unsigned opt_generation = 0;
+
+ if (nopt > cli->nopt) {
+ iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nopt);
+ if (!iopt)
+ return -1;
+ free(cli->iopt);
+ cli->iopt = iopt;
+ }
+
+ cli->opt = opt;
+ cli->nopt = nopt;
+ cli->opt_generation = ++opt_generation;
+ iopt = cli->iopt;
+ cli->current_option = -1;
+
+ /* Massage the options to make them usable */
+ for (i = 0; i < nopt; i++) {
+ /* Ignore negative option_ids, which are internal to CLP */
+ if (opt[i].option_id < 0) {
+ Clp_OptionError(clp, "CLP internal error: option %d has negative option_id", i);
+ iopt[i].ilong = iopt[i].ishort = iopt[i].ipos = iopt[i].ineg = 0;
+ continue;
+ }
+
+ /* Set flags based on input flags */
+ iopt[i].ilong = (opt[i].long_name != 0 && opt[i].long_name[0] != 0);
+ iopt[i].ishort = (opt[i].short_name > 0
+ && opt[i].short_name < (cli->utf8 ? 0x110000 : 256));
+ iopt[i].ipos = 1;
+ iopt[i].ineg = (opt[i].flags & Clp_Negate) != 0;
+ iopt[i].imandatory = (opt[i].flags & Clp_Mandatory) != 0;
+ iopt[i].ioptional = (opt[i].flags & Clp_Optional) != 0;
+ iopt[i].iprefmatch = (opt[i].flags & Clp_PreferredMatch) != 0;
+ iopt[i].ilongoff = 0;
+
+ /* Enforce invariants */
+ if (opt[i].val_type <= 0)
+ iopt[i].imandatory = iopt[i].ioptional = 0;
+ if (opt[i].val_type > 0 && !iopt[i].ioptional)
+ iopt[i].imandatory = 1;
+
+ /* Options that start with 'no-' should be changed to OnlyNegated */
+ if (iopt[i].ilong && strncmp(opt[i].long_name, "no-", 3) == 0) {
+ iopt[i].ipos = 0;
+ iopt[i].ineg = 1;
+ iopt[i].ilongoff = 3;
+ if (strncmp(opt[i].long_name + 3, "no-", 3) == 0)
+ Clp_OptionError(clp, "CLP internal error: option %d begins with \"no-no-\"", i);
+ } else if (opt[i].flags & Clp_OnlyNegated) {
+ iopt[i].ipos = 0;
+ iopt[i].ineg = 1;
+ }
+ }
+
+ /* Check option set */
+ calculate_lmm(clp, opt, iopt, nopt);
+
+ return 0;
+}
+
+/** @param clp the parser
+ * @param argc number of arguments
+ * @param argv argument array
+ *
+ * Installs the arguments in @a argv for parsing. Future option parsing will
+ * analyze @a argv.
+ *
+ * Unlike Clp_NewParser(), this function does not treat @a argv[0] specially.
+ * The first subsequent call to Clp_Next() will analyze @a argv[0].
+ *
+ * This function also sets option processing to on, as by
+ * Clp_SetOptionProcessing(@a clp, 1).
+ *
+ * @note The CLP library will not modify the contents of @a argv. The calling
+ * program should not generally modify the element of @a argv that CLP is
+ * currently analyzing.
+ */
+void
+Clp_SetArguments(Clp_Parser *clp, int argc, const char * const *argv)
+{
+ Clp_Internal *cli = clp->internal;
+
+ cli->argc = argc + 1;
+ cli->argv = argv - 1;
+
+ cli->is_short = 0;
+ cli->whole_negated = 0;
+ cli->option_processing = 1;
+ cli->current_option = -1;
+}
+
+
+/** @param clp the parser
+ * @param on whether to search for options
+ * @return previous option processing setting
+ *
+ * When option processing is off, every call to Clp_Next() returns
+ * Clp_NotOption. By default the option <tt>"--"</tt> turns off option
+ * processing and is otherwise ignored.
+ */
+int
+Clp_SetOptionProcessing(Clp_Parser *clp, int on)
+{
+ Clp_Internal *cli = clp->internal;
+ int old = cli->option_processing;
+ cli->option_processing = on;
+ return old;
+}
+
+
+/*******
+ * functions for Clp_Option lists
+ **/
+
+/* the ever-glorious argcmp */
+
+static int
+argcmp(const char *ref, const char *arg, int min_match, int fewer_dashes)
+ /* Returns 0 if ref and arg don't match.
+ Returns -1 if ref and arg match, but fewer than min_match characters.
+ Returns len if ref and arg match min_match or more characters;
+ len is the number of characters that matched in arg.
+ Allows arg to contain fewer dashes than ref iff fewer_dashes != 0.
+
+ Examples:
+ argcmp("x", "y", 1, 0) --> 0 / just plain wrong
+ argcmp("a", "ax", 1, 0) --> 0 / ...even though min_match == 1
+ and the 1st chars match
+ argcmp("box", "bo", 3, 0) --> -1 / ambiguous
+ argcmp("cat", "c=3", 1, 0) --> 1 / handles = arguments
+ */
+{
+ const char *refstart = ref;
+ const char *argstart = arg;
+ assert(min_match > 0);
+
+ compare:
+ while (*ref && *arg && *arg != '=' && *ref == *arg)
+ ref++, arg++;
+
+ /* Allow arg to contain fewer dashes than ref */
+ if (fewer_dashes && *ref == '-' && ref[1] && ref[1] == *arg) {
+ ref++;
+ goto compare;
+ }
+
+ if (*arg && *arg != '=')
+ return 0;
+ else if (ref - refstart < min_match)
+ return -1;
+ else
+ return arg - argstart;
+}
+
+static int
+find_prefix_opt(Clp_Parser *clp, const char *arg,
+ int nopt, const Clp_Option *opt,
+ const Clp_InternOption *iopt,
+ int *ambiguous, int *ambiguous_values)
+ /* Looks for an unambiguous match of 'arg' against one of the long
+ options in 'opt'. Returns positive if it finds one; otherwise, returns
+ -1 and possibly changes 'ambiguous' and 'ambiguous_values' to keep
+ track of at most MAX_AMBIGUOUS_VALUES possibilities. */
+{
+ int i, fewer_dashes = 0, first_ambiguous = *ambiguous;
+ int negated = clp && clp->negated;
+ int first_charlen = (clp ? clp_utf8_charlen(clp->internal, arg) : 1);
+
+ retry:
+ for (i = 0; i < nopt; i++) {
+ int len, lmm;
+ if (!iopt[i].ilong || (negated ? !iopt[i].ineg : !iopt[i].ipos))
+ continue;
+
+ lmm = (negated ? iopt[i].lmmneg : iopt[i].lmmpos);
+ if (clp && clp->internal->could_be_short
+ && (negated ? iopt[i].lmmneg_short : iopt[i].lmmpos_short))
+ lmm = (first_charlen >= lmm ? first_charlen + 1 : lmm);
+ len = argcmp(opt[i].long_name + iopt[i].ilongoff, arg, lmm, fewer_dashes);
+ if (len > 0)
+ return i;
+ else if (len < 0) {
+ if (*ambiguous < MAX_AMBIGUOUS_VALUES)
+ ambiguous_values[*ambiguous] = i;
+ (*ambiguous)++;
+ }
+ }
+
+ /* If there were no partial matches, try again with fewer_dashes true */
+ if (*ambiguous == first_ambiguous && !fewer_dashes) {
+ fewer_dashes = 1;
+ goto retry;
+ }
+
+ return -1;
+}
+
+
+/*****
+ * Argument parsing
+ **/
+
+static int
+val_type_binsearch(Clp_Internal *cli, int val_type)
+{
+ unsigned l = 0, r = cli->nvaltype;
+ while (l < r) {
+ unsigned m = l + (r - l) / 2;
+ if (cli->valtype[m].val_type == val_type)
+ return m;
+ else if (cli->valtype[m].val_type < val_type)
+ l = m + 1;
+ else
+ r = m;
+ }
+ return l;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags value type flags
+ * @param parser parser function
+ * @param user_data user data for @a parser function
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * @a parser will be passed argument values for type @a val_type. It should
+ * parse the argument into values (usually in @a clp->val, but sometimes
+ * elsewhere), report errors if necessary, and return whether the parse was
+ * successful.
+ *
+ * Any prior argument parser match @a val_type is removed. @a val_type must
+ * be greater than zero.
+ *
+ * @a flags specifies additional parsing flags. At the moment the only
+ * relevant flag is Clp_DisallowOptions, which means that separated values
+ * must not look like options. For example, assume argument
+ * <tt>--a</tt>/<tt>-a</tt> has mandatory value type Clp_ValStringNotOption
+ * (which has Clp_DisallowOptions). Then:
+ *
+ * <ul>
+ * <li><tt>--a=--b</tt> will parse with value <tt>--b</tt>.</li>
+ * <li><tt>-a--b</tt> will parse with value <tt>--b</tt>.</li>
+ * <li><tt>--a --b</tt> will not parse, since the mandatory value looks like
+ * an option.</li>
+ * <li><tt>-a --b</tt> will not parse, since the mandatory value looks like
+ * an option.</li>
+ * </ul>
+ */
+int
+Clp_AddType(Clp_Parser *clp, int val_type, int flags,
+ Clp_ValParseFunc parser, void *user_data)
+{
+ Clp_Internal *cli = clp->internal;
+ int vtpos;
+
+ if (val_type <= 0 || !parser)
+ return -1;
+
+ vtpos = val_type_binsearch(cli, val_type);
+
+ if (vtpos == cli->nvaltype || cli->valtype[vtpos].val_type != val_type) {
+ if (cli->nvaltype != 0 && (cli->nvaltype % Clp_InitialValType) == 0) {
+ Clp_ValType *new_valtype =
+ (Clp_ValType *) realloc(cli->valtype, sizeof(Clp_ValType) * (cli->nvaltype + Clp_InitialValType));
+ if (!new_valtype)
+ return -1;
+ cli->valtype = new_valtype;
+ }
+ memmove(&cli->valtype[vtpos + 1], &cli->valtype[vtpos],
+ sizeof(Clp_ValType) * (cli->nvaltype - vtpos));
+ cli->nvaltype++;
+ cli->valtype[vtpos].func = 0;
+ }
+
+ if (cli->valtype[vtpos].func == parse_string_list) {
+ Clp_StringList *clsl = (Clp_StringList *) cli->valtype[vtpos].user_data;
+ free(clsl->items);
+ free(clsl->iopt);
+ free(clsl);
+ }
+
+ cli->valtype[vtpos].val_type = val_type;
+ cli->valtype[vtpos].func = parser;
+ cli->valtype[vtpos].flags = flags;
+ cli->valtype[vtpos].user_data = user_data;
+ return 0;
+}
+
+
+/*******
+ * Default argument parsers
+ **/
+
+static int
+parse_string(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ (void)complain, (void)user_data;
+ clp->val.s = arg;
+ return 1;
+}
+
+static int
+parse_int(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ const char *val;
+ if (*arg == 0 || isspace((unsigned char) *arg)
+ || (user_data != 0 && *arg == '-'))
+ val = arg;
+ else if (user_data != 0) { /* unsigned */
+#if HAVE_STRTOUL
+ clp->val.u = strtoul(arg, (char **) &val, 0);
+#else
+ /* don't bother really trying to do it right */
+ if (arg[0] == '-')
+ val = arg;
+ else
+ clp->val.u = strtol(arg, (char **) &val, 0);
+#endif
+ } else
+ clp->val.i = strtol(arg, (char **) &val, 0);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain) {
+ const char *message = user_data != 0
+ ? "%<%O%> expects a nonnegative integer, not %<%s%>"
+ : "%<%O%> expects an integer, not %<%s%>";
+ return Clp_OptionError(clp, message, arg);
+ } else
+ return 0;
+}
+
+static int
+parse_double(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ const char *val;
+ (void)user_data;
+ if (*arg == 0 || isspace((unsigned char) *arg))
+ val = arg;
+ else
+ clp->val.d = strtod(arg, (char **) &val);
+ if (*arg != 0 && *val == 0)
+ return 1;
+ else if (complain)
+ return Clp_OptionError(clp, "%<%O%> expects a real number, not %<%s%>", arg);
+ else
+ return 0;
+}
+
+static int
+parse_bool(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ int i;
+ char lcarg[6];
+ (void)user_data;
+ if (strlen(arg) > 5 || strchr(arg, '=') != 0)
+ goto error;
+
+ for (i = 0; arg[i] != 0; i++)
+ lcarg[i] = tolower((unsigned char) arg[i]);
+ lcarg[i] = 0;
+
+ if (argcmp("yes", lcarg, 1, 0) > 0
+ || argcmp("true", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 1;
+ return 1;
+ } else if (argcmp("no", lcarg, 1, 0) > 0
+ || argcmp("false", lcarg, 1, 0) > 0
+ || argcmp("1", lcarg, 1, 0) > 0) {
+ clp->val.i = 0;
+ return 1;
+ }
+
+ error:
+ if (complain)
+ Clp_OptionError(clp, "%<%O%> expects a true-or-false value, not %<%s%>", arg);
+ return 0;
+}
+
+
+/*****
+ * Clp_AddStringListType
+ **/
+
+static int
+parse_string_list(Clp_Parser *clp, const char *arg, int complain, void *user_data)
+{
+ Clp_StringList *sl = (Clp_StringList *)user_data;
+ int idx, ambiguous = 0;
+ int ambiguous_values[MAX_AMBIGUOUS_VALUES + 1];
+
+ /* actually look for a string value */
+ idx = find_prefix_opt
+ (0, arg, sl->nitems, sl->items, sl->iopt,
+ &ambiguous, ambiguous_values);
+ if (idx >= 0) {
+ clp->val.i = sl->items[idx].option_id;
+ return 1;
+ }
+
+ if (sl->allow_int) {
+ if (parse_int(clp, arg, 0, 0))
+ return 1;
+ }
+
+ if (complain) {
+ const char *complaint = (ambiguous ? "ambiguous" : "invalid");
+ if (!ambiguous) {
+ ambiguous = sl->nitems_invalid_report;
+ for (idx = 0; idx < ambiguous; idx++)
+ ambiguous_values[idx] = idx;
+ }
+ return ambiguity_error
+ (clp, ambiguous, ambiguous_values, sl->items, sl->iopt,
+ "", "option %<%O%> value %<%s%> is %s", arg, complaint);
+ } else
+ return 0;
+}
+
+
+static int
+finish_string_list(Clp_Parser *clp, int val_type, int flags,
+ Clp_Option *items, int nitems, int itemscap)
+{
+ int i;
+ Clp_StringList *clsl = (Clp_StringList *)malloc(sizeof(Clp_StringList));
+ Clp_InternOption *iopt = (Clp_InternOption *)malloc(sizeof(Clp_InternOption) * nitems);
+ if (!clsl || !iopt)
+ goto error;
+
+ clsl->items = items;
+ clsl->iopt = iopt;
+ clsl->nitems = nitems;
+ clsl->allow_int = (flags & Clp_AllowNumbers) != 0;
+
+ if (nitems < MAX_AMBIGUOUS_VALUES && nitems < itemscap && clsl->allow_int) {
+ items[nitems].long_name = "any integer";
+ clsl->nitems_invalid_report = nitems + 1;
+ } else if (nitems > MAX_AMBIGUOUS_VALUES + 1)
+ clsl->nitems_invalid_report = MAX_AMBIGUOUS_VALUES + 1;
+ else
+ clsl->nitems_invalid_report = nitems;
+
+ for (i = 0; i < nitems; i++) {
+ iopt[i].ilong = iopt[i].ipos = 1;
+ iopt[i].ishort = iopt[i].ineg = iopt[i].ilongoff = iopt[i].iprefmatch = 0;
+ }
+ calculate_lmm(clp, items, iopt, nitems);
+
+ if (Clp_AddType(clp, val_type, 0, parse_string_list, clsl) >= 0)
+ return 0;
+
+ error:
+ if (clsl)
+ free(clsl);
+ if (iopt)
+ free(iopt);
+ return -1;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags string list flags
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * sets @a clp->val.i to an integer. The value string is matched against
+ * strings provided in the ellipsis arguments. For example, the
+ * Clp_AddStringListType() call below has the same effect as the
+ * Clp_AddStringListTypeVec() call:
+ *
+ * For example:
+ * @code
+ * Clp_AddStringListType(clp, 100, Clp_AllowNumbers, "cat", 1,
+ * "cattle", 2, "dog", 3, (const char *) NULL);
+ *
+ * const char * const strs[] = { "cat", "cattle", "dog" };
+ * const int vals[] = { 1, 2, 3 };
+ * Clp_AddStringListTypeVec(clp, 100, Clp_AllowNumbers, 3, strs, vals);
+ * @endcode
+ *
+ * @note The CLP library will not modify any of the passed-in strings. The
+ * calling program must not modify or free them either until the parser is
+ * destroyed.
+ */
+int
+Clp_AddStringListType(Clp_Parser *clp, int val_type, int flags, ...)
+{
+ int nitems = 0;
+ int itemscap = 5;
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+
+ va_list val;
+ va_start(val, flags);
+
+ if (!items)
+ goto error;
+
+ /* slurp up the arguments */
+ while (1) {
+ int value;
+ char *name = va_arg(val, char *);
+ if (!name)
+ break;
+ value = va_arg(val, int);
+
+ if (nitems >= itemscap) {
+ Clp_Option *new_items;
+ itemscap *= 2;
+ new_items = (Clp_Option *)realloc(items, sizeof(Clp_Option) * itemscap);
+ if (!new_items)
+ goto error;
+ items = new_items;
+ }
+
+ items[nitems].long_name = name;
+ items[nitems].option_id = value;
+ items[nitems].flags = 0;
+ nitems++;
+ }
+
+ va_end(val);
+ if (finish_string_list(clp, val_type, flags, items, nitems, itemscap) >= 0)
+ return 0;
+
+ error:
+ va_end(val);
+ if (items)
+ free(items);
+ return -1;
+}
+
+/** @param clp the parser
+ * @param val_type value type ID
+ * @param flags string list flags
+ * @param nstrs number of strings in list
+ * @param strs array of strings
+ * @param vals array of values
+ * @return 0 on success, -1 on failure
+ *
+ * Defines argument type @a val_type in parser @a clp. The parsing function
+ * sets @a clp->val.i to an integer. The value string is matched against the
+ * @a strs. If there's a unique match, the corresponding entry from @a vals
+ * is returned. Unique prefix matches also work. Finally, if @a flags
+ * contains the Clp_AllowNumbers flag, then integers are also accepted.
+ *
+ * For example:
+ * @code
+ * const char * const strs[] = { "cat", "cattle", "dog" };
+ * const int vals[] = { 1, 2, 3 };
+ * Clp_AddStringListTypeVec(clp, 100, Clp_AllowNumbers, 3, strs, vals);
+ * @endcode
+ *
+ * Say that option <tt>--animal</tt> takes value type 100. Then:
+ *
+ * <ul>
+ * <li><tt>--animal=cat</tt> will succeed and set @a clp->val.i = 1.</li>
+ * <li><tt>--animal=cattle</tt> will succeed and set @a clp->val.i = 2.</li>
+ * <li><tt>--animal=dog</tt> will succeed and set @a clp->val.i = 3.</li>
+ * <li><tt>--animal=d</tt> will succeed and set @a clp->val.i = 3.</li>
+ * <li><tt>--animal=c</tt> will fail, since <tt>c</tt> is ambiguous.</li>
+ * <li><tt>--animal=4</tt> will succeed and set @a clp->val.i = 4.</li>
+ * </ul>
+ *
+ * @note The CLP library will not modify the contents of @a strs or @a vals.
+ * The calling program can modify the @a strs array, but the actual strings
+ * (for instance, @a strs[0] and @a strs[1]) must not be modified or freed
+ * until the parser is destroyed.
+ */
+int
+Clp_AddStringListTypeVec(Clp_Parser *clp, int val_type, int flags,
+ int nstrs, const char * const *strs,
+ const int *vals)
+ /* An alternate way to make a string list type. See Clp_AddStringListType
+ for the basics; this coalesces the strings and values into two arrays,
+ rather than spreading them out into a variable argument list. */
+{
+ int i;
+ int itemscap = (nstrs < 5 ? 5 : nstrs);
+ Clp_Option *items = (Clp_Option *)malloc(sizeof(Clp_Option) * itemscap);
+ if (!items)
+ return -1;
+
+ /* copy over items */
+ for (i = 0; i < nstrs; i++) {
+ items[i].long_name = strs[i];
+ items[i].option_id = vals[i];
+ items[i].flags = 0;
+ }
+
+ if (finish_string_list(clp, val_type, flags, items, nstrs, itemscap) >= 0)
+ return 0;
+ else {
+ free(items);
+ return -1;
+ }
+}
+
+
+/*******
+ * Returning information
+ **/
+
+const char *
+Clp_ProgramName(Clp_Parser *clp)
+{
+ return clp->internal->program_name;
+}
+
+/** @param clp the parser
+ * @param name new program name
+ * @return previous program name
+ *
+ * The calling program should not modify or free @a name until @a clp itself
+ * is destroyed. */
+const char *
+Clp_SetProgramName(Clp_Parser *clp, const char *name)
+{
+ const char *old = clp->internal->program_name;
+ clp->internal->program_name = name;
+ return old;
+}
+
+
+/******
+ * Clp_ParserStates
+ **/
+
+/** @return the parser state
+ *
+ * A Clp_ParserState object can store a parsing state of a Clp_Parser object.
+ * This state specifies exactly how far the Clp_Parser has gotten in parsing
+ * an argument list. The Clp_SaveParser() and Clp_RestoreParser() functions
+ * can be used to save this state and then restore it later, allowing a
+ * Clp_Parser to switch among argument lists.
+ *
+ * The initial state is empty, in that after Clp_RestoreParser(clp, state),
+ * Clp_Next(clp) would return Clp_Done.
+ *
+ * Parser states can be saved and restored among different parser objects.
+ *
+ * @sa Clp_DeleteParserState, Clp_SaveParser, Clp_RestoreParser
+ */
+Clp_ParserState *
+Clp_NewParserState(void)
+{
+ Clp_ParserState *state = (Clp_ParserState *)malloc(sizeof(Clp_ParserState));
+ if (state) {
+ state->argv = 0;
+ state->argc = 0;
+ state->option_chars[0] = 0;
+ state->xtext = 0;
+ state->option_processing = 0;
+ state->opt_generation = 0;
+ state->current_option = -1;
+ state->is_short = 0;
+ state->whole_negated = 0;
+ state->current_short = 0;
+ state->negated_by_no = 0;
+ }
+ return state;
+}
+
+/** @param state parser state
+ *
+ * The memory associated with @a state is freed.
+ */
+void
+Clp_DeleteParserState(Clp_ParserState *state)
+{
+ free(state);
+}
+
+/** @param clp the parser
+ * @param state parser state
+ * @sa Clp_NewParserState, Clp_RestoreParser
+ */
+void
+Clp_SaveParser(const Clp_Parser *clp, Clp_ParserState *state)
+{
+ Clp_Internal *cli = clp->internal;
+ state->argv = cli->argv;
+ state->argc = cli->argc;
+ memcpy(state->option_chars, cli->option_chars, Clp_OptionCharsSize);
+ state->xtext = cli->xtext;
+
+ state->option_processing = cli->option_processing;
+ state->opt_generation = cli->opt_generation;
+ state->current_option = cli->current_option;
+ state->is_short = cli->is_short;
+ state->whole_negated = cli->whole_negated;
+ state->current_short = cli->current_short;
+ state->negated_by_no = cli->negated_by_no;
+}
+
+
+/** @param clp the parser
+ * @param state parser state
+ *
+ * The parser state in @a state is restored into @a clp. The next call to
+ * Clp_Next() will return the same result as it would have at the time @a
+ * state was saved (probably by Clp_SaveParser(@a clp, @a state)).
+ *
+ * A parser state contains information about arguments (argc and argv; see
+ * Clp_SetArguments()) and option processing (Clp_SetOptionProcessing()), but
+ * not about options (Clp_SetOptions()). Changes to options and value types
+ * are preserved across Clp_RestoreParser().
+ *
+ * @sa Clp_NewParserState, Clp_SaveParser
+ */
+void
+Clp_RestoreParser(Clp_Parser *clp, const Clp_ParserState *state)
+{
+ Clp_Internal *cli = clp->internal;
+ cli->argv = state->argv;
+ cli->argc = state->argc;
+ memcpy(cli->option_chars, state->option_chars, Clp_OptionCharsSize);
+ cli->xtext = state->xtext;
+ cli->option_processing = state->option_processing;
+ cli->is_short = state->is_short;
+ cli->whole_negated = state->whole_negated;
+ cli->current_short = state->current_short;
+ cli->negated_by_no = state->negated_by_no;
+ if (cli->opt_generation == state->opt_generation)
+ cli->current_option = state->current_option;
+ else
+ cli->current_option = -1;
+}
+
+
+/*******
+ * Clp_Next and its helpers
+ **/
+
+static void
+set_option_text(Clp_Internal *cli, const char *text, int n_option_chars)
+{
+ assert(n_option_chars < Clp_OptionCharsSize);
+ memcpy(cli->option_chars, text, n_option_chars);
+ cli->option_chars[n_option_chars] = 0;
+ cli->xtext = text + n_option_chars;
+}
+
+static int
+get_oclass(Clp_Parser *clp, const char *text, int *ocharskip)
+{
+ int c;
+ if (clp->internal->utf8) {
+ const char *s;
+ c = decode_utf8(text, &s);
+ *ocharskip = s - text;
+ } else {
+ c = (unsigned char) text[0];
+ *ocharskip = 1;
+ }
+ return Clp_OptionChar(clp, c);
+}
+
+static int
+next_argument(Clp_Parser *clp, int want_argument)
+ /* Moves clp to the next argument.
+ Returns 1 if it finds another option.
+ Returns 0 if there aren't any more arguments.
+ Returns 0, sets clp->have_val = 1, and sets clp->vstr to the argument
+ if the next argument isn't an option.
+ If want_argument > 0, it'll look for an argument.
+ want_argument == 1: Accept arguments that start with Clp_NotOption
+ or Clp_LongImplicit.
+ want_argument == 2: Accept ALL arguments.
+
+ Where is the option stored when this returns?
+ Well, cli->argv[0] holds the whole of the next command line argument.
+ cli->option_chars holds a string: what characters began the option?
+ It is generally "-" or "--".
+ cli->text holds the text of the option:
+ for short options, cli->text[0] is the relevant character;
+ for long options, cli->text holds the rest of the option. */
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text;
+ int oclass, ocharskip;
+
+ /* clear relevant flags */
+ clp->have_val = 0;
+ clp->vstr = 0;
+ cli->could_be_short = 0;
+
+ /* if we're in a string of short options, move up one char in the string */
+ if (cli->is_short) {
+ cli->xtext += clp_utf8_charlen(cli, cli->xtext);
+ if (cli->xtext[0] == 0)
+ cli->is_short = 0;
+ else if (want_argument > 0) {
+ /* handle -O[=]argument case */
+ clp->have_val = 1;
+ if (cli->xtext[0] == '=')
+ clp->vstr = cli->xtext + 1;
+ else
+ clp->vstr = cli->xtext;
+ cli->is_short = 0;
+ return 0;
+ }
+ }
+
+ /* if in short options, we're all set */
+ if (cli->is_short)
+ return 1;
+
+ /** if not in short options, move to the next argument **/
+ cli->whole_negated = 0;
+ cli->xtext = 0;
+
+ if (cli->argc <= 1)
+ return 0;
+
+ cli->argc--;
+ cli->argv++;
+ text = cli->argv[0];
+
+ if (want_argument > 1)
+ goto not_option;
+
+ if (text[0] == '-' && text[1] == '-') {
+ oclass = Clp_DoubledLong;
+ ocharskip = 2;
+ } else
+ oclass = get_oclass(clp, text, &ocharskip);
+
+ /* If this character could introduce either a short or a long option,
+ try a long option first, but remember that short's a possibility for
+ later. */
+ if ((oclass & (Clp_Short | Clp_ShortNegated))
+ && (oclass & (Clp_Long | Clp_LongNegated))) {
+ oclass &= ~(Clp_Short | Clp_ShortNegated);
+ if (text[ocharskip])
+ cli->could_be_short = 1;
+ }
+
+ switch (oclass) {
+
+ case Clp_Short:
+ cli->is_short = 1;
+ goto check_singleton;
+
+ case Clp_ShortNegated:
+ cli->is_short = 1;
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ case Clp_Long:
+ goto check_singleton;
+
+ case Clp_LongNegated:
+ cli->whole_negated = 1;
+ goto check_singleton;
+
+ check_singleton:
+ /* For options introduced with one character, option-char,
+ '[option-char]' alone is NOT an option. */
+ if (!text[ocharskip])
+ goto not_option;
+ set_option_text(cli, text, ocharskip);
+ break;
+
+ case Clp_LongImplicit:
+ /* LongImplict: option_chars == "" (since all chars are part of the
+ option); restore head -> text of option */
+ if (want_argument > 0)
+ goto not_option;
+ set_option_text(cli, text, 0);
+ break;
+
+ case Clp_DoubledLong:
+ set_option_text(cli, text, ocharskip);
+ break;
+
+ not_option:
+ case Clp_NotOption:
+ cli->is_short = 0;
+ clp->have_val = 1;
+ clp->vstr = text;
+ return 0;
+
+ default:
+ assert(0 /* CLP misconfiguration: bad option type */);
+
+ }
+
+ return 1;
+}
+
+
+static void
+switch_to_short_argument(Clp_Parser *clp)
+{
+ Clp_Internal *cli = clp->internal;
+ const char *text = cli->argv[0];
+ int ocharskip, oclass = get_oclass(clp, text, &ocharskip);
+ assert(cli->could_be_short);
+ cli->is_short = 1;
+ cli->whole_negated = (oclass & Clp_ShortNegated ? 1 : 0);
+ set_option_text(cli, cli->argv[0], ocharskip);
+}
+
+
+static int
+find_long(Clp_Parser *clp, const char *arg)
+ /* If arg corresponds to one of clp's options, finds that option &
+ returns it. If any argument is given after an = sign in arg, sets
+ clp->have_val = 1 and clp->vstr to that argument. Sets cli->ambiguous
+ to 1 iff there was no match because the argument was ambiguous. */
+{
+ Clp_Internal *cli = clp->internal;
+ int optno, len, lmm;
+ const Clp_Option *opt = cli->opt;
+ const Clp_InternOption *iopt;
+ int first_negative_ambiguous;
+
+ /* Look for a normal option. */
+ optno = find_prefix_opt
+ (clp, arg, cli->nopt, opt, cli->iopt,
+ &cli->ambiguous, cli->ambiguous_values);
+ if (optno >= 0)
+ goto worked;
+
+ /* If we can't find it, look for a negated option. */
+ /* I know this is silly, but it makes me happy to accept
+ --no-no-option as a double negative synonym for --option. :) */
+ first_negative_ambiguous = cli->ambiguous;
+ while (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-') {
+ arg += 3;
+ clp->negated = !clp->negated;
+ optno = find_prefix_opt
+ (clp, arg, cli->nopt, opt, cli->iopt,
+ &cli->ambiguous, cli->ambiguous_values);
+ if (optno >= 0)
+ goto worked;
+ }
+
+ /* No valid option was found; return 0. Mark the ambiguous values found
+ through '--no' by making them negative. */
+ {
+ int i, max = cli->ambiguous;
+ if (max > MAX_AMBIGUOUS_VALUES) max = MAX_AMBIGUOUS_VALUES;
+ for (i = first_negative_ambiguous; i < max; i++)
+ cli->ambiguous_values[i] = -cli->ambiguous_values[i] - 1;
+ }
+ return -1;
+
+ worked:
+ iopt = &cli->iopt[optno];
+ lmm = (clp->negated ? iopt->lmmneg : iopt->lmmpos);
+ if (cli->could_be_short
+ && (clp->negated ? iopt->lmmneg_short : iopt->lmmpos_short)) {
+ int first_charlen = clp_utf8_charlen(cli, arg);
+ lmm = (first_charlen >= lmm ? first_charlen + 1 : lmm);
+ }
+ len = argcmp(opt[optno].long_name + iopt->ilongoff, arg, lmm, 1);
+ assert(len > 0);
+ if (arg[len] == '=') {
+ clp->have_val = 1;
+ clp->vstr = arg + len + 1;
+ }
+ return optno;
+}
+
+
+static int
+find_short(Clp_Parser *clp, const char *text)
+ /* If short_name corresponds to one of clp's options, returns it. */
+{
+ Clp_Internal *cli = clp->internal;
+ const Clp_Option *opt = cli->opt;
+ const Clp_InternOption *iopt = cli->iopt;
+ int i, c;
+ if (clp->internal->utf8)
+ c = decode_utf8(text, 0);
+ else
+ c = (unsigned char) *text;
+
+ for (i = 0; i < cli->nopt; i++)
+ if (iopt[i].ishort && opt[i].short_name == c
+ && (!clp->negated || iopt[i].ineg)) {
+ clp->negated = clp->negated || !iopt[i].ipos;
+ return i;
+ }
+
+ return -1;
+}
+
+
+/** @param clp the parser
+ * @return option ID of next option
+ *
+ * Parse the next argument from the argument list, store information about
+ * that argument in the fields of @a clp, and return the option's ID.
+ *
+ * If an argument was successfully parsed, that option's ID is returned.
+ * Other possible return values are:
+ *
+ * <dl>
+ * <dt>Clp_Done</dt>
+ * <dd>There are no more arguments.</dd>
+ * <dt>Clp_NotOption</dt>
+ * <dd>The next argument was not an option. The argument's text is @a
+ * clp->vstr (and @a clp->val.s).</dd>
+ * <dt>Clp_BadOption</dt>
+ * <dd>The next argument was a bad option: either an option that wasn't
+ * understood, or an option lacking a required value, or an option whose value
+ * couldn't be parsed. The option has been skipped.</dd>
+ * <dt>Clp_Error</dt>
+ * <dd>There was an internal error. This should never occur unless a user
+ * messes with, for example, a Clp_Option array.</dd>
+ * </dl>
+ *
+ * The fields of @a clp are set as follows.
+ *
+ * <dl>
+ * <dt><tt>negated</tt></dt>
+ * <dd>1 if the option was negated, 0 if it wasn't.</dd>
+ * <dt><tt>have_val</tt></dt>
+ * <dd>1 if the option had a value, 0 if it didn't. Note that negated options
+ * are not allowed to have values.</dd>
+ * <dt><tt>vstr</tt></dt>
+ * <dd>The value string, if any. NULL if there was no value.</dd>
+ * <dt><tt>val</tt></dt>
+ * <dd>An option's value type will parse the value string into this
+ * union.</dd>
+ * </dl>
+ *
+ * The parsed argument is shifted off the argument list, so that sequential
+ * calls to Clp_Next() step through the arugment list.
+ */
+int
+Clp_Next(Clp_Parser *clp)
+{
+ Clp_Internal *cli = clp->internal;
+ int optno;
+ const Clp_Option *opt;
+ Clp_ParserState clpsave;
+ int vtpos, complain;
+
+ /* Set up clp */
+ cli->current_option = -1;
+ cli->ambiguous = 0;
+
+ /* Get the next argument or option */
+ if (!next_argument(clp, cli->option_processing ? 0 : 2)) {
+ clp->val.s = clp->vstr;
+ optno = clp->have_val ? Clp_NotOption : Clp_Done;
+ clp->option = &clp_option_sentinel[-optno];
+ return optno;
+ }
+
+ clp->negated = cli->whole_negated;
+ if (cli->is_short)
+ optno = find_short(clp, cli->xtext);
+ else
+ optno = find_long(clp, cli->xtext);
+
+ /* If there's ambiguity between long & short options, and we couldn't
+ find a long option, look for a short option */
+ if (optno < 0 && cli->could_be_short) {
+ switch_to_short_argument(clp);
+ optno = find_short(clp, cli->xtext);
+ }
+
+ /* If we didn't find an option... */
+ if (optno < 0 || (clp->negated && !cli->iopt[optno].ineg)) {
+ /* default processing for the "--" option: turn off option processing
+ and return the next argument */
+ if (strcmp(cli->argv[0], "--") == 0) {
+ Clp_SetOptionProcessing(clp, 0);
+ return Clp_Next(clp);
+ }
+
+ /* otherwise, report some error or other */
+ if (cli->ambiguous)
+ ambiguity_error(clp, cli->ambiguous, cli->ambiguous_values,
+ cli->opt, cli->iopt, cli->option_chars,
+ "option %<%s%s%> is ambiguous",
+ cli->option_chars, cli->xtext);
+ else if (cli->is_short && !cli->could_be_short)
+ Clp_OptionError(clp, "unrecognized option %<%s%C%>",
+ cli->option_chars, cli->xtext);
+ else
+ Clp_OptionError(clp, "unrecognized option %<%s%s%>",
+ cli->option_chars, cli->xtext);
+
+ clp->option = &clp_option_sentinel[-Clp_BadOption];
+ return Clp_BadOption;
+ }
+
+ /* Set the current option */
+ cli->current_option = optno;
+ cli->current_short = cli->is_short;
+ cli->negated_by_no = clp->negated && !cli->whole_negated;
+
+ /* The no-argument (or should-have-no-argument) case */
+ if (clp->negated
+ || (!cli->iopt[optno].imandatory && !cli->iopt[optno].ioptional)) {
+ if (clp->have_val) {
+ Clp_OptionError(clp, "%<%O%> can%,t take an argument");
+ clp->option = &clp_option_sentinel[-Clp_BadOption];
+ return Clp_BadOption;
+ } else {
+ clp->option = &cli->opt[optno];
+ return cli->opt[optno].option_id;
+ }
+ }
+
+ /* Get an argument if we need one, or if it's optional */
+ /* Sanity-check the argument type. */
+ opt = &cli->opt[optno];
+ if (opt->val_type <= 0) {
+ clp->option = &clp_option_sentinel[-Clp_Error];
+ return Clp_Error;
+ }
+ vtpos = val_type_binsearch(cli, opt->val_type);
+ if (vtpos == cli->nvaltype
+ || cli->valtype[vtpos].val_type != opt->val_type) {
+ clp->option = &clp_option_sentinel[-Clp_Error];
+ return Clp_Error;
+ }
+
+ /* complain == 1 only if the argument was explicitly given,
+ or it is mandatory. */
+ complain = (clp->have_val != 0) || cli->iopt[optno].imandatory;
+ Clp_SaveParser(clp, &clpsave);
+
+ if (cli->iopt[optno].imandatory && !clp->have_val) {
+ /* Mandatory argument case */
+ /* Allow arguments to options to start with a dash, but only if the
+ argument type allows it by not setting Clp_DisallowOptions */
+ int disallow = (cli->valtype[vtpos].flags & Clp_DisallowOptions) != 0;
+ next_argument(clp, disallow ? 1 : 2);
+ if (!clp->have_val) {
+ int got_option = cli->xtext != 0;
+ Clp_RestoreParser(clp, &clpsave);
+ if (got_option)
+ Clp_OptionError(clp, "%<%O%> requires a non-option argument");
+ else
+ Clp_OptionError(clp, "%<%O%> requires an argument");
+ clp->option = &clp_option_sentinel[-Clp_BadOption];
+ return Clp_BadOption;
+ }
+
+ } else if (cli->is_short && !clp->have_val
+ && cli->xtext[clp_utf8_charlen(cli, cli->xtext)])
+ /* The -[option]argument case:
+ Assume that the rest of the current string is the argument. */
+ next_argument(clp, 1);
+
+ /* Parse the argument */
+ if (clp->have_val) {
+ Clp_ValType *atr = &cli->valtype[vtpos];
+ if (atr->func(clp, clp->vstr, complain, atr->user_data) <= 0) {
+ /* parser failed */
+ clp->have_val = 0;
+ if (cli->iopt[optno].imandatory) {
+ clp->option = &clp_option_sentinel[-Clp_BadOption];
+ return Clp_BadOption;
+ } else
+ Clp_RestoreParser(clp, &clpsave);
+ }
+ }
+
+ clp->option = opt;
+ return opt->option_id;
+}
+
+
+/** @param clp the parser
+ * @param allow_options whether options will be allowed
+ *
+ * Remove and return the next argument from @a clp's argument array. If there
+ * are no arguments left, or if the next argument is an option and @a
+ * allow_options != 0, then returns null.
+ */
+const char *
+Clp_Shift(Clp_Parser *clp, int allow_options)
+ /* Returns the next argument from the argument list without parsing it.
+ If there are no more arguments, returns 0. */
+{
+ Clp_ParserState clpsave;
+ Clp_SaveParser(clp, &clpsave);
+ next_argument(clp, allow_options ? 2 : 1);
+ if (!clp->have_val)
+ Clp_RestoreParser(clp, &clpsave);
+ return clp->vstr;
+}
+
+
+/*******
+ * Clp_OptionError
+ **/
+
+typedef struct Clp_BuildString {
+ char *text;
+ char *pos;
+ int capacity;
+ int bad;
+} Clp_BuildString;
+
+static Clp_BuildString *
+new_build_string(void)
+{
+ Clp_BuildString *bs = (Clp_BuildString *)malloc(sizeof(Clp_BuildString));
+ if (!bs) goto bad;
+ bs->text = (char *)malloc(256);
+ if (!bs->text) goto bad;
+ bs->pos = bs->text;
+ bs->capacity = 256;
+ bs->bad = 0;
+ return bs;
+
+ bad:
+ if (bs) free(bs);
+ return 0;
+}
+
+static void
+free_build_string(Clp_BuildString *bs)
+{
+ if (bs) free(bs->text);
+ free(bs);
+}
+
+static int
+grow_build_string(Clp_BuildString *bs, int want)
+{
+ char *new_text;
+ int ipos = bs->pos - bs->text;
+ int new_capacity = bs->capacity;
+ while (want >= new_capacity)
+ new_capacity *= 2;
+ new_text = (char *)realloc(bs->text, new_capacity);
+ if (!new_text) {
+ bs->bad = 1;
+ return 0;
+ } else {
+ bs->text = new_text;
+ bs->pos = bs->text + ipos;
+ bs->capacity = new_capacity;
+ return 1;
+ }
+}
+
+#define ENSURE_BUILD_STRING(bs, space) \
+ ((((bs)->pos - (bs)->text) + (space) >= (bs)->capacity) \
+ || grow_build_string((bs), ((bs)->pos - (bs)->text) + (space)))
+
+static void
+append_build_string(Clp_BuildString *bs, const char *s, int l)
+{
+ if (l < 0)
+ l = strlen(s);
+ if (ENSURE_BUILD_STRING(bs, l)) {
+ memcpy(bs->pos, s, l);
+ bs->pos += l;
+ }
+}
+
+
+static Clp_BuildString *
+Clp_VaOptionError(Clp_Parser *clp, Clp_BuildString *bs,
+ const char *fmt, va_list val)
+{
+ Clp_Internal *cli = clp->internal;
+ const char *percent;
+ int c;
+
+ if (!bs)
+ bs = new_build_string();
+ if (!bs)
+ return 0;
+ if (cli->program_name && cli->program_name[0]) {
+ append_build_string(bs, cli->program_name, -1);
+ append_build_string(bs, ": ", 2);
+ }
+
+ for (percent = strchr(fmt, '%'); percent; percent = strchr(fmt, '%')) {
+ append_build_string(bs, fmt, percent - fmt);
+ switch (*++percent) {
+
+ case 's': {
+ const char *s = va_arg(val, const char *);
+ if (s)
+ append_build_string(bs, s, -1);
+ else
+ append_build_string(bs, "(null)", 6);
+ break;
+ }
+
+ case 'C': {
+ const char *s = va_arg(val, const char *);
+ if (cli->utf8)
+ c = decode_utf8(s, 0);
+ else
+ c = (unsigned char) *s;
+ goto char_c;
+ }
+
+ case 'c':
+ c = va_arg(val, int);
+ goto char_c;
+
+ char_c:
+ if (ENSURE_BUILD_STRING(bs, 4)) {
+ if (c >= 32 && c <= 126)
+ *bs->pos++ = c;
+ else if (c < 32) {
+ *bs->pos++ = '^';
+ *bs->pos++ = c + 64;
+ } else if (cli->utf8 && c >= 127 && c < 0x110000) {
+ bs->pos = encode_utf8(bs->pos, 4, c);
+ } else if (c >= 127 && c <= 255) {
+ sprintf(bs->pos, "\\%03o", c & 0xFF);
+ bs->pos += 4;
+ } else {
+ *bs->pos++ = '\\';
+ *bs->pos++ = '?';
+ }
+ }
+ break;
+
+ case 'd': {
+ int d = va_arg(val, int);
+ if (ENSURE_BUILD_STRING(bs, 32)) {
+ sprintf(bs->pos, "%d", d);
+ bs->pos = strchr(bs->pos, 0);
+ }
+ break;
+ }
+
+ case 'O': {
+ int optno = cli->current_option;
+ const Clp_Option *opt = &cli->opt[optno];
+ if (optno < 0)
+ append_build_string(bs, "(no current option!)", -1);
+ else if (cli->current_short) {
+ append_build_string(bs, cli->option_chars, -1);
+ if (ENSURE_BUILD_STRING(bs, 5)) {
+ if (cli->utf8)
+ bs->pos = encode_utf8(bs->pos, 5, opt->short_name);
+ else
+ *bs->pos++ = opt->short_name;
+ }
+ } else if (cli->negated_by_no) {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, "no-", 3);
+ append_build_string(bs, opt->long_name + cli->iopt[optno].ilongoff, -1);
+ } else {
+ append_build_string(bs, cli->option_chars, -1);
+ append_build_string(bs, opt->long_name + cli->iopt[optno].ilongoff, -1);
+ }
+ break;
+ }
+
+ case '%':
+ if (ENSURE_BUILD_STRING(bs, 1))
+ *bs->pos++ = '%';
+ break;
+
+ case '`': /* backwards compatibility */
+ case '<':
+ append_build_string(bs, (cli->utf8 ? "\342\200\230" : "'"), -1);
+ break;
+
+ case '\'': /* backwards compatibility */
+ case ',':
+ case '>':
+ append_build_string(bs, (cli->utf8 ? "\342\200\231" : "'"), -1);
+ break;
+
+ default:
+ if (ENSURE_BUILD_STRING(bs, 2)) {
+ *bs->pos++ = '%';
+ *bs->pos++ = *percent;
+ }
+ break;
+
+ }
+ fmt = ++percent;
+ }
+
+ append_build_string(bs, fmt, -1);
+ append_build_string(bs, "\n", 1);
+
+ return bs;
+}
+
+static void
+do_error(Clp_Parser *clp, Clp_BuildString *bs)
+{
+ const char *text;
+ if (bs && !bs->bad) {
+ *bs->pos = 0;
+ text = bs->text;
+ } else
+ text = "out of memory\n";
+
+ if (clp->internal->error_handler != 0)
+ (*clp->internal->error_handler)(clp, text);
+ else
+ fputs(text, stderr);
+}
+
+/** @param clp the parser
+ * @param format error format
+ *
+ * Format an error message from @a format and any additional arguments in the
+ * ellipsis. The resulting error string by printing it to standard error or
+ * passing it to Clp_SetErrorHandler.
+ *
+ * The following format characters are accepted:
+ *
+ * <dl>
+ * <dt><tt>%</tt><tt>c</tt></dt>
+ * <dd>A character (type <tt>int</tt>). Control characters are printed in
+ * caret notation. If the parser is in UTF-8 mode, the character is formatted
+ * in UTF-8. Otherwise, special characters are printed with backslashes and
+ * octal notation.</dd>
+ * <dt><tt>%</tt><tt>s</tt></dt>
+ * <dd>A string (type <tt>const char *</tt>).</dd>
+ * <dt><tt>%</tt><tt>C</tt></dt>
+ * <dd>The argument is a string (type <tt>const char *</tt>). The first
+ * character in this string is printed. If the parser is in UTF-8 mode, this
+ * may involve multiple bytes.</dd>
+ * <dt><tt>%</tt><tt>d</tt></dt>
+ * <dd>An integer (type <tt>int</tt>). Printed in decimal.</dd>
+ * <dt><tt>%</tt><tt>O</tt></dt>
+ * <dd>The current option. No values are read from the argument list; the
+ * current option is defined in the Clp_Parser object itself.</dd>
+ * <dt><tt>%%</tt></dt>
+ * <dd>Prints a percent character.</dd>
+ * <dt><tt>%</tt><tt>&lt;</tt></dt>
+ * <dd>Prints an open quote string. In UTF-8 mode, prints a left single
+ * quote. Otherwise prints a single quote.</dd>
+ * <dt><tt>%</tt><tt>&gt;</tt></dt>
+ * <dd>Prints a closing quote string. In UTF-8 mode, prints a right single
+ * quote. Otherwise prints a single quote.</dd>
+ * <dt><tt>%</tt><tt>,</tt></dt>
+ * <dd>Prints an apostrophe. In UTF-8 mode, prints a right single quote.
+ * Otherwise prints a single quote.</dd>
+ * </dl>
+ *
+ * Note that no flag characters, precision, or field width characters are
+ * currently supported.
+ *
+ * @sa Clp_SetErrorHandler
+ */
+int
+Clp_OptionError(Clp_Parser *clp, const char *format, ...)
+{
+ Clp_BuildString *bs;
+ va_list val;
+ va_start(val, format);
+ bs = Clp_VaOptionError(clp, 0, format, val);
+ va_end(val);
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+ambiguity_error(Clp_Parser *clp, int ambiguous, int *ambiguous_values,
+ const Clp_Option *opt, const Clp_InternOption *iopt,
+ const char *prefix, const char *fmt, ...)
+{
+ Clp_Internal *cli = clp->internal;
+ Clp_BuildString *bs;
+ int i;
+ va_list val;
+ va_start(val, fmt);
+ bs = Clp_VaOptionError(clp, 0, fmt, val);
+ if (!bs) goto done;
+
+ if (clp->internal->program_name && clp->internal->program_name[0]) {
+ append_build_string(bs, clp->internal->program_name, -1);
+ append_build_string(bs, ": ", 2);
+ }
+ append_build_string(bs, "(Possibilities are", -1);
+
+ for (i = 0; i < ambiguous && i < MAX_AMBIGUOUS_VALUES; i++) {
+ int value = ambiguous_values[i];
+ const char *no_dash = "";
+ if (value < 0)
+ value = -(value + 1), no_dash = "no-";
+ if (i == 0)
+ append_build_string(bs, " ", 1);
+ else if (i == ambiguous - 1)
+ append_build_string(bs, (i == 1 ? " and " : ", and "), -1);
+ else
+ append_build_string(bs, ", ", 2);
+ append_build_string(bs, (cli->utf8 ? "\342\200\230" : "'"), -1);
+ append_build_string(bs, prefix, -1);
+ append_build_string(bs, no_dash, -1);
+ append_build_string(bs, opt[value].long_name + iopt[value].ilongoff, -1);
+ append_build_string(bs, (cli->utf8 ? "\342\200\231" : "'"), -1);
+ }
+
+ if (ambiguous > MAX_AMBIGUOUS_VALUES)
+ append_build_string(bs, ", and others", -1);
+ append_build_string(bs, ".)\n", -1);
+ va_end(val);
+
+ done:
+ do_error(clp, bs);
+ free_build_string(bs);
+ return 0;
+}
+
+static int
+copy_string(char *buf, int buflen, int bufpos, const char *what)
+{
+ int l = strlen(what);
+ if (l > buflen - bufpos - 1)
+ l = buflen - bufpos - 1;
+ memcpy(buf + bufpos, what, l);
+ return l;
+}
+
+/** @param clp the parser
+ * @param buf output buffer
+ * @param len length of output buffer
+ * @return number of characters written to the buffer, not including the terminating NUL
+ *
+ * A string that looks like the last option parsed by @a clp is extracted into
+ * @a buf. The correct option characters are put into the string first,
+ * followed by the option text. The output buffer is null-terminated unless
+ * @a len == 0.
+ *
+ * @sa Clp_CurOptionName
+ */
+int
+Clp_CurOptionNameBuf(Clp_Parser *clp, char *buf, int len)
+{
+ Clp_Internal *cli = clp->internal;
+ int optno = cli->current_option;
+ int pos = 0;
+ if (optno < 0)
+ pos += copy_string(buf, len, pos, "(no current option!)");
+ else if (cli->current_short) {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ if (cli->utf8)
+ pos = (encode_utf8(buf + pos, len - pos - 1, cli->opt[optno].short_name) - buf);
+ else if (pos < len - 1)
+ buf[pos++] = cli->opt[optno].short_name;
+ } else if (cli->negated_by_no) {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ pos += copy_string(buf, len, pos, "no-");
+ pos += copy_string(buf, len, pos, cli->opt[optno].long_name + cli->iopt[optno].ilongoff);
+ } else {
+ pos += copy_string(buf, len, pos, cli->option_chars);
+ pos += copy_string(buf, len, pos, cli->opt[optno].long_name + cli->iopt[optno].ilongoff);
+ }
+ if (pos < len)
+ buf[pos] = 0;
+ return pos;
+}
+
+/** @param clp the parser
+ * @return string describing the current option
+ *
+ * This function acts like Clp_CurOptionNameBuf(), but returns a pointer into
+ * a static buffer that will be rewritten on the next call to
+ * Clp_CurOptionName().
+ *
+ * @note This function is not thread safe.
+ *
+ * @sa Clp_CurOptionName
+ */
+const char *
+Clp_CurOptionName(Clp_Parser *clp)
+{
+ static char buf[256];
+ Clp_CurOptionNameBuf(clp, buf, 256);
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc
new file mode 100644
index 00000000000..2c41f3f2e79
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/error.cc
@@ -0,0 +1,1185 @@
+// -*- related-file-name: "../include/lcdf/error.hh" -*-
+/*
+ * error.{cc,hh} -- flexible classes for error reporting
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2019 Eddie Kohler
+ * Copyright (c) 2008 Meraki, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/hashmap.hh>
+#include <errno.h>
+#include <ctype.h>
+#include <algorithm>
+#ifndef __KERNEL__
+# include <stdlib.h>
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+#endif
+
+/** @file error.hh
+ * @brief Flexible error handling classes.
+ */
+
+struct ErrorHandler::Conversion {
+ String name;
+ ConversionFunction hook;
+ Conversion *next;
+};
+static ErrorHandler::Conversion *error_items;
+
+const char ErrorHandler::e_abort[] = "<-999>";
+const char ErrorHandler::e_fatal[] = "<-1>";
+const char ErrorHandler::e_emergency[] = "<0>";
+const char ErrorHandler::e_alert[] = "<1>";
+const char ErrorHandler::e_critical[] = "<2>";
+const char ErrorHandler::e_error[] = "<3>";
+const char ErrorHandler::e_warning[] = "<4>";
+const char ErrorHandler::e_warning_annotated[] = "<4>warning: ";
+const char ErrorHandler::e_notice[] = "<5>";
+const char ErrorHandler::e_info[] = "<6>";
+const char ErrorHandler::e_debug[] = "<7>";
+
+const int ErrorHandler::ok_result = 0;
+const int ErrorHandler::error_result = -EINVAL;
+
+ErrorHandler *ErrorHandler::the_default_handler = 0;
+ErrorHandler *ErrorHandler::the_silent_handler = 0;
+
+
+// ANNOTATION MANAGEMENT
+
+static const char *
+parse_level(const char *begin, const char *end, int *result)
+{
+ int x = 0;
+ const char *s = begin;
+
+ bool negative = false;
+ if (s != end && *s == '-') {
+ negative = true;
+ ++s;
+ } else if (s != end && *s == '+')
+ ++s;
+
+ const char *digits = s;
+ for (; s != end && *s >= '0' && *s <= '9'; ++s)
+ x = x * 10 + *s - '0';
+
+ if (s != end && *s == '.')
+ for (++s; s != end && *s >= '0' && *s <= '9'; ++s)
+ /* nada */;
+
+ if (s == digits || (s == digits + 1 && s[-1] == '.'))
+ return begin;
+ if (result)
+ *result = (negative ? -x : x);
+ return s;
+}
+
+String
+ErrorHandler::make_anno(const char *name, const String &value)
+{
+ StringAccum sa;
+ sa.reserve(value.length() + 10);
+
+ // level annotation requires special handling
+ if (name[0] == '<' && name[1] == '>' && name[2] == 0) {
+ if (parse_level(value.begin(), value.end(), 0) == value.end()) {
+ sa << '<' << value << '>';
+ return sa.take_string();
+ } else
+ return String();
+ }
+
+ sa << '{' << name << ':';
+ const char *last = value.begin(), *end = value.end();
+ for (const char *s = value.begin(); s != end; ++s)
+ if (*s == '\\' || *s == '}') {
+ sa.append(last, s);
+ sa << '\\' << *s;
+ last = s + 1;
+ } else if (*s == '\n') {
+ sa.append(last, s);
+ sa << '\\' << 'n';
+ last = s + 1;
+ }
+ sa.append(last, end);
+ sa << '}';
+ return sa.take_string();
+}
+
+const char *
+ErrorHandler::skip_anno(const String &str, const char *begin, const char *end,
+ String *name_result, String *value_result, bool raw)
+{
+ String name, value;
+ const char *s = begin;
+
+ if (s + 3 <= end && *s == '<') {
+ const char *x = parse_level(s + 1, end, 0);
+ if (x != s + 1 && x != end && *x == '>') {
+ name = String::make_stable("<>", 2);
+ if (str)
+ value = str.substring(begin + 1, x);
+ begin = x + 1;
+ }
+
+ } else if (s + 2 <= end && *s == '{' && s[1] == '}')
+ begin = s + 2;
+
+ else if (s + 3 <= end && *s == '{' && str) {
+ for (++s; s != end && isalnum((unsigned char) *s); ++s)
+ /* nada */;
+ if (s == end || s == begin + 1 || (*s != '}' && *s != ':'))
+ /* not an annotation */;
+ else if (*s == '}' && str) {
+ name = str.substring(begin + 1, s);
+ begin = s + 1;
+ } else if (*s == '}') {
+ name = String::make_stable("{}", 2);
+ begin = s + 1;
+ } else if (str) {
+ const char *x, *last = s + 1;
+ StringAccum sa;
+ for (x = s + 1; x != end && *x != '\n' && *x != '}'; ++x)
+ if (*x == '\\' && x + 1 != end && x[1] != '\n') {
+ if (!raw) {
+ sa.append(last, x);
+ sa << (x[1] == 'n' ? '\n' : x[1]);
+ last = x + 2;
+ }
+ ++x;
+ }
+ if (x != end && *x == '}') {
+ name = str.substring(begin + 1, s);
+ if (sa) {
+ sa.append(last, x);
+ value = sa.take_string();
+ } else
+ value = str.substring(s + 1, x);
+ begin = x + 1;
+ }
+ } else {
+ const char *x;
+ for (x = s + 1; x != end && *x != '\n' && *x != '}'; ++x)
+ if (*x == '\\' && x + 1 != end && x[1] != '\n')
+ ++x;
+ if (x != end && *x == '}') {
+ name = String::make_stable("{}", 2);
+ begin = x + 1;
+ }
+ }
+ }
+
+ if (name_result)
+ *name_result = name;
+ if (value_result)
+ *value_result = value;
+ return begin;
+}
+
+const char *
+ErrorHandler::parse_anno(const String &str, const char *begin, const char *end,
+ ...)
+{
+ const char *names[8];
+ void *values[8];
+ int nanno = 0;
+
+ va_list val;
+ va_start(val, end);
+ while (const char *n = va_arg(val, const char *)) {
+ assert(nanno < 8);
+ names[nanno] = n;
+ if (n[0] == '#')
+ values[nanno] = va_arg(val, int *);
+ else
+ values[nanno] = va_arg(val, String *);
+ ++nanno;
+ }
+
+ String name, value;
+ while (1) {
+ begin = skip_anno(str, begin, end, &name, &value, false);
+ if (!name)
+ break;
+ for (int i = 0; i < nanno; ++i)
+ if (names[i][0] == '#') {
+ if (name == (names[i] + 1))
+ parse_level(value.begin(), value.end(), (int *) values[i]);
+ } else {
+ if (name == names[i])
+ *(String *) values[i] = value;
+ }
+ }
+
+ return begin;
+}
+
+String
+ErrorHandler::combine_anno(const String &text, const String &anno)
+{
+ if (!anno)
+ return text;
+
+ String names[8], values[8];
+ int nanno = 0;
+ const char *abegin = anno.begin();
+ while (abegin != anno.end()) {
+ assert(nanno < 8);
+ abegin = skip_anno(anno, abegin, anno.end(), &names[nanno], &values[nanno], true);
+ if (names[nanno])
+ ++nanno;
+ else
+ break;
+ }
+
+ const char *last = text.begin(), *s = last;
+ String name;
+ StringAccum sa;
+ while (s != text.end()) {
+ const char *line = s;
+ uint32_t mask = (1U << nanno) - 1;
+ while (1) {
+ s = skip_anno(text, s, text.end(), &name, 0, false);
+ if (!name)
+ break;
+ for (int i = 0; i < nanno; ++i)
+ if (name == names[i])
+ mask &= ~(1U << i);
+ }
+
+ if (mask) {
+ sa.append(last, line);
+ for (int i = 0; i < nanno; ++i)
+ if (mask & (1U << i)) {
+ if (names[i].equals("<>", 2))
+ sa << '<' << values[i] << '>';
+ else
+ sa << '{' << names[i] << ':' << values[i] << '}';
+ }
+ last = line;
+ }
+ if (abegin != anno.end()) {
+ sa.append(last, s);
+ sa.append(abegin, anno.end());
+ last = s;
+ }
+
+ while (s != text.end() && *s != '\n')
+ ++s;
+ if (s != text.end())
+ ++s;
+ }
+
+ if (sa) {
+ sa.append(last, text.end());
+ return sa.take_string();
+ } else
+ return text;
+}
+
+String
+ErrorHandler::clean_landmark(const String &landmark, bool with_colon)
+{
+ const char *end = landmark.end();
+ while (end != landmark.begin() && isspace((unsigned char) end[-1]))
+ --end;
+ if (end != landmark.begin() && end[-1] == ':')
+ --end;
+ if (end == landmark.begin())
+ return String();
+ else if (with_colon)
+ return landmark.substring(landmark.begin(), end) + ": ";
+ else
+ return landmark.substring(landmark.begin(), end);
+}
+
+
+// FORMATTING
+
+#define NUMBUF_SIZE 128
+#define ErrH ErrorHandler
+
+#if SIZEOF_UNSIGNED_LONG >= SIZEOF_VOID_P
+typedef unsigned long do_number_t;
+#else
+typedef uintptr_t do_number_t;
+#endif
+
+static char*
+do_number(do_number_t num, char *after_last, int base, int flags)
+{
+ const char *digits =
+ ((flags & ErrH::cf_uppercase) ? "0123456789ABCDEF" : "0123456789abcdef");
+ char *pos = after_last;
+ while (num) {
+ *--pos = digits[num % base];
+ num /= base;
+ }
+ if (pos == after_last)
+ *--pos = '0';
+ return pos;
+}
+
+static char *
+do_number_flags(char *pos, char *after_last, int base, int flags,
+ int precision, int field_width)
+{
+ // remove cf_alternate_form for zero results in base 16
+ if ((flags & ErrH::cf_alternate_form) && base == 16 && *pos == '0')
+ flags &= ~ErrH::cf_alternate_form;
+
+ // account for zero padding
+ if (precision >= 0)
+ while (after_last - pos < precision)
+ *--pos = '0';
+ else if (flags & ErrH::cf_zero_pad) {
+ if ((flags & ErrH::cf_alternate_form) && base == 16)
+ field_width -= 2;
+ if ((flags & ErrH::cf_negative)
+ || (flags & (ErrH::cf_plus_positive | ErrH::cf_space_positive)))
+ field_width--;
+ while (after_last - pos < field_width)
+ *--pos = '0';
+ }
+
+ // alternate forms
+ if ((flags & ErrH::cf_alternate_form) && base == 8 && pos[1] != '0')
+ *--pos = '0';
+ else if ((flags & ErrH::cf_alternate_form) && base == 16) {
+ *--pos = ((flags & ErrH::cf_uppercase) ? 'X' : 'x');
+ *--pos = '0';
+ }
+
+ // sign
+ if (flags & ErrH::cf_negative)
+ *--pos = '-';
+ else if (flags & ErrH::cf_plus_positive)
+ *--pos = '+';
+ else if (flags & ErrH::cf_space_positive)
+ *--pos = ' ';
+
+ return pos;
+}
+
+String
+ErrorHandler::vxformat(int default_flags, const char *s, va_list val)
+{
+ StringAccum msg;
+
+ char numbuf[NUMBUF_SIZE]; // for numerics
+ numbuf[NUMBUF_SIZE-1] = 0;
+
+ String strstore; // to ensure temporaries aren't destroyed
+
+ // declare and initialize these here to make gcc shut up about possible
+ // use before initialization
+ int flags = 0;
+ int field_width = -1;
+ int precision = -1;
+ int width_flag = 0;
+ int base = 10;
+ while (1) {
+
+ const char *pct = strchr(s, '%');
+ if (!pct) {
+ if (*s)
+ msg << s;
+ break;
+ }
+ if (pct != s) {
+ msg.append(s, pct - s);
+ s = pct;
+ }
+
+ // parse flags
+ flags = default_flags;
+ flags:
+ switch (*++s) {
+ case '#': flags |= cf_alternate_form; goto flags;
+ case '0': flags |= cf_zero_pad; goto flags;
+ case '-': flags |= cf_left_just; goto flags;
+ case ' ': flags |= cf_space_positive; goto flags;
+ case '+': flags |= cf_plus_positive; goto flags;
+ case '\'': flags |= cf_singlequote; goto flags;
+ case '_': flags &= ~cf_utf8; goto flags;
+ }
+
+ // parse field width
+ field_width = -1;
+ if (*s == '*') {
+ field_width = va_arg(val, int);
+ if (field_width < 0) {
+ field_width = -field_width;
+ flags |= cf_left_just;
+ }
+ s++;
+ } else if (*s >= '0' && *s <= '9')
+ for (field_width = 0; *s >= '0' && *s <= '9'; s++)
+ field_width = 10*field_width + *s - '0';
+
+ // parse precision
+ precision = -1;
+ if (*s == '.') {
+ s++;
+ precision = 0;
+ if (*s == '*') {
+ precision = va_arg(val, int);
+ s++;
+ } else if (*s >= '0' && *s <= '9')
+ for (; *s >= '0' && *s <= '9'; s++)
+ precision = 10*precision + *s - '0';
+ }
+
+ // parse width flags
+ width_flag = 0;
+ width_flags:
+ switch (*s) {
+ case 'h': case 'l':
+ if (width_flag == *s)
+ width_flag = *s + 'A' - 'a';
+ else if (width_flag)
+ break;
+ else
+ width_flag = *s;
+ s++;
+ goto width_flags;
+ case 'z':
+ case 't':
+ if (width_flag)
+ break;
+ width_flag = *s++;
+ break;
+ case '^':
+ if (!isdigit((unsigned char) s[1]) || width_flag)
+ break;
+ for (s++; isdigit((unsigned char) *s); s++)
+ width_flag = width_flag * 10 + *s - '0';
+ width_flag = -width_flag;
+ break;
+ }
+
+ // conversion character
+ // after switch, data lies between `s1' and `s2'
+ const char *s1 = 0, *s2 = 0;
+ base = 10;
+ switch (*s++) {
+
+ case 's': {
+ s1 = va_arg(val, const char *);
+ if (!s1)
+ s1 = "(null)";
+
+ // fetch length
+ int len;
+ if (precision < 0)
+ len = strlen(s1);
+ else
+ len = strnlen(s1, precision);
+
+ // transform string if alternate form
+ if (flags & cf_alternate_form) {
+ strstore = String(s1, len).printable();
+ if (precision < 0 || strstore.length() < precision)
+ len = strstore.length();
+ }
+
+ // quote characters that look like annotations, readjusting length
+ if (flags & (cf_singlequote | cf_alternate_form)) {
+ if (!(flags & cf_alternate_form))
+ strstore = String(s1, len);
+
+ // check first line, considering trailing part of 'msg'
+ const char *mbegin = msg.end();
+ while (mbegin != msg.begin() && mbegin[-1] != '\n')
+ --mbegin;
+ if (skip_anno(strstore.begin(), strstore.end()) != strstore.begin()
+ && skip_anno(mbegin, msg.end()) == msg.end()) {
+ strstore = String::make_stable("{}", 2) + strstore;
+ len += 2;
+ }
+
+ // check subsequent lines
+ const char *s = std::find(strstore.begin(), strstore.end(), '\n');
+ while (s != strstore.end() && s + 1 != strstore.end()) {
+ size_t nextpos = (s + 1) - strstore.begin();
+ if (skip_anno(s + 1, strstore.end()) != s + 1) {
+ strstore = strstore.substring(strstore.begin(), s + 1)
+ + String::make_stable("{}", 2)
+ + strstore.substring(s + 1, strstore.end());
+ len += 2;
+ }
+ s = std::find(strstore.begin() + nextpos, strstore.end(), '\n');
+ }
+ }
+
+ // obtain begin and end pointers
+ if (flags & (cf_singlequote | cf_alternate_form))
+ s1 = strstore.begin();
+ s2 = s1 + len;
+ break;
+ }
+
+ case 'c': {
+ int c = va_arg(val, int);
+ // check for extension of 'signed char' to 'int'
+ if (c < 0)
+ c += 256;
+ // assume ASCII
+ if (c == '\n')
+ strcpy(numbuf, "\\n");
+ else if (c == '\t')
+ strcpy(numbuf, "\\t");
+ else if (c == '\r')
+ strcpy(numbuf, "\\r");
+ else if (c == '\0')
+ strcpy(numbuf, "\\0");
+ else if (c < 0 || c >= 256)
+ strcpy(numbuf, "(bad char)");
+ else if (c < 32 || c >= 0177)
+ sprintf(numbuf, "\\%03o", c);
+ else
+ sprintf(numbuf, "%c", c);
+ s1 = numbuf;
+ s2 = strchr(numbuf, 0);
+ break;
+ }
+
+ case '%': {
+ numbuf[0] = '%';
+ s1 = numbuf;
+ s2 = s1 + 1;
+ break;
+ }
+
+ case '<':
+ s1 = (flags & cf_utf8 ? "\342\200\230" : "\'");
+ s2 = s1 + strlen(s1);
+ break;
+
+ case '>':
+ case ',':
+ s1 = (flags & cf_utf8 ? "\342\200\231" : "\'");
+ s2 = s1 + strlen(s1);
+ break;
+
+ case 'd':
+ case 'i':
+ flags |= cf_signed;
+ /* fallthru */
+ case 'u':
+ number: {
+ // protect numbuf from overflow
+ if (field_width > NUMBUF_SIZE)
+ field_width = NUMBUF_SIZE;
+ if (precision > NUMBUF_SIZE - 4)
+ precision = NUMBUF_SIZE - 4;
+
+ s2 = numbuf + NUMBUF_SIZE;
+
+ do_number_t num;
+ switch (width_flag) {
+ case 'H':
+ case -8:
+ num = (unsigned char) va_arg(val, int);
+ if ((flags & cf_signed) && (signed char) num < 0)
+ num = -(signed char) num, flags |= cf_negative;
+ break;
+ case 'h':
+ case -16:
+ num = (unsigned short) va_arg(val, int);
+ if ((flags & cf_signed) && (short) num < 0)
+ num = -(short) num, flags |= cf_negative;
+ break;
+ case 0:
+ case -32:
+#if SIZEOF_LONG == 4
+ case 'l':
+#endif
+#if SIZEOF_SIZE_T == 4
+ case 'z':
+#endif
+#if SIZEOF_PTRDIFF_T == 4
+ case 't':
+#endif
+ num = va_arg(val, unsigned);
+ if ((flags & cf_signed) && (int) num < 0)
+ num = -(int) num, flags |= cf_negative;
+ break;
+#if HAVE_INT64_TYPES
+# if SIZEOF_LONG == 8
+ case 'l':
+# endif
+# if SIZEOF_LONG_LONG == 8
+ case 'L':
+# endif
+# if SIZEOF_SIZE_T == 8
+ case 'z':
+# endif
+# if SIZEOF_PTRDIFF_T == 8
+ case 't':
+# endif
+ case -64: {
+ uint64_t qnum = va_arg(val, uint64_t);
+ if ((flags & cf_signed) && (int64_t)qnum < 0)
+ qnum = -(int64_t) qnum, flags |= cf_negative;
+ StringAccum sa;
+ sa.append_numeric(static_cast<String::uintmax_t>(qnum), base, (flags & cf_uppercase));
+ s1 = s2 - sa.length();
+ memcpy(const_cast<char*>(s1), sa.data(), s2 - s1);
+ goto got_number;
+ }
+#endif
+ default:
+ goto error;
+ }
+ s1 = do_number(num, (char*) s2, base, flags);
+
+#if HAVE_INT64_TYPES
+ got_number:
+#endif
+ s1 = do_number_flags((char*)s1, (char*) s2, base, flags, precision, field_width);
+ break;
+ }
+
+ case 'o':
+ base = 8;
+ goto number;
+
+ case 'X':
+ flags |= cf_uppercase;
+ /* fallthru */
+ case 'x':
+ base = 16;
+ goto number;
+
+ case 'p': {
+ if (*s == '{') {
+ s1 = s2 = s + 1;
+ while (*s2 && *s2 != '}' && !isspace((unsigned char) *s2))
+ ++s2;
+ if (*s2 == '}')
+ goto braces;
+ }
+ void* v = va_arg(val, void*);
+ s2 = numbuf + NUMBUF_SIZE;
+ s1 = do_number((do_number_t) v, (char*) s2, 16, flags);
+ s1 = do_number_flags((char*) s1, (char*) s2, 16, flags | cf_alternate_form, precision, field_width);
+ break;
+ }
+
+#ifndef __KERNEL__
+ case 'e': case 'f': case 'g':
+ case 'E': case 'F': case 'G': {
+ char format[80], *f = format, new_numbuf[NUMBUF_SIZE];
+ *f++ = '%';
+ if (flags & cf_alternate_form)
+ *f++ = '#';
+ if (precision >= 0)
+ f += sprintf(f, ".%d", precision);
+ *f++ = s[-1];
+ *f++ = 0;
+
+ int len = sprintf(new_numbuf, format, va_arg(val, double));
+
+ s2 = numbuf + NUMBUF_SIZE;
+ s1 = s2 - len;
+ memcpy((char *)s1, new_numbuf, len); // note: no terminating \0
+ s1 = do_number_flags((char *)s1, (char *)s2, 10, flags & ~cf_alternate_form, -1, field_width);
+ break;
+ }
+#endif
+
+ case '{':
+ s1 = s2 = s;
+ while (*s2 && *s2 != '}' && !isspace((unsigned char) *s2))
+ ++s2;
+ if (*s2 != '}')
+ goto error;
+ goto braces;
+
+ braces:
+ s = s2 + 1;
+ for (Conversion *item = error_items; item; item = item->next)
+ if (item->name.equals(s1, s2 - s1)) {
+ strstore = item->hook(flags, VA_LIST_REF(val));
+ s1 = strstore.begin();
+ s2 = strstore.end();
+ goto got_result;
+ }
+ goto error;
+
+ error:
+ default:
+ assert(0 /* Bad % in error */);
+ break;
+
+ }
+
+ // add result of conversion
+ got_result:
+ int slen = s2 - s1;
+ if (slen > field_width)
+ field_width = slen;
+ char *dest = msg.extend(field_width);
+ if (flags & cf_left_just) {
+ memcpy(dest, s1, slen);
+ memset(dest + slen, ' ', field_width - slen);
+ } else {
+ memcpy(dest + field_width - slen, s1, slen);
+ memset(dest, (flags & cf_zero_pad ? '0' : ' '), field_width - slen);
+ }
+ }
+
+ return msg.take_string();
+}
+
+String
+ErrorHandler::xformat(int default_flags, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vxformat(default_flags, fmt, val);
+ va_end(val);
+ return s;
+}
+
+String
+ErrorHandler::xformat(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vxformat(0, fmt, val);
+ va_end(val);
+ return s;
+}
+
+String
+ErrorHandler::format(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String s = vformat(fmt, val);
+ va_end(val);
+ return s;
+}
+
+
+// ERROR MESSAGE SHORTHAND
+
+void
+ErrorHandler::debug(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ xmessage(String::make_stable(e_debug, 3), fmt, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::message(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ xmessage(String::make_stable(e_info, 3), fmt, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::warning(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ int r = xmessage(String::make_stable(e_warning_annotated, 12), fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::error(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ int r = xmessage(String::make_stable(e_error, 3), fmt, val);
+ va_end(val);
+ return r;
+}
+
+void
+ErrorHandler::fatal(const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ (void) xmessage(String::make_stable(e_fatal, 4), fmt, val);
+ va_end(val);
+ abort();
+}
+
+void
+ErrorHandler::ldebug(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ xmessage(String::make_stable(e_debug, 3) + l, fmt, val);
+ va_end(val);
+}
+
+void
+ErrorHandler::lmessage(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ xmessage(String::make_stable(e_info, 3) + l, fmt, val);
+ va_end(val);
+}
+
+int
+ErrorHandler::lwarning(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ int r = xmessage(l + String::make_stable(e_warning_annotated, 12), fmt, val);
+ va_end(val);
+ return r;
+}
+
+int
+ErrorHandler::lerror(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ int r = xmessage(String::make_stable(e_error, 3) + l, fmt, val);
+ va_end(val);
+ return r;
+}
+
+void
+ErrorHandler::lfatal(const String &landmark, const char *fmt, ...)
+{
+ va_list val;
+ va_start(val, fmt);
+ String l = make_landmark_anno(landmark);
+ (void) xmessage(String::make_stable(e_fatal, 4) + l, fmt, val);
+ va_end(val);
+ abort();
+}
+
+int
+ErrorHandler::xmessage(const String &str)
+{
+ String xstr = decorate(str);
+
+ int min_level = 1000, xlevel = 1000;
+ const char *s = xstr.begin(), *end = xstr.end();
+ void *user_data = 0;
+ while (s != end) {
+ const char *l = parse_anno(xstr, s, end, "#<>", &xlevel,
+ (const char *) 0);
+ const char *nl = std::find(l, end, '\n');
+ String line = xstr.substring(s, nl);
+ s = nl + (nl != end);
+ user_data = emit(line, user_data, s != end);
+ min_level = (xlevel < min_level ? xlevel : min_level);
+ }
+
+ account(min_level);
+
+ return (min_level <= el_warning ? error_result : ok_result);
+}
+
+String
+ErrorHandler::vformat(const char *fmt, va_list val)
+{
+ return vxformat(0, fmt, val);
+}
+
+String
+ErrorHandler::decorate(const String &str)
+{
+ return str;
+}
+
+void *
+ErrorHandler::emit(const String &, void *user_data, bool)
+{
+ return user_data;
+}
+
+void
+ErrorHandler::account(int level)
+{
+ if (level <= el_error)
+ ++_nerrors;
+#ifndef __KERNEL__
+ if (level <= el_abort)
+ abort();
+ else if (level <= el_fatal)
+ exit(-level);
+#endif
+}
+
+
+#ifndef __KERNEL__
+//
+// FILE ERROR HANDLER
+//
+
+FileErrorHandler::FileErrorHandler(FILE *f, const String &context)
+ : _f(f), _context(context), _default_flags(0)
+{
+# if HAVE_UNISTD_H
+ if (isatty(fileno(_f))) {
+# endif
+ char *s = getenv("LANG");
+ if (s && (strstr(s, "UTF-8") != 0 || strstr(s, "UTF8") != 0
+ || strstr(s, "utf8") != 0))
+ _default_flags |= cf_utf8;
+# if HAVE_UNISTD_H
+ }
+# endif
+}
+
+String
+FileErrorHandler::vformat(const char *fmt, va_list val)
+{
+ return vxformat(_default_flags, fmt, val);
+}
+
+void *
+FileErrorHandler::emit(const String &str, void *, bool)
+{
+ String landmark;
+ const char *s = parse_anno(str, str.begin(), str.end(),
+ "l", &landmark, (const char *) 0);
+ StringAccum sa;
+ sa << _context << clean_landmark(landmark, true)
+ << str.substring(s, str.end()) << '\n';
+ ssize_t result = fwrite(sa.begin(), 1, sa.length(), _f);
+ (void) result;
+ return 0;
+}
+
+#endif
+
+
+//
+// STATIC ERROR HANDLERS
+//
+
+ErrorHandler::Conversion *
+ErrorHandler::add_conversion(const String &name, ConversionFunction function)
+{
+ if (Conversion *c = new Conversion) {
+ c->name = name;
+ c->hook = function;
+ c->next = error_items;
+ error_items = c;
+ return c;
+ } else
+ return 0;
+}
+
+int
+ErrorHandler::remove_conversion(ErrorHandler::Conversion *conv)
+{
+ Conversion **pprev = &error_items;
+ for (Conversion *c = error_items; c; pprev = &c->next, c = *pprev)
+ if (c == conv) {
+ *pprev = c->next;
+ delete c;
+ return 0;
+ }
+ return -1;
+}
+
+ErrorHandler *
+ErrorHandler::static_initialize(ErrorHandler *default_handler)
+{
+ if (!the_silent_handler) {
+ the_default_handler = default_handler;
+ the_silent_handler = new SilentErrorHandler;
+ }
+ return default_handler;
+}
+
+void
+ErrorHandler::static_cleanup()
+{
+ delete the_default_handler;
+ delete the_silent_handler;
+ the_default_handler = the_silent_handler = 0;
+ while (error_items) {
+ Conversion *next = error_items->next;
+ delete error_items;
+ error_items = next;
+ }
+}
+
+void
+ErrorHandler::set_default_handler(ErrorHandler *errh)
+{
+ the_default_handler = errh;
+}
+
+
+//
+// ERROR VENEER
+//
+
+String
+ErrorVeneer::vformat(const char *fmt, va_list val)
+{
+ if (_errh)
+ return _errh->vformat(fmt, val);
+ else
+ return ErrorHandler::vformat(fmt, val);
+}
+
+String
+ErrorVeneer::decorate(const String &str)
+{
+ if (_errh)
+ return _errh->decorate(str);
+ else
+ return ErrorHandler::decorate(str);
+}
+
+void *
+ErrorVeneer::emit(const String &str, void *user_data, bool more)
+{
+ if (_errh)
+ return _errh->emit(str, user_data, more);
+ else
+ return ErrorHandler::emit(str, user_data, more);
+}
+
+void
+ErrorVeneer::account(int level)
+{
+ ErrorHandler::account(level);
+ if (_errh)
+ _errh->account(level);
+}
+
+
+//
+// CONTEXT ERROR HANDLER
+//
+
+ContextErrorHandler::ContextErrorHandler(ErrorHandler *errh, const char *fmt,
+ ...)
+ : ErrorVeneer(errh), _indent(String::make_stable(" ", 2)),
+ _context_landmark("{l:}"), _context_printed(false)
+{
+ va_list val;
+ va_start(val, fmt);
+ _context = ErrorVeneer::vformat(fmt, val);
+ va_end(val);
+ if (_context)
+ _context = combine_anno(_context, String::make_stable("{context:context}", 17));
+}
+
+String
+ContextErrorHandler::decorate(const String &str)
+{
+ String context_anno;
+ const char *str_endanno = parse_anno(str, str.begin(), str.end(),
+ "context", &context_anno,
+ (const char *) 0);
+ if (context_anno.equals("no", 2))
+ return ErrorVeneer::decorate(str);
+
+ String istr;
+ if (context_anno.equals("noindent", 8))
+ istr = combine_anno(str, _context_landmark);
+ else
+ istr = combine_anno(str, _context_landmark + _indent);
+
+ if (!_context_printed && !context_anno.equals("nocontext", 9)) {
+ String astr = combine_anno(combine_anno(_context, _context_landmark),
+ str.substring(str.begin(), str_endanno));
+ if (astr && astr.back() != '\n')
+ astr += '\n';
+ _context_printed = true;
+ return ErrorVeneer::decorate(astr + istr);
+ } else
+ return ErrorVeneer::decorate(istr);
+}
+
+
+//
+// PREFIX ERROR HANDLER
+//
+
+PrefixErrorHandler::PrefixErrorHandler(ErrorHandler *errh,
+ const String &prefix)
+ : ErrorVeneer(errh), _prefix(prefix)
+{
+}
+
+String
+PrefixErrorHandler::decorate(const String &str)
+{
+ return ErrorVeneer::decorate(combine_anno(str, _prefix));
+}
+
+
+//
+// LANDMARK ERROR HANDLER
+//
+
+LandmarkErrorHandler::LandmarkErrorHandler(ErrorHandler *errh, const String &landmark)
+ : ErrorVeneer(errh), _landmark(make_landmark_anno(landmark))
+{
+}
+
+String
+LandmarkErrorHandler::decorate(const String &str)
+{
+ return ErrorVeneer::decorate(combine_anno(str, _landmark));
+}
+
+
+//
+// BAIL ERROR HANDLER
+//
+
+#ifndef __KERNEL__
+
+BailErrorHandler::BailErrorHandler(ErrorHandler *errh, int l)
+ : ErrorVeneer(errh), _level(l)
+{
+}
+
+void
+BailErrorHandler::account(int level)
+{
+ ErrorVeneer::account(level);
+ if (level <= _level)
+ exit(1);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc
new file mode 100644
index 00000000000..fe9fb757406
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/filename.cc
@@ -0,0 +1,130 @@
+// -*- related-file-name: "../include/lcdf/filename.hh" -*-
+
+/* filename.{cc,hh} -- filenames
+ *
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/filename.hh>
+#include <lcdf/landmark.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifndef PATHNAME_SEPARATOR
+# define PATHNAME_SEPARATOR '/'
+#endif
+#ifndef CURRENT_DIRECTORY
+# define CURRENT_DIRECTORY "./"
+#endif
+
+
+Filename::Filename(const String &fn)
+ : _path(fn), _actual(0)
+{
+ if (!fn)
+ return;
+
+ int last_slash = fn.find_right(PATHNAME_SEPARATOR);
+ if (last_slash >= 0) {
+ _dir = _path.substring(0, last_slash + 1);
+ _name = _path.substring(last_slash + 1);
+ } else {
+ _dir = CURRENT_DIRECTORY;
+ _name = fn;
+ }
+
+ assert(_dir.back() == PATHNAME_SEPARATOR);
+}
+
+Filename::Filename(const String &dir, const String &name)
+ : _name(name), _actual(0)
+{
+ if (!name)
+ return;
+
+ if (_name[0] == PATHNAME_SEPARATOR)
+ _dir = "";
+ else if (dir) {
+ _dir = dir;
+ if (dir.back() != PATHNAME_SEPARATOR)
+ _dir += PATHNAME_SEPARATOR;
+ } else
+ _dir = CURRENT_DIRECTORY;
+
+ int slash = name.find_right(PATHNAME_SEPARATOR);
+ if (slash >= 0) {
+ _dir += name.substring(0, slash + 1);
+ _name = name.substring(slash + 1);
+ }
+
+ _path = _dir + _name;
+}
+
+Filename::Filename(FILE *actual, const String &name)
+ : _name(name), _path(name), _actual(actual)
+{
+}
+
+
+String
+Filename::extension() const
+{
+ int dot = _name.find_right('.');
+ while (dot > 0 && _name[dot - 1] == '.')
+ dot--;
+ if (dot > 0)
+ return _name.substring(dot + 1);
+ else
+ return String();
+}
+
+String
+Filename::base() const
+{
+ if (String ex = extension())
+ return _name.substring(0, _name.length() - ex.length() - 1);
+ else
+ return _name;
+}
+
+
+FILE *
+Filename::open_read(bool binary) const
+{
+ if (_actual || !_path)
+ return _actual;
+ else
+ return fopen(_path.c_str(), binary ? "rb" : "r");
+}
+
+bool
+Filename::readable() const
+{
+ struct stat s;
+ if (!_path)
+ return false;
+ return _actual || (_path && (stat(_path.c_str(), &s) >= 0));
+}
+
+
+FILE *
+Filename::open_write(bool binary) const
+{
+ if (_actual || !_path)
+ return _actual;
+ else
+ return fopen(_path.c_str(), "wb");
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/fixlibc.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/fixlibc.c
new file mode 100644
index 00000000000..d41238daf85
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/fixlibc.c
@@ -0,0 +1,73 @@
+/* Provide definitions for missing or incorrect libc functions. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !HAVE_STRDUP
+char *
+strdup(const char *s)
+{
+ char *t;
+ int l;
+ if (!s)
+ return 0;
+ l = strlen(s) + 1;
+ t = (char *)malloc(l);
+ if (!t)
+ return 0;
+ memcpy(t, s, l);
+ return t;
+}
+#endif
+
+#if !HAVE_STRERROR
+/* David Mazieres <dm@lcs.mit.edu> assures me that this definition works. */
+char *
+strerror(int errno)
+{
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+ if (errno < 0 || errno >= sys_nerr)
+ return (char *)"bad error number";
+ else
+ return sys_errlist[errno];
+}
+#endif
+
+#if HAVE_BROKEN_STRTOD
+/* On NeXTSTEP, Melissa O'Neill <oneill@cs.sfu.ca> reports that strtod
+ consumes whitespace after its argument, which makes mminstance (among other
+ programs) not work. This wrapper gets rid of that whitespace again.
+ (Originally, we suspected strtol too, but it seems to work, at least in
+ NeXTSTEP 3.3 patch 2.) */
+
+double
+good_strtod(const char *nptr, char **endptr)
+{
+ double d = strtod(nptr, endptr);
+ if (endptr)
+ while (*endptr > nptr && isspace((unsigned char) (*endptr)[-1]))
+ (*endptr)--;
+ return d;
+}
+#endif
+
+#if !HAVE_STRNLEN || HAVE_BROKEN_STRNLEN
+size_t
+strnlen(const char *s, size_t maxlen)
+{
+ const char *p = (const char *) memchr(s, 0, maxlen);
+ return p ? p - s : maxlen;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc
new file mode 100644
index 00000000000..891c9b09955
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/globmatch.cc
@@ -0,0 +1,116 @@
+// -*- related-file-name: "../include/lcdf/globmatch.hh" -*-
+
+/* globmatch.{cc,hh} -- glob_match() function for shell globbing
+ *
+ * Copyright (c) 2000-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/globmatch.hh>
+#include <lcdf/string.hh>
+#include <lcdf/vector.hh>
+
+bool
+glob_match(const String& str, const String& pattern)
+{
+ const char* sdata = str.data();
+ const char* pdata = pattern.data();
+ int slen = str.length();
+ int plen = pattern.length();
+ int spos = 0, ppos = 0;
+ Vector<int> glob_ppos, glob_spos1, glob_spos2;
+
+ while (1) {
+ while (ppos < plen)
+ switch (pdata[ppos]) {
+
+ case '?':
+ if (spos >= slen)
+ goto done;
+ spos++;
+ ppos++;
+ break;
+
+ case '*':
+ glob_ppos.push_back(ppos + 1);
+ glob_spos1.push_back(spos);
+ glob_spos2.push_back(slen);
+ spos = slen;
+ ppos++;
+ break;
+
+ case '[': {
+ if (spos >= slen)
+ goto done;
+
+ // find end of character class
+ int p = ppos + 1;
+ bool negated = false;
+ if (p < plen && pdata[p] == '^') {
+ negated = true;
+ p++;
+ }
+ int first = p;
+ if (p < plen && pdata[p] == ']')
+ p++;
+ while (p < plen && pdata[p] != ']')
+ p++;
+ if (p >= plen) // not a character class at all
+ goto ordinary;
+
+ // parse character class
+ bool in = false;
+ for (int i = first; i < p && !in; i++) {
+ int c1 = pdata[i];
+ int c2 = c1;
+ if (i < p - 2 && pdata[i+1] == '-') {
+ c2 = pdata[i+2];
+ i += 2;
+ }
+ if (sdata[spos] >= c1 && sdata[spos] <= c2)
+ in = true;
+ }
+
+ if ((negated && in) || (!negated && !in))
+ goto done;
+ ppos = p + 1;
+ spos++;
+ break;
+ }
+
+ default:
+ ordinary:
+ if (spos >= slen || sdata[spos] != pdata[ppos])
+ goto done;
+ spos++;
+ ppos++;
+ break;
+
+ }
+
+ done:
+ if (spos == slen && ppos == plen)
+ return true;
+ while (glob_ppos.size() && glob_spos1.back() == glob_spos2.back()) {
+ glob_ppos.pop_back();
+ glob_spos1.pop_back();
+ glob_spos2.pop_back();
+ }
+ if (glob_ppos.size()) {
+ glob_spos2.back()--;
+ spos = glob_spos2.back();
+ ppos = glob_ppos.back();
+ } else
+ return false;
+ }
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc
new file mode 100644
index 00000000000..3d4252e5d19
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/landmark.cc
@@ -0,0 +1,36 @@
+// -*- related-file-name: "../include/lcdf/landmark.hh" -*-
+
+/* landmark.{cc,hh} -- FILE:LINE type landmarks
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/landmark.hh>
+
+Landmark
+operator+(const Landmark &landmark, int offset)
+{
+ if (landmark.has_line())
+ return Landmark(landmark.file(), landmark.line() + offset);
+ else
+ return landmark;
+}
+
+Landmark::operator String() const
+{
+ if (_file && has_line())
+ return _file + ":" + String(_line);
+ else
+ return _file;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/md5.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/md5.c
new file mode 100644
index 00000000000..c8508865c20
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/md5.c
@@ -0,0 +1,357 @@
+/* -*- mode: c; c-basic-offset: 8; related-file-name: "../include/lcdf/md5.h" -*- */
+/* md5.c - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc.
+ *
+ * according to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ *
+ * 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 2, 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, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+/* heavily modified for GnuPG by <werner.koch@guug.de> */
+/* modified again for Sylpheed by <wk@gnupg.org> 2001-02-11 */
+/* modified again for LCDF by Eddie Kohler <kohler@icir.org> */
+
+
+/* Test values:
+ * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E
+ * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61
+ * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72
+ * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <lcdf/inttypes.h>
+#include <lcdf/md5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/****************
+ * Rotate a 32 bit integer by n bits
+ */
+#if defined(__GNUC__) && defined(__i386__)
+static inline uint32_t
+rol( uint32_t x, int n)
+{
+ __asm__("roll %%cl,%0"
+ :"=r" (x)
+ :"0" (x),"c" (n));
+ return x;
+}
+#else
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#endif
+
+
+void
+md5_init(MD5_CONTEXT *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->nblocks = 0;
+ ctx->count = 0;
+ ctx->finalized = 0;
+}
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+
+/****************
+ * transform n*64 bytes
+ */
+static void
+transform(MD5_CONTEXT *ctx, const unsigned char *data)
+{
+ uint32_t correct_words[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+ uint32_t *cwp = correct_words;
+
+#if WORDS_BIGENDIAN
+ {
+ int i;
+ unsigned char *p2, *p1;
+
+ for (i = 0, p1 = data, p2 = (unsigned char*)correct_words;
+ i < 16; i++, p2 += 4) {
+ p2[3] = *p1++;
+ p2[2] = *p1++;
+ p2[1] = *p1++;
+ p2[0] = *p1++;
+ }
+ }
+#elif WORDS_BIGENDIAN_SET
+ memcpy(correct_words, data, 64);
+#else
+# error "WORDS_BIGENDIAN has not been set!"
+#endif
+
+
+#define OP(a, b, c, d, s, T) \
+ do { \
+ a += FF (b, c, d) + (*cwp++) + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Before we start, one word about the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ a = rol(a, s); \
+ a += b; \
+ } while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Put checksum in context given as argument. */
+ ctx->A += A;
+ ctx->B += B;
+ ctx->C += C;
+ ctx->D += D;
+}
+
+
+
+/* The routine updates the message-digest context to
+ * account for the presence of each of the characters inBuf[0..inLen-1]
+ * in the message whose digest is being computed.
+ */
+void
+md5_update(MD5_CONTEXT *hd, const unsigned char *inbuf, size_t inlen)
+{
+ if (hd->count == 64) { /* flush the buffer */
+ transform( hd, hd->buf );
+ hd->count = 0;
+ hd->nblocks++;
+ }
+ if (!inbuf)
+ return;
+ if (hd->count) {
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+ md5_update(hd, NULL, 0);
+ if (!inlen)
+ return;
+ }
+
+ while (inlen >= 64) {
+ transform(hd, inbuf);
+ hd->count = 0;
+ hd->nblocks++;
+ inlen -= 64;
+ inbuf += 64;
+ }
+
+ for (; inlen && hd->count < 64; inlen--)
+ hd->buf[hd->count++] = *inbuf++;
+}
+
+
+
+/* The routine final terminates the message-digest computation and
+ * ends with the desired message digest in mdContext->digest[0...15].
+ * The handle is prepared for a new MD5 cycle.
+ * Returns 16 bytes representing the digest.
+ */
+
+static void
+do_final(MD5_CONTEXT *hd)
+{
+ uint32_t t, msb, lsb;
+ unsigned char *p;
+
+ md5_update(hd, NULL, 0); /* flush */
+
+ msb = 0;
+ t = hd->nblocks;
+ if ((lsb = t << 6) < t) /* multiply by 64 to make a byte count */
+ msb++;
+ msb += t >> 26;
+ t = lsb;
+ if ((lsb = t + hd->count) < t) /* add the count */
+ msb++;
+ t = lsb;
+ if ((lsb = t << 3) < t) /* multiply by 8 to make a bit count */
+ msb++;
+ msb += t >> 29;
+
+ if (hd->count < 56) { /* enough room */
+ hd->buf[hd->count++] = 0x80; /* pad */
+ while(hd->count < 56)
+ hd->buf[hd->count++] = 0; /* pad */
+ } else { /* need one extra block */
+ hd->buf[hd->count++] = 0x80; /* pad character */
+ while (hd->count < 64)
+ hd->buf[hd->count++] = 0;
+ md5_update(hd, NULL, 0); /* flush */
+ memset(hd->buf, 0, 56); /* fill next block with zeroes */
+ }
+
+ /* append the 64 bit count */
+ hd->buf[56] = lsb ;
+ hd->buf[57] = lsb >> 8;
+ hd->buf[58] = lsb >> 16;
+ hd->buf[59] = lsb >> 24;
+ hd->buf[60] = msb ;
+ hd->buf[61] = msb >> 8;
+ hd->buf[62] = msb >> 16;
+ hd->buf[63] = msb >> 24;
+ transform(hd, hd->buf);
+
+ p = hd->buf;
+#if WORDS_BIGENDIAN
+#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \
+ *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
+#elif WORDS_BIGENDIAN_SET
+ /*#define X(a) do { *(uint32_t*)p = hd->##a ; p += 4; } while(0)*/
+ /* Unixware's cpp doesn't like the above construct so we do it his way:
+ * (reported by Allan Clark) */
+#define X(a) do { *(uint32_t*)p = (*hd).a ; p += 4; } while(0)
+#else
+# error "WORDS_BIGENDIAN has not been set!"
+#endif
+ X(A);
+ X(B);
+ X(C);
+ X(D);
+#undef X
+ hd->finalized = 1;
+}
+
+void
+md5_final(unsigned char *digest, MD5_CONTEXT *ctx)
+{
+ if (!ctx->finalized)
+ do_final(ctx);
+ memcpy(digest, ctx->buf, 16);
+}
+
+void
+md5_final_text(char *buf, MD5_CONTEXT *ctx)
+{
+ static const char *chars = "abcdefghijklmnopqrstuvwxyz234567";
+ int bit;
+ if (!ctx->finalized)
+ do_final(ctx);
+ for (bit = 0; bit < 16*8; bit += 5) {
+ int first_char = bit / 8;
+ int val = ctx->buf[first_char] >> (bit % 8);
+ if (bit + 8 > (first_char + 1) * 8 && first_char < 15)
+ val += ctx->buf[first_char + 1] << (8 - (bit % 8));
+ *buf++ = chars[val & 0x1F];
+ }
+ *buf++ = 0;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc
new file mode 100644
index 00000000000..55d4b30fd0e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/permstr.cc
@@ -0,0 +1,319 @@
+// -*- related-file-name: "../include/lcdf/permstr.hh" -*-
+
+/* permstr.{cc,hh} -- permanent strings
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/permstr.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static PermString::Initializer initializer;
+
+PermString::Doodad PermString::zero_char_doodad = {
+ 0, 0, { 0, 0 }
+};
+PermString::Doodad PermString::one_char_doodad[256];
+PermString::Doodad* PermString::buckets[NHASH];
+
+PermString::Initializer::Initializer()
+{
+ static int initialized = 0;
+ if (!initialized) {
+ PermString::static_initialize();
+ initialized = 1;
+ }
+}
+
+void
+PermString::static_initialize()
+{
+ for (int i = 0; i < 256; i++) {
+ one_char_doodad[i].next = 0;
+ one_char_doodad[i].length = 1;
+ one_char_doodad[i].data[0] = i;
+ one_char_doodad[i].data[1] = 0;
+ }
+}
+
+
+// This scatter array, and the ideas behind it, are stolen from lcc.
+static int scatter[] = { /* map characters to random values */
+ 2078917053, 143302914, 1027100827, 1953210302, 755253631,
+ 2002600785, 1405390230, 45248011, 1099951567, 433832350,
+ 2018585307, 438263339, 813528929, 1703199216, 618906479,
+ 573714703, 766270699, 275680090, 1510320440, 1583583926,
+ 1723401032, 1965443329, 1098183682, 1636505764, 980071615,
+ 1011597961, 643279273, 1315461275, 157584038, 1069844923,
+ 471560540, 89017443, 1213147837, 1498661368, 2042227746,
+ 1968401469, 1353778505, 1300134328, 2013649480, 306246424,
+ 1733966678, 1884751139, 744509763, 400011959, 1440466707,
+ 1363416242, 973726663, 59253759, 1639096332, 336563455,
+ 1642837685, 1215013716, 154523136, 593537720, 704035832,
+ 1134594751, 1605135681, 1347315106, 302572379, 1762719719,
+ 269676381, 774132919, 1851737163, 1482824219, 125310639,
+ 1746481261, 1303742040, 1479089144, 899131941, 1169907872,
+ 1785335569, 485614972, 907175364, 382361684, 885626931,
+ 200158423, 1745777927, 1859353594, 259412182, 1237390611,
+ 48433401, 1902249868, 304920680, 202956538, 348303940,
+ 1008956512, 1337551289, 1953439621, 208787970, 1640123668,
+ 1568675693, 478464352, 266772940, 1272929208, 1961288571,
+ 392083579, 871926821, 1117546963, 1871172724, 1771058762,
+ 139971187, 1509024645, 109190086, 1047146551, 1891386329,
+ 994817018, 1247304975, 1489680608, 706686964, 1506717157,
+ 579587572, 755120366, 1261483377, 884508252, 958076904,
+ 1609787317, 1893464764, 148144545, 1415743291, 2102252735,
+ 1788268214, 836935336, 433233439, 2055041154, 2109864544,
+ 247038362, 299641085, 834307717, 1364585325, 23330161,
+ 457882831, 1504556512, 1532354806, 567072918, 404219416,
+ 1276257488, 1561889936, 1651524391, 618454448, 121093252,
+ 1010757900, 1198042020, 876213618, 124757630, 2082550272,
+ 1834290522, 1734544947, 1828531389, 1982435068, 1002804590,
+ 1783300476, 1623219634, 1839739926, 69050267, 1530777140,
+ 1802120822, 316088629, 1830418225, 488944891, 1680673954,
+ 1853748387, 946827723, 1037746818, 1238619545, 1513900641,
+ 1441966234, 367393385, 928306929, 946006977, 985847834,
+ 1049400181, 1956764878, 36406206, 1925613800, 2081522508,
+ 2118956479, 1612420674, 1668583807, 1800004220, 1447372094,
+ 523904750, 1435821048, 923108080, 216161028, 1504871315,
+ 306401572, 2018281851, 1820959944, 2136819798, 359743094,
+ 1354150250, 1843084537, 1306570817, 244413420, 934220434,
+ 672987810, 1686379655, 1301613820, 1601294739, 484902984,
+ 139978006, 503211273, 294184214, 176384212, 281341425,
+ 228223074, 147857043, 1893762099, 1896806882, 1947861263,
+ 1193650546, 273227984, 1236198663, 2116758626, 489389012,
+ 593586330, 275676551, 360187215, 267062626, 265012701,
+ 719930310, 1621212876, 2108097238, 2026501127, 1865626297,
+ 894834024, 552005290, 1404522304, 48964196, 5816381,
+ 1889425288, 188942202, 509027654, 36125855, 365326415,
+ 790369079, 264348929, 513183458, 536647531, 13672163,
+ 313561074, 1730298077, 286900147, 1549759737, 1699573055,
+ 776289160, 2143346068, 1975249606, 1136476375, 262925046,
+ 92778659, 1856406685, 1884137923, 53392249, 1735424165,
+ 1602280572
+};
+
+
+void
+PermString::initialize(const char* s, int length)
+{
+ const unsigned char* m = reinterpret_cast<const unsigned char*>(s);
+ const unsigned char* mm;
+
+ if (length < 0)
+ length = (s ? strlen(s) : 0);
+
+ if (length == 0) {
+ _rep = zero_char_doodad.data;
+ return;
+ } else if (length == 1) {
+ _rep = one_char_doodad[m[0]].data;
+ return;
+ }
+
+ unsigned hash;
+ int l;
+ for (hash = 0, l = length, mm = m; l; mm++, l--)
+ hash = (hash << 1) + scatter[*mm];
+ hash &= (NHASH - 1);
+
+ Doodad *buck;
+ for (buck = buckets[hash]; buck; buck = buck->next)
+ if (length == buck->length && memcmp(s, buck->data, length) == 0) {
+ _rep = buck->data;
+ return;
+ }
+
+ // CANNOT USE new because the structure has variable size.
+ buck = (Doodad *)malloc(sizeof(Doodad) + length - 1);
+ buck->next = buckets[hash];
+ buckets[hash] = buck;
+ buck->length = length;
+ memcpy(buck->data, s, length);
+ buck->data[length] = 0;
+
+ _rep = buck->data;
+}
+
+static int pspos;
+static int pscap = 64;
+static char *psc = (char *)malloc(pscap);
+
+static void
+append(const char *s, int len)
+{
+ if (pspos + len >= pscap) {
+ pscap *= 2;
+ psc = (char *)realloc(psc, pscap);
+ }
+ memcpy(psc + pspos, s, len);
+ pspos += len;
+}
+
+inline static void
+extend(int len)
+{
+ while (pspos + len >= pscap) {
+ pscap *= 2;
+ psc = (char *)realloc(psc, pscap);
+ }
+}
+
+PermString
+vpermprintf(const char *s, va_list val)
+{
+ pspos = 0;
+ while (1) {
+
+ const char *pct = strchr(s, '%');
+ if (!pct) {
+ if (*s)
+ append(s, strlen(s));
+ break;
+ }
+ if (pct != s) {
+ append(s, pct - s);
+ s = pct;
+ }
+
+ int iflag = -1;
+ while (1)
+ switch (*++s) {
+
+ case '0':
+ /* zeroflag = 1; */
+ break;
+
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ assert(iflag == -1 /* Too many decimal flags in permprintf */);
+ iflag = 0;
+ while (*s >= '0' && *s <= '9') {
+ iflag = iflag * 10 + *s - '0';
+ s++;
+ }
+ break;
+
+ case '*':
+ assert(iflag == -1 /* iflag given */);
+ iflag = va_arg(val, int);
+ break;
+
+ case 's': {
+ const char *x = va_arg(val, const char *);
+ if (x) {
+ if (iflag < 0)
+ append(x, strlen(x));
+ else
+ append(x, iflag);
+ }
+ goto pctdone;
+ }
+
+ case 'c': {
+ char c = (char)(va_arg(val, int) & 0xFF);
+ append(&c, 1);
+ goto pctdone;
+ }
+
+ case 'p': {
+ PermString::Capsule x = va_arg(val, PermString::Capsule);
+ PermString px;
+ if (x)
+ px = PermString::decapsule(x);
+ if (iflag < 0 || iflag > px.length())
+ append(px.c_str(), px.length());
+ else
+ append(px.c_str(), iflag);
+ goto pctdone;
+ }
+
+ case 'd': {
+ // FIXME FIXME rewrite for sense
+ int x = va_arg(val, int);
+ if (pspos == pscap)
+ extend(1);
+
+ // FIXME -2^31
+ unsigned int ux = x;
+ if (x < 0) {
+ psc[pspos++] = '-';
+ ux = -x;
+ }
+
+ int numdigits = 0;
+ for (unsigned digcountx = ux; digcountx > 9; digcountx /= 10)
+ numdigits++;
+
+ extend(numdigits + 1);
+ int digit = numdigits;
+ do {
+ psc[pspos + digit] = (ux % 10) + '0';
+ ux /= 10;
+ digit--;
+ } while (ux);
+ pspos += numdigits + 1;
+
+ goto pctdone;
+ }
+
+ case 'g': {
+ // FIXME FIXME rewrite for sense
+ double x = va_arg(val, double);
+ char buffer[1000];
+ int len;
+ sprintf(buffer, "%.10g%n", x, &len);
+ extend(len);
+ strcpy(psc + pspos, buffer);
+ pspos += len;
+ goto pctdone;
+ }
+
+ default:
+ assert(0 /* Bad % in permprintf */);
+ goto pctdone;
+
+ }
+
+ pctdone:
+ s++;
+ }
+
+ return PermString(psc, pspos);
+}
+
+PermString permprintf(const char *s, ...)
+{
+ va_list val;
+ va_start(val, s);
+ PermString p = vpermprintf(s, val);
+ va_end(val);
+ return p;
+}
+
+PermString permcat(PermString a, PermString b)
+{
+ if (!a || !b)
+ return a ? a : b;
+ unsigned al = a.length();
+ unsigned bl = b.length();
+ char *s = new char[al + bl];
+ memcpy(s, a.c_str(), al);
+ memcpy(s + al, b.c_str(), bl);
+ PermString p(s, al + bl);
+ delete[] s;
+ return p;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc
new file mode 100644
index 00000000000..9fd881e9612
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/point.cc
@@ -0,0 +1,57 @@
+// -*- related-file-name: "../include/lcdf/point.hh" -*-
+
+/* point.{cc,hh} -- 2D points
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/point.hh>
+
+Point
+Point::rotated(double rotation) const noexcept
+{
+ double r = length();
+ double theta = angle() + rotation;
+ return Point(r * cos(theta), r * sin(theta));
+}
+
+Point
+Point::midpoint(const Point &a, const Point &b) noexcept
+{
+ return Point((a.x + b.x)/2, (a.y + b.y)/2);
+}
+
+bool
+Point::on_line(const Point &a, const Point &b, double tolerance) const noexcept
+{
+ Point c = b - a;
+ double d = c.x * (y - a.y) - c.y * (x - a.x);
+ return (d * d <= tolerance * tolerance * c.squared_length());
+}
+
+bool
+Point::on_segment(const Point &a, const Point &b, double t) const noexcept
+{
+ double tt;
+ Point c = b - a;
+ if (fabs(c.x) > fabs(c.y))
+ tt = (x - a.x) / c.x;
+ else if (c.y)
+ tt = (y - a.y) / c.y;
+ else
+ tt = 0;
+ if (tt < 0 || tt > 1)
+ return 0;
+ return on_line(a, b, t);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc
new file mode 100644
index 00000000000..0755059e825
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/slurper.cc
@@ -0,0 +1,187 @@
+// -*- related-file-name: "../include/lcdf/slurper.hh" -*-
+
+/* slurper.{cc,hh} -- reading from files a line at a time
+ *
+ * Copyright (c) 1998-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/slurper.hh>
+#include <string.h>
+
+static const int DefChunkCap = 2048;
+static const int WorthMoving = 256;
+
+
+Slurper::Slurper(const Filename &filename, FILE *f)
+ : _filename(filename), _lineno(0),
+ _data(new unsigned char[DefChunkCap]), _cap(DefChunkCap),
+ _pos(0), _len(0), _line(0), _line_len(0),
+ _saved_line(false), _at_eof(false)
+{
+ if (f) {
+ _f = f;
+ _own_f = false;
+ } else {
+ _f = _filename.open_read();
+ _own_f = true;
+ }
+}
+
+Slurper::~Slurper()
+{
+ delete[] _data;
+ if (_f && _own_f) fclose(_f);
+}
+
+
+void
+Slurper::grow_buffer()
+{
+ // If we need to keep the upper part of the buffer, shift it down (moving
+ // any data we care about).
+ if (_pos >= _cap - WorthMoving) {
+ // I used to move it myself, with a comment that SunOS didn't have a
+ // correct implementation of memmove. This should be detected by
+ // configure, if it's really a problem.
+ memmove(_data, _data + _pos, _len - _pos);
+ _len -= _pos;
+ _pos = 0;
+ }
+
+ // Grow the buffer if necessary.
+ if (_len >= _cap) {
+ unsigned char *new_data = new unsigned char[ 2 * _cap ];
+ // I can't believe I didn't have the line below!!
+ memcpy(new_data, _data, _len);
+ delete[] _data;
+ _data = new_data;
+ _cap = 2 * _cap;
+ }
+}
+
+
+inline int
+Slurper::more_data()
+{
+ grow_buffer();
+
+ // Read new data into the buffer.
+ int amount = fread(_data + _len, 1, _cap - _len, _f);
+ _len += amount;
+ return amount;
+}
+
+char *
+Slurper::get_line_at(unsigned pos)
+{
+ while (1) {
+ for (; pos < _len; pos++)
+ if (_data[pos] == '\n' || _data[pos] == '\r')
+ goto line_ends_at_pos;
+
+ // no line end? look for more data. save and reset `pos', since _pos
+ // may change.
+ int offset = pos - _pos;
+ bool got_more_data = more_data() != 0;
+ pos = _pos + offset;
+ if (!got_more_data) {
+ _at_eof = true;
+ goto line_ends_at_pos;
+ }
+ }
+
+ line_ends_at_pos:
+
+ // PRECONDITION: the line starts at _pos and ends at pos.
+ unsigned next_pos;
+
+ // Find beginning of next line. 3 cases:
+ // 1. line ends in \r\n -> _pos = pos + 2;
+ // 2. line ends in \r OR \n -> _pos = pos + 1;
+ // 3. neither -> must be last line in file; _pos = pos,
+ // since pos == _len
+ if (pos == _len) {
+ // last line in file didn't end in `\n': must have no data left
+ // ensure we have enough space for terminating nul
+ if (pos == _cap) grow_buffer();
+ next_pos = pos;
+ // if already at EOF, don't increment the line number
+ if (pos == _pos) _lineno--;
+
+ } else if (_data[pos] == '\n')
+ next_pos = pos + 1;
+
+ else {
+ assert(_data[pos] == '\r');
+ // If `\r' is last char in buffer, `\n' might be next char. Must read more
+ // data to check for it, or we'd report an empty line that didn't really
+ // exist.
+ if (pos == _len - 1) {
+ // be careful about the possible shift of _pos and _len!
+ int offset = pos - _pos;
+ more_data();
+ pos = _pos + offset;
+ }
+ if (pos < _len - 1 && _data[pos + 1] == '\n')
+ next_pos = pos + 2;
+ else
+ next_pos = pos + 1;
+ }
+
+ _line = _data + _pos;
+ _line_len = pos - _pos;
+ _data[pos] = 0;
+ _pos = next_pos;
+ _lineno++;
+ return (char *)_line;
+}
+
+char *
+Slurper::next_line()
+{
+ if (_saved_line) {
+ _saved_line = false;
+ return (char *)_line;
+ }
+ get_line_at(_pos);
+ if (_line_len == 0 && _at_eof)
+ _line = 0;
+ return (char *)_line;
+}
+
+char *
+Slurper::peek_line()
+{
+ next_line();
+ _saved_line = true;
+ return (char *)_line;
+}
+
+char *
+Slurper::append_next_line()
+{
+ unsigned delta = (_data + _pos) - (_line + _line_len);
+ if (_len - _pos > _line_len) {
+ memmove(_line + delta, _line, _line_len);
+ _line += delta;
+ } else {
+ memmove(_data + _pos - delta, _data + _pos, _len - _pos);
+ _pos -= delta;
+ _len -= delta;
+ }
+
+ unsigned append_at = _pos;
+ _pos = _line - _data;
+ return get_line_at(append_at);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc
new file mode 100644
index 00000000000..6ee6b62f22b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/straccum.cc
@@ -0,0 +1,306 @@
+// -*- related-file-name: "../include/lcdf/straccum.hh" -*-
+/*
+ * straccum.{cc,hh} -- build up strings with operator<<
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2019 Eddie Kohler
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <stdarg.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+/** @class StringAccum
+ * @brief Efficiently build up Strings from pieces.
+ *
+ * Like the String class, StringAccum represents a string of characters.
+ * However, unlike a String, a StringAccum is inherently mutable, and
+ * efficiently supports building up a large string from many smaller pieces.
+ *
+ * StringAccum objects support operator<<() operations for most fundamental
+ * data types. A StringAccum is generally built up by operator<<(), and then
+ * turned into a String by the take_string() method. Extracting the String
+ * from a StringAccum does no memory allocation or copying; the StringAccum's
+ * memory is donated to the String.
+ *
+ * <h3>Out-of-memory StringAccums</h3>
+ *
+ * When there is not enough memory to add requested characters to a
+ * StringAccum object, the object becomes a special "out-of-memory"
+ * StringAccum. Out-of-memory objects are contagious: the result of any
+ * concatenation operation involving an out-of-memory StringAccum is another
+ * out-of-memory StringAccum. Appending an out-of-memory String with "sa <<
+ * s" makes "sa" out-of-memory. (However, other usually-equivalent calls,
+ * such as "sa.append(s.begin(), s.end())", <em>do not</em> make "sa"
+ * out-of-memory.) Calling take_string() on an out-of-memory StringAccum
+ * returns an out-of-memory String.
+ *
+ * Out-of-memory StringAccum objects have length zero.
+ */
+
+
+void
+StringAccum::assign_out_of_memory()
+{
+ assert(_cap >= 0);
+ if (_cap > 0)
+ delete[] (_s - MEMO_SPACE);
+ _s = reinterpret_cast<unsigned char *>(const_cast<char *>(String::out_of_memory_data()));
+ _cap = -1;
+ _len = 0;
+}
+
+char *
+StringAccum::grow(int want)
+{
+ // can't append to out-of-memory strings
+ if (_cap < 0) {
+ errno = ENOMEM;
+ return 0;
+ }
+
+ int ncap = (_cap ? (_cap + MEMO_SPACE) * 2 : 128) - MEMO_SPACE;
+ while (ncap <= want)
+ ncap = (ncap + MEMO_SPACE) * 2 - MEMO_SPACE;
+
+ unsigned char *n = new unsigned char[ncap + MEMO_SPACE];
+ if (!n) {
+ assign_out_of_memory();
+ errno = ENOMEM;
+ return 0;
+ }
+ n += MEMO_SPACE;
+
+ if (_s) {
+ memcpy(n, _s, _len);
+ delete[] (_s - MEMO_SPACE);
+ }
+ _s = n;
+ _cap = ncap;
+ return reinterpret_cast<char *>(_s + _len);
+}
+
+int
+StringAccum::resize(int len)
+{
+ assert(len >= 0);
+ if (len > _cap && !grow(len))
+ return -ENOMEM;
+ else {
+ _len = len;
+ return 0;
+ }
+}
+
+char *
+StringAccum::hard_extend(int nadjust, int nreserve)
+{
+ char *x = grow(_len + nadjust + nreserve);
+ if (x)
+ _len += nadjust;
+ return x;
+}
+
+const char *
+StringAccum::c_str()
+{
+ if (_len < _cap || grow(_len))
+ _s[_len] = '\0';
+ return reinterpret_cast<char *>(_s);
+}
+
+void
+StringAccum::append_fill(int c, int len)
+{
+ if (char *s = extend(len))
+ memset(s, c, len);
+}
+
+void
+StringAccum::append_utf8_hard(unsigned ch)
+{
+ if (ch < 0x80)
+ append((unsigned char) ch);
+ else if (ch < 0x800) {
+ append((unsigned char) (0xC0 + ((ch >> 6) & 0x1F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else if (ch < 0x10000) {
+ append((unsigned char) (0xE0 + ((ch >> 12) & 0x0F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else if (ch < 0x110000) {
+ append((unsigned char) (0xF0 + ((ch >> 18) & 0x07)));
+ append((unsigned char) (0x80 + ((ch >> 12) & 0x3F)));
+ append((unsigned char) (0x80 + ((ch >> 6) & 0x3F)));
+ append((unsigned char) (0x80 + (ch & 0x3F)));
+ } else
+ append((unsigned char) '?');
+}
+
+void
+StringAccum::hard_append(const char *s, int len)
+{
+ // We must be careful about calls like "sa.append(sa.begin(), sa.end())";
+ // a naive implementation might use sa's data after freeing it.
+ const char *my_s = reinterpret_cast<char *>(_s);
+
+ if (len <= 0) {
+ // do nothing
+ } else if (_len + len <= _cap) {
+ success:
+ memcpy(_s + _len, s, len);
+ _len += len;
+ } else if (s < my_s || s >= my_s + _cap) {
+ if (grow(_len + len))
+ goto success;
+ } else {
+ unsigned char *old_s = _s;
+ int old_len = _len;
+
+ _s = 0;
+ _len = 0;
+ _cap = 0;
+
+ if (char *new_s = extend(old_len + len)) {
+ memcpy(new_s, old_s, old_len);
+ memcpy(new_s + old_len, s, len);
+ }
+
+ delete[] (old_s - MEMO_SPACE);
+ }
+}
+
+void
+StringAccum::append(const char *s)
+{
+ hard_append(s, strlen(s));
+}
+
+String
+StringAccum::take_string()
+{
+ int len = length();
+ int cap = _cap;
+ char *str = reinterpret_cast<char *>(_s);
+ if (len > 0) {
+ _s = 0;
+ _len = _cap = 0;
+ return String::make_claim(str, len, cap);
+ } else if (!out_of_memory())
+ return String();
+ else {
+ clear();
+ return String::make_out_of_memory();
+ }
+}
+
+void
+StringAccum::swap(StringAccum &o)
+{
+ unsigned char *os = o._s;
+ int olen = o._len, ocap = o._cap;
+ o._s = _s;
+ o._len = _len, o._cap = _cap;
+ _s = os;
+ _len = olen, _cap = ocap;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a i to @a sa.
+ @return @a sa */
+StringAccum &
+operator<<(StringAccum &sa, long i)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%ld", i);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+/** @relates StringAccum
+ @brief Append decimal representation of @a u to @a sa.
+ @return @a sa */
+StringAccum &
+operator<<(StringAccum &sa, unsigned long u)
+{
+ if (char *x = sa.reserve(24)) {
+ int len = sprintf(x, "%lu", u);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+StringAccum &
+operator<<(StringAccum &sa, double d)
+{
+ if (char *x = sa.reserve(256)) {
+ int len = sprintf(x, "%.12g", d);
+ sa.adjust_length(len);
+ }
+ return sa;
+}
+
+StringAccum &
+StringAccum::snprintf(int n, const char *format, ...)
+{
+ va_list val;
+ va_start(val, format);
+ if (char *x = reserve(n + 1)) {
+#if HAVE_VSNPRINTF
+ int len = vsnprintf(x, n + 1, format, val);
+#else
+ int len = vsprintf(x, format, val);
+ assert(len <= n);
+#endif
+ adjust_length(len);
+ }
+ va_end(val);
+ return *this;
+}
+
+void
+StringAccum::append_break_lines(const String& text, int linelen, const String &leftmargin)
+{
+ if (text.length() == 0)
+ return;
+ const char* line = text.begin();
+ const char* ends = text.end();
+ linelen -= leftmargin.length();
+ for (const char* s = line; s < ends; s++) {
+ const char* start = s;
+ while (s < ends && isspace((unsigned char) *s))
+ s++;
+ const char* word = s;
+ while (s < ends && !isspace((unsigned char) *s))
+ s++;
+ if (s - line > linelen && start > line) {
+ *this << leftmargin;
+ append(line, start - line);
+ *this << '\n';
+ line = word;
+ }
+ }
+ if (line < text.end()) {
+ *this << leftmargin;
+ append(line, text.end() - line);
+ *this << '\n';
+ }
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc
new file mode 100644
index 00000000000..41e7ae0d602
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/string.cc
@@ -0,0 +1,786 @@
+// -*- related-file-name: "../include/lcdf/string.hh" -*-
+/*
+ * string.{cc,hh} -- a String class with shared substrings
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2000 Massachusetts Institute of Technology
+ * Copyright (c) 2001-2019 Eddie Kohler
+ * Copyright (c) 2008-2009 Meraki, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/string.hh>
+#include <lcdf/straccum.hh>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <lcdf/inttypes.h>
+
+#ifndef likely
+#define likely(x) (x)
+#endif
+#ifndef unlikely
+#define unlikely(x) (x)
+#endif
+
+/** @file string.hh
+ * @brief The LCDF String class.
+ */
+
+/** @class String
+ * @brief A string of characters.
+ *
+ * The String class represents a string of characters. Strings may be
+ * constructed from C strings, characters, numbers, and so forth. They may
+ * also be added together. The underlying character arrays are dynamically
+ * allocated; String operations allocate and free memory as needed. A String
+ * and its substrings generally share memory. Accessing a character by index
+ * takes O(1) time; so does creating a substring.
+ *
+ * <h3>Out-of-memory strings</h3>
+ *
+ * When there is not enough memory to create a particular string, a special
+ * "out-of-memory" string is returned instead. Out-of-memory strings are
+ * contagious: the result of any concatenation operation involving an
+ * out-of-memory string is another out-of-memory string. Thus, the final
+ * result of a series of String operations will be an out-of-memory string,
+ * even if the out-of-memory condition occurs in the middle.
+ *
+ * Out-of-memory strings have zero characters, but they aren't equal to other
+ * empty strings. If @a s is a normal String (even an empty string), and @a
+ * oom is an out-of-memory string, then @a s @< @a oom.
+ *
+ * All out-of-memory strings are equal and share the same data(), which is
+ * different from the data() of any other string. See
+ * String::out_of_memory_data(). The String::make_out_of_memory() function
+ * returns an out-of-memory string.
+ */
+
+const char String::null_data = '\0';
+const char String::oom_data = '\0';
+const char String::bool_data[] = "true\0false";
+const char String::int_data[] = "0\0001\0002\0003\0004\0005\0006\0007\0008\0009";
+
+#if HAVE_STRING_PROFILING > 1
+# define MEMO_INITIALIZER_TAIL , 0, 0
+#else
+# define MEMO_INITIALIZER_TAIL
+#endif
+
+const String::rep_t String::null_string_rep = {
+ &null_data, 0, 0
+};
+const String::rep_t String::oom_string_rep = {
+ &oom_data, 0, 0
+};
+
+#if HAVE_STRING_PROFILING
+uint64_t String::live_memo_count;
+uint64_t String::memo_sizes[55];
+uint64_t String::live_memo_sizes[55];
+uint64_t String::live_memo_bytes[55];
+# if HAVE_STRING_PROFILING > 1
+String::memo_t *String::live_memos[55];
+# endif
+#endif
+
+/** @cond never */
+String::memo_t *
+String::create_memo(char *space, int dirty, int capacity)
+{
+ assert(capacity > 0 && capacity >= dirty);
+ memo_t *memo;
+ if (space)
+ memo = reinterpret_cast<memo_t *>(space);
+ else
+ memo = reinterpret_cast<memo_t *>(new char[MEMO_SPACE + capacity]);
+ if (memo) {
+ memo->capacity = capacity;
+ memo->dirty = dirty;
+ memo->refcount = (space ? 0 : 1);
+#if HAVE_STRING_PROFILING
+ int bucket = profile_memo_size_bucket(dirty, capacity);
+ ++memo_sizes[bucket];
+ ++live_memo_sizes[bucket];
+ live_memo_bytes[bucket] += capacity;
+ ++live_memo_count;
+# if HAVE_STRING_PROFILING > 1
+ memo->pprev = &live_memos[bucket];
+ if ((memo->next = *memo->pprev))
+ memo->next->pprev = &memo->next;
+ *memo->pprev = memo;
+# endif
+#endif
+ }
+ return memo;
+}
+
+void
+String::delete_memo(memo_t *memo)
+{
+ assert(memo->capacity > 0);
+ assert(memo->capacity >= memo->dirty);
+#if HAVE_STRING_PROFILING
+ int bucket = profile_memo_size_bucket(memo->dirty, memo->capacity);
+ --live_memo_sizes[bucket];
+ live_memo_bytes[bucket] -= memo->capacity;
+ --live_memo_count;
+# if HAVE_STRING_PROFILING > 1
+ if ((*memo->pprev = memo->next))
+ memo->next->pprev = memo->pprev;
+# endif
+#endif
+ delete[] reinterpret_cast<char *>(memo);
+}
+
+
+#if HAVE_STRING_PROFILING
+void
+String::one_profile_report(StringAccum &sa, int i, int examples)
+{
+ if (i <= 16)
+ sa << "memo_dirty_" << i;
+ else if (i < 25) {
+ uint32_t s = (i - 17) * 2 + 17;
+ sa << "memo_cap_" << s << '_' << (s + 1);
+ } else if (i < 29) {
+ uint32_t s = (i - 25) * 8 + 33;
+ sa << "memo_cap_" << s << '_' << (s + 7);
+ } else {
+ uint32_t s1 = (1U << (i - 23)) + 1;
+ uint32_t s2 = (s1 - 1) << 1;
+ sa << "memo_cap_" << s1 << '_' << s2;
+ }
+ sa << '\t' << live_memo_sizes[i] << '\t' << memo_sizes[i] << '\t' << live_memo_bytes[i] << '\n';
+ if (examples) {
+# if HAVE_STRING_PROFILING > 1
+ for (memo_t *m = live_memos[i]; m; m = m->next) {
+ sa << " [" << m->dirty << "] ";
+ uint32_t dirty = m->dirty;
+ if (dirty > 0 && m->real_data[dirty - 1] == '\0')
+ --dirty;
+ sa.append(m->real_data, dirty > 128 ? 128 : dirty);
+ sa << '\n';
+ }
+# endif
+ }
+}
+
+void
+String::profile_report(StringAccum &sa, int examples)
+{
+ uint64_t all_live_sizes = 0, all_sizes = 0, all_live_bytes = 0;
+ for (int i = 0; i < 55; ++i) {
+ if (memo_sizes[i])
+ one_profile_report(sa, i, examples);
+ all_live_sizes += live_memo_sizes[i];
+ all_sizes += memo_sizes[i];
+ all_live_bytes += live_memo_bytes[i];
+ }
+ sa << "memo_total\t" << all_live_sizes << '\t' << all_sizes << '\t' << all_live_bytes << '\n';
+}
+#endif
+
+/** @endcond never */
+
+
+/** @brief Construct a base-10 string representation of @a x. */
+String::String(int x)
+{
+ if (x >= 0 && x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%d", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(unsigned x)
+{
+ if (x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%u", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(long x)
+{
+ if (x >= 0 && x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%ld", x);
+ assign(buf, -1, false);
+ }
+}
+
+/** @overload */
+String::String(unsigned long x)
+{
+ if (x < 10)
+ assign_memo(int_data + 2 * x, 1, 0);
+ else {
+ char buf[128];
+ sprintf(buf, "%lu", x);
+ assign(buf, -1, false);
+ }
+}
+
+String::String(double x)
+{
+ char buf[128];
+ int len = sprintf(buf, "%.12g", x);
+ assign(buf, len, false);
+}
+
+String
+String::make_claim(char *str, int len, int capacity)
+{
+ assert(str && len > 0 && capacity >= len);
+ memo_t *new_memo = create_memo(str - MEMO_SPACE, len, capacity);
+ return String(str, len, new_memo);
+}
+
+String
+String::make_stable(const char *s, int len)
+{
+ if (len < 0)
+ len = (s ? strlen(s) : 0);
+ return String(s, len, 0);
+}
+
+String
+String::make_fill(int c, int len)
+{
+ String s;
+ s.append_fill(c, len);
+ return s;
+}
+
+void
+String::assign_out_of_memory()
+{
+ if (_r.memo)
+ deref();
+ _r.memo = 0;
+ _r.data = &oom_data;
+ _r.length = 0;
+}
+
+void
+String::assign(const char *s, int len, bool need_deref)
+{
+ if (!s) {
+ assert(len <= 0);
+ len = 0;
+ } else if (len < 0)
+ len = strlen(s);
+
+ // need to start with dereference
+ if (need_deref) {
+ if (unlikely(_r.memo
+ && s >= _r.memo->real_data
+ && s + len <= _r.memo->real_data + _r.memo->capacity)) {
+ // Be careful about "String s = ...; s = s.c_str();"
+ _r.data = s;
+ _r.length = len;
+ return;
+ } else
+ deref();
+ }
+
+ if (len == 0) {
+ _r.memo = 0;
+ _r.data = (s == &oom_data ? s : &null_data);
+
+ } else {
+ // Make the memo a multiple of 16 characters and bigger than 'len'.
+ int memo_capacity = (len + 15 + MEMO_SPACE) & ~15;
+ _r.memo = create_memo(0, len, memo_capacity - MEMO_SPACE);
+ if (!_r.memo) {
+ assign_out_of_memory();
+ return;
+ }
+ memcpy(_r.memo->real_data, s, len);
+ _r.data = _r.memo->real_data;
+ }
+
+ _r.length = len;
+}
+
+/** @brief Append @a len unknown characters to this string.
+ * @return Modifiable pointer to the appended characters.
+ *
+ * The caller may safely modify the returned memory. Null is returned if
+ * the string becomes out-of-memory. */
+char *
+String::append_uninitialized(int len)
+{
+ // Appending anything to "out of memory" leaves it as "out of memory"
+ if (unlikely(len <= 0) || out_of_memory())
+ return 0;
+
+ // If we can, append into unused space. First, we check that there's
+ // enough unused space for 'len' characters to fit; then, we check
+ // that the unused space immediately follows the data in '*this'.
+ uint32_t dirty;
+ if (_r.memo
+ && ((dirty = _r.memo->dirty), _r.memo->capacity > dirty + len)) {
+ char *real_dirty = _r.memo->real_data + dirty;
+ if (real_dirty == _r.data + _r.length) {
+ _r.memo->dirty = dirty + len;
+ _r.length += len;
+ assert(_r.memo->dirty < _r.memo->capacity);
+#if HAVE_STRING_PROFILING
+ profile_update_memo_dirty(_r.memo, dirty, dirty + len, _r.memo->capacity);
+#endif
+ return real_dirty;
+ }
+ }
+
+ // Now we have to make new space. Make sure the memo is a multiple of 16
+ // bytes and that it is at least 16. But for large strings, allocate a
+ // power of 2, since power-of-2 sizes minimize waste in frequently-used
+ // allocators, like Linux kmalloc.
+ int want_memo_len = _r.length + len + MEMO_SPACE;
+ int memo_capacity;
+ if (want_memo_len <= 1024)
+ memo_capacity = (want_memo_len + 15) & ~15;
+ else
+ for (memo_capacity = 2048; memo_capacity < want_memo_len; )
+ memo_capacity *= 2;
+
+ memo_t *new_memo = create_memo(0, _r.length + len, memo_capacity - MEMO_SPACE);
+ if (!new_memo) {
+ assign_out_of_memory();
+ return 0;
+ }
+
+ char *new_data = new_memo->real_data;
+ memcpy(new_data, _r.data, _r.length);
+
+ deref();
+ _r.data = new_data;
+ new_data += _r.length; // now new_data points to the garbage
+ _r.length += len;
+ _r.memo = new_memo;
+ return new_data;
+}
+
+void
+String::append(const char *s, int len, memo_t *memo)
+{
+ if (!s) {
+ assert(len <= 0);
+ len = 0;
+ } else if (len < 0)
+ len = strlen(s);
+
+ if (s == &oom_data)
+ // Appending "out of memory" to a regular string makes it "out of
+ // memory"
+ assign_out_of_memory();
+ else if (len == 0)
+ /* do nothing */;
+ else if (_r.length == 0 && memo && !out_of_memory()) {
+ deref();
+ assign_memo(s, len, memo);
+ } else if (likely(!(_r.memo
+ && s >= _r.memo->real_data
+ && s + len <= _r.memo->real_data + _r.memo->capacity))) {
+ if (char *space = append_uninitialized(len))
+ memcpy(space, s, len);
+ } else {
+ String preserve_s(*this);
+ if (char *space = append_uninitialized(len))
+ memcpy(space, s, len);
+ }
+}
+
+/** @brief Append @a len copies of character @a c to this string. */
+void
+String::append_fill(int c, int len)
+{
+ assert(len >= 0);
+ if (char *space = append_uninitialized(len))
+ memset(space, c, len);
+}
+
+/** @brief Ensure the string's data is unshared and return a mutable
+ pointer to it. */
+char *
+String::mutable_data()
+{
+ // If _memo has a capacity (it's not one of the special strings) and it's
+ // uniquely referenced, return _data right away.
+ if (_r.memo && _r.memo->refcount == 1)
+ return const_cast<char *>(_r.data);
+
+ // Otherwise, make a copy of it. Rely on: deref() doesn't change _data or
+ // _length; and if _capacity == 0, then deref() doesn't free _real_data.
+ assert(!_r.memo || _r.memo->refcount > 1);
+ // But in multithreaded situations we must hold a local copy of memo!
+ String do_not_delete_underlying_memo(*this);
+ deref();
+ assign(_r.data, _r.length, false);
+ return const_cast<char *>(_r.data);
+}
+
+char *
+String::mutable_c_str()
+{
+ (void) mutable_data();
+ (void) c_str();
+ return const_cast<char *>(_r.data);
+}
+
+/** @brief Return a substring of this string, consisting of the @a len
+ characters starting at index @a pos.
+ @param pos substring's first position relative to the string
+ @param len length of substring
+
+ If @a pos is negative, starts that far from the end of the string. If @a
+ len is negative, leaves that many characters off the end of the string.
+ If @a pos and @a len specify a substring that is partly outside the
+ string, only the part within the string is returned. If the substring is
+ beyond either end of the string, returns an empty string (but this
+ should be considered a programming error; a future version may generate
+ a warning for this case).
+
+ @note String::substring() is intended to behave like Perl's substr(). */
+String
+String::substring(int pos, int len) const
+{
+ if (pos < 0)
+ pos += _r.length;
+
+ int pos2;
+ if (len < 0)
+ pos2 = _r.length + len;
+ else if (pos >= 0 && len >= _r.length) // avoid integer overflow
+ pos2 = _r.length;
+ else
+ pos2 = pos + len;
+
+ if (pos < 0)
+ pos = 0;
+ if (pos2 > _r.length)
+ pos2 = _r.length;
+
+ if (pos >= pos2)
+ return String();
+ else
+ return String(_r.data + pos, pos2 - pos, _r.memo);
+}
+
+int
+String::find_left(char c, int start) const
+{
+ if (start < 0)
+ start = 0;
+ for (int i = start; i < _r.length; i++)
+ if (_r.data[i] == c)
+ return i;
+ return -1;
+}
+
+int
+String::find_left(const String &str, int start) const
+{
+ if (start < 0)
+ start = 0;
+ int max_pos = length() - str.length();
+ for (int i = start; i <= max_pos; ++i)
+ if (memcmp(_r.data + i, str.data(), str.length()) == 0)
+ return i;
+ return -1;
+}
+
+int
+String::find_right(char c, int start) const
+{
+ if (start >= _r.length)
+ start = _r.length - 1;
+ for (int i = start; i >= 0; i--)
+ if (_r.data[i] == c)
+ return i;
+ return -1;
+}
+
+static String
+hard_lower(const String &s, int pos)
+{
+ String new_s(s.data(), s.length());
+ char *x = const_cast<char *>(new_s.data()); // know it's mutable
+ int len = s.length();
+ for (; pos < len; pos++)
+ x[pos] = tolower((unsigned char) x[pos]);
+ return new_s;
+}
+
+/** @brief Return a lowercased version of this string.
+
+ Translates the ASCII characters 'A' through 'Z' into their lowercase
+ equivalents. */
+String
+String::lower() const
+{
+ // avoid copies
+ if (!out_of_memory())
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] >= 'A' && _r.data[i] <= 'Z')
+ return hard_lower(*this, i);
+ return *this;
+}
+
+static String
+hard_upper(const String &s, int pos)
+{
+ String new_s(s.data(), s.length());
+ char *x = const_cast<char *>(new_s.data()); // know it's mutable
+ int len = s.length();
+ for (; pos < len; pos++)
+ x[pos] = toupper((unsigned char) x[pos]);
+ return new_s;
+}
+
+/** @brief Return an uppercased version of this string.
+
+ Translates the ASCII characters 'a' through 'z' into their uppercase
+ equivalents. */
+String
+String::upper() const
+{
+ // avoid copies
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] >= 'a' && _r.data[i] <= 'z')
+ return hard_upper(*this, i);
+ return *this;
+}
+
+static String
+hard_printable(const String &s, int pos, int type)
+{
+ StringAccum sa(s.length() * 2);
+ sa.append(s.data(), pos);
+ const unsigned char *x = reinterpret_cast<const unsigned char *>(s.data());
+ int len = s.length();
+ for (; pos < len; pos++) {
+ if (x[pos] >= 32 && x[pos] < 127)
+ sa << x[pos];
+ else if (x[pos] < 32 && type != 1)
+ sa << '^' << (unsigned char)(x[pos] + 64);
+ else if (char *buf = sa.extend(4, 1))
+ sprintf(buf, "\\%03o", x[pos]);
+ }
+ return sa.take_string();
+}
+
+/** @brief Return a "printable" version of this string.
+ @param type quoting type
+
+ The default quoting type (0) translates control characters 0-31 into
+ "control" sequences, such as "^@" for the null character, and characters
+ 127-255 into octal escape sequences, such as "\377" for 255. Quoting
+ type 1 translates all characters outside of 32-126 into octal escape
+ sequences. */
+String
+String::printable(int type) const
+{
+ // avoid copies
+ if (!out_of_memory())
+ for (int i = 0; i < _r.length; i++)
+ if (_r.data[i] < 32 || _r.data[i] > 126)
+ return hard_printable(*this, i, type);
+ return *this;
+}
+
+hashcode_t
+String::hashcode(const char *begin, const char *end)
+{
+ if (end <= begin)
+ return 0;
+
+ uint32_t hash = end - begin;
+ int rem = hash & 3;
+ end -= rem;
+ uint32_t last16;
+
+#if !HAVE_INDIFFERENT_ALIGNMENT
+ if (!(reinterpret_cast<uintptr_t>(begin) & 1)) {
+#endif
+#define get16(p) (*reinterpret_cast<const uint16_t *>((p)))
+ for (; begin != end; begin += 4) {
+ hash += get16(begin);
+ uint32_t tmp = (get16(begin + 2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ hash += hash >> 11;
+ }
+ if (rem >= 2) {
+ last16 = get16(begin);
+ goto rem2;
+ }
+#undef get16
+#if !HAVE_INDIFFERENT_ALIGNMENT
+ } else {
+# if WORDS_BIGENDIAN
+# define get16(p) (((unsigned char) (p)[0] << 8) + (unsigned char) (p)[1])
+# elif WORDS_BIGENDIAN_SET
+# define get16(p) ((unsigned char) (p)[0] + ((unsigned char) (p)[1] << 8))
+# else
+# error "unknown byte order"
+# endif
+ // should be exactly the same as the code above
+ for (; begin != end; begin += 4) {
+ hash += get16(begin);
+ uint32_t tmp = (get16(begin + 2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ hash += hash >> 11;
+ }
+ if (rem >= 2) {
+ last16 = get16(begin);
+ goto rem2;
+ }
+# undef get16
+ }
+#endif
+
+ /* Handle end cases */
+ if (0) { // weird organization avoids uninitialized
+ rem2: // variable warnings
+ if (rem == 3) {
+ hash += last16;
+ hash ^= hash << 16;
+ hash ^= ((unsigned char) begin[2]) << 18;
+ hash += hash >> 11;
+ } else {
+ hash += last16;
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ }
+ } else if (rem == 1) {
+ hash += (unsigned char) *begin;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+}
+
+#if 0
+// 11.Apr.2008 -- This old hash function was swapped out in favor of
+// SuperFastHash, above.
+hashcode_t
+String::hashcode() const
+{
+ int l = length();
+ const char *d = data();
+ if (!l)
+ return 0;
+ else if (l == 1)
+ return d[0] | (d[0] << 8);
+ else if (l < 4)
+ return d[0] + (d[1] << 3) + (l << 12);
+ else
+ return d[0] + (d[1] << 8) + (d[2] << 16) + (d[3] << 24)
+ + (l << 12) + (d[l-1] << 10);
+}
+#endif
+
+bool
+String::equals(const char *s, int len) const
+{
+ // It'd be nice to make "out-of-memory" strings compare unequal to
+ // anything, even themselves, but this would be a bad idea for Strings
+ // used as (for example) keys in hashtables. Instead, "out-of-memory"
+ // strings compare unequal to other null strings, but equal to each other.
+ if (len < 0)
+ len = strlen(s);
+ if (_r.length != len)
+ return false;
+ else if (_r.data == s)
+ return true;
+ else if (len == 0)
+ return (s != &oom_data && _r.data != &oom_data);
+ else
+ return memcmp(_r.data, s, len) == 0;
+}
+
+bool
+String::starts_with(const char *s, int len) const
+{
+ // See note on equals() re: "out-of-memory" strings.
+ if (len < 0)
+ len = strlen(s);
+ if (_r.length < len)
+ return false;
+ else if (_r.data == s)
+ return true;
+ else if (len == 0)
+ return (s != &oom_data && _r.data != &oom_data);
+ else
+ return memcmp(_r.data, s, len) == 0;
+}
+
+int
+String::compare(const char *s, int len) const
+{
+ if (len < 0)
+ len = strlen(s);
+ if (_r.data == s)
+ return _r.length - len;
+ else if (_r.data == &oom_data)
+ return 1;
+ else if (s == &oom_data)
+ return -1;
+ else if (_r.length == len)
+ return memcmp(_r.data, s, len);
+ else if (_r.length < len) {
+ int v = memcmp(_r.data, s, _r.length);
+ return (v ? v : -1);
+ } else {
+ int v = memcmp(_r.data, s, len);
+ return (v ? v : 1);
+ }
+}
+
+void
+String::align(int n)
+{
+ int offset = reinterpret_cast<uintptr_t>(_r.data) % n;
+ if (offset) {
+ String s;
+ s.append_uninitialized(_r.length + n + 1);
+ offset = reinterpret_cast<uintptr_t>(s._r.data) % n;
+ memcpy((char *)s._r.data + n - offset, _r.data, _r.length);
+ s._r.data += n - offset;
+ s._r.length = _r.length;
+ *this = s;
+ }
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/strtonum.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/strtonum.c
new file mode 100644
index 00000000000..36898c5a7ad
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/strtonum.c
@@ -0,0 +1,31 @@
+/* -*- related-file-name: "../include/lcdf/strtonum.h" -*- */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/strtonum.h>
+#include <stdlib.h>
+#if HAVE_BROKEN_STRTOD
+# define strtod good_strtod
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A faster strtod which only calls the real strtod if the string has a
+ fractional part. */
+
+double
+strtonumber(const char *f, char **endf)
+{
+ long v = strtol((char *)f, endf, 10);
+
+ /* handle any possible decimal part */
+ if (**endf == '.' || **endf == 'E' || **endf == 'e')
+ return strtod((char *)f, endf);
+ else
+ return v;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc
new file mode 100644
index 00000000000..8f92dfeba83
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/transform.cc
@@ -0,0 +1,182 @@
+// -*- related-file-name: "../include/lcdf/transform.hh" -*-
+
+/* transform.{cc,hh} -- planar affine transformations
+ *
+ * Copyright (c) 2000-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/transform.hh>
+#include <lcdf/straccum.hh>
+#include <math.h>
+
+Transform::Transform()
+{
+ _m[0] = _m[3] = 1;
+ _m[1] = _m[2] = _m[4] = _m[5] = 0;
+ _null = true;
+}
+
+Transform::Transform(const double m[6])
+{
+ _m[0] = m[0];
+ _m[1] = m[1];
+ _m[2] = m[2];
+ _m[3] = m[3];
+ _m[4] = m[4];
+ _m[5] = m[5];
+ check_null(0);
+}
+
+Transform::Transform(double m0, double m1, double m2,
+ double m3, double m4, double m5)
+{
+ _m[0] = m0;
+ _m[1] = m1;
+ _m[2] = m2;
+ _m[3] = m3;
+ _m[4] = m4;
+ _m[5] = m5;
+ check_null(0);
+}
+
+void
+Transform::check_null(double tolerance)
+{
+ _null = (fabs(_m[0] - 1) < tolerance && fabs(_m[1]) < tolerance
+ && fabs(_m[2]) < tolerance && fabs(_m[3] - 1) < tolerance
+ && fabs(_m[4]) < tolerance && fabs(_m[5]) < tolerance);
+}
+
+
+void
+Transform::scale(double x, double y)
+{
+ _m[0] *= x;
+ _m[1] *= x;
+ _m[2] *= y;
+ _m[3] *= y;
+
+ if (x != 1 || y != 1)
+ _null = false;
+}
+
+void
+Transform::rotate(double r)
+{
+ double c = cos(r);
+ double s = sin(r);
+
+ double a = _m[0], b = _m[2];
+ _m[0] = a*c + b*s;
+ _m[2] = b*c - a*s;
+
+ a = _m[1], b = _m[3];
+ _m[1] = a*c + b*s;
+ _m[3] = b*c - a*s;
+
+ if (r != 0)
+ _null = false;
+}
+
+void
+Transform::translate(double x, double y)
+{
+ _m[4] += _m[0]*x + _m[2]*y;
+ _m[5] += _m[1]*x + _m[3]*y;
+
+ if (x != 0 || y != 0)
+ _null = false;
+}
+
+void Transform::raw_translate(double x, double y) {
+ _m[4] += x;
+ _m[5] += y;
+
+ if (x != 0 || y != 0)
+ _null = false;
+}
+
+void
+Transform::shear(double s)
+{
+ *this *= Transform(1, 0, s, 1, 0, 0);
+}
+
+Transform& Transform::operator*=(const Transform& x) {
+ if (x.null())
+ /* do nothing */;
+ else if (null())
+ memcpy(_m, x._m, sizeof(_m));
+ else {
+ double m[6];
+ m[0] = _m[0] * x._m[0] + _m[2] * x._m[1];
+ m[1] = _m[1] * x._m[0] + _m[3] * x._m[1];
+ m[2] = _m[0] * x._m[2] + _m[2] * x._m[3];
+ m[3] = _m[1] * x._m[2] + _m[3] * x._m[3];
+ m[4] = _m[0] * x._m[4] + _m[2] * x._m[5] + _m[4];
+ m[5] = _m[1] * x._m[4] + _m[3] * x._m[5] + _m[5];
+ memcpy(_m, m, sizeof(_m));
+ }
+ return *this;
+}
+
+
+void
+Transform::real_apply_to(Point &p) const
+{
+ double x = p.x;
+ p.x = x*_m[0] + p.y*_m[2] + _m[4];
+ p.y = x*_m[1] + p.y*_m[3] + _m[5];
+}
+
+Point
+Transform::real_apply(const Point &p) const
+{
+ return Point(p.x*_m[0] + p.y*_m[2] + _m[4],
+ p.x*_m[1] + p.y*_m[3] + _m[5]);
+}
+
+Bezier &
+operator*=(Bezier &b, const Transform &t)
+{
+ if (!t.null()) {
+ b.mpoint(0) *= t;
+ b.mpoint(1) *= t;
+ b.mpoint(2) *= t;
+ b.mpoint(3) *= t;
+ }
+ return b;
+}
+
+Bezier
+operator*(const Bezier &b, const Transform &t)
+{
+ return (t.null()
+ ? b
+ : Bezier(b.point(0) * t, b.point(1) * t, b.point(2) * t, b.point(3) * t));
+}
+
+String
+Transform::unparse() const
+{
+ StringAccum sa;
+ sa << '[';
+ for (int i = 0; i < 6; i++) {
+ if (i)
+ sa << ',' << ' ';
+ sa << _m[i];
+ }
+ sa << ']';
+ return sa.take_string();
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc
new file mode 100644
index 00000000000..eee30630f9f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/liblcdf/vectorv.cc
@@ -0,0 +1,112 @@
+/*
+ * vectorv.cc -- template specialization for Vector<void*>
+ * Eddie Kohler
+ *
+ * Copyright (c) 1999-2006 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, subject to the conditions
+ * listed in the Click LICENSE file. These conditions include: you must
+ * preserve this copyright notice, and you cannot mention the copyright
+ * holders in advertising related to the Software without their permission.
+ * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
+ * notice is a summary of the Click LICENSE file; the license in that file is
+ * legally binding.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <lcdf/vector.hh>
+#include <string.h>
+
+Vector<void*>::Vector(const Vector<void*> &o)
+ : _l(0), _n(0), _capacity(0)
+{
+ *this = o;
+}
+
+Vector<void*>::~Vector()
+{
+ delete[] _l;
+}
+
+Vector<void*> &
+Vector<void*>::operator=(const Vector<void*> &o)
+{
+ if (&o != this) {
+ _n = 0;
+ if (reserve(o._n)) {
+ _n = o._n;
+ memcpy(_l, o._l, sizeof(void *) * _n);
+ }
+ }
+ return *this;
+}
+
+Vector<void*> &
+Vector<void*>::assign(int n, void *e)
+{
+ _n = 0;
+ resize(n, e);
+ return *this;
+}
+
+bool
+Vector<void*>::reserve(int want)
+{
+ if (want < 0)
+ want = (_capacity > 0 ? _capacity * 2 : 4);
+ if (want <= _capacity)
+ return true;
+
+ void **new_l = new void*[want];
+ if (!new_l)
+ return false;
+
+ if (_n) {
+ memcpy(new_l, _l, sizeof(void*) * _n);
+ }
+ delete[] _l;
+
+ _l = new_l;
+ _capacity = want;
+ return true;
+}
+
+Vector<void*>::iterator
+Vector<void*>::erase(iterator a, iterator b)
+{
+ if (b > a) {
+ assert(a >= begin() && b <= end());
+ memmove(a, b, (end() - b) * sizeof(void*));
+ _n -= b - a;
+ return a;
+ } else
+ return b;
+}
+
+void
+Vector<void*>::resize(int nn, void *e)
+{
+ if (nn <= _capacity || reserve(nn)) {
+ for (int i = _n; i < nn; i++)
+ _l[i] = e;
+ _n = nn;
+ }
+}
+
+void
+Vector<void*>::swap(Vector<void*>& o)
+{
+ void **l = _l;
+ int n = _n;
+ int cap = _capacity;
+ _l = o._l;
+ _n = o._n;
+ _capacity = o._capacity;
+ o._l = l;
+ o._n = n;
+ o._capacity = cap;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/m4/lcdf-typetools.m4 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/m4/lcdf-typetools.m4
new file mode 100644
index 00000000000..7aaff4c33af
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/m4/lcdf-typetools.m4
@@ -0,0 +1,15 @@
+## Define configure options for lcdf-typetools. Extracted from configure.ac
+## for ease of building TeX Live.
+m4_define_default([kpse_indent_26], [26])[]dnl
+m4_define([kpse_lcdf_typetools_progs], [cfftot1 mmafm mmpfb otfinfo otftotfm t1dotlessj t1lint t1rawafm t1reencode t1testpage ttftotype42])[]dnl
+AC_FOREACH([Kpse_Prog], kpse_lcdf_typetools_progs,
+ [AC_ARG_ENABLE(Kpse_Prog,
+ AS_HELP_STRING([--disable-]Kpse_Prog,
+ [do not build the ]Kpse_Prog[ program],
+ kpse_indent_26))])
+m4_define([kpse_otftotfm_auto_opts], [cfftot1 t1dotlessj ttftotype42 updmap])[]dnl
+AC_FOREACH([Kpse_Opt], kpse_otftotfm_auto_opts,
+ [AC_ARG_ENABLE(Kpse_Opt,
+ AS_HELP_STRING([--disable-auto-]Kpse_Opt,
+ [disable running ]Kpse_Opt[ from otftotfm],
+ kpse_indent_26))])
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.am
new file mode 100644
index 00000000000..acabc098098
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = mmafm
+man_MANS = mmafm.1
+
+mmafm_SOURCES = main.cc
+
+mmafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmafm.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.in
new file mode 100644
index 00000000000..2b7e846d241
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/Makefile.in
@@ -0,0 +1,748 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mmafm$(EXEEXT)
+subdir = lcdf-typetools-src/mmafm
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_mmafm_OBJECTS = main.$(OBJEXT)
+mmafm_OBJECTS = $(am_mmafm_OBJECTS)
+mmafm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/main.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(mmafm_SOURCES)
+DIST_SOURCES = $(mmafm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = mmafm.1
+mmafm_SOURCES = main.cc
+mmafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmafm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/mmafm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/mmafm/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mmafm$(EXEEXT): $(mmafm_OBJECTS) $(mmafm_DEPENDENCIES) $(EXTRA_mmafm_DEPENDENCIES)
+ @rm -f mmafm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mmafm_OBJECTS) $(mmafm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc
new file mode 100644
index 00000000000..67e635f662a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/main.cc
@@ -0,0 +1,434 @@
+/* main.cc -- driver for mmafm program
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/findmet.hh>
+#include <efont/psres.hh>
+#include <lcdf/slurper.hh>
+#include <efont/afm.hh>
+#include <efont/afmw.hh>
+#include <efont/amfm.hh>
+#include <lcdf/error.hh>
+#include <lcdf/clp.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+
+#define WEIGHT_OPT 300
+#define WIDTH_OPT 301
+#define OPSIZE_OPT 302
+#define STYLE_OPT 303
+#define N1_OPT 304
+#define N2_OPT 305
+#define N3_OPT 306
+#define N4_OPT 307
+#define VERSION_OPT 308
+#define HELP_OPT 309
+#define OUTPUT_OPT 310
+#define PRECISION_OPT 311
+#define KERN_PREC_OPT 312
+
+const Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ValDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ValDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ValDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ValDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ValDouble, 0 },
+ { "optical-size", 'O', OPSIZE_OPT, Clp_ValDouble, 0 },
+ { "style", 0, STYLE_OPT, Clp_ValDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ValDouble, 0 },
+ { "min-kern", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "minimum-kern", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "kern-precision", 'k', KERN_PREC_OPT, Clp_ValDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ValInt, 0 },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+};
+
+using namespace Efont;
+
+
+static const char *program_name;
+static ErrorHandler *errh;
+static AmfmMetrics *amfm;
+
+static Vector<PermString> ax_names;
+static Vector<int> ax_nums;
+static Vector<double> values;
+
+static void
+set_design(PermString a, double v)
+{
+ ax_names.push_back(a);
+ ax_nums.push_back(-1);
+ values.push_back(v);
+}
+
+static void
+set_design(int a, double v)
+{
+ ax_names.push_back(PermString());
+ ax_nums.push_back(a);
+ values.push_back(v);
+}
+
+static void
+set_amfm(AmfmMetrics *a)
+{
+ if (a) {
+ if (amfm) errh->fatal("already read one AMFM file");
+ amfm = a;
+ }
+}
+
+
+// apply precision
+static inline void
+pround(double &v, double multiplier, double divider)
+{
+ if (KNOWN(v))
+ v = floor(v * multiplier + 0.5) * divider;
+}
+
+static void
+apply_precision(Metrics *m, int precision)
+{
+ if (precision < 0)
+ return;
+
+ double multiplier = 1, divider = 1;
+ for (int i = 0; i < precision; i++)
+ multiplier *= 10, divider /= 10;
+
+ for (int i = 0; i < m->nfd(); i++)
+ pround(m->fd(i), multiplier, divider);
+
+ for (int i = 0; i < m->nglyphs(); i++) {
+ pround(m->wd(i), multiplier, divider);
+ pround(m->lf(i), multiplier, divider);
+ pround(m->bt(i), multiplier, divider);
+ pround(m->rt(i), multiplier, divider);
+ pround(m->tp(i), multiplier, divider);
+ }
+
+ for (int i = 0; i < m->nkv(); i++)
+ pround(m->kv(i), multiplier, divider);
+}
+
+static void
+apply_kern_precision(Metrics *m, double kern_precision)
+{
+ if (kern_precision <= 0)
+ return;
+
+ for (int i = 0; i < m->nkv(); i++)
+ if (fabs(m->kv(i)) < kern_precision)
+ m->kv(i) = 0;
+}
+
+
+static void
+read_file(const char *fn, MetricsFinder *finder)
+{
+ Filename filename;
+ FILE *file;
+
+ if (strcmp(fn, "-") == 0) {
+ filename = Filename("<stdin>");
+ file = stdin;
+ } else {
+ filename = Filename(fn);
+ file = filename.open_read();
+ }
+ int save_errno = errno;
+
+ if (!file) {
+ // look for a font by name
+ AmfmMetrics *new_amfm = finder->find_amfm(fn, errh);
+ if (new_amfm) {
+ set_amfm(new_amfm);
+ return;
+ }
+ if (finder->find_metrics(fn, errh))
+ return;
+
+ // check for instance name. don't use InstanceMetricsFinder.
+ const char *underscore = strchr(fn, '_');
+ if (underscore)
+ new_amfm = finder->find_amfm(PermString(fn, underscore - fn), errh);
+ if (!new_amfm)
+ errh->fatal("%s: %s", fn, strerror(save_errno));
+ set_amfm(new_amfm);
+
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ set_design(i, x);
+ i++;
+ }
+ return;
+ }
+
+ Slurper slurper(filename, file);
+ bool is_afm = false;
+ if (file != stdin) {
+ char *first_line = slurper.peek_line();
+ if (first_line)
+ is_afm = strncmp(first_line, "StartFontMetrics", 16) == 0;
+ }
+
+ if (is_afm) {
+ Metrics *afm = AfmReader::read(slurper, errh);
+ if (afm)
+ finder->record(afm);
+ } else
+ set_amfm(AmfmReader::read(slurper, finder, errh));
+}
+
+
+static void
+usage_error(const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION | FONT]...", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+static void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Mmafm%> creates an AFM font metrics file for a multiple master font by\n\
+interpolating at a point you specify and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTION | FONT]...\n\
+\n\
+Each FONT is either an AFM or AMFM file name, or the font name of a multiple\n\
+master font. In the second case, mmafm will find the actual AMFM file using\n\
+the PSRESOURCEPATH environment variable.\n\
+\n\
+General options:\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -h, --help Print this message and exit.\n\
+ -v, --version Print version number and warranty and exit.\n\
+\n\
+Interpolation settings:\n\
+ -w, --weight=N Set weight to N.\n\
+ -W, --width=N Set width to N.\n\
+ -O, --optical-size=N Set optical size to N.\n\
+ --style=N Set style axis to N.\n\
+ --1=N, --2=N, --3=N, --4=N Set first (second, third, fourth) axis to N.\n\
+ -p, --precision=N Allow N digits of fraction (default 3).\n\
+ -k, --min-kern=N Remove kerns smaller than N (default 2).\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ MetricsFinder *finder = new CacheMetricsFinder;
+
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+ PsresMetricsFinder *psres_finder = new PsresMetricsFinder(psres);
+ finder->add_finder(psres_finder);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+
+ FILE *output_file = 0;
+ int precision = 3;
+ double kern_precision = 2.0;
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case WEIGHT_OPT:
+ set_design("Weight", clp->val.d);
+ break;
+
+ case WIDTH_OPT:
+ set_design("Width", clp->val.d);
+ break;
+
+ case OPSIZE_OPT:
+ set_design("OpticalSize", clp->val.d);
+ break;
+
+ case STYLE_OPT:
+ set_design("Style", clp->val.d);
+ break;
+
+ case N1_OPT:
+ case N2_OPT:
+ case N3_OPT:
+ case N4_OPT:
+ set_design(opt - N1_OPT, clp->val.d);
+ break;
+
+ case PRECISION_OPT:
+ precision = clp->val.i;
+ break;
+
+ case KERN_PREC_OPT:
+ kern_precision = clp->val.d;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file) errh->fatal("output file already specified");
+ if (strcmp(clp->vstr, "-") == 0)
+ output_file = stdout;
+ else {
+ output_file = fopen(clp->vstr, "wb");
+ if (!output_file)
+ errh->fatal("%s: %s", clp->vstr, strerror(errno));
+ }
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case VERSION_OPT:
+ printf("mmafm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ read_file(clp->vstr, finder);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(0);
+ break;
+
+ }
+ }
+
+ done:
+ if (!amfm) usage_error("missing font argument");
+
+ MultipleMasterSpace *mmspace = amfm->mmspace();
+#if MMAFM_RUN_MMPFB
+ if (!mmspace->check_intermediate()) {
+ char *buf = new char[amfm->font_name().length() + 30];
+ sprintf(buf, "mmpfb -q --amcp-info '%s'", amfm->font_name().c_str());
+
+ FILE *f = popen(buf, "r");
+ if (f) {
+ Filename fake("<mmpfb output>");
+ Slurper slurpy(fake, f);
+ AmfmReader::add_amcp_file(slurpy, amfm, errh);
+ pclose(f);
+ }
+
+ delete[] buf;
+ }
+#endif
+
+ Vector<double> design = mmspace->default_design_vector();
+ for (int i = 0; i < values.size(); i++)
+ if (ax_names[i])
+ mmspace->set_design(design, ax_names[i], values[i], errh);
+ else
+ mmspace->set_design(design, ax_nums[i], values[i], errh);
+
+ Vector<double> weight;
+ if (!mmspace->design_to_weight(design, weight, errh)) {
+ if (!mmspace->check_intermediate()) {
+ errh->message("(I can%,t interpolate font programs with intermediate masters on my own.");
+#if MMAFM_RUN_MMPFB
+ errh->message("I tried to run %<mmpfb --amcp-info %s%>, but it didn't work.", amfm->font_name().c_str());
+ errh->message("Maybe your PSRESOURCEPATH environment variable is not set?");
+#endif
+ errh->fatal("See the manual page for more information.)");
+ } else
+ errh->fatal("can%,t create weight vector");
+ }
+
+ // Need to check for case when all design coordinates are unspecified. The
+ // AMFM file contains a default WeightVector, but often NOT a default
+ // DesignVector; we don't want to generate a file with a FontName like
+ // `MyriadMM_-9.79797979e97_-9.79797979e97_' because the DesignVector
+ // components are unknown.
+ if (!KNOWN(design[0]))
+ errh->fatal("must specify %s%,s %s coordinate", amfm->font_name().c_str(),
+ mmspace->axis_type(0).c_str());
+
+ Metrics *m = amfm->interpolate(design, weight, errh);
+ if (m) {
+
+ // Add a comment identifying this as interpolated by mmafm
+ if (MetricsXt *xt = m->find_xt("AFM")) {
+ AfmMetricsXt *afm_xt = (AfmMetricsXt *)xt;
+
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ int time_len = strlen(time_str) - 1;
+ char *buf = new char[strlen(VERSION) + time_len + 100];
+ sprintf(buf, "Interpolated by mmafm-%s on %.*s.", VERSION,
+ time_len, time_str);
+#else
+ char *buf = new char[strlen(VERSION) + 100];
+ sprintf(buf, "Interpolated by mmafm-%s.", VERSION);
+#endif
+
+ afm_xt->opening_comments.push_back(buf);
+ afm_xt->opening_comments.push_back("Mmafm is free software. See <http://www.lcdf.org/type/>.");
+ delete[] buf;
+ }
+
+ // round numbers if necessary
+ if (precision >= 0)
+ apply_precision(m, precision);
+ if (kern_precision > 0)
+ apply_kern_precision(m, kern_precision);
+
+ // write the output file
+ if (!output_file)
+ output_file = stdout;
+ AfmWriter::write(m, output_file);
+
+ return 0;
+ } else
+ return 1;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1
new file mode 100644
index 00000000000..58be625b366
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmafm/mmafm.1
@@ -0,0 +1,178 @@
+.\" -*-nroff-*-
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de Op
+.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Oy
+.BI "\\$1\fR=" "\\$2\fR, " "\\$3\& " "\\$4" "\\$5" "\\$6"
+..
+.de Ol
+.BI "\\$1\fR=" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.de Es
+.Sp
+.RS 5
+.nf
+..
+.de Ee
+.fi
+.RE
+.PP
+..
+.TH MMAFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+mmafm \- creates AFM font metrics for multiple master fonts
+'
+.SH SYNOPSIS
+.B mmafm
+\%[OPTIONS...]
+.I font
+'
+.SH DESCRIPTION
+.B Mmafm
+creates AFM font metrics for PostScript multiple master fonts by
+interpolation. You pass it an AMFM file (multiple master font metrics) and
+options specifying the design point you want, and it writes the resulting
+AFM file to the standard output.
+.PP
+Each
+.I font
+argument is either the filename of an AFM or AMFM font metrics file, or a
+PostScript font name. If you give a font name,
+.B mmafm
+will look up the actual font metrics file using the PSRESOURCEPATH
+environment variable. This colon-separated path is searched for `PSres.upr'
+files, an Adobe method for indexing PostScript resources.
+.PP
+You can also give the name of a multiple master font instance, like
+`MinionMM_367_400_12_'.
+.B Mmafm
+will parse the font name and create that instance for you. `PSres.upr'
+files must be set up for this to work.
+.PP
+Any multiple master font should be distributed with a single AMFM file and
+several AFM files (one for each master). For Myriad, for example, the AMFM
+file is MyriadMM.amfm and the AFM files are MyriadMM-LightCn.afm,
+MyriadMM-LightSemiEx.afm, MyriadMM-BlackCn.afm, and
+MyriadMM-BlackSemiEx.afm.
+.B Mmafm
+needs to find all these files to function. For fonts in the Adobe type
+library, you can download the necessary files from
+<http://www.lcdf.org/type>; look for the mm-metrics package.
+.PP
+You must always supply the AMFM file (or its font name) on the command
+line, but
+.B mmafm
+will look for any required AFM files you don't supply yourself. It tries
+the PSRESOURCEPATH environment variable, and also looks for files named
+`\fIFontName\fR.afm' or `\fIFontName\fR.AFM' in the directory that
+contained the AMFM file. (The Myriad filenames given above fit this
+pattern.)
+.PP
+.B Mmafm
+supports fonts with intermediate masters, like Adobe Jenson and Kepler. If
+your PSRESOURCEPATH environment variable is set up, it will handle these
+fonts automatically. Otherwise, you must first run
+.RB ` "mmpfb \-\-amcp\-info" '
+on the font outline files to create auxiliary AMCP files for these fonts.
+Each AMCP file should be in the same directory as its corresponding AMFM
+file and should have the same root filename, but with a `.amcp' extension
+instead of `.amfm'. See
+.M mmpfb 1
+for more information.
+'
+'
+.SH EXAMPLE
+'
+.nf
+% mmafm \-\-weight=400 \-\-width=600 MyriadMM.amfm > MyriadMM_400_600_.afm
+.fi
+'
+.SH OPTIONS
+Long options may be abbreviated to their unique prefixes.
+'
+.TP 5
+.Oy \-\-output file \-o file
+Send output to
+.I file
+instead of standard output.
+'
+.TP
+.Oy \-\-weight N \-w N
+Set the weight axis to
+.IR N .
+'
+.TP
+.Oy \-\-width N \-W N
+Set the width axis to
+.IR N .
+'
+.TP
+.Oy \-\-optical\-size N \-O N
+Set the optical size axis to
+.IR N .
+'
+.TP
+.Ol \-\-style N
+Set the style axis to
+.IR N .
+.TP
+\fB\-\-1\fR=\fIN\fR (\fB\-\-2\fR=\fIN\fR, \fB\-\-3\fR=\fIN\fR, \fB\-\-4\fR=\fIN\fR)
+Set the first (second, third, fourth) axis to
+.IR N .
+'
+.TP
+.Oy \-\-precision N \-p N
+Round output numbers so they have at most
+.I N
+digits after the decimal point. Smaller numbers are less precise; `\fB\-p
+\fR0' rounds all numbers to integers. The default precision is 3.
+'
+.TP
+.Oy \-\-min\-kern N \-k N
+Only output kerning pairs whose absolute value is
+.IR N
+or larger. Smaller minimum kerns make kerning more precise and the output
+AFM file bigger. The default minimum kern is 2.0.
+'
+.SH TROUBLESHOOTING
+.PP
+Some programs, such as TeX's
+.BR fontinst ,
+can choke on AFM files that include fractional numbers. Therefore, if you
+have trouble with an AFM file, try rerunning
+.B mmafm
+with the
+.Op \-\-precision=0
+option.
+'
+.SH SEE ALSO
+.M mmpfb 1
+'
+.SH DIAGNOSTICS
+.TP 5
+\fIFont\fR requires intermediate master conversion programs
+You haven't yet created an AMCP file for \fIFont\fR.
+'
+.SH AUTHOR
+.na
+Eddie Kohler, ekohler@gmail.com
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
+.br
+AMFM and AFM files for Adobe Type Library fonts are also available at that
+URL.
+.PP
+Thanks to Melissa O'Neill for suggestions and patient
+debugging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.am
new file mode 100644
index 00000000000..d1b8d0370d1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.am
@@ -0,0 +1,17 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = mmpfb
+man_MANS = mmpfb.1
+
+mmpfb_SOURCES = myfont.cc myfont.hh \
+ main.cc \
+ t1minimize.cc t1minimize.hh \
+ t1rewrit.cc t1rewrit.hh
+
+mmpfb_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = mmpfb.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.in
new file mode 100644
index 00000000000..a6991dea01d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/Makefile.in
@@ -0,0 +1,781 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = mmpfb$(EXEEXT)
+subdir = lcdf-typetools-src/mmpfb
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_mmpfb_OBJECTS = myfont.$(OBJEXT) main.$(OBJEXT) \
+ t1minimize.$(OBJEXT) t1rewrit.$(OBJEXT)
+mmpfb_OBJECTS = $(am_mmpfb_OBJECTS)
+mmpfb_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/main.Po ./$(DEPDIR)/myfont.Po \
+ ./$(DEPDIR)/t1minimize.Po ./$(DEPDIR)/t1rewrit.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(mmpfb_SOURCES)
+DIST_SOURCES = $(mmpfb_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = mmpfb.1
+mmpfb_SOURCES = myfont.cc myfont.hh \
+ main.cc \
+ t1minimize.cc t1minimize.hh \
+ t1rewrit.cc t1rewrit.hh
+
+mmpfb_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = mmpfb.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/mmpfb/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/mmpfb/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mmpfb$(EXEEXT): $(mmpfb_OBJECTS) $(mmpfb_DEPENDENCIES) $(EXTRA_mmpfb_DEPENDENCIES)
+ @rm -f mmpfb$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(mmpfb_OBJECTS) $(mmpfb_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/myfont.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1minimize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rewrit.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/myfont.Po
+ -rm -f ./$(DEPDIR)/t1minimize.Po
+ -rm -f ./$(DEPDIR)/t1rewrit.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/myfont.Po
+ -rm -f ./$(DEPDIR)/t1minimize.Po
+ -rm -f ./$(DEPDIR)/t1rewrit.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc
new file mode 100644
index 00000000000..8b742f77c55
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/main.cc
@@ -0,0 +1,463 @@
+/* main.cc -- driver for mmpfb program
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1mm.hh>
+#include "myfont.hh"
+#include "t1rewrit.hh"
+#include "t1minimize.hh"
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+#define WEIGHT_OPT 300
+#define WIDTH_OPT 301
+#define OPSIZE_OPT 302
+#define STYLE_OPT 303
+#define N1_OPT 304
+#define N2_OPT 305
+#define N3_OPT 306
+#define N4_OPT 307
+#define VERSION_OPT 308
+#define AMCP_INFO_OPT 309
+#define HELP_OPT 310
+#define PFA_OPT 311
+#define PFB_OPT 312
+#define OUTPUT_OPT 313
+#define QUIET_OPT 314
+#define PRECISION_OPT 315
+#define SUBRS_OPT 316
+#define MINIMIZE_OPT 317
+
+const Clp_Option options[] = {
+ { "1", '1', N1_OPT, Clp_ValDouble, 0 },
+ { "2", '2', N2_OPT, Clp_ValDouble, 0 },
+ { "3", '3', N3_OPT, Clp_ValDouble, 0 },
+ { "4", '4', N4_OPT, Clp_ValDouble, 0 },
+ { "amcp-info", 0, AMCP_INFO_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "minimize", 'm', MINIMIZE_OPT, 0, Clp_Negate },
+ { "optical-size", 'O', OPSIZE_OPT, Clp_ValDouble, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "precision", 'p', PRECISION_OPT, Clp_ValUnsigned, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "style", 0, STYLE_OPT, Clp_ValDouble, 0 },
+ { "subrs", 0, SUBRS_OPT, Clp_ValInt, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+ { "wd", 0, WIDTH_OPT, Clp_ValDouble, 0 },
+ { "weight", 'w', WEIGHT_OPT, Clp_ValDouble, 0 },
+ { "width", 'W', WIDTH_OPT, Clp_ValDouble, 0 },
+ { "wt", 0, WEIGHT_OPT, Clp_ValDouble, 0 },
+};
+
+using namespace Efont;
+
+static const char *program_name;
+static ErrorHandler *errh;
+static MyFont *font;
+static MultipleMasterSpace *mmspace;
+
+static Vector<PermString> ax_names;
+static Vector<int> ax_nums;
+static Vector<double> values;
+
+
+void
+usage_error(const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Mmpfb%> creates a single-master PostScript Type 1 font by interpolating a\n\
+multiple master font at a point you specify. The resulting font does not\n\
+contain multiple master extensions. It is written to the standard output.\n\
+\n\
+Usage: %s [OPTION]... FONT\n\
+\n\
+FONT is either the name of a PFA or PFB multiple master font file, or a\n\
+PostScript font name. In the second case, mmpfb will find the actual outline\n\
+file using the PSRESOURCEPATH environment variable.\n\
+\n\
+General options:\n\
+ --amcp-info Print AMCP info, if necessary, and exit.\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -p, --precision=N Set precision to N (larger means more precise).\n\
+ --subrs=N Limit output font to at most N subroutines.\n\
+ --no-minimize Do not replace original font%,s PostScript code.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ -v, --version Print version number and exit.\n\
+\n\
+Interpolation settings:\n\
+ -w, --weight=N Set weight to N.\n\
+ -W, --width=N Set width to N.\n\
+ -O, --optical-size=N Set optical size to N.\n\
+ --style=N Set style axis to N.\n\
+ --1=N, --2=N, --3=N, --4=N Set first (second, third, fourth) axis to N.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+static void
+set_design(PermString a, double v)
+{
+ ax_names.push_back(a);
+ ax_nums.push_back(-1);
+ values.push_back(v);
+}
+
+static void
+set_design(int a, double v)
+{
+ ax_names.push_back(PermString());
+ ax_nums.push_back(a);
+ values.push_back(v);
+}
+
+void
+do_file(const char *filename, PsresDatabase *psres)
+{
+ FILE *f;
+ if (strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript or instance name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ const char *underscore = strchr(filename, '_');
+ if (!fn && underscore) {
+ fn = psres->filename_value
+ ("FontOutline", PermString(filename, underscore - filename));
+ int i = 0;
+ while (underscore[0] == '_' && underscore[1]) {
+ double x = strtod(underscore + 1, const_cast<char **>(&underscore));
+ set_design(i, x);
+ i++;
+ }
+ }
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ font = new MyFont(*reader);
+ delete reader;
+ if (!font->ok())
+ errh->fatal("%s: invalid font", filename);
+ else if (font->nglyphs() == 0)
+ errh->fatal("%s: font contains no characters", filename);
+
+ mmspace = font->create_mmspace(errh);
+ if (!mmspace)
+ errh->fatal("%s: not a multiple master font", filename);
+
+ font->undo_synthetic();
+}
+
+
+static void
+print_conversion_program(FILE *f, const Type1Charstring &cs, PermString name)
+{
+ if (cs) {
+ const unsigned char *data = cs.data();
+ for (int i = 0; i < cs.length(); ) {
+ int l = cs.length() - i;
+ if (l > 32)
+ l = 32;
+ fprintf(f, "%s <", name.c_str());
+ for (int j = 0; j < l; j++)
+ fprintf(f, "%02X", data[j]);
+ fprintf(f, ">\n");
+ data += l;
+ i += l;
+ }
+ }
+}
+
+
+static void
+print_amcp_info(MultipleMasterSpace *mmspace, FILE *f)
+{
+ const Type1Charstring &ndv = mmspace->ndv();
+ const Type1Charstring &cdv = mmspace->cdv();
+ if (!ndv && !cdv)
+ fprintf(stderr, "%s does not have conversion programs.\n",
+ mmspace->font_name().c_str());
+ else {
+ fprintf(f, "StartConversionPrograms %d %d\n", ndv.length(),
+ cdv.length());
+ print_conversion_program(f, ndv, "NDV");
+ print_conversion_program(f, cdv, "CDV");
+ fprintf(f, "EndConversionPrograms\n");
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ bool write_pfb = true;
+ bool amcp_info = false;
+ bool minimize = true;
+ int precision = 5;
+ int subr_count = -1;
+ FILE *outfile = 0;
+ ::errh =
+ ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case WEIGHT_OPT:
+ set_design("Weight", clp->val.d);
+ break;
+
+ case WIDTH_OPT:
+ set_design("Width", clp->val.d);
+ break;
+
+ case OPSIZE_OPT:
+ set_design("OpticalSize", clp->val.d);
+ break;
+
+ case STYLE_OPT:
+ set_design("Style", clp->val.d);
+ break;
+
+ case N1_OPT:
+ case N2_OPT:
+ case N3_OPT:
+ case N4_OPT:
+ set_design(opt - N1_OPT, clp->val.d);
+ break;
+
+ case AMCP_INFO_OPT:
+ amcp_info = true;
+ break;
+
+ case PFA_OPT:
+ write_pfb = false;
+ break;
+
+ case PFB_OPT:
+ write_pfb = true;
+ break;
+
+ case PRECISION_OPT:
+ if (clp->val.i > 107) {
+ errh->warning("precision lowered to 107");
+ precision = 107;
+ } else if (clp->val.i < 1) {
+ errh->warning("precision raised to 1");
+ precision = 1;
+ } else
+ precision = clp->val.i;
+ break;
+
+ case SUBRS_OPT:
+ if (clp->negated)
+ subr_count = -1;
+ else if (clp->val.i <= 0)
+ errh->warning("subr count too small");
+ else
+ subr_count = clp->val.i;
+ break;
+
+ case MINIMIZE_OPT:
+ minimize = !clp->negated;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case OUTPUT_OPT:
+ if (outfile) errh->fatal("output file already specified");
+ if (strcmp(clp->vstr, "-") == 0)
+ outfile = stdout;
+ else {
+ outfile = fopen(clp->vstr, "wb");
+ if (!outfile)
+ errh->fatal("%s: %s", clp->vstr, strerror(errno));
+ }
+ break;
+
+ case VERSION_OPT:
+ printf("mmpfb (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1997-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ do_file(clp->vstr, psres);
+ break;
+
+ case Clp_Done:
+ if (!font)
+ usage_error("missing font argument");
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (outfile == 0)
+ outfile = stdout;
+
+ if (amcp_info) {
+ print_amcp_info(mmspace, outfile);
+ exit(0);
+ }
+
+ Vector<double> design = mmspace->empty_design_vector();
+ for (int i = 0; i < values.size(); i++)
+ if (ax_names[i])
+ mmspace->set_design(design, ax_names[i], values[i], errh);
+ else
+ mmspace->set_design(design, ax_nums[i], values[i], errh);
+
+ Vector<double> default_design = mmspace->default_design_vector();
+ for (int i = 0; i < mmspace->naxes(); i++)
+ if (!KNOWN(design[i]) && KNOWN(default_design[i])) {
+ errh->warning("using default value %g for %s%,s %s", default_design[i],
+ font->font_name().c_str(), mmspace->axis_type(i).c_str());
+ design[i] = default_design[i];
+ }
+
+ if (!font->set_design_vector(mmspace, design, errh))
+ exit(1);
+
+ font->interpolate_dicts(minimize, errh);
+ font->interpolate_charstrings(precision, errh);
+
+ if (subr_count >= 0) {
+ Type1SubrRemover sr(font, errh);
+ sr.run(subr_count);
+ }
+
+ font->fill_in_subrs();
+
+ Type1Font *t1font;
+ if (minimize) {
+ t1font = ::minimize(font);
+ delete font;
+ } else
+ t1font = font;
+
+ { // Add an identifying comment.
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ int time_len = strlen(time_str) - 1;
+ char *buf = new char[strlen(VERSION) + time_len + 100];
+ sprintf(buf, "%%%% Interpolated by mmpfb-%s on %.*s.", VERSION,
+ time_len, time_str);
+#else
+ char *buf = new char[strlen(VERSION) + 100];
+ sprintf(buf, "%%%% Interpolated by mmpfb-%s.", VERSION);
+#endif
+
+ t1font->add_header_comment(buf);
+ t1font->add_header_comment("%% Mmpfb is free software. See <http://www.lcdf.org/type/>.");
+ delete[] buf;
+ }
+
+ if (write_pfb) {
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outfile), _O_BINARY);
+#endif
+ Type1PFBWriter w(outfile);
+ t1font->write(w);
+ } else {
+ Type1PFAWriter w(outfile);
+ t1font->write(w);
+ }
+
+ return 0;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1
new file mode 100644
index 00000000000..42dadb72bf5
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/mmpfb.1
@@ -0,0 +1,206 @@
+.\" -*-nroff-*-
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.ds E " \-\-
+.if t .ds E \(em
+.de Op
+.BR "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Oy
+.BI "\\$1\fR=" "\\$2\fR, " "\\$3\& " "\\$4" "\\$5" "\\$6"
+..
+.de Ol
+.BI "\\$1\fR=" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH MMPFB 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+mmpfb \- creates single-master fonts from multiple master fonts
+'
+.SH SYNOPSIS
+.B mmpfb
+\%[OPTIONS...]
+.I font
+'
+.SH DESCRIPTION
+.B Mmpfb
+creates a normal, single-master PostScript font from a multiple master font
+by interpolation. You pass it a PFB or PFA font and options specifying the
+design point you want; it writes the resulting PFB or PFA font to the
+standard output.
+.PP
+The fonts
+.B mmpfb
+creates are interpolated at a low level to remove multiple master
+instructions from individual characters. Therefore, they can be used by
+programs that don't normally understand multiple master fonts, like
+.BR ps2pk (1).
+.PP
+.B Mmpfb
+supports fonts with intermediate masters, like Adobe Jenson and Kepler. It
+can also create AMCP (Adobe Multiple Master Conversion Program) files for
+use by
+.M mmafm 1 ;
+see
+.B \-\-amcp\-info
+below.
+.PP
+The
+.I font
+argument is either the name of a PFA or PFB font file, or a PostScript font
+name. If you give a font name,
+.B mmpfb
+will find the actual outline file using the PSRESOURCEPATH environment
+variable. This colon-separated path is searched for `PSres.upr' files, an
+Adobe method for indexing PostScript resources.
+.PP
+You can also give the name of a multiple
+master font instance, like `MinionMM_367_400_12_'.
+.B Mmpfb
+will parse the font name and create that instance for you. `PSres.upr'
+files must be set up for this to work.
+'
+'
+.SH EXAMPLE
+'
+.nf
+% mmpfb \-\-weight=400 \-\-width=600 MyriadMM.pfb > MyriadMM_400_600_.pfb
+.fi
+'
+.SH OPTIONS
+Long options may be abbreviated to their unique prefixes.
+'
+.TP 5
+.Oy \-\-output file \-o file
+'
+Send output to
+.I file
+instead of standard output.
+'
+.TP
+.BR \-\-pfb ", " \-b
+'
+Output a PFB font. This is the default.
+'
+.TP
+.BR \-\-pfa ", " \-a
+'
+Output a PFA font.
+'
+.TP
+.Op \-\-amcp\-info
+'
+Do not create a font; instead, output an AMCP file for use by
+.M mmafm 1 .
+A message is printed if the font doesn't have intermediate masters, in
+which case no AMCP file is necessary.
+'
+.TP
+.Oy \-\-weight N \-w N
+'
+Set the weight axis to
+.IR N .
+'
+.TP
+.Oy \-\-width N \-W N
+'
+Set the width axis to
+.IR N .
+'
+.TP
+.Oy \-\-optical\-size N \-O N
+'
+Set the optical size axis to
+.IR N .
+'
+.TP
+.Ol \-\-style N
+'
+Set the style axis to
+.IR N .
+.TP
+\fB\-\-1\fR=\fIN\fR (\fB\-\-2\fR=\fIN\fR, \fB\-\-3\fR=\fIN\fR, \fB\-\-4\fR=\fIN\fR)
+'
+Set the first (second, third, fourth) axis to
+.IR N .
+'
+.TP
+.Oy \-\-precision N \-p N
+'
+Set the output precision to
+.IR N .
+Higher values mean the control points in the output font will be more
+exactly aligned; lower values (1 or 2) create smaller output font
+files, and are close enough for most purposes. A precision of
+.IR N
+means that each point will be within
+.RI 1/ N
+font units of the exact interpolated value. (A font unit is generally
+1/7200 inch for a 10-point font.) The default is 5.
+'
+.TP
+.Ol \-\-subrs N
+'
+Limit the output font to at most
+.IR N
+subroutines. 256 is a good value for
+.IR N .
+'
+.TP
+.BR \-\-no\-minimize
+'
+Do not minimize the output font definition. By default,
+.B mmpfb
+removes extra PostScript code and dictionary definitions from the font.
+Supply the
+.B \-\-no\-minimize
+option to avoid this behavior.
+'
+.SH TROUBLESHOOTING
+.LP
+The "IBM" Type 1 font interpreter shipped as part of the X font server and
+.B ps2pk
+(among others) is inappropriately strict about PostScript code embedded in
+a font. The
+.B \-\-minimize
+option (now the default) fixes this problem.
+.LP
+Some versions of Adobe Acrobat Distiller may report "Warning: unable to
+embed font X. Invalid character outline data" when distilling an instance
+generated by
+.BR mmpfb .
+This is due to a limitation in the number of font subroutines Distiller can
+accept. (Multiple master fonts, and the single-master fonts generated by
+.BR mmpfb ,
+tend to have a lot of subroutines.) Try limiting the number of subroutines
+in the generated font with the
+.Op \-\-subrs
+option.
+'
+.SH SEE ALSO
+.M mmafm 1
+'
+.SH DIAGNOSTICS
+.TP 5
+reducing \fIfont\fR to minimum number of subroutines (\fIN\fR)
+You tried to reduce the number of subroutines to less than \fIN\fR using
+the
+.Op \-\-subrs
+option, but the font needs at least \fIN\fR to function. The output font
+will have \fIN\fR subroutines.
+'
+.SH AUTHOR
+.na
+Eddie Kohler, ekohler@gmail.com
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
+.PP
+Thanks to Melissa O'Neill for suggestions and patient
+debugging.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc
new file mode 100644
index 00000000000..7a58a32d170
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.cc
@@ -0,0 +1,300 @@
+/* myfont.cc -- general multiple- to single-master conversion
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "myfont.hh"
+#include <efont/t1item.hh>
+#include <efont/t1interp.hh>
+#include "t1rewrit.hh"
+#include <efont/t1mm.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+using namespace Efont;
+
+MyFont::MyFont(Type1Reader &reader)
+ : Type1Font(reader)
+{
+}
+
+MyFont::~MyFont()
+{
+}
+
+void
+MyFont::kill_def(Type1Definition *t1d, int whichd)
+{
+ if (!t1d)
+ return;
+
+ if (whichd < 0)
+ for (whichd = dFont; whichd < dLast; whichd = (Dict)(whichd + 1))
+ if (dict(whichd, t1d->name()) == t1d)
+ break;
+ if (whichd < 0 || whichd >= dLast || dict(whichd, t1d->name()) != t1d)
+ return;
+
+ int icount = nitems();
+ for (int i = first_dict_item(whichd); i < icount; i++)
+ if (item(i) == t1d) {
+ StringAccum sa;
+ sa << '%';
+ t1d->gen(sa);
+ PermString name = t1d->name();
+ Type1CopyItem *t1ci = new Type1CopyItem(sa.take_string());
+ set_item(i, t1ci);
+ set_dict(whichd, name, 0);
+ return;
+ }
+
+ assert(0);
+}
+
+bool
+MyFont::set_design_vector(MultipleMasterSpace *mmspace, const Vector<double> &design, ErrorHandler *errh)
+{
+ Type1Definition *t1d = dict("DesignVector");
+ if (t1d) {
+ t1d->set_numvec(design);
+ kill_def(t1d, dFont);
+ }
+
+ t1d = dict("NormDesignVector");
+ if (t1d) {
+ NumVector norm_design;
+ if (mmspace->design_to_norm_design(design, norm_design))
+ t1d->set_numvec(norm_design);
+ kill_def(t1d, dFont);
+ }
+
+ if (!mmspace->design_to_weight(design, _weight_vector, errh))
+ return false;
+
+ // Need to check for case when all design coordinates are unspecified. The
+ // font file contains a default WeightVector, but possibly NOT a default
+ // DesignVector; we don't want to generate a FontName like
+ // `MyriadMM_-9.79797979e97_-9.79797979e97_' because the DesignVector
+ // components are unknown.
+ if (!KNOWN(design[0])) {
+ errh->error("must specify %s%,s %s coordinate", font_name().c_str(),
+ mmspace->axis_type(0).c_str());
+ return false;
+ }
+
+ t1d = dict("WeightVector");
+ if (t1d) {
+ t1d->set_numvec(_weight_vector);
+ kill_def(t1d, dFont);
+ }
+
+ int naxes = design.size();
+ _nmasters = _weight_vector.size();
+
+ PermString name;
+ t1d = dict("FontName");
+ if (t1d && t1d->value_name(name)) {
+ StringAccum sa(name);
+ for (int a = 0; a < naxes; a++)
+ sa << '_' << design[a];
+ // Multiple masters require an underscore AFTER the font name
+ sa << '_';
+ t1d->set_name(sa.c_str());
+ uncache_defs(); // remove cached font name
+ }
+
+ // add a FullName too
+ String full_name;
+ t1d = fi_dict("FullName");
+ if (t1d && t1d->value_string(full_name)) {
+ StringAccum sa(full_name);
+ for (int a = 0; a < naxes; a++) {
+ sa << (a ? ' ' : '_') << design[a];
+ PermString label = mmspace->axis_abbreviation(a);
+ if (label)
+ sa << ' ' << label;
+ }
+ t1d->set_string(sa.c_str());
+ }
+
+ // save UniqueID, then kill its definition
+ int uniqueid;
+ t1d = dict("UniqueID");
+ bool have_uniqueid = (t1d && t1d->value_int(uniqueid));
+ kill_def(t1d, dFont);
+
+ // prepare XUID
+ t1d = dict("XUID");
+ NumVector xuid;
+ if (!t1d || !t1d->value_numvec(xuid)) {
+ if (have_uniqueid) {
+ t1d = ensure(dFont, "XUID");
+ xuid.clear();
+ xuid.push_back(1);
+ xuid.push_back(uniqueid);
+ } else if (t1d) {
+ kill_def(t1d, dFont);
+ t1d = 0;
+ }
+ }
+ if (t1d) {
+ // Append design vector values to the XUID to prevent cache pollution.
+ for (int a = 0; a < naxes; a++)
+ xuid.push_back((int)(design[a] * 100));
+ t1d->set_numvec(xuid);
+ }
+
+ return true;
+}
+
+void
+MyFont::interpolate_dict_int(PermString name, Dict the_dict, ErrorHandler *errh)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ NumVector blend;
+
+ if (def && blend_def && blend_def->value_numvec(blend)) {
+ int n = _nmasters;
+ double val = 0;
+ for (int m = 0; m < n; m++)
+ val += blend[m] * _weight_vector[m];
+ int ival = (int)floor(val + 0.50001);
+ if (fabs(val - ival) >= 0.001)
+ errh->warning("interpolated %s should be an integer (it is %g)", name.c_str(), val);
+ def->set_num(ival);
+ kill_def(blend_def, the_dict + dBlend);
+ }
+}
+
+void
+MyFont::interpolate_dict_num(PermString name, Dict the_dict, bool force_integer)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ NumVector blend;
+
+ if (def && blend_def && blend_def->value_numvec(blend)) {
+ int n = _nmasters;
+ double val = 0;
+ for (int m = 0; m < n; m++)
+ val += blend[m] * _weight_vector[m];
+ if (force_integer)
+ val = floor(val + 0.50001);
+ def->set_num(val);
+ kill_def(blend_def, the_dict + dBlend);
+ } else if (def && !blend_def && force_integer) {
+ double val;
+ if (def->value_num(val))
+ def->set_num(floor(val + 0.50001));
+ }
+}
+
+void
+MyFont::interpolate_dict_numvec(PermString name, Dict the_dict, int round_mode, bool executable)
+{
+ Type1Definition *def = dict(the_dict, name);
+ Type1Definition *blend_def = dict(the_dict + dBlend, name);
+ Vector<NumVector> blend;
+
+ if (def && blend_def && blend_def->value_numvec_vec(blend)) {
+ int n = blend.size();
+ NumVector val;
+ for (int i = 0; i < n; i++) {
+ double d = 0;
+ for (int m = 0; m < _nmasters; m++)
+ d += blend[i][m] * _weight_vector[m];
+ if (round_mode == 2 && i < 2)
+ d = floor(d - 0.50001);
+ else if (round_mode)
+ d = floor(d + 0.50001);
+ val.push_back(d);
+ }
+ def->set_numvec(val, executable);
+ kill_def(blend_def, the_dict + dBlend);
+ }
+}
+
+void
+MyFont::interpolate_dicts(bool force_integer, ErrorHandler *errh)
+{
+ // Unfortunately, some programs (acroread) expect the FontBBox to consist
+ // of integers. Round its elements away from zero (this is what the
+ // Acrobat distiller seems to do).
+ interpolate_dict_numvec("FontBBox", dFont, 2, true);
+
+ interpolate_dict_numvec("BlueValues", dPrivate, force_integer);
+ interpolate_dict_numvec("OtherBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("FamilyBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("FamilyOtherBlues", dPrivate, force_integer);
+ interpolate_dict_numvec("StdHW", dPrivate);
+ interpolate_dict_numvec("StdVW", dPrivate);
+ interpolate_dict_numvec("StemSnapH", dPrivate);
+ interpolate_dict_numvec("StemSnapV", dPrivate);
+
+ interpolate_dict_num("BlueScale", dPrivate);
+ interpolate_dict_num("BlueShift", dPrivate, force_integer);
+ interpolate_dict_int("BlueFuzz", dPrivate, errh);
+
+ {
+ Type1Definition *def = p_dict("ForceBold");
+ Type1Definition *blend_def = bp_dict("ForceBold");
+ Type1Definition *thresh = p_dict("ForceBoldThreshold");
+ Vector<PermString> namevec;
+ double thresh_val;
+ if (def && blend_def && thresh && blend_def->value_namevec(namevec)
+ && thresh->value_num(thresh_val) && namevec.size() == _nmasters) {
+ double v = 0;
+ for (int m = 0; m < _nmasters; m++)
+ if (namevec[m] == "true")
+ v += _weight_vector[m];
+ def->set_code(v >= thresh_val ? "true" : "false");
+ kill_def(blend_def, dBlendPrivate);
+ }
+ }
+
+ interpolate_dict_num("UnderlinePosition", dFontInfo);
+ interpolate_dict_num("UnderlineThickness", dFontInfo);
+ interpolate_dict_num("ItalicAngle", dFontInfo);
+
+ if (Type1Definition *def = bp_dict("BuildCharArray"))
+ kill_def(def, dBlendPrivate);
+
+ for (DictHashMap::const_iterator i = dict_begin(dBlend); i; i++) {
+ PermString name = i.key();
+ if (i.value() && name != "Private" && name != "FontInfo"
+ && name != "ConvertDesignVector" && name != "NormalizeDesignVector")
+ errh->warning("didn%,t interpolate %s in Blend", name.c_str());
+ }
+
+ for (DictHashMap::const_iterator i = dict_begin(dBlendPrivate); i; i++)
+ if (i.value() && i.key() != "Erode")
+ errh->warning("didn%,t interpolate %s in BlendPrivate", i.key().c_str());
+
+ kill_def(p_dict("NDV"), dPrivate);
+ kill_def(p_dict("CDV"), dPrivate);
+ kill_def(p_dict("UniqueID"), dPrivate);
+ kill_def(fi_dict("BlendDesignPositions"), dFontInfo);
+ kill_def(fi_dict("BlendDesignMap"), dFontInfo);
+ kill_def(fi_dict("BlendAxisTypes"), dFontInfo);
+}
+
+void
+MyFont::interpolate_charstrings(int precision, ErrorHandler *errh)
+{
+ Type1MMRemover remover(this, _weight_vector, precision, errh);
+ remover.run();
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.hh
new file mode 100644
index 00000000000..ffe35668f94
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/myfont.hh
@@ -0,0 +1,31 @@
+#ifndef MYFONT_HH
+#define MYFONT_HH
+#include <efont/t1font.hh>
+namespace Efont { class MultipleMasterSpace; }
+class ErrorHandler;
+
+class MyFont : public Efont::Type1Font { public:
+
+ MyFont(Efont::Type1Reader &);
+ ~MyFont();
+
+ bool set_design_vector(Efont::MultipleMasterSpace *, const Vector<double> &, ErrorHandler * = 0);
+
+ void interpolate_dicts(bool force_integers, ErrorHandler *);
+ void interpolate_charstrings(int precision, ErrorHandler * = 0);
+
+ private:
+
+ typedef Vector<double> NumVector;
+
+ int _nmasters;
+ Vector<double> _weight_vector;
+
+ void interpolate_dict_int(PermString, Dict, ErrorHandler *);
+ void interpolate_dict_num(PermString, Dict, bool round_integer = false);
+ void interpolate_dict_numvec(PermString, Dict, int round_mode = 0, bool executable = false);
+ void kill_def(Efont::Type1Definition *, int which_dict = -1);
+
+};
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc
new file mode 100644
index 00000000000..da7fee98cc3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.cc
@@ -0,0 +1,41 @@
+/* t1minimize.cc -- make minimal copy of a Type 1 font
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "t1minimize.hh"
+#include <efont/t1item.hh>
+#include <stdio.h>
+
+using namespace Efont;
+
+Type1Font *
+minimize(Type1Font *font)
+{
+ Vector<double> xuid_extension;
+ xuid_extension.push_back(0x000395C1);
+ Type1Font *output = Type1Font::skeleton_make_copy(font, font->font_name(), &xuid_extension);
+
+ // Subrs
+ for (int i = 0; i < font->nsubrs(); i++)
+ if (Type1Subr *s = font->subr_x(i))
+ output->set_subr(s->subrno(), s->t1cs(), s->definer());
+
+ // CharStrings
+ for (int i = 0; i < font->nglyphs(); i++)
+ if (Type1Subr *g = font->glyph_x(i))
+ output->add_glyph(Type1Subr::make_glyph(g->name(), g->t1cs(), g->definer()));
+
+ return output;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.hh
new file mode 100644
index 00000000000..a5c3ea04906
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1minimize.hh
@@ -0,0 +1,7 @@
+#ifndef EFONT_T1MINIMIZE_HH
+#define EFONT_T1MINIMIZE_HH
+#include <efont/t1font.hh>
+
+Efont::Type1Font *minimize(Efont::Type1Font *);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc
new file mode 100644
index 00000000000..c8a4f507f03
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.cc
@@ -0,0 +1,924 @@
+/* t1rewrit.cc -- routines for multiple- to single-master charstring conversion
+ *
+ * Copyright (c) 1997-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "t1rewrit.hh"
+#include <efont/t1item.hh>
+#include <efont/t1csgen.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <stdio.h>
+#include <math.h>
+
+using namespace Efont;
+
+static bool itc_complained = false;
+static ErrorHandler *itc_errh;
+
+void
+itc_complain()
+{
+ //itc_errh->warning("strange %<callothersubr%>; is this an ITC font?");
+ itc_complained = true;
+}
+
+
+/*****
+ * HintReplacementDetector
+ **/
+
+class HintReplacementDetector : public CharstringInterp { public:
+
+ HintReplacementDetector(Type1Font *, int);
+ HintReplacementDetector(Type1Font *, const Vector<double> &, int);
+
+ bool is_hint_replacement(int i) const { return _hint_replacements[i] != 0; }
+ int call_count(int i) const { return _call_counts[i]; }
+
+ bool type1_command(int);
+
+ bool run(Type1Font *, Type1Charstring &);
+
+ private:
+
+ Vector<int> _hint_replacements;
+ Vector<int> _call_counts;
+ int _subr_level;
+ int _count_calls_below;
+
+};
+
+HintReplacementDetector::HintReplacementDetector(Type1Font *f, int b)
+ : CharstringInterp(),
+ _hint_replacements(f->nsubrs(), 0), _call_counts(f->nsubrs(), 0),
+ _count_calls_below(b)
+{
+}
+
+HintReplacementDetector::HintReplacementDetector(Type1Font *f, const Vector<double> &wv, int b)
+ : CharstringInterp(wv),
+ _hint_replacements(f->nsubrs(), 0), _call_counts(f->nsubrs(), 0),
+ _count_calls_below(b)
+{
+}
+
+bool
+HintReplacementDetector::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallothersubr: {
+ if (size() < 2)
+ goto unknown;
+ int command = (int)top(0);
+ int n = (int)top(1);
+ if (command == Cs::othcReplacehints && n == 1) {
+ pop(2);
+ _hint_replacements[(int)top()] = 1;
+ ps_clear();
+ ps_push(top());
+ pop();
+ break;
+ } else if (command >= Cs::othcMM1 && command <= Cs::othcMM6) {
+ pop(2);
+ return mm_command(command, n);
+ } else if (command >= Cs::othcITC_load && command <= Cs::othcITC_random) {
+ pop(2);
+ return itc_command(command, n);
+ } else
+ goto unknown;
+ }
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ return error(errUnderflow, cmd);
+ int which = (int)pop();
+ if (!_count_calls_below || _subr_level < _count_calls_below)
+ _call_counts[which]++;
+
+ Charstring *subr_cs = get_subr(which);
+ if (!subr_cs)
+ return error(errSubr, which);
+
+ _subr_level++;
+ subr_cs->process(*this);
+ _subr_level--;
+
+ if (error() != errOK)
+ return false;
+ return !done();
+ }
+
+ case Cs::cEndchar:
+ case Cs::cReturn:
+ return CharstringInterp::type1_command(cmd);
+
+ case Cs::cBlend:
+ case Cs::cAbs:
+ case Cs::cAdd:
+ case Cs::cSub:
+ case Cs::cDiv:
+ case Cs::cNeg:
+ case Cs::cRandom:
+ case Cs::cMul:
+ case Cs::cSqrt:
+ case Cs::cDrop:
+ case Cs::cExch:
+ case Cs::cIndex:
+ case Cs::cRoll:
+ case Cs::cDup:
+ case Cs::cAnd:
+ case Cs::cOr:
+ case Cs::cNot:
+ case Cs::cEq:
+ case Cs::cIfelse:
+ return arith_command(cmd);
+
+ case Cs::cPop:
+ if (ps_size() >= 1)
+ push(ps_pop());
+ break;
+
+ default:
+ unknown:
+ clear();
+ break;
+
+ }
+ return true;
+}
+
+bool
+HintReplacementDetector::run(Type1Font *f, Type1Charstring &cs)
+{
+ _subr_level = 0;
+ CharstringInterp::interpret(f, &cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1OneMMRemover
+ **/
+
+class Type1OneMMRemover: public CharstringInterp { public:
+
+ Type1OneMMRemover(Type1MMRemover *);
+
+ bool type1_command(int);
+
+ inline bool run_fresh_subr(const Type1Charstring &, bool);
+ inline bool run_fresh_glyph(const Type1Charstring &);
+ inline bool rerun_subr(const Type1Charstring &);
+
+ Type1Charstring *output_prefix();
+ void output_main(Type1Charstring &);
+
+ private:
+
+ Type1MMRemover *_remover;
+ Type1CharstringGen _prefix_gen;
+ Type1CharstringGen _main_gen;
+
+ int _subr_level;
+ bool _in_subr;
+ bool _in_prefix;
+ bool _must_expand;
+
+ inline void run_subr(Type1Charstring *);
+ bool itc_command(int command, int on_stack);
+
+ bool run(const Type1Charstring &, bool, bool, bool);
+
+};
+
+/* For version 1.1
+ *
+ * Problem: Sometimes a charstring will call one subroutine, which will call
+ * another, etc., which finally does a multiple master CallOtherSubr! The
+ * required arguments might build up only gradually over all the subrs. This
+ * makes it hard to remove the eventual CallOtherSubr!
+ *
+ * Partial solution: Divide each subroutine into two parts: the initial
+ * "prefix" contains the closure of any initial multiple-master commands
+ * (including those from sub-subroutines), the following "main" part has all
+ * the other commands. In a situation like this:
+ *
+ * subr-1 = 8 15 callothersubr pop pop pop return
+ * subr-2 = 4 5 6 1 callsubr return
+ * subr-3 = 1 2 3 2 callsubr return
+ *
+ * we'll divide it up like this: (prefix || main)
+ *
+ * subr-1 = 8 15 callothersubr pop pop pop || (nothing)
+ * subr-2 = 4 5 6 8 15 callothersubr pop pop pop || (nothing)
+ * subr-3 = 1 2 3 4 5 6 8 15 callothersubr pop pop pop || (nothing)
+ *
+ * Now, when we call a subroutine, we EXECUTE its prefix part. Then, if its
+ * main part is nonempty, we output the original call to the subroutine to
+ * take care of the main part. */
+
+
+Type1OneMMRemover::Type1OneMMRemover(Type1MMRemover *remover)
+ : CharstringInterp(remover->weight_vector()),
+ _remover(remover), _prefix_gen(remover->precision()),
+ _main_gen(remover->precision())
+{
+}
+
+inline void
+Type1OneMMRemover::run_subr(Type1Charstring *cs)
+{
+ _subr_level++;
+ cs->process(*this);
+ _subr_level--;
+}
+
+bool
+Type1OneMMRemover::itc_command(int command, int on_stack)
+{
+ const Vector<double> &weight = weight_vector();
+ assert(weight.size());
+ Vector<double> *scratch = scratch_vector();
+ Type1CharstringGen *gen =
+ (_in_prefix ? &_prefix_gen : (_in_subr ? &_main_gen : 0));
+
+ int base = size() - on_stack - 2;
+ switch (command) {
+
+ case Cs::othcITC_load: {
+ if (on_stack != 1)
+ return false;
+ int offset = (int)at(base);
+ for (int i = 0; i < weight.size(); i++)
+ vec(scratch, offset+i) = weight.at_u(i);
+ // save load command, so we expand its effects into the scratch
+ // vector
+ if (gen) {
+ gen->gen_number(offset);
+ gen->gen_number(1);
+ gen->gen_number(Cs::othcITC_load);
+ gen->gen_command(Cs::cCallothersubr);
+ }
+ break;
+ }
+
+ case Cs::othcITC_put: {
+ if (on_stack != 2)
+ return false;
+ int offset = (int)at(base+1);
+ vec(scratch, offset) = at(base);
+ // save put command, so we expand its effects into the scratch
+ // vector
+ if (gen) {
+ gen->gen_number(at(base));
+ gen->gen_number(offset);
+ gen->gen_number(2);
+ gen->gen_number(Cs::othcITC_put);
+ gen->gen_command(Cs::cCallothersubr);
+ }
+ break;
+ }
+
+ case Cs::othcITC_get: {
+ if (on_stack != 1)
+ return false;
+ int offset = (int)at(base);
+ double d = vec(scratch, offset);
+ if (!KNOWN(d)) {
+ _must_expand = true;
+ return false;
+ }
+ ps_push(d);
+ break;
+ }
+
+ case Cs::othcITC_add: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) + at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_sub: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) - at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_mul: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) * at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_div: {
+ if (on_stack != 2)
+ return false;
+ ps_push(at(base) / at(base+1));
+ break;
+ }
+
+ case Cs::othcITC_ifelse: {
+ if (on_stack != 4)
+ return false;
+ if (at(base+2) <= at(base+3))
+ ps_push(at(base));
+ else
+ ps_push(at(base+1));
+ break;
+ }
+
+ default:
+ return false;
+
+ }
+
+ pop(on_stack + 2);
+ return true;
+}
+
+bool
+Type1OneMMRemover::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallothersubr: {
+ // Expand known othersubr calls. If we cannot expand the othersubr
+ // call completely, then write it to the expander.
+ if (size() < 2)
+ goto partial_othersubr;
+ int command = (int)top(0);
+ int n = (int)top(1);
+ if (command >= Cs::othcITC_load && command <= Cs::othcITC_random) {
+ if (!itc_complained)
+ itc_complain();
+ if (size() < 2 + n || !itc_command(command, n))
+ goto partial_othersubr;
+ } else if (command >= Cs::othcMM1 && command <= Cs::othcMM6) {
+ if (size() < 2 + n)
+ goto partial_othersubr;
+ pop(2);
+ mm_command(command, n);
+ } else
+ goto normal;
+ break;
+ }
+
+ partial_othersubr: {
+ if (!_in_prefix) {
+ _must_expand = true;
+ goto normal;
+ }
+ _prefix_gen.gen_stack(*this, 0);
+ _prefix_gen.gen_command(Cs::cCallothersubr);
+ break;
+ }
+
+ case Cs::cCallsubr: {
+ // expand subroutines in line if necessary
+ if (size() < 1)
+ goto normal;
+ int subrno = (int)pop();
+ if (_subr_level < 1) { // otherwise, have already included prefix
+ if (Type1Charstring *cs = _remover->subr_prefix(subrno))
+ run_subr(cs);
+ }
+ if (Type1Charstring *cs = _remover->subr_expander(subrno))
+ run_subr(cs);
+ else {
+ push(subrno);
+ goto normal;
+ }
+ break;
+ }
+
+ case Cs::cPop:
+ if (ps_size() >= 1)
+ push(ps_pop());
+ else if (_in_prefix && ps_size() == 0) {
+ _prefix_gen.gen_stack(*this, 0);
+ _prefix_gen.gen_command(Cs::cPop);
+ } else
+ goto normal;
+ break;
+
+ case Cs::cDiv:
+ if (size() < 2)
+ goto normal;
+ top(1) /= top(0);
+ pop();
+ break;
+
+ case Cs::cReturn:
+ return false;
+
+ normal:
+ default:
+ _main_gen.gen_stack(*this, cmd);
+ _main_gen.gen_command(cmd);
+ _in_prefix = 0;
+ return (cmd != Cs::cEndchar);
+
+ }
+ return true;
+}
+
+
+bool
+Type1OneMMRemover::run(const Type1Charstring &cs,
+ bool in_subr, bool do_prefix, bool fresh)
+{
+ _prefix_gen.clear();
+ _main_gen.clear();
+ _in_subr = in_subr;
+ _in_prefix = do_prefix;
+ _subr_level = (fresh ? 0 : 1);
+ _must_expand = false;
+ Vector<double> *scratch = scratch_vector();
+ scratch->assign(scratch->size(), UNKDOUBLE);
+
+ CharstringInterp::interpret(_remover->program(), &cs);
+
+ if (in_subr) {
+ _main_gen.gen_stack(*this, Cs::cReturn);
+ _main_gen.gen_command(Cs::cReturn);
+ }
+ if (_must_expand)
+ return true;
+ if (fresh && in_subr) {
+ if (_main_gen.length() == 0
+ || (_main_gen.length() == 1 && _main_gen.data()[0] == Cs::cReturn))
+ return true;
+ }
+ return false;
+}
+
+inline bool
+Type1OneMMRemover::run_fresh_subr(const Type1Charstring &cs, bool do_prefix)
+{
+ return run(cs, true, do_prefix, true);
+}
+
+inline bool
+Type1OneMMRemover::run_fresh_glyph(const Type1Charstring &cs)
+{
+ return run(cs, false, false, true);
+}
+
+inline bool
+Type1OneMMRemover::rerun_subr(const Type1Charstring &cs)
+{
+ return run(cs, true, false, false);
+}
+
+Type1Charstring *
+Type1OneMMRemover::output_prefix()
+{
+ if (_prefix_gen.length() > 0) {
+ _prefix_gen.gen_command(Cs::cReturn);
+ return _prefix_gen.output();
+ } else
+ return 0;
+}
+
+void
+Type1OneMMRemover::output_main(Type1Charstring &cs)
+{
+ _main_gen.output(cs);
+}
+
+
+/*****
+ * Type1BadCallRemover
+ **/
+
+class Type1BadCallRemover: public CharstringInterp { public:
+
+ Type1BadCallRemover(Type1MMRemover *);
+
+ bool type1_command(int);
+
+ bool run(Type1Charstring &, bool is_subr);
+
+ private:
+
+ Type1CharstringGen _gen;
+ Type1MMRemover *_remover;
+ bool _is_subr;
+
+};
+
+Type1BadCallRemover::Type1BadCallRemover(Type1MMRemover *remover)
+ : CharstringInterp(remover->weight_vector()),
+ _gen(remover->precision()), _remover(remover)
+{
+}
+
+bool
+Type1BadCallRemover::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ goto normal;
+ int subrno = (int)top();
+ if (!get_subr(subrno)) {
+ pop();
+ return false;
+ } else
+ goto normal;
+ }
+
+ normal:
+ default:
+ _gen.gen_stack(*this, 0);
+ _gen.gen_command(cmd);
+ return (cmd != Cs::cEndchar || _is_subr) && cmd != Cs::cReturn;
+
+ }
+}
+
+bool
+Type1BadCallRemover::run(Type1Charstring &cs, bool is_subr)
+{
+ _is_subr = is_subr;
+ _gen.clear();
+ CharstringInterp::interpret(_remover->program(), &cs);
+ _gen.output(cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1MMRemover
+ **/
+
+Type1MMRemover::Type1MMRemover(Type1Font *font, const Vector<double> &wv,
+ int precision, ErrorHandler *errh)
+ : _font(font), _weight_vector(wv), _precision(precision),
+ _nsubrs(font->nsubrs()),
+ _subr_done(_nsubrs, 0),
+ _subr_prefix(_nsubrs, (Type1Charstring *)0),
+ _must_expand_subr(_nsubrs, 0),
+ _hint_replacement_subr(_nsubrs, 0),
+ _expand_all_subrs(false), _errh(errh)
+{
+ itc_errh = _errh;
+
+ // find subroutines needed for hint replacement
+ HintReplacementDetector hr(font, wv, 0);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ hr.run(font, g->t1cs());
+ for (int i = 0; i < _nsubrs; i++)
+ if (hr.is_hint_replacement(i))
+ _hint_replacement_subr[i] = 1;
+
+ // don't get rid of first 4 subrs
+ for (int i = 0; i < _nsubrs && i < 4; i++)
+ _subr_done[i] = 1;
+}
+
+Type1MMRemover::~Type1MMRemover()
+{
+ for (int i = 0; i < _nsubrs; i++)
+ if (_subr_prefix[i])
+ delete _subr_prefix[i];
+}
+
+
+Type1Charstring *
+Type1MMRemover::subr_prefix(int subrno)
+{
+ if (subrno < 0 || subrno >= _nsubrs)
+ return 0;
+
+ if (!_subr_done[subrno]) {
+ _subr_done[subrno] = 1;
+
+ Type1Charstring *subr = _font->subr(subrno);
+ if (!subr)
+ return 0;
+
+ Type1OneMMRemover one(this);
+ if (one.run_fresh_subr(*subr, !_hint_replacement_subr[subrno]))
+ _must_expand_subr[subrno] = true;
+ _subr_prefix[subrno] = one.output_prefix();
+ one.output_main(*subr);
+ }
+
+ return _subr_prefix[subrno];
+}
+
+Type1Charstring *
+Type1MMRemover::subr_expander(int subrno)
+{
+ if (subrno < 0 || subrno >= _nsubrs)
+ return 0;
+ if (!_subr_done[subrno])
+ (void)subr_prefix(subrno);
+ if (!_expand_all_subrs && !_must_expand_subr[subrno])
+ return 0;
+ return _font->subr(subrno);
+}
+
+extern "C" {
+static int CDECL
+sort_permstring_compare(const void *v1, const void *v2)
+{
+ const PermString *s1 = (const PermString *)v1;
+ const PermString *s2 = (const PermString *)v2;
+ return strcmp(s1->c_str(), s2->c_str());
+}
+}
+
+void
+Type1MMRemover::run()
+{
+ Type1OneMMRemover one(this);
+
+ // check subroutines
+ for (int subrno = 0; subrno < _nsubrs; subrno++)
+ (void)subr_prefix(subrno);
+
+ // expand glyphs
+ Vector<PermString> bad_glyphs;
+ for (int i = 0; i < _font->nglyphs(); i++) {
+ Type1Subr *g = _font->glyph_x(i);
+ if (g) {
+ if (one.run_fresh_glyph(g->t1cs())) {
+ // Every glyph should be fully expandable without encountering
+ // a MM command. If we fail the first time, try again,
+ // expanding ALL subroutines. This catches, for example, SUBR
+ // 1 { 1 0 return }; GLYPH g { 1 callsubr 2 blend }; This will
+ // fail the first time, because `1 callsubr' will be left as a
+ // subroutine call, so `1 0' (required arguments to `blend')
+ // won't be visible.
+ _expand_all_subrs = true;
+ if (one.run_fresh_glyph(g->t1cs()))
+ bad_glyphs.push_back(g->name());
+ _expand_all_subrs = false;
+ }
+ one.output_main(g->t1cs());
+ }
+ }
+
+ // remove uncalled subroutines, expand hint replacement subroutines
+ HintReplacementDetector hr(_font, _weight_vector, 0);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ hr.run(_font, g->t1cs());
+ // don't remove first four subroutines!
+ for (int subrno = 4; subrno < _nsubrs; subrno++)
+ if (hr.call_count(subrno) || _hint_replacement_subr[subrno]) {
+ Type1Charstring *cs = _font->subr(subrno);
+ if (one.rerun_subr(*cs)) {
+ _expand_all_subrs = true;
+ if (one.rerun_subr(*cs))
+ bad_glyphs.push_back(permprintf("subr %d", subrno));
+ _expand_all_subrs = false;
+ }
+ one.output_main(*cs);
+ } else
+ _font->remove_subr(subrno);
+
+ // remove calls to removed subroutines
+ Type1BadCallRemover bcr(this);
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ bcr.run(g->t1cs(), false);
+ for (int subrno = 4; subrno < _nsubrs; subrno++)
+ if (Type1Charstring *cs = _font->subr(subrno))
+ bcr.run(*cs, true);
+
+ // report warnings
+ if (bad_glyphs.size()) {
+ qsort(&bad_glyphs[0], bad_glyphs.size(), sizeof(PermString), sort_permstring_compare);
+ _errh->error("could not fully interpolate the following glyphs:");
+ StringAccum sa;
+ for (int i = 0; i < bad_glyphs.size(); i++) {
+ PermString n = bad_glyphs[i];
+ bool comma = (i < bad_glyphs.size() - 1);
+ if (sa.length() && sa.length() + 1 + n.length() + comma > 70) {
+ _errh->message(" %s", sa.c_str());
+ sa.clear();
+ }
+ sa << (sa.length() ? " " : "") << n << (comma ? "," : "");
+ }
+ _errh->message(" %s", sa.c_str());
+ }
+}
+
+
+/*****
+ * SubrExpander
+ **/
+
+class SubrExpander : public CharstringInterp { public:
+
+ SubrExpander();
+
+ void set_renumbering(const Vector<int> *v) { _renumbering = v; }
+
+ bool type1_command(int);
+
+ bool run(Type1Font *, Type1Charstring &);
+
+ private:
+
+ Type1CharstringGen _gen;
+ const Vector<int> *_renumbering;
+ int _subr_level;
+
+};
+
+SubrExpander::SubrExpander()
+ : CharstringInterp(), _gen(0), _renumbering(0)
+{
+}
+
+bool
+SubrExpander::type1_command(int cmd)
+{
+ switch (cmd) {
+
+ case Cs::cCallsubr: {
+ if (size() < 1)
+ goto unknown;
+ int subrno = (int)top(0);
+ int renumber_subrno = (subrno >= 0 && subrno < _renumbering->size() ? (*_renumbering)[subrno] : subrno);
+ if (renumber_subrno >= 0) {
+ top(0) = renumber_subrno;
+ goto unknown;
+ }
+ pop();
+ if (Charstring *subr_cs = get_subr(subrno)) {
+ _subr_level++;
+ subr_cs->process(*this);
+ _subr_level--;
+ }
+ return !done();
+ }
+
+ case Cs::cEndchar:
+ set_done();
+ goto end_cs;
+
+ case Cs::cReturn:
+ if (_subr_level)
+ return false;
+ goto end_cs;
+
+ end_cs:
+ _gen.gen_stack(*this, cmd);
+ _gen.gen_command(cmd);
+ return false;
+
+ default:
+ unknown:
+ _gen.gen_stack(*this, cmd);
+ _gen.gen_command(cmd);
+ break;
+
+ }
+ return true;
+}
+
+bool
+SubrExpander::run(Type1Font *font, Type1Charstring &cs)
+{
+ _gen.clear();
+ _subr_level = 0;
+ CharstringInterp::interpret(font, &cs);
+ _gen.output(cs);
+ return error() == errOK;
+}
+
+
+/*****
+ * Type1SubrRemover
+ **/
+
+Type1SubrRemover::Type1SubrRemover(Type1Font *font, ErrorHandler *errh)
+ : _font(font), _nsubrs(font->nsubrs()),
+ _renumbering(_nsubrs, REMOVABLE), _cost(_nsubrs, 0),
+ _save_count(0), _nonexist_count(0), _errh(errh)
+{
+ // find subroutines needed for hint replacement
+ HintReplacementDetector hr(font, 2);
+ for (int i = 0; i < _font->nglyphs(); i++) {
+ Type1Subr *g = _font->glyph_x(i);
+ if (g)
+ hr.run(_font, g->t1cs());
+ }
+
+ // save necessary subroutines
+ for (int i = 0; i < 4; i++) {
+ _renumbering[i] = i;
+ _save_count++;
+ }
+ // save hint-replacement subroutines
+ for (int i = 0; i < _nsubrs; i++) {
+ Type1Subr *cs = _font->subr_x(i);
+ if (!cs) {
+ _renumbering[i] = DEAD;
+ _nonexist_count++;
+ } else if (hr.is_hint_replacement(i)) {
+ _renumbering[i] = i;
+ _save_count++;
+ } else
+ _cost[i] = hr.call_count(i) * (cs->t1cs().length() - (i <= 107 ? 2 : 3));
+ }
+}
+
+Type1SubrRemover::~Type1SubrRemover()
+{
+}
+
+static Vector<int> *sort_keys;
+
+extern "C" {
+static int CDECL
+sort_permute_compare(const void *v1, const void *v2)
+{
+ const int *i1 = (const int *)v1;
+ const int *i2 = (const int *)v2;
+ return (*sort_keys)[*i1] - (*sort_keys)[*i2];
+}
+}
+
+bool
+Type1SubrRemover::run(int lower_to)
+{
+ if (lower_to < 0)
+ lower_to = _nsubrs;
+ if (lower_to < _save_count) {
+ _errh->warning("reducing %s to minimum number of subroutines (%d)",
+ _font->font_name().c_str(), _save_count - _nonexist_count);
+ lower_to = _save_count;
+ }
+ int to_remove = _nsubrs - _nonexist_count - lower_to;
+ if (to_remove < 0)
+ to_remove = 0;
+
+ // multiply by lost bytes per call
+ Vector<int> permute;
+ for (int i = 0; i < _nsubrs; i++)
+ permute.push_back(i);
+
+ // sort them by least frequent use -> most frequent use
+ sort_keys = &_cost;
+ qsort(&permute[0], _nsubrs, sizeof(int), sort_permute_compare);
+
+ // mark first portion of `permute' to be removed
+ int removed = 0;
+ for (int i = 0; i < _nsubrs; i++) {
+ int p = permute[i];
+ if (_renumbering[p] == REMOVABLE && removed < to_remove) {
+ _renumbering[p] = DEAD;
+ removed++;
+ }
+ }
+
+ // renumber the rest
+ int renumber_pos = 0;
+ for (int i = 0; i < _nsubrs; i++)
+ if (_renumbering[i] == REMOVABLE) { // save it
+ while (_renumbering[renumber_pos] >= 0)
+ renumber_pos++;
+ _renumbering[i] = renumber_pos++;
+ }
+ SubrExpander rem0;
+ rem0.set_renumbering(&_renumbering);
+
+ // go through and change them all
+ for (int i = 0; i < _nsubrs; i++) {
+ Type1Subr *s = _font->subr_x(i);
+ if (s && _renumbering[i] >= 0)
+ rem0.run(_font, s->t1cs());
+ }
+ for (int i = 0; i < _font->nglyphs(); i++)
+ if (Type1Subr *g = _font->glyph_x(i))
+ rem0.run(_font, g->t1cs());
+
+ // actually remove subroutines
+ _font->renumber_subrs(_renumbering);
+
+ return true;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.hh
new file mode 100644
index 00000000000..eac9d75beeb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/mmpfb/t1rewrit.hh
@@ -0,0 +1,68 @@
+#ifndef T1REWRIT_HH
+#define T1REWRIT_HH
+#include <efont/t1interp.hh>
+#include <efont/t1font.hh>
+#include <lcdf/straccum.hh>
+
+class Type1MMRemover { public:
+
+ Type1MMRemover(Efont::Type1Font *, const Vector<double> &weight_vec, int, ErrorHandler *);
+ ~Type1MMRemover();
+
+ Efont::CharstringProgram *program() const { return _font; }
+ const Vector<double> &weight_vector() const { return _weight_vector; }
+ int nmasters() const { return _weight_vector.size(); }
+ int precision() const { return _precision; }
+
+ Efont::Type1Charstring *subr_prefix(int);
+ Efont::Type1Charstring *subr_expander(int);
+
+ void run();
+
+ private:
+
+ Efont::Type1Font *_font;
+ Vector<double> _weight_vector;
+ int _precision;
+
+ int _nsubrs;
+ Vector<int> _subr_done;
+ Vector<Efont::Type1Charstring *> _subr_prefix;
+ Vector<int> _must_expand_subr;
+ Vector<int> _hint_replacement_subr;
+ bool _expand_all_subrs;
+
+ ErrorHandler *_errh;
+
+};
+
+
+class Type1SubrRemover { public:
+
+ Type1SubrRemover(Efont::Type1Font *, ErrorHandler *);
+ ~Type1SubrRemover();
+
+ Efont::CharstringProgram *program() const { return _font; }
+ ErrorHandler *errh() const { return _errh; }
+
+ int save_count() const { return _save_count; }
+
+ bool run(int);
+
+ private:
+
+ Efont::Type1Font *_font;
+
+ int _nsubrs;
+ enum { REMOVABLE = -1, DEAD = -2 };
+ Vector<int> _renumbering;
+ Vector<int> _cost;
+ int _save_count;
+ int _nonexist_count;
+
+ ErrorHandler *_errh;
+
+};
+
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.am
new file mode 100644
index 00000000000..b2f3dbfa52a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = otfinfo
+man_MANS = otfinfo.1
+
+otfinfo_SOURCES = \
+ otfinfo.cc
+
+otfinfo_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+otfinfo_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otfinfo.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.in
new file mode 100644
index 00000000000..2a949aa07f9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/Makefile.in
@@ -0,0 +1,750 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = otfinfo$(EXEEXT)
+subdir = lcdf-typetools-src/otfinfo
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_otfinfo_OBJECTS = otfinfo.$(OBJEXT)
+otfinfo_OBJECTS = $(am_otfinfo_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/otfinfo.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(otfinfo_SOURCES)
+DIST_SOURCES = $(otfinfo_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = otfinfo.1
+otfinfo_SOURCES = \
+ otfinfo.cc
+
+otfinfo_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+otfinfo_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otfinfo.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/otfinfo/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/otfinfo/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+otfinfo$(EXEEXT): $(otfinfo_OBJECTS) $(otfinfo_DEPENDENCIES) $(EXTRA_otfinfo_DEPENDENCIES)
+ @rm -f otfinfo$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(otfinfo_OBJECTS) $(otfinfo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otfinfo.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/otfinfo.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/otfinfo.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1
new file mode 100644
index 00000000000..558d5e144f3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.1
@@ -0,0 +1,199 @@
+'\"t
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH OTFINFO 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+otfinfo \- report information about OpenType fonts
+.SH SYNOPSIS
+.B otfinfo
+\%[\fB-sfzpvag\fR]
+\%[\fIFILE...\fR]
+'
+.SH DESCRIPTION
+.BR Otfinfo
+reports information about the named OpenType font
+.IR FILE s
+(or standard input, if no
+.IR FILE s
+are given). Results are printed to standard output. Each line is prefaced
+with the relevant
+.I FILE
+if more than one
+.I FILE
+was supplied.
+'
+.SH OPTIONS
+With long options, you need type only as many characters as will make the
+option unique.
+.SS Query options
+.PD 0
+.PD 0
+.TP 5
+.BR \-s ", " \-\-scripts
+Print supported scripts and language systems. The scripts are printed one
+per line, with human-readable descriptions; for example:
+.nf
+ cyrl Cyrillic
+ grek Greek
+ latn Latin
+ latn.TUR Latin/Turkish
+.fi
+'
+.Sp
+.TP 5
+.BR \-f ", " \-\-features
+Print GSUB and GPOS features supported by the selected script (see the
+.B \-\-script
+option below). The scripts are printed one per line, with human-readable
+descriptions; for example:
+.nf
+ aalt Access All Alternates
+ c2sc Small Capitals From Capitals
+ case Case-Sensitive Forms
+ cpsp Capital Spacing
+ \&...
+ zero Slashed Zero
+.fi
+'
+.Sp
+.TP 5
+.BR \-z ", " \-\-optical\-size
+Print optical size information. For example:
+.nf
+ design size 11 pt, size range (8.4 pt, 13 pt], subfamily ID 11, subfamily name Semibold Italic
+.fi
+'
+.Sp
+.TP 5
+.BR \-p ", " \-\-postscript\-name
+Print each font's PostScript name. For example:
+.nf
+ MinionPro-SemiboldItCapt
+.fi
+'
+.Sp
+.TP 5
+.BR \-a ", " \-\-family
+Print each font's family name. For example:
+.nf
+ Minion Pro
+.fi
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-font\-version
+Print font version information, if available. For example:
+.nf
+ OTF 1.013;PS 001.000;Core 1.0.27;makeotf.lib(1.11)
+.fi
+'
+.Sp
+.TP 5
+.BR \-i ", " \-\-info
+Print each font's name, version, designer, vendor, copyright, and license
+information. For example:
+.nf
+ Family: Minion Pro
+ Subfamily: Regular
+ Full name: Minion Pro
+ PostScript name: MinionPro-Regular
+ Version: OTF 1.011;PS 001.000;Core 1.0.27;makeotf.lib1.3.1
+ Unique ID: 1.011;ADBE;MinionPro-Regular
+ Designer: Robert Slimbach
+ Vendor URL: http://www.adobe.com/type/
+ Trademark: Minion is either a registered trademark or a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+ Copyright: \(co 2000 Adobe Systems Incorporated. All Rights Reserved. U.S. Patent Des. 337,604. Other patents pending.
+ License URL: http://www.adobe.com/type/legal.html
+.fi
+'
+.Sp
+.TP 5
+.BR \-g ", " \-\-glyphs
+Print the name of every glyph in each font, one per line. For example:
+.nf
+ \&.notdef
+ space
+ exclam
+ \&...
+ ncommaaccent.end
+ lje.alt
+.fi
+'
+.Sp
+.TP 5
+.BR \-u ", " \-\-unicode
+Print each Unicode code point supported by the font, followed by the glyph number
+representing that code point (and, if present, the name of the corresponding glyph).
+.Sp
+.TP 5
+.BR \-t ", " \-\-tables
+Print the size and name of every OpenType table in the font. For example:
+.nf
+ 52 BASE
+ 87723 CFF
+ 4940 DSIG
+ 21366 GPOS
+ \&...
+.fi
+'
+.Sp
+.TP 5
+.BR \-T " \fItable\fR, " \-\-dump\-table= \fItable\fR
+Print the contents of the font's OpenType table \fItable\fR.
+'
+.PD
+'
+'
+.SS Miscellaneous options
+'
+.PD 0
+.TP 5
+.BI \-\-script= "script\fR[.\fIlang\fR]"
+Select the script system
+.I script
+and language system
+.IR lang
+used to look up features by
+.BR \-\-features .
+Examples include "latn" (Latin script), "grek" (Greek script), and "yi.YIC"
+(Yi script with classic characters). If
+.I lang
+is not specified, otfinfo will use the default language system for that
+script. Defaults to "latn".
+'
+.Sp
+.TP 5
+.BR \-V ", " \-\-verbose
+Write progress messages to standard error.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M otftotfm 1
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc
new file mode 100644
index 00000000000..ea917b6a073
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otfinfo/otfinfo.cc
@@ -0,0 +1,726 @@
+/* otfinfo.cc -- driver for reporting information about OpenType fonts
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/otfcmap.hh>
+#include <efont/otfgsub.hh>
+#include <efont/otfgpos.hh>
+#include <efont/otfname.hh>
+#include <efont/otfos2.hh>
+#include <efont/otfpost.hh>
+#include <efont/cff.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <algorithm>
+#include <utility>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define VERBOSE_OPT 304
+#define SCRIPT_OPT 305
+
+#define QUERY_SCRIPTS_OPT 320
+#define QUERY_FEATURES_OPT 321
+#define QUERY_OPTICAL_SIZE_OPT 322
+#define QUERY_POSTSCRIPT_NAME_OPT 323
+#define QUERY_GLYPHS_OPT 324
+#define QUERY_FVERSION_OPT 325
+#define TABLES_OPT 326
+#define QUERY_FAMILY_OPT 327
+#define INFO_OPT 328
+#define DUMP_TABLE_OPT 329
+#define QUERY_UNICODE_OPT 330
+
+const Clp_Option options[] = {
+ { "script", 0, SCRIPT_OPT, Clp_ValString, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },
+ { "features", 'f', QUERY_FEATURES_OPT, 0, 0 },
+ { "scripts", 's', QUERY_SCRIPTS_OPT, 0, 0 },
+ { "size", 0, QUERY_OPTICAL_SIZE_OPT, 0, 0 },
+ { "optical-size", 'z', QUERY_OPTICAL_SIZE_OPT, 0, 0 },
+ { "postscript-name", 'p', QUERY_POSTSCRIPT_NAME_OPT, 0, 0 },
+ { "family", 'a', QUERY_FAMILY_OPT, 0, 0 },
+ { "font-version", 'v', QUERY_FVERSION_OPT, 0, 0 },
+ { "info", 'i', INFO_OPT, 0, 0 },
+ { "glyphs", 'g', QUERY_GLYPHS_OPT, 0, 0 },
+ { "tables", 't', TABLES_OPT, 0, 0 },
+ { "dump-table", 'T', DUMP_TABLE_OPT, Clp_ValString, 0 },
+ { "unicode", 'u', QUERY_UNICODE_OPT, 0, 0 },
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+static Efont::OpenType::Tag script, langsys;
+
+bool verbose = false;
+bool quiet = false;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Otfinfo%> reports information about an OpenType font to standard output.\n\
+Options specify what information to print.\n\
+\n\
+Usage: %s [-sfzpg | OPTIONS] [OTFFILES...]\n\n",
+ program_name);
+ uerrh.message("\
+Query options:\n\
+ -s, --scripts Report font%,s supported scripts.\n\
+ -f, --features Report font%,s GSUB/GPOS features.\n\
+ -z, --optical-size Report font%,s optical size information.\n\
+ -p, --postscript-name Report font%,s PostScript name.\n\
+ -a, --family Report font%,s family name.\n\
+ -v, --font-version Report font%,s version information.\n\
+ -i, --info Report font%,s names and designer/vendor info.\n\
+ -g, --glyphs Report font%,s glyph names.\n\
+ -t, --tables Report font%,s OpenType tables.\n\
+ -T, --dump-table NAME Output font%,s %<NAME%> table.\n\
+\n\
+Other options:\n\
+ --script=SCRIPT[.LANG] Set script used for --features [latn].\n\
+ -V, --verbose Print progress information to standard error.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n");
+}
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning = false)
+{
+ FILE *f;
+ int f_errno = 0;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else {
+ f = fopen(filename.c_str(), "rb");
+ f_errno = errno;
+ }
+
+ String error_anno = (warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename);
+ if (!f) {
+ errh->xmessage(error_anno, strerror(f_errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage(error_anno, strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<stdin>");
+ else
+ return s;
+}
+
+static void
+collect_script_descriptions(const OpenType::ScriptList &script_list, Vector<String> &output, ErrorHandler *errh)
+{
+ Vector<OpenType::Tag> script, langsys;
+ script_list.language_systems(script, langsys, errh);
+ for (int i = 0; i < script.size(); i++) {
+ String what = script[i].text();
+ const char *s = script[i].script_description();
+ String where = (s ? s : "<unknown script>");
+ if (!langsys[i].null()) {
+ what += String(".") + langsys[i].text();
+ s = langsys[i].language_description();
+ where += String("/") + (s ? s : "<unknown language>");
+ }
+ if (what.length() < 8)
+ output.push_back(what + String("\t\t") + where);
+ else
+ output.push_back(what + String("\t") + where);
+ }
+}
+
+static void
+do_query_scripts(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ Vector<String> results;
+ if (String gsub_table = otf.table("GSUB")) {
+ OpenType::Gsub gsub(gsub_table, &otf, errh);
+ collect_script_descriptions(gsub.script_list(), results, errh);
+ }
+ if (String gpos_table = otf.table("GPOS")) {
+ OpenType::Gpos gpos(gpos_table, errh);
+ collect_script_descriptions(gpos.script_list(), results, errh);
+ }
+
+ if (results.size()) {
+ std::sort(results.begin(), results.end());
+ String *unique_result = std::unique(results.begin(), results.end());
+ for (String *sp = results.begin(); sp < unique_result; sp++)
+ result_errh->message("%s", sp->c_str());
+ }
+}
+
+static void
+collect_feature_descriptions(const OpenType::ScriptList &script_list, const OpenType::FeatureList &feature_list, Vector<String> &output, ErrorHandler *errh)
+{
+ int required_fid;
+ Vector<int> fids;
+ // collect features applying to this script
+ script_list.features(script, langsys, required_fid, fids, errh);
+ for (int i = -1; i < fids.size(); i++) {
+ int fid = (i < 0 ? required_fid : fids[i]);
+ if (fid >= 0) {
+ OpenType::Tag tag = feature_list.tag(fid);
+ const char *s = tag.feature_description();
+ output.push_back(tag.text() + String("\t") + (s ? s : "<unknown feature>"));
+ }
+ }
+}
+
+static void
+do_query_features(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ Vector<String> results;
+ if (String gsub_table = otf.table("GSUB")) {
+ OpenType::Gsub gsub(gsub_table, &otf, errh);
+ collect_feature_descriptions(gsub.script_list(), gsub.feature_list(), results, errh);
+ }
+ if (String gpos_table = otf.table("GPOS")) {
+ OpenType::Gpos gpos(gpos_table, errh);
+ collect_feature_descriptions(gpos.script_list(), gpos.feature_list(), results, errh);
+ }
+
+ if (results.size()) {
+ std::sort(results.begin(), results.end());
+ String *unique_result = std::unique(results.begin(), results.end());
+ for (String *sp = results.begin(); sp < unique_result; sp++)
+ result_errh->message("%s", sp->c_str());
+ }
+}
+
+static bool
+do_query_optical_size_size(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ String gpos_table = otf.table("GPOS");
+ if (!gpos_table)
+ return false;
+
+ OpenType::Gpos gpos(gpos_table, errh);
+ OpenType::Name name(otf.table("name"), errh);
+
+ // extract 'size' feature
+ int required_fid;
+ Vector<int> fids;
+ gpos.script_list().features(script, langsys, required_fid, fids, errh);
+
+ int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
+ if (size_fid < 0)
+ return false;
+
+ // old Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
+ if (!size_data.length())
+ return false;
+
+ StringAccum sa;
+ sa << "design size " << (size_data.u16(0) / 10.) << " pt";
+ if (size_data.u16(2) != 0) {
+ sa << ", size range (" << (size_data.u16(6) / 10.) << " pt, "
+ << (size_data.u16(8) / 10.) << " pt], "
+ << "subfamily ID " << size_data.u16(2);
+ if (String n = name.english_name(size_data.u16(4)))
+ sa << ", subfamily name " << n;
+ }
+
+ result_errh->message("%s", sa.c_str());
+ return true;
+
+ } catch (OpenType::Error) {
+ return errh->nerrors() != before_nerrors;
+ }
+}
+
+static void
+do_query_optical_size(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ if (do_query_optical_size_size(otf, errh, result_errh))
+ return;
+
+ String os2_table = otf.table("OS/2");
+ if (!os2_table)
+ throw OpenType::Error();
+
+ OpenType::Os2 os2(os2_table, errh);
+ if (!os2.ok() || !os2.has_optical_point_size())
+ throw OpenType::Error();
+
+ StringAccum sa;
+ sa << "size range [" << os2.lower_optical_point_size() << ", " << os2.upper_optical_point_size() << ")";
+ result_errh->message("%s", sa.c_str());
+
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("no optical size information");
+ }
+}
+
+static void
+do_query_family_name(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String family_name = "no family name information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ family_name = name.english_name(OpenType::Name::N_FAMILY);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", family_name.c_str());
+}
+
+static void
+do_query_postscript_name(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String postscript_name = "no PostScript name information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ postscript_name = name.english_name(OpenType::Name::N_POSTSCRIPT);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", postscript_name.c_str());
+}
+
+static void
+do_query_font_version(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ String version = "no version information";
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok())
+ version = name.english_name(OpenType::Name::N_VERSION);
+ }
+
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("%s", version.c_str());
+}
+
+static void
+do_info(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ StringAccum sa;
+
+ if (String name_table = otf.table("name")) {
+ OpenType::Name name(name_table, errh);
+ if (name.ok()) {
+ if (String s = name.english_name(OpenType::Name::N_FAMILY))
+ sa << "Family: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_SUBFAMILY))
+ sa << "Subfamily: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_FULLNAME))
+ sa << "Full name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_POSTSCRIPT))
+ sa << "PostScript name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_POSTSCRIPT_CID))
+ sa << "PostScript CID name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_PREF_FAMILY))
+ sa << "Preferred family: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_PREF_SUBFAMILY))
+ sa << "Preferred subfamily: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_MAC_COMPAT_FULLNAME))
+ sa << "Mac font menu name: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_VERSION))
+ sa << "Version: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_UNIQUEID))
+ sa << "Unique ID: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESCRIPTION))
+ sa << "Description: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESIGNER))
+ sa << "Designer: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_DESIGNER_URL))
+ sa << "Designer URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_MANUFACTURER))
+ sa << "Manufacturer: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_VENDOR_URL))
+ sa << "Vendor URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_TRADEMARK))
+ sa << "Trademark: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_COPYRIGHT))
+ sa << "Copyright: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_LICENSE_URL))
+ sa << "License URL: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_LICENSE_DESCRIPTION))
+ sa << "License Description: " << s << "\n";
+ if (String s = name.english_name(OpenType::Name::N_SAMPLE_TEXT))
+ sa << "Sample text: " << s << "\n";
+ }
+ }
+
+ if (String os2_table = otf.table("OS/2")) {
+ OpenType::Os2 os2(os2_table, errh);
+ if (os2.ok()) {
+ if (String s = os2.vendor_id()) {
+ while (s.length() && (s.back() == ' ' || s.back() == 0))
+ s = s.substring(s.begin(), s.end() - 1);
+ if (s)
+ sa << "Vendor ID: " << s << "\n";
+ }
+ }
+ }
+
+ if (sa || errh->nerrors() == before_nerrors)
+ result_errh->message("%s", (sa ? sa.c_str() : "no information"));
+}
+
+static void
+do_query_glyphs_cff(const OpenType::Font& otf, ErrorHandler* errh, Vector<PermString>& glyph_names)
+{
+ try {
+ // get font
+ Cff cff(otf.table("CFF"), otf.units_per_em(), errh);
+ if (!cff.ok())
+ return;
+
+ Cff::FontParent *fp = cff.font(PermString(), errh);
+ if (!fp || !fp->ok())
+ return;
+ Cff::Font *font = dynamic_cast<Cff::Font *>(fp);
+ if (!font) {
+ errh->error("CID-keyed fonts not supported");
+ return;
+ }
+
+ // save glyph names
+ font->glyph_names(glyph_names);
+ } catch (OpenType::Error) {
+ }
+}
+
+static void
+do_query_glyphs_post(const OpenType::Font& otf, ErrorHandler* errh, Vector<PermString>& glyph_names)
+{
+ try {
+ // get font
+ OpenType::Post post(otf.table("post"), errh);
+ if (!post.ok())
+ return;
+
+ // save glyph names
+ post.glyph_names(glyph_names);
+ } catch (OpenType::Error) {
+ }
+}
+
+static void
+do_query_glyphs(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ Vector<PermString> glyph_names;
+ if (otf.table("CFF"))
+ do_query_glyphs_cff(otf, errh, glyph_names);
+ else if (otf.table("post"))
+ do_query_glyphs_post(otf, errh, glyph_names);
+ for (PermString* s = glyph_names.begin(); s != glyph_names.end(); ++s)
+ result_errh->message("%s", s->c_str());
+ if (glyph_names.empty() && errh->nerrors() == before_nerrors)
+ errh->message("no glyph name information");
+}
+
+static void
+do_query_unicode(const OpenType::Font& otf, ErrorHandler* errh, ErrorHandler* result_errh)
+{
+ Vector<PermString> glyph_names;
+ if (otf.table("CFF"))
+ do_query_glyphs_cff(otf, errh, glyph_names);
+ else if (otf.table("post"))
+ do_query_glyphs_post(otf, errh, glyph_names);
+
+ try {
+ OpenType::Cmap cmap(otf.table("cmap"), errh);
+ if (!cmap.ok())
+ throw OpenType::Error();
+
+ Vector<std::pair<uint32_t, int> > u2g;
+ cmap.unmap_all(u2g);
+ std::sort(u2g.begin(), u2g.end());
+ for (std::pair<uint32_t, int>* it = u2g.begin(); it != u2g.end(); ++it) {
+ char name[10];
+ if (it->first < 0x10000)
+ sprintf(name, "uni%04X", it->first);
+ else
+ sprintf(name, "u%X", it->first);
+ if (it->second < glyph_names.size())
+ result_errh->message("%s %d %s\n", name, it->second, glyph_names[it->second].c_str());
+ else
+ result_errh->message("%s %d\n", name, it->second);
+ }
+ } catch (OpenType::Error) {
+ }
+}
+
+static void
+do_tables(const OpenType::Font &otf, ErrorHandler *errh, ErrorHandler *result_errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ int n = otf.ntables();
+
+ for (int i = 0; i < n; i++)
+ if (OpenType::Tag tag = otf.table_tag(i)) {
+ String s = otf.table(tag);
+ result_errh->message("%7u %s\n", s.length(), tag.text().c_str());
+ }
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ result_errh->message("corrupted tables");
+ }
+}
+
+static void
+do_dump_table(const OpenType::Font &otf, OpenType::Tag tag, ErrorHandler *errh)
+{
+ int before_nerrors = errh->nerrors();
+ try {
+ if (otf.has_table(tag)) {
+ String s = otf.table(tag);
+ int written = fwrite(s.data(), 1, s.length(), stdout);
+ if (written != s.length())
+ errh->error("%s", strerror(errno));
+ } else
+ errh->message("no %<%s%> table", tag.text().c_str());
+ } catch (OpenType::Error) {
+ if (errh->nerrors() == before_nerrors)
+ errh->message("corrupted tables");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ Vector<const char *> input_files;
+ OpenType::Tag dump_table;
+ int query = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case SCRIPT_OPT: {
+ if (!script.null())
+ usage_error(errh, "--script already specified");
+ String arg = clp->vstr;
+ int period = arg.find_left('.');
+ OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
+ if (scr.valid() && period > 0) {
+ OpenType::Tag lang(arg.substring(period + 1));
+ if (lang.valid()) {
+ script = scr;
+ langsys = lang;
+ } else
+ usage_error(errh, "bad language tag");
+ } else if (scr.valid())
+ script = scr;
+ else
+ usage_error(errh, "bad script tag");
+ break;
+ }
+
+ case QUERY_SCRIPTS_OPT:
+ case QUERY_FEATURES_OPT:
+ case QUERY_OPTICAL_SIZE_OPT:
+ case QUERY_POSTSCRIPT_NAME_OPT:
+ case QUERY_GLYPHS_OPT:
+ case QUERY_FAMILY_OPT:
+ case QUERY_FVERSION_OPT:
+ case QUERY_UNICODE_OPT:
+ case TABLES_OPT:
+ case INFO_OPT:
+ if (query)
+ usage_error(errh, "supply exactly one query type option");
+ query = opt;
+ break;
+
+ case DUMP_TABLE_OPT:
+ if (query)
+ usage_error(errh, "supply exactly one query type option");
+ if (!(dump_table = OpenType::Tag(clp->vstr)))
+ usage_error(errh, "bad table name");
+ query = opt;
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case VERSION_OPT:
+ printf("otfinfo (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ input_files.push_back(clp->vstr);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!query)
+ usage_error(errh, "supply exactly one query option");
+ if (!input_files.size())
+ input_files.push_back("-");
+ if (script.null())
+ script = Efont::OpenType::Tag("latn");
+
+ FileErrorHandler stdout_errh(stdout);
+ for (const char **input_filep = input_files.begin(); input_filep != input_files.end(); input_filep++) {
+ int before_nerrors = errh->nerrors();
+ String font_data = read_file(*input_filep, errh);
+ if (errh->nerrors() != before_nerrors)
+ continue;
+
+ String input_file = printable_filename(*input_filep);
+ LandmarkErrorHandler cerrh(errh, input_file);
+ OpenType::Font otf(font_data, &cerrh);
+ if (!otf.ok())
+ continue;
+
+ PrefixErrorHandler stdout_cerrh(&stdout_errh, input_file + ":");
+ ErrorHandler *result_errh = (input_files.size() > 1 ? static_cast<ErrorHandler *>(&stdout_cerrh) : static_cast<ErrorHandler *>(&stdout_errh));
+ if (query == QUERY_SCRIPTS_OPT)
+ do_query_scripts(otf, &cerrh, result_errh);
+ else if (query == QUERY_FEATURES_OPT)
+ do_query_features(otf, &cerrh, result_errh);
+ else if (query == QUERY_OPTICAL_SIZE_OPT)
+ do_query_optical_size(otf, &cerrh, result_errh);
+ else if (query == QUERY_POSTSCRIPT_NAME_OPT)
+ do_query_postscript_name(otf, &cerrh, result_errh);
+ else if (query == QUERY_GLYPHS_OPT)
+ do_query_glyphs(otf, &cerrh, result_errh);
+ else if (query == QUERY_UNICODE_OPT)
+ do_query_unicode(otf, &cerrh, result_errh);
+ else if (query == QUERY_FAMILY_OPT)
+ do_query_family_name(otf, &cerrh, result_errh);
+ else if (query == QUERY_FVERSION_OPT)
+ do_query_font_version(otf, &cerrh, result_errh);
+ else if (query == TABLES_OPT)
+ do_tables(otf, &cerrh, result_errh);
+ else if (query == DUMP_TABLE_OPT)
+ do_dump_table(otf, dump_table, &cerrh);
+ else if (query == INFO_OPT)
+ do_info(otf, &cerrh, result_errh);
+ }
+
+ Clp_DeleteParser(clp);
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am
new file mode 100644
index 00000000000..106e4a6f9b7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.am
@@ -0,0 +1,35 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = otftotfm
+man_MANS = otftotfm.1
+
+otftotfm_SOURCES = \
+ automatic.cc automatic.hh \
+ dvipsencoding.cc dvipsencoding.hh \
+ glyphfilter.cc glyphfilter.hh \
+ metrics.cc metrics.hh \
+ otftotfm.cc otftotfm.hh \
+ secondary.cc secondary.hh \
+ setting.hh \
+ uniprop.cc uniprop.hh \
+ util.cc util.hh
+EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
+
+otftotfm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = otftotfm.1
+
+if have_kpathsea
+otftotfm_SOURCES += kpseinterface.c kpseinterface.h
+AM_CPPFLAGS += $(KPATHSEA_INCLUDES)
+otftotfm_LDADD += $(KPATHSEA_LIBS)
+otftotfm_DEPENDENCIES += $(KPATHSEA_DEPEND)
+endif have_kpathsea
+
+## Rebuild libkpathsea in a TeX Live build
+@KPATHSEA_RULE@
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.in
new file mode 100644
index 00000000000..f4e5711abf7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/Makefile.in
@@ -0,0 +1,842 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = otftotfm$(EXEEXT)
+@have_kpathsea_TRUE@am__append_1 = kpseinterface.c kpseinterface.h
+@have_kpathsea_TRUE@am__append_2 = $(KPATHSEA_INCLUDES)
+@have_kpathsea_TRUE@am__append_3 = $(KPATHSEA_LIBS)
+@have_kpathsea_TRUE@am__append_4 = $(KPATHSEA_DEPEND)
+subdir = lcdf-typetools-src/otftotfm
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__otftotfm_SOURCES_DIST = automatic.cc automatic.hh dvipsencoding.cc \
+ dvipsencoding.hh glyphfilter.cc glyphfilter.hh metrics.cc \
+ metrics.hh otftotfm.cc otftotfm.hh secondary.cc secondary.hh \
+ setting.hh uniprop.cc uniprop.hh util.cc util.hh \
+ kpseinterface.c kpseinterface.h
+@have_kpathsea_TRUE@am__objects_1 = kpseinterface.$(OBJEXT)
+am_otftotfm_OBJECTS = automatic.$(OBJEXT) dvipsencoding.$(OBJEXT) \
+ glyphfilter.$(OBJEXT) metrics.$(OBJEXT) otftotfm.$(OBJEXT) \
+ secondary.$(OBJEXT) uniprop.$(OBJEXT) util.$(OBJEXT) \
+ $(am__objects_1)
+otftotfm_OBJECTS = $(am_otftotfm_OBJECTS)
+am__DEPENDENCIES_1 =
+@have_kpathsea_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/automatic.Po \
+ ./$(DEPDIR)/dvipsencoding.Po ./$(DEPDIR)/glyphfilter.Po \
+ ./$(DEPDIR)/kpseinterface.Po ./$(DEPDIR)/metrics.Po \
+ ./$(DEPDIR)/otftotfm.Po ./$(DEPDIR)/secondary.Po \
+ ./$(DEPDIR)/uniprop.Po ./$(DEPDIR)/util.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(otftotfm_SOURCES) $(EXTRA_otftotfm_SOURCES)
+DIST_SOURCES = $(am__otftotfm_SOURCES_DIST) $(EXTRA_otftotfm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = otftotfm.1
+otftotfm_SOURCES = automatic.cc automatic.hh dvipsencoding.cc \
+ dvipsencoding.hh glyphfilter.cc glyphfilter.hh metrics.cc \
+ metrics.hh otftotfm.cc otftotfm.hh secondary.cc secondary.hh \
+ setting.hh uniprop.cc uniprop.hh util.cc util.hh \
+ $(am__append_1)
+EXTRA_otftotfm_SOURCES = kpseinterface.c kpseinterface.h
+otftotfm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a \
+ $(am__append_3)
+otftotfm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a \
+ $(am__append_4)
+AM_CPPFLAGS = -I$(srcdir)/../include $(am__append_2)
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = otftotfm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/otftotfm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/otftotfm/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+otftotfm$(EXEEXT): $(otftotfm_OBJECTS) $(otftotfm_DEPENDENCIES) $(EXTRA_otftotfm_DEPENDENCIES)
+ @rm -f otftotfm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(otftotfm_OBJECTS) $(otftotfm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/automatic.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvipsencoding.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glyphfilter.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpseinterface.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metrics.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otftotfm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secondary.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniprop.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/automatic.Po
+ -rm -f ./$(DEPDIR)/dvipsencoding.Po
+ -rm -f ./$(DEPDIR)/glyphfilter.Po
+ -rm -f ./$(DEPDIR)/kpseinterface.Po
+ -rm -f ./$(DEPDIR)/metrics.Po
+ -rm -f ./$(DEPDIR)/otftotfm.Po
+ -rm -f ./$(DEPDIR)/secondary.Po
+ -rm -f ./$(DEPDIR)/uniprop.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/automatic.Po
+ -rm -f ./$(DEPDIR)/dvipsencoding.Po
+ -rm -f ./$(DEPDIR)/glyphfilter.Po
+ -rm -f ./$(DEPDIR)/kpseinterface.Po
+ -rm -f ./$(DEPDIR)/metrics.Po
+ -rm -f ./$(DEPDIR)/otftotfm.Po
+ -rm -f ./$(DEPDIR)/secondary.Po
+ -rm -f ./$(DEPDIR)/uniprop.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+@KPATHSEA_RULE@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc
new file mode 100644
index 00000000000..0567de51e2c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.cc
@@ -0,0 +1,816 @@
+/* automatic.{cc,hh} -- code for automatic mode and interfacing with kpathsea
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#include <config.h>
+#include "automatic.hh"
+#include "kpseinterface.h"
+#include "util.hh"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <sys/types.h>
+#if HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#if HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#include <algorithm>
+
+#ifdef WIN32
+# include <io.h>
+# include <direct.h>
+# define mkdir(dir, access) _mkdir(dir)
+# define COPY_CMD "copy"
+# define CMD_SEP "&"
+#else
+# define COPY_CMD "cp"
+# define CMD_SEP ";"
+#endif
+
+/* kpathsea may already have defined this */
+#ifndef DEV_NULL
+# ifdef WIN32
+# define DEV_NULL "NUL"
+# else
+# define DEV_NULL "/dev/null"
+# endif
+#endif
+
+#if HAVE_AUTO_T1DOTLESSJ
+enum { T1DOTLESSJ_EXIT_J_NODOT = 2 };
+#endif
+
+static String odir[NUMODIR];
+static String typeface;
+static String vendor;
+static String map_file;
+#define DEFAULT_VENDOR "lcdftools"
+#define DEFAULT_TYPEFACE "unknown"
+
+static const struct {
+ const char *name;
+ const char *envvar;
+ const char *texdir;
+} odir_info[] = {
+ { "encoding", "ENCODINGDESTDIR", "#fonts/enc/dvips/@#dvips/@" },
+ { "TFM", "TFMDESTDIR", "fonts/tfm/%" },
+ { "PL", "PLDESTDIR", "fonts/pl/%" },
+ { "VF", "VFDESTDIR", "fonts/vf/%" },
+ { "VPL", "VPLDESTDIR", "fonts/vpl/%" },
+ { "Type 1", "T1DESTDIR", "fonts/type1/%" },
+ { "DVIPS map", "DVIPS directory", "#fonts/map/dvips/@#dvips/@" },
+ { "DVIPS updmap", "DVIPS directory", "dvips" },
+ { "TrueType", "TTFDESTDIR", "fonts/truetype/%" },
+ { "OpenType", "OPENTYPEDESTDIR", "fonts/opentype/%" },
+ { "Type 42", "T42DESTDIR", "fonts/type42/%" }
+};
+
+#if HAVE_KPATHSEA
+static String odir_kpathsea[NUMODIR];
+
+static bool writable_texdir_tried = false;
+static String writable_texdir; // always ends with directory separator
+static int tds_1_1 = -1;
+
+static bool mktexupd_tried = false;
+static String mktexupd;
+
+static String
+kpsei_string(char* x)
+{
+ String s(x);
+ free((void*)x);
+ return s;
+}
+
+static void
+look_for_writable_texdir(const char *path_variable, bool create)
+{
+ String path = kpsei_string(kpsei_path_expand(path_variable));
+ while (path && !writable_texdir) {
+ const char* colon = std::find(path.begin(), path.end(), kpsei_env_sep_char);
+ String texdir = path.substring(path.begin(), colon);
+ path = path.substring(colon + 1, path.end());
+ if (access(texdir.c_str(), W_OK) >= 0)
+ writable_texdir = texdir;
+ else if (create && errno != EACCES && mkdir(texdir.c_str(), 0777) >= 0)
+ // create file if it doesn't exist already
+ writable_texdir = texdir;
+ }
+ if (writable_texdir && writable_texdir.back() != '/')
+ writable_texdir += "/";
+}
+
+static void
+find_writable_texdir(ErrorHandler *errh, const char *)
+{
+#if defined(W32TEX)
+// W32TeX does not have TEXMFVAR
+ char *p = kpsei_var_value("TEXMFVAR");
+ if (p == NULL) // W32TeX
+ look_for_writable_texdir("$TEXMFLOCAL", true);
+ else { // TeXLive
+ free (p);
+ look_for_writable_texdir("$TEXMFVAR", true);
+ }
+#else
+ look_for_writable_texdir("$TEXMFVAR", true);
+#endif
+ if (!writable_texdir)
+ look_for_writable_texdir("$VARTEXMF", false);
+ if (!writable_texdir)
+ look_for_writable_texdir("$TEXMF", false);
+ if (!writable_texdir) {
+ errh->warning("no writable directory found in $TEXMFVAR or $TEXMF");
+ errh->message("(You probably need to set your TEXMF environment variable; see\n\
+the manual for more information. The current TEXMF path is\n\
+%<%s%>.)", kpsei_string(kpsei_path_expand("$TEXMF")).c_str());
+ }
+ writable_texdir_tried = true;
+}
+
+static String
+get_vendor()
+{
+ return (vendor ? vendor : String(DEFAULT_VENDOR));
+}
+
+static String
+get_typeface()
+{
+ return (typeface ? typeface : String(DEFAULT_TYPEFACE));
+}
+#endif
+
+bool
+set_vendor(const String &s)
+{
+ bool had = (bool) vendor;
+ vendor = s;
+ return !had;
+}
+
+bool
+set_typeface(const String &s, bool override)
+{
+ bool had = (bool) typeface;
+ if (!had || override)
+ typeface = s;
+ return !had;
+}
+
+String
+getodir(int o, ErrorHandler *errh)
+{
+ assert(o >= 0 && o < NUMODIR);
+
+ if (!odir[o] && automatic && odir_info[o].envvar)
+ odir[o] = getenv(odir_info[o].envvar);
+
+#if HAVE_KPATHSEA
+ if (!odir[o] && automatic && !writable_texdir_tried)
+ find_writable_texdir(errh, odir_info[o].name);
+
+ if (!odir[o] && automatic && writable_texdir) {
+ String suffix = odir_info[o].texdir;
+
+ // May need to behave differently on TDS 1.1 rather than TDS 1.0.
+ if (suffix[0] == '#') {
+ // check type of TDS
+ if (tds_1_1 < 0) {
+ // using a procedure suggested by Olaf Weber
+ String encfonts = kpsei_string(kpsei_path_expand("$TEXMFMAIN/fonts/enc"));
+ if (!encfonts)
+ encfonts = kpsei_string(kpsei_path_expand("$TEXMFDIST/fonts/enc"));
+ tds_1_1 = (encfonts != String());
+ }
+ if (tds_1_1 == 0)
+ suffix = suffix.substring(std::find(suffix.begin() + 1, suffix.end(), '#') + 1, suffix.end());
+ else
+ suffix = suffix.substring(suffix.begin() + 1, std::find(suffix.begin() + 1, suffix.end(), '#'));
+ }
+
+ String dir = writable_texdir + suffix;
+
+ if (dir.back() == '%')
+ dir = dir.substring(0, -1) + get_vendor() + "/" + get_typeface();
+ else if (dir.back() == '@')
+ dir = dir.substring(0, -1) + get_vendor();
+
+ // create parent directories as appropriate
+ int slash = writable_texdir.length() - 1;
+ while (access(dir.c_str(), F_OK) < 0 && slash < dir.length()) {
+ if ((slash = dir.find_left('/', slash + 1)) < 0)
+ slash = dir.length();
+ String subdir = dir.substring(0, slash);
+ if (access(subdir.c_str(), F_OK) < 0
+ && !no_create
+ && mkdir(subdir.c_str(), 0777) < 0)
+ goto kpathsea_done;
+ }
+
+ // that's our answer
+ odir[o] = dir;
+ odir_kpathsea[o] = dir;
+ }
+ kpathsea_done:
+#endif
+
+ if (!odir[o]) {
+ if (automatic) {
+ errh->warning("%s not specified, placing %s files in %<.%>", odir_info[o].envvar, odir_info[o].name);
+#if !HAVE_KPATHSEA
+ static int kpathsea_warning = 0;
+ if (++kpathsea_warning == 1)
+ errh->message("(This version of otftotfm lacks $TEXMF directory support.)");
+#endif
+ }
+ odir[o] = ".";
+ }
+
+ while (odir[o].length() && odir[o].back() == '/')
+ odir[o] = odir[o].substring(0, -1);
+
+ if (verbose)
+ errh->message("placing %s files in %<%s%>", odir_info[o].name, odir[o].c_str());
+ return odir[o];
+}
+
+void
+setodir(int o, const String &value)
+{
+ assert(o >= 0 && o < NUMODIR);
+ odir[o] = value;
+}
+
+const char *
+odirname(int o)
+{
+ if (o == NUMODIR) {
+ return "default";
+ } else {
+ assert(o >= 0 && o < NUMODIR);
+ return odir_info[o].name;
+ }
+}
+
+#if HAVE_KPATHSEA
+static bool
+file_in_kpathsea_odir(int o, const String &file)
+{
+ return odir_kpathsea[o]
+ && file.length() > odir[o].length()
+ && memcmp(file.data(), odir[o].data(), odir[o].length()) == 0
+ && file[odir[o].length()] == '/';
+}
+#endif
+
+void
+update_odir(int o, String file, ErrorHandler *errh)
+{
+ assert(o >= 0 && o < NUMODIR);
+#if HAVE_KPATHSEA
+ if (file.find_left('/') < 0)
+ file = odir[o] + "/" + file;
+
+ // exit if this directory was not found via kpathsea, or the file is not
+ // in the kpathsea directory
+ if (!file_in_kpathsea_odir(o, file))
+ return;
+
+ assert(writable_texdir && writable_texdir.length() <= odir[o].length()
+ && memcmp(file.data(), writable_texdir.data(), writable_texdir.length()) == 0);
+
+ // divide the filename into portions
+ // file == writable_texdir + directory + file
+ file = file.substring(writable_texdir.length());
+ while (file && file[0] == '/')
+ file = file.substring(1);
+ int last_slash = file.find_right('/');
+ String directory = (last_slash >= 0 ? file.substring(0, last_slash) : String());
+ file = file.substring(last_slash >= 0 ? last_slash + 1 : 0);
+ if (!file) // no filename to update
+ return;
+
+ // return if nocreate
+ if (no_create) {
+ errh->message("would update %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+ return;
+ } else if (verbose)
+ errh->message("updating %sls-R for %s/%s", writable_texdir.c_str(), directory.c_str(), file.c_str());
+
+ // try to update ls-R ourselves, rather than running mktexupd --
+ // mktexupd's runtime is painful: a half second to update a file
+ String ls_r = writable_texdir + "ls-R";
+ bool success = false;
+ if (access(ls_r.c_str(), R_OK) >= 0) // make sure it already exists
+ if (FILE *f = fopen(ls_r.c_str(), "ab")) {
+ fprintf(f, "./%s:\n%s\n", directory.c_str(), file.c_str());
+ success = true;
+ fclose(f);
+ }
+
+ // otherwise, run mktexupd
+ if (!success && writable_texdir.find_left('\'') < 0 && directory.find_left('\'') < 0 && file.find_left('\'') < 0) {
+ // look for mktexupd script
+ if (!mktexupd_tried) {
+#ifdef _WIN32
+ mktexupd = "mktexupd.exe";
+#else
+ mktexupd = kpsei_string(kpsei_find_file("mktexupd", KPSEI_FMT_WEB2C));
+#endif
+ mktexupd_tried = true;
+ }
+
+ // run script
+ if (mktexupd) {
+ String command = mktexupd + " " + shell_quote(writable_texdir + directory) + " " + shell_quote(file);
+ int retval = system(command.c_str());
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ }
+ }
+#else
+ (void) file, (void) errh;
+#endif
+}
+
+bool
+set_map_file(const String &s)
+{
+ bool had = (bool) map_file;
+ map_file = s;
+ return !had;
+}
+
+String
+installed_type1(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ (void) otf_filename, (void) allow_generate, (void) errh;
+
+ if (!ps_fontname)
+ return String();
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_CFFTOT1
+ if (!(force && allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh))) {
+# endif
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+# if HAVE_AUTO_CFFTOT1
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_CFFTOT1
+ // if not found, and can generate on the fly, run cfftot1
+ if (allow_generate && otf_filename && otf_filename != "-" && getodir(O_TYPE1, errh)) {
+ String pfb_filename = odir[O_TYPE1] + "/" + ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || otf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "cfftot1 " + shell_quote(otf_filename) + " -n " + shell_quote(ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ }
+ }
+#endif
+
+ return String();
+}
+
+String
+installed_type1_dotlessj(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ (void) otf_filename, (void) allow_generate, (void) errh;
+
+ if (!ps_fontname)
+ return String();
+ if (verbose)
+ errh->message("searching for dotless-j font for %s", ps_fontname.c_str());
+
+ String j_ps_fontname = ps_fontname + "LCDFJ";
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_T1DOTLESSJ
+ if (!(force && allow_generate && getodir(O_TYPE1, errh))) {
+# endif
+ // look for existing .pfb or .pfa
+ String file, path;
+ if ((file = j_ps_fontname + ".pfb", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))
+ || (file = j_ps_fontname + ".pfa", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE1)))) {
+ // ignore versions in the current directory
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 1 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 1 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+# if HAVE_AUTO_T1DOTLESSJ
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_T1DOTLESSJ
+ // if not found, and can generate on the fly, try running t1dotlessj
+ if (allow_generate && getodir(O_TYPE1, errh)) {
+ if (String base_filename = installed_type1(otf_filename, ps_fontname, allow_generate, errh)) {
+ String pfb_filename = odir[O_TYPE1] + "/" + j_ps_fontname + ".pfb";
+ if (pfb_filename.find_left('\'') >= 0 || base_filename.find_left('\'') >= 0)
+ return String();
+ String command = "t1dotlessj " + shell_quote(base_filename) + " -n " + shell_quote(j_ps_fontname) + " " + shell_quote(pfb_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (WEXITSTATUS(retval) == T1DOTLESSJ_EXIT_J_NODOT)
+ return String("\0", 1);
+ else if (retval != 0)
+ errh->warning("%<%s%> failed (%d)", command.c_str(), retval);
+ if (retval == 0) {
+ update_odir(O_TYPE1, pfb_filename, errh);
+ return pfb_filename;
+ } else
+ errh->warning("output font will not contain a dotless-j character");
+ }
+ }
+#endif
+
+ return String();
+}
+
+String
+installed_truetype(const String &ttf_filename, bool allow_generate, ErrorHandler *errh)
+{
+ String file = pathname_filename(ttf_filename);
+
+#if HAVE_KPATHSEA
+ if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh))) {
+ if (String path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TRUETYPE))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring TrueType file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+ }
+#endif
+
+ // perhaps generate type 42 in the future, for now just copy
+ if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TRUETYPE, errh)) {
+ String installed_ttf_filename = odir[O_TRUETYPE] + "/" + file;
+ if (installed_ttf_filename.find_left('\'') >= 0 || installed_ttf_filename.find_left('\"') >= 0)
+ return String();
+
+ int retval;
+ if (!same_filename(ttf_filename, installed_ttf_filename)) {
+ String command = COPY_CMD " " + shell_quote(ttf_filename) + " " + shell_quote(installed_ttf_filename);
+ retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ } else {
+ if (verbose)
+ errh->message("TrueType file %s already located in output directory", installed_ttf_filename.c_str());
+ retval = 0;
+ }
+
+ if (retval == 0) {
+ update_odir(O_TRUETYPE, installed_ttf_filename, errh);
+ return installed_ttf_filename;
+ }
+ }
+
+ return String();
+}
+
+String
+installed_type42(const String &ttf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh)
+{
+ (void) allow_generate, (void) ttf_filename, (void) errh;
+
+ if (!ps_fontname)
+ return String();
+
+#if HAVE_KPATHSEA
+# if HAVE_AUTO_TTFTOTYPE42
+ if (!(force && allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh))) {
+# endif
+ // look for .pfb and .pfa
+ String file, path;
+ if ((file = ps_fontname + ".t42", path = kpsei_string(kpsei_find_file(file.c_str(), KPSEI_FMT_TYPE42)))) {
+ if (path == "./" + file || path == file) {
+ if (verbose)
+ errh->message("ignoring Type 42 file %s found with kpathsea in %<.%>", path.c_str());
+ } else {
+ if (verbose)
+ errh->message("Type 42 file %s found with kpathsea at %s", file.c_str(), path.c_str());
+ return path;
+ }
+ }
+# if HAVE_AUTO_TTFTOTYPE42
+ }
+# endif
+#endif
+
+#if HAVE_AUTO_TTFTOTYPE42
+ // if not found, and can generate on the fly, run ttftotype42
+ if (allow_generate && ttf_filename && ttf_filename != "-" && getodir(O_TYPE42, errh)) {
+ String t42_filename = odir[O_TYPE42] + "/" + ps_fontname + ".t42";
+ if (t42_filename.find_left('\'') >= 0 || ttf_filename.find_left('\'') >= 0)
+ return String();
+ String command = "ttftotype42 " + shell_quote(ttf_filename) + " " + shell_quote(t42_filename);
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->error("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->error("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->error("%<%s%> failed", command.c_str());
+ if (retval == 0) {
+ update_odir(O_TYPE42, t42_filename, errh);
+ return t42_filename;
+ }
+ }
+#endif
+
+ return String();
+}
+
+int
+update_autofont_map(const String &fontname, String mapline, ErrorHandler *errh)
+{
+#if HAVE_KPATHSEA
+ if (automatic && !map_file && getodir(O_MAP, errh))
+ map_file = odir[O_MAP] + "/" + get_vendor() + ".map";
+#endif
+
+ if (map_file == "" || map_file == "-")
+ fputs(mapline.c_str(), stdout);
+ else {
+ // report no_create/verbose
+ if (no_create) {
+ errh->message("would update %s for %s", map_file.c_str(), String(fontname).c_str());
+ return 0;
+ } else if (verbose)
+ errh->message("updating %s for %s", map_file.c_str(), String(fontname).c_str());
+
+ int fd = open(map_file.c_str(), O_RDWR | O_CREAT, 0666);
+ if (fd < 0)
+ return errh->lerror(map_file, "%s", strerror(errno));
+ FILE *f = fdopen(fd, "r+");
+ // NB: also change encoding logic if you change this code
+
+#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
+ {
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", map_file.c_str(), strerror(result));
+ }
+ }
+#endif
+
+ // read old data from map file
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f))
+ return errh->error("%s: %s", map_file.c_str(), strerror(errno));
+ String text = sa.take_string();
+
+ // add comment if necessary
+ bool created = (!text);
+ if (created)
+ text = "% Automatically maintained by otftotfm or other programs. Do not edit.\n\n";
+ if (text.back() != '\n')
+ text += "\n";
+
+ // append old encodings
+ int fl = 0;
+ int nl = text.find_left('\n') + 1;
+ bool changed = created;
+ while (fl < text.length()) {
+ if (fl + fontname.length() + 1 < nl
+ && memcmp(text.data() + fl, fontname.data(), fontname.length()) == 0
+ && text[fl + fontname.length()] == ' ') {
+ // found the old name
+ if (text.substring(fl, nl - fl) == mapline) {
+ // duplicate of old name, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ return 0;
+ } else {
+ text = text.substring(0, fl) + text.substring(nl);
+ nl = fl;
+ changed = true;
+ }
+ }
+ fl = nl;
+ nl = text.find_left('\n', fl) + 1;
+ }
+
+ if (!mapline && !changed) {
+ // special case: empty mapline, unchanged file
+ if (verbose)
+ errh->message("%s unchanged", map_file.c_str());
+ } else {
+ // add our text
+ text += mapline;
+
+ // rewind file
+#if HAVE_FTRUNCATE
+ rewind(f);
+ if (ftruncate(fd, 0) < 0)
+#endif
+ {
+ fclose(f);
+ f = fopen(map_file.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+ // write data
+ ignore_result(fwrite(text.data(), 1, text.length(), f));
+ }
+
+ fclose(f);
+
+ // inform about the new file if necessary
+ if (created)
+ update_odir(O_MAP, map_file, errh);
+
+#if HAVE_KPATHSEA && !WIN32
+ // run 'updmap' if present
+ String updmap_prog = output_flags & G_UPDMAP_USER ? "updmap-user" : "updmap-sys";
+ String updmap_dir, updmap_file;
+ if (automatic && (output_flags & G_UPDMAP))
+ updmap_dir = getodir(O_MAP_PARENT, errh);
+ if (updmap_dir
+ && (updmap_file = updmap_dir + "/" + updmap_prog)
+ && access(updmap_file.c_str(), X_OK) >= 0) {
+ // want to run `updmap` from its directory, can't use system()
+ if (verbose)
+ errh->message("running %s", updmap_file.c_str());
+
+ pid_t child = fork();
+ if (child < 0)
+ errh->fatal("%s during fork", strerror(errno));
+ else if (child == 0) {
+ // change to updmap directory, run it
+ if (chdir(updmap_dir.c_str()) < 0)
+ errh->fatal("%s: %s during chdir", updmap_dir.c_str(), strerror(errno));
+ if (execl(output_flags & G_UPDMAP_USER ? "./updmap-user" : "./updmap-sys",
+ updmap_file.c_str(),
+ (const char*) 0) < 0)
+ errh->fatal("%s: %s during exec", updmap_file.c_str(), strerror(errno));
+ exit(1); // should never get here
+ }
+
+# if HAVE_WAITPID
+ // wait for updmap to finish
+ int status;
+ while (1) {
+ pid_t answer = waitpid(child, &status, 0);
+ if (answer >= 0)
+ break;
+ else if (errno != EINTR)
+ errh->fatal("%s during wait", strerror(errno));
+ }
+ if (!WIFEXITED(status))
+ errh->warning("%s exited abnormally", updmap_file.c_str());
+ else if (WEXITSTATUS(status) != 0)
+ errh->warning("%s exited with status %d", updmap_file.c_str(), WEXITSTATUS(status));
+# else
+# error "need waitpid() support: report this bug to the maintainer"
+# endif
+ goto ran_updmap;
+ }
+
+# if HAVE_AUTO_UPDMAP
+ // run system updmap
+ if (output_flags & G_UPDMAP) {
+ String filename = map_file;
+ int slash = filename.find_right('/');
+ if (slash >= 0)
+ filename = filename.substring(slash + 1);
+ String redirect = verbose ? " 1>&2" : " >" DEV_NULL " 2>&1";
+ String command = updmap_prog + " --nomkmap --enable Map " + shell_quote(filename) + redirect
+ + CMD_SEP " " + updmap_prog + redirect;
+ int retval = mysystem(command.c_str(), errh);
+ if (retval == 127)
+ errh->warning("could not run %<%s%>", command.c_str());
+ else if (retval < 0)
+ errh->warning("could not run %<%s%>: %s", command.c_str(), strerror(errno));
+ else if (retval != 0)
+ errh->warning("%<%s%> exited with status %d;\nrun it manually to check for errors", command.c_str(), WEXITSTATUS(retval));
+ goto ran_updmap;
+ }
+# endif
+
+ if (verbose)
+ errh->message("not running updmap");
+
+ ran_updmap: ;
+#endif
+ }
+
+ return 0;
+}
+
+String
+locate_encoding(String encfile, ErrorHandler *errh, bool literal)
+{
+ if (!encfile || encfile == "-")
+ return encfile;
+
+ if (!literal) {
+ int slash = encfile.find_right('/');
+ int dot = encfile.find_left('.', slash >= 0 ? slash : 0);
+ if (dot < 0)
+ if (String file = locate_encoding(encfile + ".enc", errh, true))
+ return file;
+ }
+
+#if HAVE_KPATHSEA
+ if (String file = kpsei_string(kpsei_find_file(encfile.c_str(), KPSEI_FMT_ENCODING))) {
+ if (verbose)
+ errh->message("encoding file %s found with kpathsea at %s", encfile.c_str(), file.c_str());
+ return file;
+ } else if (verbose)
+ errh->message("encoding file %s not found with kpathsea", encfile.c_str());
+#endif
+
+ if (access(encfile.c_str(), R_OK) >= 0)
+ return encfile;
+ else
+ return String();
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh
new file mode 100644
index 00000000000..6149232f4f9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/automatic.hh
@@ -0,0 +1,27 @@
+#ifndef OTFTOTFM_AUTOMATIC_HH
+#define OTFTOTFM_AUTOMATIC_HH
+#include <lcdf/string.hh>
+class ErrorHandler;
+
+enum {
+ O_ENCODING = 0, O_TFM, O_PL, O_VF, O_VPL, O_TYPE1, O_MAP, O_MAP_PARENT,
+ O_TRUETYPE, O_OPENTYPE, O_TYPE42, NUMODIR
+};
+
+extern bool automatic;
+extern bool no_create;
+String getodir(int o, ErrorHandler *);
+void setodir(int o, const String &);
+bool set_vendor(const String &);
+bool set_typeface(const String &, bool override);
+bool set_map_file(const String &);
+const char *odirname(int o);
+void update_odir(int o, String file, ErrorHandler *);
+String installed_type1(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *);
+String installed_type1_dotlessj(const String &otf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *);
+String installed_truetype(const String &ttf_filename, bool allow_generate, ErrorHandler *errh);
+String installed_type42(const String &ttf_filename, const String &ps_fontname, bool allow_generate, ErrorHandler *errh);
+int update_autofont_map(const String &fontname, String mapline, ErrorHandler *);
+String locate_encoding(String encfile, ErrorHandler *, bool literal = false);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc
new file mode 100644
index 00000000000..6a30b9d17fd
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.cc
@@ -0,0 +1,979 @@
+/* dvipsencoding.{cc,hh} -- store a DVIPS encoding
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "dvipsencoding.hh"
+#include "metrics.hh"
+#include "secondary.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <algorithm>
+#include "util.hh"
+
+enum { GLYPHLIST_ALTERNATIVE = 0x40000000,
+ GLYPHLIST_USEMAP = GLYPHLIST_ALTERNATIVE,
+ U_EMPTYSLOT = 0xD801,
+ U_ALTSELECTOR = 0xD802 };
+static HashMap<String, uint32_t> glyphlist((uint32_t) -1);
+static Vector<uint32_t> glyphmap;
+static PermString::Initializer perm_initializer;
+PermString DvipsEncoding::dot_notdef(".notdef");
+
+#define NEXT_GLYPH_NAME(gn) ("/" + (gn))
+
+void
+DvipsEncoding::add_glyphlist(String text)
+{
+ const char *s = text.begin(), *end = text.end();
+ while (s != end) {
+ // move to first nonblank
+ while (s != end && isspace((unsigned char) *s))
+ ++s;
+ // ignore comments
+ if (s != end && *s == '#') {
+ skip_to_end_of_line:
+ while (s != end && *s != '\n' && *s != '\r')
+ ++s;
+ continue;
+ }
+ // parse glyph name
+ const char *name_start = s;
+ while (s != end && !isspace((unsigned char) *s) && *s != ';')
+ ++s;
+ if (s == name_start)
+ goto skip_to_end_of_line;
+ String glyph_name = text.substring(name_start, s).compact();
+ int map_pos = glyphmap.size();
+ // parse Unicodes
+ while (1) {
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || *s == '\n' || *s == '\r' || *s == '#'
+ || (map_pos == glyphmap.size() && *s != ';' && *s != ','))
+ break;
+ if (*s == ';' || *s == ',') {
+ ++s;
+ while (s != end && (*s == ' ' || *s == '\t'))
+ ++s;
+ if (s == end || !isxdigit((unsigned char) *s))
+ goto skip_to_end_of_line;
+ if (map_pos != glyphmap.size())
+ glyphmap.push_back(GLYPHLIST_ALTERNATIVE);
+ }
+ uint32_t u = 0;
+ while (s != end && isxdigit((unsigned char) *s)) {
+ if (*s >= '0' && *s <= '9')
+ u = (u << 4) + *s - '0';
+ else if (*s >= 'A' && *s <= 'F')
+ u = (u << 4) + *s - 'A' + 10;
+ else
+ u = (u << 4) + *s - 'a' + 10;
+ ++s;
+ }
+ if (u == 0 || u > 0x10FFFF)
+ goto skip_to_end_of_line;
+ glyphmap.push_back(u);
+ if (s != end && !isspace((unsigned char) *s) && *s != ',' && *s != ';')
+ break;
+ }
+ // store result
+ if (map_pos == glyphmap.size() - 1) {
+ glyphlist.insert(glyph_name, glyphmap.back());
+ glyphmap.pop_back();
+ } else {
+ glyphlist.insert(glyph_name, map_pos | GLYPHLIST_USEMAP);
+ glyphmap.push_back(0);
+ }
+ goto skip_to_end_of_line;
+ }
+}
+
+static void
+unicode_add_suffix(Vector<uint32_t> &prefix,
+ int prefix_starting_from,
+ const Vector<uint32_t> &suffix)
+{
+ int prefix_size = prefix.size();
+ for (Vector<uint32_t>::const_iterator it = suffix.begin();
+ it != suffix.end() && *it != 0;
+ ++it)
+ if (*it == GLYPHLIST_ALTERNATIVE) {
+ prefix.push_back(*it);
+ for (int i = prefix_starting_from; i < prefix_size; ++i)
+ prefix.push_back(prefix[i]);
+ } else
+ prefix.push_back(*it);
+}
+
+bool
+DvipsEncoding::glyphname_unicode(String gn, Vector<uint32_t> &unis)
+{
+ int unis_first_size = unis.size();
+
+ // drop all characters to the right of the first dot
+ String::iterator dot = std::find(gn.begin(), gn.end(), '.');
+ if (dot > gn.begin() && dot < gn.end())
+ gn = gn.substring(gn.begin(), dot);
+
+ // map the first component, handle later components recursively
+ String::iterator underscore = std::find(gn.begin(), gn.end(), '_');
+ String component = gn.substring(gn.begin(), underscore);
+ int prefix_start = 0;
+ Vector<uint32_t> suffix;
+ if (String gn_suffix = gn.substring(underscore + 1, gn.end())) {
+ if (!glyphname_unicode(gn_suffix, suffix))
+ return false;
+ }
+
+ // check glyphlist
+ int value = glyphlist[component];
+ uint32_t uval;
+ if (value >= 0 && !(value & GLYPHLIST_USEMAP))
+ unis.push_back(value);
+ else if (value >= 0) {
+ for (int i = (value & ~GLYPHLIST_USEMAP);
+ glyphmap[i];
+ ++i)
+ if (glyphmap[i] == GLYPHLIST_ALTERNATIVE) {
+ unicode_add_suffix(unis, prefix_start, suffix);
+ unis.push_back(GLYPHLIST_ALTERNATIVE);
+ prefix_start = unis.size();
+ } else
+ unis.push_back(glyphmap[i]);
+ } else if (component.length() >= 7
+ && (component.length() % 4) == 3
+ && (memcmp(component.data(), "uni", 3) == 0
+ // 16.Aug.2008: Some texnansx.enc have incorrect "Uni"
+ // prefix, but we might as well understand it.
+ || memcmp(component.data(), "Uni", 3) == 0)) {
+ for (const char *s = component.begin() + 3;
+ s < component.end();
+ s += 4)
+ if (parse_unicode_number(s, s + 4, -1, uval))
+ unis.push_back(uval);
+ else {
+ unis.resize(unis_first_size);
+ return false;
+ }
+ } else if (component.length() >= 5
+ && component.length() <= 7
+ && component[0] == 'u'
+ && parse_unicode_number(component.begin() + 1, component.end(), -1, uval))
+ unis.push_back(uval);
+ else
+ return false;
+
+ unicode_add_suffix(unis, prefix_start, suffix);
+ return true;
+}
+
+
+DvipsEncoding::DvipsEncoding()
+ : _boundary_char(-1), _altselector_char(-1), _unicoding_map(-1),
+ _warn_missing(false)
+{
+}
+
+void
+DvipsEncoding::encode(int e, PermString what)
+{
+ if (e >= _e.size())
+ _e.resize(e + 1, dot_notdef);
+ _e[e] = what;
+}
+
+int
+DvipsEncoding::encoding_of(PermString what, bool encoding_required)
+{
+ int slot = -1;
+ for (int i = 0; i < _e.size(); i++)
+ if (_e[i] == what) {
+ slot = i;
+ goto use_slot;
+ } else if (!_e[i] || _e[i] == dot_notdef)
+ slot = i;
+ if (what == "||")
+ return _boundary_char;
+ else if (!encoding_required || slot < 0)
+ return -1;
+ use_slot:
+ if (encoding_required) {
+ if (slot >= _encoding_required.size())
+ _encoding_required.resize(slot + 1, false);
+ _encoding_required[slot] = true;
+ this->encode(slot, what);
+ }
+ return slot;
+}
+
+static String
+tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ // skip whitespace
+ while (pos < len && isspace((unsigned char) data[pos])) {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
+ pos_in = pos + 1;
+ return s.substring(pos, 1);
+ } else if (data[pos] == '(') {
+ int first = pos, nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ pos_in = (pos < len ? pos + 1 : len);
+ return s.substring(first, pos_in - first);
+ } else {
+ int first = pos;
+ while (pos < len && data[pos] == '/')
+ pos++;
+ while (pos < len && data[pos] != '/' && !isspace((unsigned char) data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
+ pos++;
+ pos_in = pos;
+ return s.substring(first, pos - first);
+ }
+ }
+}
+
+
+static String
+comment_tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ while (pos < len && data[pos] != '%' && data[pos] != '(') {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && (data[pos] == ' ' || data[pos] == '\t'); pos++)
+ /* nada */;
+ int first = pos;
+ for (; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ pos_in = pos;
+ if (pos > first)
+ return s.substring(first, pos - first);
+ } else {
+ int nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ }
+ }
+}
+
+static bool
+retokenize_isword(char c)
+{
+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9') || c == '.' || c == '_';
+}
+
+
+static struct { const char *s; int v; } ligkern_ops[] = {
+ { "=:", DvipsEncoding::JL_LIG }, { "|=:", DvipsEncoding::JL_CLIG },
+ { "|=:>", DvipsEncoding::JL_CLIG_S }, { "=:|", DvipsEncoding::JL_LIGC },
+ { "=:|>", DvipsEncoding::JL_LIGC_S }, { "|=:|", DvipsEncoding::JL_CLIGC },
+ { "|=:>", DvipsEncoding::JL_CLIGC_S }, { "|=:|>>", DvipsEncoding::JL_CLIGC_SS },
+ { "{}", DvipsEncoding::JT_KERN }, { "{K}", DvipsEncoding::JT_KERN },
+ { "{L}", DvipsEncoding::JT_LIG }, { "{LK}", DvipsEncoding::JT_NOLIGKERN },
+ { "{KL}", DvipsEncoding::JT_NOLIGKERN }, { "{k}", DvipsEncoding::JT_KERN },
+ { "{l}", DvipsEncoding::JT_LIG }, { "{lk}", DvipsEncoding::JT_NOLIGKERN },
+ { "{kl}", DvipsEncoding::JT_NOLIGKERN },
+ // some encodings have @{@} instead of {}
+ { "@{@}", DvipsEncoding::JT_KERN },
+ { 0, 0 }
+};
+
+static int
+find_ligkern_op(const String &s)
+{
+ for (int i = 0; ligkern_ops[i].s; i++)
+ if (ligkern_ops[i].s == s)
+ return ligkern_ops[i].v;
+ return 0;
+}
+
+inline bool
+operator==(const DvipsEncoding::Ligature& l1, const DvipsEncoding::Ligature& l2)
+{
+ return l1.c1 == l2.c1 && l1.c2 == l2.c2;
+}
+
+void
+DvipsEncoding::add_ligkern(const Ligature &l, int override)
+{
+ Ligature *old = std::find(_lig.begin(), _lig.end(), l);
+ if (old == _lig.end())
+ _lig.push_back(l);
+ else {
+ if ((l.join & JT_KERN) && (override > 0 || !(old->join & JT_KERN))) {
+ old->join |= JT_KERN;
+ old->k = l.k;
+ }
+ if ((l.join & JT_LIG) && (override > 0 || !(old->join & JT_LIG))) {
+ old->join = (old->join & JT_KERN) | (l.join & JT_LIGALL);
+ old->d = l.d;
+ }
+ }
+}
+
+int
+DvipsEncoding::parse_ligkern_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ _file_had_ligkern = true;
+ int op;
+ long l;
+ char *endptr;
+ if (v.size() == 3) {
+ // empty string fails
+ if (!v[0])
+ return -1;
+ // boundary char setting
+ if (v[0] == "||" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _boundary_char < 0)
+ _boundary_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _boundary_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in boundary character assignment");
+ }
+ // altselector char setting
+ if (v[0] == "^^" && v[1] == "=") {
+ char *endptr;
+ if (override > 0 || _altselector_char < 0)
+ _altselector_char = strtol(v[2].c_str(), &endptr, 10);
+ if (*endptr == 0 && _altselector_char < _e.size())
+ return 0;
+ else
+ return errh->error("parse error in altselector character assignment");
+ }
+ // encoding
+ l = strtol(v[0].c_str(), &endptr, 0);
+ if (endptr == v[0].end() && v[1] == "=") {
+ if (l >= 0 && l < 256) {
+ if (override > 0 || !_e[l])
+ encode(l, v[2]);
+ return 0;
+ } else
+ return errh->error("encoding value %<%d%> out of range", l);
+ }
+
+ // kern operation
+ if (v[1].length() >= 3 && v[1][0] == '{' && v[1].back() == '}') {
+ String middle = v[1].substring(1, v[1].length() - 2);
+ l = strtol(middle.c_str(), &endptr, 0);
+ if (endptr == middle.end()) {
+ op = JT_KERN;
+ goto found_kernop;
+ }
+ }
+ op = find_ligkern_op(v[1]);
+ if (!op || (op & JT_ADDLIG))
+ return -1;
+ found_kernop:
+ int av = (v[0] == "*" ? J_ALL : encoding_of(v[0]));
+ if (av < 0)
+ return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[0].c_str());
+ int bv = (v[2] == "*" ? J_ALL : encoding_of(v[2]));
+ if (bv < 0)
+ return errh->warning("bad %<%s%> (%<%s%> has no encoding)", v[1].c_str(), v[2].c_str());
+ if ((op & JT_KERN) && l && (av == J_ALL || bv == J_ALL))
+ return errh->warning("%<%s %s %s%> illegal, only {0} works with *", v[0].c_str(), v[1].c_str(), v[2].c_str());
+ Ligature lig = { av, bv, op, static_cast<int>(l), 0 };
+ add_ligkern(lig, override);
+ return 0;
+
+ } else if (v.size() == 4 && ((op = find_ligkern_op(v[2])) & JT_ADDLIG)) {
+ int av = encoding_of(v[0], override > 0);
+ if (av < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[0].c_str()) : -1);
+ int bv = encoding_of(v[1], override > 0);
+ if (bv < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[1].c_str()) : -1);
+ int cv = encoding_of(v[3], override > 0);
+ if (cv < 0)
+ return (override > 0 ? errh->warning("bad ligature (%<%s%> has no encoding)", v[3].c_str()) : -1);
+ Ligature lig = { av, bv, op, 0, cv };
+ add_ligkern(lig, override);
+ return 0;
+
+ } else
+ return -EPARSE;
+}
+
+int
+DvipsEncoding::parse_position_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ if (v.size() != 4)
+ return -EPARSE;
+
+ int c = encoding_of(v[0]);
+ if (c < 0)
+ return (override > 0 ? errh->warning("bad positioning (%<%s%> has no encoding)", v[0].c_str()) : -1);
+
+ char *endptr;
+ int pdx, pdy, adx;
+ if (!v[1] || !v[2] || !v[3]
+ || (pdx = strtol(v[1].c_str(), &endptr, 10), *endptr)
+ || (pdy = strtol(v[2].c_str(), &endptr, 10), *endptr)
+ || (adx = strtol(v[3].c_str(), &endptr, 10), *endptr))
+ return errh->error("parse error in POSITION");
+
+ Ligature l = { c, pdx, pdy, adx, 0 };
+ Ligature *old = std::find(_pos.begin(), _pos.end(), l);
+ if (old == _pos.end())
+ _pos.push_back(l);
+ else if (override > 0)
+ *old = l;
+ return 0;
+}
+
+int
+DvipsEncoding::parse_unicoding_words(Vector<String> &v, int override, ErrorHandler *errh)
+{
+ int av;
+ if (v.size() < 2 || (v[1] != "=" && v[1] != "=:" && v[1] != ":="))
+ return -EPARSE;
+ else if (v[0] == "||" || (av = encoding_of(v[0])) < 0)
+ return errh->warning("bad UNICODING (%<%s%> has no encoding)", v[0].c_str());
+
+ int original_size = _unicoding.size();
+
+ if (v.size() == 2 || (v.size() == 3 && v[2] == dot_notdef))
+ /* no warnings to delete a glyph */;
+ else {
+ for (int i = 2; i < v.size(); i++) {
+ if (_unicoding.size() != original_size)
+ _unicoding.push_back(GLYPHLIST_ALTERNATIVE);
+ if (!glyphname_unicode(v[i], _unicoding)) {
+ errh->warning("can%,t map %<%s%> to Unicode", v[i].c_str());
+ if (i == v.size() - 1 && _unicoding.size() == original_size)
+ errh->warning("target %<%s%> will be deleted from encoding", v[0].c_str());
+ else if (_unicoding.size() != original_size)
+ _unicoding.pop_back();
+ }
+ }
+ }
+
+ _unicoding.push_back(0);
+ if (override > 0 || _unicoding_map[v[0]] < 0)
+ _unicoding_map.insert(v[0], original_size);
+ return 0;
+}
+
+const DvipsEncoding::WordType DvipsEncoding::word_types[] = {
+ { "LIGKERN", &DvipsEncoding::parse_ligkern_words },
+ { "POSITION", &DvipsEncoding::parse_position_words },
+ { "UNICODING", &DvipsEncoding::parse_unicoding_words }
+};
+
+void
+DvipsEncoding::parse_word_group(Vector<String> &words, int override, int wt, ErrorHandler *errh)
+{
+ if (words.size() > 0) {
+ int (DvipsEncoding::*method)(Vector<String> &, int, ErrorHandler *) = word_types[wt].parsefunc;
+ if ((this->*method)(words, override, errh) == -EPARSE) {
+ Vector<String> rewords;
+ for (String *sp = words.begin(); sp != words.end(); sp++) {
+ const char *s = sp->begin(), *ends = sp->end();
+ while (s != ends) {
+ const char *word = s;
+ if (*s == '{') {
+ for (s++; s != ends && *s != '}'; s++)
+ /* nada */;
+ if (s != ends)
+ s++;
+ } else {
+ bool x = retokenize_isword(*s);
+ for (s++; s != ends && x == retokenize_isword(*s); s++)
+ /* nada */;
+ }
+ rewords.push_back(sp->substring(word, s));
+ }
+ }
+ if ((this->*method)(rewords, override, errh) == -EPARSE)
+ errh->error("parse error in %s", word_types[wt].name);
+
+ }
+ words.clear();
+ }
+}
+
+int
+DvipsEncoding::parse_words(const String &s, int override, int wt, ErrorHandler *errh)
+{
+ Vector<String> words;
+ const char *data = s.data();
+ const char *end = s.end();
+ while (data < end) {
+ while (data < end && isspace((unsigned char) *data))
+ data++;
+ const char *first = data;
+ while (data < end && !isspace((unsigned char) *data) && *data != ';')
+ data++;
+ if (data == first) {
+ data++; // step past semicolon (or harmlessly past EOS)
+ parse_word_group(words, override, wt, errh);
+ } else
+ words.push_back(s.substring(first, data));
+ }
+ parse_word_group(words, override, wt, errh);
+ return 0;
+}
+
+String
+DvipsEncoding::landmark(int line) const
+{
+ StringAccum sa;
+ sa << _printable_filename << ':' << line;
+ return sa.take_string();
+}
+
+static String
+trim_space(const String &s, int pos)
+{
+ while (pos < s.length() && isspace((unsigned char) s[pos]))
+ pos++;
+ int epos = s.length();
+ for (int x = 0; x < 2; x++) {
+ while (epos > pos && isspace((unsigned char) s[epos - 1]))
+ epos--;
+ if (epos == pos || s[epos - 1] != ';')
+ break;
+ epos--;
+ }
+ return s.substring(pos, epos - pos);
+}
+
+int
+DvipsEncoding::parse(String filename, bool ignore_ligkern, bool ignore_other, ErrorHandler *errh)
+{
+ int before = errh->nerrors();
+ String s = read_file(filename, errh);
+ if (errh->nerrors() != before)
+ return -1;
+ _filename = filename;
+ _printable_filename = printable_filename(filename);
+ _file_had_ligkern = false;
+ int pos = 0, line = 1;
+
+ // parse text
+ String token = tokenize(s, pos, line);
+ if (!token || token[0] != '/')
+ return errh->lerror(landmark(line), "parse error, expected name");
+ _name = token.substring(1);
+ _initial_comment = s.substring(0, pos - token.length());
+
+ if (tokenize(s, pos, line) != "[")
+ return errh->lerror(landmark(line), "parse error, expected [");
+
+ while ((token = tokenize(s, pos, line)) && token[0] == '/')
+ _e.push_back(token.substring(1));
+
+ _final_text = token + s.substring(pos);
+
+ // now parse comments
+ pos = 0, line = 1;
+ Vector<String> words;
+ LandmarkErrorHandler lerrh(errh, "");
+ while ((token = comment_tokenize(s, pos, line)))
+ if (token.length() >= 8
+ && memcmp(token.data(), "LIGKERN", 7) == 0
+ && isspace((unsigned char) token[7])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(8), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "LIGKERNX", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_ligkern) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_LIGKERN, &lerrh);
+
+ } else if (token.length() >= 10
+ && memcmp(token.data(), "UNICODING", 9) == 0
+ && isspace((unsigned char) token[9])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(10), 1, WT_UNICODING, &lerrh);
+
+ } else if (token.length() >= 9
+ && memcmp(token.data(), "POSITION", 8) == 0
+ && isspace((unsigned char) token[8])
+ && !ignore_other) {
+ lerrh.set_landmark(landmark(line));
+ parse_words(token.substring(9), 1, WT_POSITION, &lerrh);
+
+ } else if (token.length() >= 13
+ && memcmp(token.data(), "CODINGSCHEME", 12) == 0
+ && isspace((unsigned char) token[12])
+ && !ignore_other) {
+ _coding_scheme = trim_space(token, 13);
+ if (_coding_scheme.length() > 39)
+ lerrh.lwarning(landmark(line), "only first 39 chars of CODINGSCHEME are significant");
+ if (std::find(_coding_scheme.begin(), _coding_scheme.end(), '(') < _coding_scheme.end()
+ || std::find(_coding_scheme.begin(), _coding_scheme.end(), ')') < _coding_scheme.end()) {
+ lerrh.lerror(landmark(line), "CODINGSCHEME cannot contain parentheses");
+ _coding_scheme = String();
+ }
+
+ } else if (token.length() >= 11
+ && memcmp(token.data(), "WARNMISSING", 11) == 0
+ && (token.length() == 11 || isspace((unsigned char) token[11]))
+ && !ignore_other) {
+ String value = trim_space(token, 11);
+ if (value == "1" || value == "yes" || value == "true" || !value)
+ _warn_missing = true;
+ else if (value == "0" || value == "no" || value == "false")
+ _warn_missing = false;
+ else
+ lerrh.lerror(landmark(line), "WARNMISSING command not understood");
+ }
+
+ return 0;
+}
+
+int
+DvipsEncoding::parse_ligkern(const String &ligkern_text, int override, ErrorHandler *errh)
+{
+ return parse_words(ligkern_text, override, WT_LIGKERN, errh);
+}
+
+int
+DvipsEncoding::parse_position(const String &position_text, int override, ErrorHandler *errh)
+{
+ return parse_words(position_text, override, WT_POSITION, errh);
+}
+
+int
+DvipsEncoding::parse_unicoding(const String &unicoding_text, int override, ErrorHandler *errh)
+{
+ return parse_words(unicoding_text, override, WT_UNICODING, errh);
+}
+
+void
+DvipsEncoding::bad_codepoint(int code, Metrics &metrics, HashMap<PermString, int> &unencoded)
+{
+ for (int i = 0; i < _lig.size(); i++) {
+ Ligature &l = _lig[i];
+ if (l.c1 == code || l.c2 == code)
+ l.join = 0;
+ else if ((l.join & JT_ADDLIG) && l.d == code)
+ l.join &= ~JT_LIGALL;
+ }
+
+ if (_warn_missing) {
+ Vector<uint32_t> garbage;
+ bool unicodes_explicit = x_unicodes(_e[code], garbage);
+ if (!unicodes_explicit || garbage.size() > 0) {
+ Vector<Setting> v;
+ v.push_back(Setting(Setting::RULE, 500, 500));
+ v.push_back(Setting(Setting::SPECIAL, String("Warning: missing glyph '") + _e[code] + "'"));
+ metrics.encode_virtual(code, _e[code], 0, v, true);
+ unencoded.insert(_e[code], 1);
+ }
+ }
+}
+
+static inline Efont::OpenType::Glyph
+map_uni(uint32_t uni, const Efont::OpenType::Cmap &cmap, const Metrics &m)
+{
+ if (uni == U_EMPTYSLOT)
+ return m.emptyslot_glyph();
+ else
+ return cmap.map_uni(uni);
+}
+
+bool
+DvipsEncoding::x_unicodes(PermString chname, Vector<uint32_t> &unicodes) const
+{
+ int i = _unicoding_map[chname];
+ if (i >= 0) {
+ for (; _unicoding[i] > 0; i++)
+ unicodes.push_back(_unicoding[i]);
+ return true;
+ } else {
+ glyphname_unicode(chname, unicodes);
+ return false;
+ }
+}
+
+
+void
+DvipsEncoding::make_metrics(Metrics &metrics, const FontInfo &finfo, Secondary *secondary, bool literal, ErrorHandler *errh)
+{
+ // first pass: without secondaries
+ for (int code = 0; code < _e.size(); code++) {
+ PermString chname = _e[code];
+
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find first single Unicode glyph supported by the font
+ Efont::OpenType::Glyph glyph = 0;
+ uint32_t glyph_uni = 0;
+ {
+ Vector<uint32_t> unicodes;
+ (void) x_unicodes(chname, unicodes);
+ Vector<uint32_t>::iterator u = unicodes.begin();
+ while (u != unicodes.end() && glyph <= 0) {
+ uint32_t this_uni = u[0];
+ ++u;
+ if (u != unicodes.end()) {
+ if (*u != GLYPHLIST_ALTERNATIVE)
+ break;
+ ++u;
+ }
+
+ glyph = map_uni(this_uni, *finfo.cmap, metrics);
+ if (glyph_uni == 0 || glyph > 0)
+ glyph_uni = this_uni;
+ }
+ }
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+#if 0
+ // 2.May.2008: ff, fi, fl, ffi, and ffl might map to f_f, f_i, f_l,
+ // f_f_i, and f_f_l
+ if (!named_glyph && chname.length() > 0 && chname.length() <= 3
+ && chname[0] == 'f') {
+ if (chname.equals("ff", 2))
+ named_glyph = finfo.glyphid("f_f");
+ else if (chname.equals("fi", 2))
+ named_glyph = finfo.glyphid("f_i");
+ else if (chname.equals("fl", 2))
+ named_glyph = finfo.glyphid("f_l");
+ else if (chname.equals("ffi", 2))
+ named_glyph = finfo.glyphid("f_f_i");
+ else if (chname.equals("ffl", 2))
+ named_glyph = finfo.glyphid("f_f_l");
+ }
+#endif
+ // do not use a Unicode-mapped glyph if literal
+ if (literal)
+ glyph = named_glyph;
+
+ // If we found a glyph, maybe use its named_glyph variant.
+ if (glyph > 0 && named_glyph > 0
+ && std::find(chname.begin(), chname.end(), '.') < chname.end())
+ glyph = named_glyph;
+
+ // assign slot
+ if (glyph > 0)
+ metrics.encode(code, glyph_uni, glyph);
+ }
+
+ // second pass: with secondaries
+ for (int code = 0; code < _e.size(); code++) {
+ // skip already-encoded characters and .notdef
+ if (literal || metrics.glyph(code) > 0 || _e[code] == dot_notdef)
+ continue;
+
+ PermString chname = _e[code];
+
+ // find all Unicodes
+ Vector<uint32_t> unicodes;
+ bool unicodes_explicit = x_unicodes(chname, unicodes);
+
+ // find named glyph, if any
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+
+ // 1. We were not able to find the glyph using Unicode.
+ // 2. There might be a named_glyph.
+ // May need to try secondaries later. Store this slot.
+ // Try secondaries, if there's explicit unicoding or no named_glyph.
+ if (unicodes_explicit || named_glyph <= 0)
+ for (uint32_t *u = unicodes.begin(); u != unicodes.end(); ) {
+ uint32_t *endu = u + 1;
+ while (endu != unicodes.end() && *endu != GLYPHLIST_ALTERNATIVE)
+ ++endu;
+ if (secondary->encode_uni(code, chname, u, endu, metrics, errh))
+ goto encoded;
+ u = (endu == unicodes.end() ? endu : endu + 1);
+ }
+
+ // 1. We were not able to find the glyph using Unicode or secondaries.
+ // 2. There might be a named_glyph.
+ // Use named glyph, if any. Special case for "UNICODING foo =: ;",
+ // which should turn off the character (even if a named_glyph exists),
+ // UNLESS the glyph was explicitly requested.
+ if (named_glyph > 0
+ && (!unicodes_explicit
+ || unicodes.size() > 0
+ || (_encoding_required.size() > code && _encoding_required[code]))) {
+ uint32_t uni = 0;
+ if (unicodes.size() == 1 || (unicodes.size() > 0 && unicodes[1] == GLYPHLIST_ALTERNATIVE))
+ uni = unicodes[0];
+ metrics.encode(code, uni, named_glyph);
+ }
+
+ encoded:
+ /* all set */;
+ }
+
+ // add altselector
+ if (_altselector_char >= 0 && _altselector_char < _e.size()) {
+ metrics.add_altselector_code(_altselector_char, 0);
+ if (metrics.glyph(_altselector_char) <= 0 && !literal)
+ (void) secondary->encode_uni(_altselector_char, "<altselector>", U_ALTSELECTOR, metrics, errh);
+ }
+
+ // final pass: complain
+ HashMap<PermString, int> unencoded_map;
+ for (int code = 0; code < _e.size(); code++)
+ if (_e[code] != dot_notdef && metrics.glyph(code) <= 0)
+ bad_codepoint(code, metrics, unencoded_map);
+ Vector<String> unencoded;
+ for (HashMap<PermString, int>::iterator it = unencoded_map.begin(); it; ++it)
+ unencoded.push_back(it.key());
+
+ if (unencoded.size() == 1) {
+ errh->warning("%<%s%> glyph not found in font", unencoded[0].c_str());
+ errh->message("(This glyph will appear as a blot and cause warnings if used.)");
+ } else if (unencoded.size() > 1) {
+ std::sort(unencoded.begin(), unencoded.end());
+ StringAccum sa;
+ for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
+ sa << *a << ' ';
+ sa.pop_back();
+ sa.append_break_lines(sa.take_string(), 68, " ");
+ sa.pop_back();
+ errh->warning("%d glyphs not found in font:", unencoded.size());
+ errh->message("%s\n(These glyphs will appear as blots and cause warnings if used.)", sa.c_str());
+ }
+
+ metrics.set_coding_scheme(_coding_scheme);
+}
+
+void
+DvipsEncoding::make_base_mappings(Vector<int> &mappings, const FontInfo &finfo)
+{
+ mappings.clear();
+ for (int code = 0; code < _e.size(); code++) {
+ PermString chname = _e[code];
+
+ // common case: skip .notdef
+ if (chname == dot_notdef)
+ continue;
+
+ // find named glyph
+ Efont::OpenType::Glyph named_glyph = finfo.glyphid(chname);
+ if (named_glyph > 0) {
+ if (mappings.size() <= named_glyph)
+ mappings.resize(named_glyph + 1, -1);
+ mappings[named_glyph] = code;
+ }
+ }
+}
+
+
+void
+DvipsEncoding::apply_ligkern_lig(Metrics &metrics, ErrorHandler *errh) const
+{
+ assert((int)J_ALL == (int)Metrics::CODE_ALL);
+ for (const Ligature *l = _lig.begin(); l < _lig.end(); l++) {
+ if (l->c1 < 0 || l->c2 < 0 || l->join < 0 || !(l->join & JT_LIG))
+ continue;
+ metrics.remove_ligatures(l->c1, l->c2);
+ if (!(l->join & JT_ADDLIG))
+ /* nada */;
+ else if ((l->join & JT_LIGALL) == JL_LIG)
+ metrics.add_ligature(l->c1, l->c2, l->d);
+ else if ((l->join & JT_LIGALL) == JL_LIGC)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->d, l->c2));
+ else if ((l->join & JT_LIGALL) == JL_CLIG)
+ metrics.add_ligature(l->c1, l->c2, metrics.pair_code(l->c1, l->d));
+ else {
+ static int complex_join_warning = 0;
+ if (!complex_join_warning) {
+ errh->warning("complex LIGKERN ligature removed (I only support %<=:%>, %<=:|%>, and %<|=:%>)");
+ complex_join_warning = 1;
+ }
+ }
+ }
+}
+
+void
+DvipsEncoding::apply_ligkern_kern(Metrics &metrics, ErrorHandler *) const
+{
+ assert((int)J_ALL == (int)Metrics::CODE_ALL);
+ for (const Ligature *l = _lig.begin(); l < _lig.end(); l++)
+ if (l->c1 >= 0 && l->c2 >= 0 && (l->join & JT_KERN))
+ metrics.set_kern(l->c1, l->c2, l->k);
+}
+
+void
+DvipsEncoding::apply_position(Metrics &metrics, ErrorHandler *) const
+{
+ for (const Ligature *l = _pos.begin(); l < _pos.end(); l++)
+ if (l->c1 >= 0)
+ metrics.add_single_positioning(l->c1, l->c2, l->join, l->k);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh
new file mode 100644
index 00000000000..67181b2d654
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/dvipsencoding.hh
@@ -0,0 +1,128 @@
+#ifndef OTFTOTFM_DVIPSENCODING_HH
+#define OTFTOTFM_DVIPSENCODING_HH
+#include <efont/otfcmap.hh>
+#include <efont/cff.hh>
+#include <lcdf/hashmap.hh>
+class Metrics;
+class Secondary;
+class FontInfo;
+
+class DvipsEncoding { public:
+
+ DvipsEncoding();
+
+ static void add_glyphlist(String);
+
+ operator bool() const { return _e.size() > 0; }
+ const String &name() const { return _name; }
+ const String &filename() const { return _filename; }
+ int boundary_char() const { return _boundary_char; }
+ const String &coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
+ void set_warn_missing(bool wm) { _warn_missing = wm; }
+
+ void encode(int, PermString);
+ inline int encoding_of(PermString) const;
+ int encoding_of(PermString, bool encode);
+ inline bool encoded(int e) const;
+ inline PermString encoding(int e) const;
+ int encoding_size() const { return _e.size(); }
+
+ int parse(String filename, bool ignore_ligkern, bool ignore_other, ErrorHandler *);
+ int parse_ligkern(const String &ligkern_text, int override, ErrorHandler *);
+ int parse_position(const String &ligkern_text, int override, ErrorHandler *);
+ int parse_unicoding(const String &unicoding_text, int override, ErrorHandler *);
+
+ bool file_had_ligkern() const { return _file_had_ligkern; }
+
+ // also modifies 'this':
+ void make_metrics(Metrics &, const FontInfo &, Secondary *, bool literal, ErrorHandler *);
+ void make_base_mappings(Vector<int> &mappings, const FontInfo &);
+
+ void apply_ligkern_lig(Metrics &, ErrorHandler *) const;
+ void apply_ligkern_kern(Metrics &, ErrorHandler *) const;
+ void apply_position(Metrics &, ErrorHandler *) const;
+
+ enum { JT_KERN = 32, JT_LIG = 64, JT_ADDLIG = 128, JT_LIGALL = 199,
+ JL_LIG = JT_LIG | JT_ADDLIG, JL_CLIG = JL_LIG | 1,
+ JL_CLIG_S = JL_LIG | 2, JL_LIGC = JL_LIG | 3,
+ JL_LIGC_S = JL_LIG | 4, JL_CLIGC = JL_LIG | 5,
+ JL_CLIGC_S = JL_LIG | 6, JL_CLIGC_SS = JL_LIG | 7,
+ JT_NOLIGKERN = JT_KERN | JT_LIG,
+ J_ALL = 0x7FFFFFFF }; // also see nokern_names in dvipsencoding.cc
+
+ private:
+
+ struct Ligature {
+ int c1, c2, join, k, d;
+ };
+
+ Vector<PermString> _e;
+ Vector<bool> _encoding_required;
+ int _boundary_char;
+ int _altselector_char;
+
+ Vector<Ligature> _lig;
+ Vector<Ligature> _pos;
+ HashMap<PermString, int> _unicoding_map;
+ Vector<uint32_t> _unicoding;
+
+ mutable Vector<uint32_t> _unicodes;
+
+ String _name;
+ String _filename;
+ String _printable_filename;
+ String _coding_scheme;
+ String _initial_comment;
+ String _final_text;
+ bool _file_had_ligkern;
+ bool _warn_missing;
+
+ struct WordType {
+ const char *name;
+ int (DvipsEncoding::*parsefunc)(Vector<String>&, int, ErrorHandler*);
+ };
+ static const WordType word_types[];
+ enum { WT_LIGKERN = 0, WT_POSITION, WT_UNICODING };
+
+ void add_ligkern(const Ligature &, int override);
+ enum { EPARSE = 90000 };
+ int parse_ligkern_words(Vector<String> &, int override, ErrorHandler *);
+ int parse_position_words(Vector<String> &, int override, ErrorHandler *);
+ int parse_unicoding_words(Vector<String> &, int override, ErrorHandler *);
+ void parse_word_group(Vector<String> &, int override, int wt, ErrorHandler *);
+ int parse_words(const String &, int override, int wt, ErrorHandler *);
+ void bad_codepoint(int, Metrics &, HashMap<PermString, int> &bad_unicodes);
+ bool x_unicodes(PermString chname, Vector<uint32_t> &unicodes) const;
+ String landmark(int line) const;
+
+ static PermString dot_notdef;
+
+ static bool glyphname_unicode(String, Vector<uint32_t> &);
+
+ friend inline bool operator==(const Ligature&, const Ligature&);
+
+};
+
+inline bool
+DvipsEncoding::encoded(int e) const
+{
+ return e >= 0 && e < _e.size() && _e[e] != dot_notdef;
+}
+
+inline PermString
+DvipsEncoding::encoding(int e) const
+{
+ if (encoded(e))
+ return _e[e];
+ else
+ return PermString();
+}
+
+inline int
+DvipsEncoding::encoding_of(PermString what) const
+{
+ return const_cast<DvipsEncoding *>(this)->encoding_of(what, false);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc
new file mode 100644
index 00000000000..03ffcbd86ee
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.cc
@@ -0,0 +1,236 @@
+/* glyphfilter.{cc,hh} -- define subsets of characters
+ *
+ * Copyright (c) 2004-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef WIN32
+# define _USE_MATH_DEFINES
+#endif
+#include "glyphfilter.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <ctype.h>
+#include <algorithm>
+#include "uniprop.hh"
+#include "util.hh"
+
+bool
+GlyphFilter::allow(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode, int ptype) const
+{
+ // out-of-range glyphs never match
+ if (glyph < 0 || glyph >= glyph_names.size())
+ return false;
+
+ String glyph_name = glyph_names[glyph];
+ int uniprop = -1;
+ bool any_includes = false;
+ bool included = false;
+
+ // loop over patterns
+ for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
+ // check pattern type
+ if ((p->type & ~T_TYPEMASK) != ptype)
+ continue;
+ // check include/exclude
+ if ((p->type & T_EXCLUDE) == 0) {
+ if (included)
+ continue;
+ any_includes = true;
+ }
+ // check if there's a match
+ bool match;
+ if (p->data == D_NAME)
+ match = glob_match(glyph_name, p->pattern);
+ else if (p->data == D_UNIPROP) {
+ if (uniprop < 0)
+ uniprop = UnicodeProperty::property(unicode);
+ match = ((uniprop & p->u.uniprop.mask) == p->u.uniprop.value);
+ } else
+ match = (unicode >= p->u.unirange.low && unicode <= p->u.unirange.high);
+ // act if match
+ if (match == ((p->type & T_NEGATE) == 0)) {
+ if ((p->type & T_EXCLUDE) == 0)
+ included = true;
+ else
+ return false;
+ }
+ }
+
+ return !any_includes || included;
+}
+
+GlyphFilter::Pattern::Pattern(uint16_t ptype)
+ : type(ptype), data(D_NAME)
+{
+ // make sure that even unused data has a known value, to simplify
+ // operator==
+ u.unirange.low = u.unirange.high = 0;
+}
+
+int
+GlyphFilter::Pattern::compare(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ int cmp = a.type - b.type;
+ if (cmp == 0)
+ cmp = a.data - b.data;
+ if (cmp == 0)
+ cmp = (int) (a.u.unirange.low - b.u.unirange.low);
+ if (cmp == 0)
+ cmp = (int) (a.u.unirange.high - b.u.unirange.high);
+ if (cmp == 0)
+ cmp = String::compare(a.pattern, b.pattern);
+ return cmp;
+}
+
+void
+GlyphFilter::add_pattern(const String& pattern, int ptype, ErrorHandler* errh)
+{
+ _sorted = false;
+
+ const char* begin = pattern.begin();
+ const char* end = pattern.end();
+ while (begin < end && isspace((unsigned char) *begin))
+ begin++;
+ if (begin >= end)
+ errh->error("missing pattern");
+
+ while (begin < end) {
+ const char* word = begin;
+ while (word < end && !isspace((unsigned char) *word))
+ word++;
+ bool negated = false;
+ if (begin < word && begin[0] == '!')
+ negated = true, begin++;
+
+ // actually parse clause
+ Pattern p(ptype + (negated ? T_NEGATE : 0));
+
+ // unicode property
+ if (begin + 3 <= word && begin[0] == '<' && word[-1] == '>') {
+ p.data = D_UNIPROP;
+ if (UnicodeProperty::parse_property(pattern.substring(begin + 1, word - 1), p.u.uniprop.value, p.u.uniprop.mask))
+ _patterns.push_back(p);
+ else if (errh)
+ errh->error("unknown Unicode property %<%s%>", pattern.c_str());
+ goto next_clause;
+ }
+
+ // unicode values
+ {
+ const char* dash = std::find(begin, word, '-');
+ if (parse_unicode_number(begin, dash, 2, p.u.unirange.low)) {
+ if (dash == word)
+ p.u.unirange.high = p.u.unirange.low;
+ else if (dash == word - 1)
+ p.u.unirange.high = 0xFFFFFFFFU;
+ else if (parse_unicode_number(dash + 1, word, (begin[0] == 'U' ? 1 : 0), p.u.unirange.high))
+ /* do nothing */;
+ else
+ goto name_pattern; // assume it's a name
+ p.data = D_UNIRANGE;
+ _patterns.push_back(p);
+ goto next_clause;
+ }
+ }
+
+ // otherwise must be name pattern
+ name_pattern:
+ p.data = D_NAME;
+ p.pattern = pattern.substring(begin, word);
+ _patterns.push_back(p);
+
+ // move to next clause
+ next_clause:
+ for (begin = word; begin < end && isspace((unsigned char) *begin); begin++)
+ /* nada */;
+ }
+}
+
+void
+GlyphFilter::add_substitution_filter(const String& s, bool is_exclude, ErrorHandler* errh)
+{
+ add_pattern(s, is_exclude ? T_SRC + T_EXCLUDE : T_SRC, errh);
+}
+
+void
+GlyphFilter::add_alternate_filter(const String& s, bool is_exclude, ErrorHandler* errh)
+{
+ add_pattern(s, is_exclude ? T_DST + T_EXCLUDE : T_DST, errh);
+}
+
+GlyphFilter&
+GlyphFilter::operator+=(const GlyphFilter& gf)
+{
+ // be careful about self-addition
+ _patterns.reserve(gf._patterns.size());
+ const Pattern* end = gf._patterns.end();
+ for (const Pattern* p = gf._patterns.begin(); p < end; p++)
+ _patterns.push_back(*p);
+ return *this;
+}
+
+GlyphFilter
+operator+(const GlyphFilter& a, const GlyphFilter& b)
+{
+ if (!b)
+ return a;
+ if (!a)
+ return b;
+ GlyphFilter x(a);
+ x += b;
+ return x;
+}
+
+bool
+operator==(const GlyphFilter& a, const GlyphFilter& b)
+{
+ if (&a == &b)
+ return true;
+ if (a._patterns.size() != b._patterns.size())
+ return false;
+ const GlyphFilter::Pattern* pa = a._patterns.begin();
+ const GlyphFilter::Pattern* pb = b._patterns.begin();
+ for (; pa < a._patterns.end(); pa++, pb++)
+ if (!(*pa == *pb))
+ return false;
+ return true;
+}
+
+void
+GlyphFilter::sort()
+{
+ if (!_sorted) {
+ std::sort(_patterns.begin(), _patterns.end());
+ Pattern* true_end = std::unique(_patterns.begin(), _patterns.end());
+ _patterns.erase(true_end, _patterns.end());
+ _sorted = true;
+ }
+}
+
+void
+GlyphFilter::unparse(StringAccum& sa) const
+{
+ for (const Pattern* p = _patterns.begin(); p < _patterns.end(); p++) {
+ sa << (p->type & T_DST ? 'D' : 'S') << (p->type & T_NEGATE ? "!" : "") << (p->type & T_EXCLUDE ? "X" : "");
+ if (p->data == D_NAME)
+ sa << '<' << p->pattern << '>';
+ else if (p->data == D_UNIPROP)
+ sa << "[UNIPROP:" << p->u.uniprop.mask << '=' << p->u.uniprop.value << ']';
+ else
+ sa.snprintf(20, "[U+%02x-U+%02x]", p->u.unirange.low, p->u.unirange.high);
+ sa << ' ';
+ }
+ if (_patterns.size())
+ sa.pop_back();
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh
new file mode 100644
index 00000000000..4fc25ddadff
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/glyphfilter.hh
@@ -0,0 +1,110 @@
+#ifndef OTFTOTFM_GLYPHFILTER_HH
+#define OTFTOTFM_GLYPHFILTER_HH
+#include <efont/otf.hh>
+#include <lcdf/vector.hh>
+class Metrics;
+
+class GlyphFilter { public:
+
+ GlyphFilter() : _sorted(true) { }
+
+ operator bool() const { return _patterns.size() != 0; }
+
+ inline bool allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
+ inline bool allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const;
+
+ void add_substitution_filter(const String&, bool is_exclude, ErrorHandler*);
+ void add_alternate_filter(const String&, bool is_exclude, ErrorHandler*);
+
+ friend bool operator==(const GlyphFilter&, const GlyphFilter&);
+ inline bool check_eq(GlyphFilter&); // may alter both GlyphFilters
+
+ GlyphFilter& operator+=(const GlyphFilter&);
+
+ void unparse(StringAccum&) const;
+
+ struct Pattern {
+ uint16_t type;
+ uint16_t data;
+ union {
+ struct {
+ int mask;
+ int value;
+ } uniprop;
+ struct {
+ uint32_t low;
+ uint32_t high;
+ } unirange;
+ } u;
+ String pattern;
+ Pattern(uint16_t type);
+ static int compare(const Pattern&, const Pattern&);
+ };
+
+ private:
+
+ enum { T_EXCLUDE = 1, T_NEGATE = 2, T_TYPEMASK = 3,
+ T_SRC = 0, T_DST = 4 };
+ enum { D_NAME, D_UNIPROP, D_UNIRANGE };
+
+ Vector<Pattern> _patterns;
+ bool _sorted;
+
+ bool allow(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode, int ptype) const;
+ void add_pattern(const String&, int ptype, ErrorHandler*);
+ void sort();
+
+};
+
+inline bool
+GlyphFilter::allow_substitution(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_SRC));
+}
+
+inline bool
+GlyphFilter::allow_alternate(Efont::OpenType::Glyph glyph, const Vector<PermString>& glyph_names, uint32_t unicode) const
+{
+ return (!_patterns.size() || allow(glyph, glyph_names, unicode, T_DST));
+}
+
+inline bool operator==(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return a.type == b.type && a.data == b.data && a.u.unirange.low == b.u.unirange.low && a.u.unirange.high == b.u.unirange.high && a.pattern == b.pattern;
+}
+
+inline bool operator<(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return GlyphFilter::Pattern::compare(a, b) < 0;
+}
+
+inline bool operator!=(const GlyphFilter::Pattern& a, const GlyphFilter::Pattern& b)
+{
+ return !(a == b);
+}
+
+bool operator==(const GlyphFilter&, const GlyphFilter&);
+
+inline bool operator!=(const GlyphFilter& a, const GlyphFilter& b)
+{
+ return !(a == b);
+}
+
+inline bool
+GlyphFilter::check_eq(GlyphFilter& o)
+{
+ sort();
+ o.sort();
+ return *this == o;
+}
+
+GlyphFilter operator+(const GlyphFilter&, const GlyphFilter&);
+
+inline StringAccum&
+operator<<(StringAccum& sa, const GlyphFilter& gf)
+{
+ gf.unparse(sa);
+ return sa;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c
new file mode 100644
index 00000000000..68eecbcc56d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.c
@@ -0,0 +1,99 @@
+/* kpseinterface.{c,h} -- interface with the kpathsea library
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#include <kpathsea/config.h>
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <kpathsea/progname.h>
+#include <kpathsea/expand.h>
+#include <kpathsea/c-pathch.h>
+#include <kpathsea/tex-file.h>
+#ifdef W32TEX
+#include <kpathsea/variable.h>
+#endif
+#include "kpseinterface.h"
+
+int kpsei_env_sep_char = ENV_SEP;
+
+void
+kpsei_init(const char* argv0, const char* progname)
+{
+ kpse_set_program_name(argv0, progname);
+#ifdef SELFAUTODIR
+ putenv("SELFAUTODIR=" SELFAUTODIR);
+#endif
+#ifdef SELFAUTOLOC
+ putenv("SELFAUTOLOC=" SELFAUTOLOC);
+#endif
+#ifdef SELFAUTOPARENT
+ putenv("SELFAUTOPARENT=" SELFAUTOPARENT);
+#endif
+#ifdef SELFAUTOGRANDPARENT
+ putenv("SELFAUTOGRANDPARENT=" SELFAUTOGRANDPARENT);
+#endif
+}
+
+char*
+kpsei_path_expand(const char* path)
+{
+ return kpse_path_expand(path);
+}
+
+char*
+kpsei_find_file(const char* name, int format)
+{
+ char *result;
+ switch (format) {
+ case KPSEI_FMT_WEB2C:
+ return kpse_find_file(name, kpse_web2c_format, true);
+ case KPSEI_FMT_ENCODING:
+#if HAVE_DECL_KPSE_ENC_FORMAT
+ if ((result = kpse_find_file(name, kpse_enc_format, true)))
+ return result;
+#endif
+ return kpse_find_file(name, kpse_tex_ps_header_format, true);
+ case KPSEI_FMT_TYPE1:
+ return kpse_find_file(name, kpse_type1_format, false);
+ case KPSEI_FMT_TYPE42:
+ return kpse_find_file(name, kpse_type42_format, false);
+ case KPSEI_FMT_TRUETYPE:
+ return kpse_find_file(name, kpse_truetype_format, false);
+#if HAVE_DECL_KPSE_OPENTYPE_FORMAT
+ case KPSEI_FMT_OPENTYPE:
+ return kpse_find_file(name, kpse_opentype_format, false);
+#endif
+ case KPSEI_FMT_OTHER_TEXT:
+ return kpse_find_file(name, kpse_program_text_format, true);
+ case KPSEI_FMT_MAP:
+ return kpse_find_file(name, kpse_fontmap_format, true);
+ default:
+ return 0;
+ }
+}
+
+void
+kpsei_set_debug_flags(unsigned flags)
+{
+ kpathsea_debug = flags;
+}
+
+#ifdef W32TEX
+char*
+kpsei_var_value(const char *name)
+{
+ return kpse_var_value(name);
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h
new file mode 100644
index 00000000000..413e06e6572
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/kpseinterface.h
@@ -0,0 +1,23 @@
+#ifndef OTFTOTFM_KPSEINTERFACE_H
+#define OTFTOTFM_KPSEINTERFACE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void kpsei_init(const char* argv0, const char* progname);
+extern int kpsei_env_sep_char;
+char* kpsei_path_expand(const char* path); /* free() result */
+enum { KPSEI_FMT_WEB2C, KPSEI_FMT_ENCODING, KPSEI_FMT_TYPE1,
+ KPSEI_FMT_OTHER_TEXT, KPSEI_FMT_MAP, KPSEI_FMT_TRUETYPE,
+ KPSEI_FMT_OPENTYPE, KPSEI_FMT_TYPE42 };
+char* kpsei_find_file(const char* name, int format);
+void kpsei_set_debug_flags(unsigned flags);
+
+#ifdef W32TEX
+char* kpsei_var_value(const char *name);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc
new file mode 100644
index 00000000000..84259ad69c6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.cc
@@ -0,0 +1,1573 @@
+/* metrics.{cc,hh} -- an encoding during and after OpenType features
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "metrics.hh"
+#include "dvipsencoding.hh"
+#include "util.hh"
+#include "glyphfilter.hh"
+#include <string.h>
+#include <stdio.h>
+#include <algorithm>
+#include <lcdf/straccum.hh>
+
+Metrics::Metrics(const Efont::CharstringProgram *font, int nglyphs)
+ : _boundary_glyph(nglyphs), _emptyslot_glyph(nglyphs + 1),
+ _design_units(1000), _units_per_em(font->units_per_em()),
+ _liveness_marked(false)
+{
+ _encoding.assign(256, Char());
+ add_mapped_font(font, String());
+}
+
+Metrics::~Metrics()
+{
+ for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
+ delete c->virtual_char;
+}
+
+int
+Metrics::add_mapped_font(const Efont::CharstringProgram *font, const String &name)
+{
+ _mapped_fonts.push_back(font);
+ _mapped_font_names.push_back(name);
+ return _mapped_fonts.size() - 1;
+}
+
+void
+Metrics::check() const
+{
+ // check invariants
+ // 1. all 'ligatures' entries refer to valid characters
+ // 2. all 'ligatures' entries with 'in1 == c' are in '_encoding[c].ligs'
+ // 3. 'virtual_char' SHOW operations point to valid non-virtual chars
+ for (int code = 0; code < _encoding.size(); code++) {
+ const Char *ch = &_encoding[code];
+ assert((ch->virtual_char != 0) == (ch->glyph == VIRTUAL_GLYPH));
+ for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ assert(valid_code(l->in2) && valid_code(l->out));
+ for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ assert(valid_code(k->in2));
+ if (const VirtualChar *vc = ch->virtual_char) {
+ assert(vc->name);
+ int font_number = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
+ assert(s->valid_op());
+ if (s->op == Setting::SHOW && font_number == 0)
+ assert(nonvirtual_code(s->x));
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ }
+ assert(ch->built_in1 < 0 || valid_code(ch->built_in1));
+ assert(ch->built_in2 < 0 || valid_code(ch->built_in2));
+ assert((ch->built_in1 >= 0) == (ch->built_in2 >= 0));
+ assert(ch->base_code < 0 || valid_code(ch->base_code));
+ if (valid_code(ch->base_code)) {
+ const Char *ch2 = &_encoding[ch->base_code];
+ assert((!ch->virtual_char && ch->glyph)
+ || (!ch2->virtual_char && ch2->glyph));
+ }
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->virtual_char && ch->built_in1 >= 0 && ch->built_in2 >= 0);
+ if (ch->flag(Char::CONTEXT_ONLY))
+ assert(ch->flag(Char::LIVE));
+ }
+}
+
+PermString
+Metrics::code_name(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return permprintf("<badcode%d>", code);
+ else {
+ const Char &ch = _encoding[code];
+ if (ch.virtual_char)
+ return ch.virtual_char->name;
+ else if (ch.glyph == _boundary_glyph)
+ return "<boundary>";
+ else if (ch.glyph == _emptyslot_glyph)
+ return "<emptyslot>";
+ else if (ch.glyph >= 0 && ch.glyph < _mapped_fonts[0]->nglyphs())
+ return _mapped_fonts[0]->glyph_name(ch.glyph);
+ else
+ return permprintf("<glyph%d>", ch.glyph);
+ }
+}
+
+
+/*****************************************************************************/
+/* encoding */
+
+Metrics::Code
+Metrics::unicode_encoding(uint32_t uni) const
+{
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if (ch->unicode == uni)
+ return ch - _encoding.begin();
+ return -1;
+}
+
+Metrics::Code
+Metrics::hard_encoding(Glyph g, Code after) const
+{
+ if (g < 0)
+ return -1;
+ int answer = -1, n = 0;
+ for (int i = _encoding.size() - 1; i >= after; i--)
+ if (_encoding[i].glyph == g)
+ answer = i, n++;
+ if (n < 2 && after == 0) {
+ if (g >= _emap.size())
+ _emap.resize(g + 1, -2);
+ _emap[g] = answer;
+ }
+ return answer;
+}
+
+Metrics::Code
+Metrics::force_encoding(Glyph g, int lookup_source)
+{
+ assert(g >= 0);
+ int e = encoding(g, 0);
+ if (e >= 0)
+ return e;
+ else {
+ Char ch;
+ ch.glyph = g;
+ ch.base_code = _encoding.size();
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ assign_emap(g, ch.base_code);
+ return ch.base_code;
+ }
+}
+
+void
+Metrics::encode(Code code, uint32_t uni, Glyph g)
+{
+ assert(code >= 0 && g >= 0 && g != VIRTUAL_GLYPH);
+ if (code >= _encoding.size())
+ _encoding.resize(code + 1, Char());
+ _encoding[code].unicode = uni;
+ _encoding[code].glyph = g;
+ if (g > 0)
+ _encoding[code].base_code = code;
+ assert(!_encoding[code].virtual_char);
+ assign_emap(g, code);
+}
+
+void
+Metrics::encode_virtual(Code code, PermString name, uint32_t uni, const Vector<Setting> &v, bool base_char)
+{
+ assert(code >= 0 && v.size() > 0);
+ if (code >= _encoding.size())
+ _encoding.resize(code + 1, Char());
+ _encoding[code].unicode = uni;
+ _encoding[code].glyph = VIRTUAL_GLYPH;
+ if (base_char)
+ _encoding[code].flags |= Char::BASE_REP;
+ assert(!_encoding[code].virtual_char);
+ VirtualChar *vc = _encoding[code].virtual_char = new VirtualChar;
+ vc->name = name;
+ vc->setting = v;
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++) {
+ assert(s->valid_op() && (s->op != Setting::SHOW || font_number != 0 || nonvirtual_code(s->x)));
+ if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+}
+
+void
+Metrics::apply_base_encoding(const String &font_name, const DvipsEncoding &dvipsenc, const Vector<int> &mapping)
+{
+ int font_number = -1;
+ for (Char *c = _encoding.begin(); c != _encoding.end(); c++)
+ if (c->glyph > 0 && !c->virtual_char && c->glyph < mapping.size()
+ && mapping[c->glyph] >= 0) {
+ if (font_number < 0)
+ font_number = add_mapped_font(mapped_font(0), font_name);
+ VirtualChar *vc = c->virtual_char = new VirtualChar;
+ vc->name = dvipsenc.encoding(mapping[c->glyph]);
+ vc->setting.push_back(Setting(Setting::FONT, font_number));
+ vc->setting.push_back(Setting(Setting::SHOW, mapping[c->glyph], c->glyph));
+ c->glyph = VIRTUAL_GLYPH;
+ c->base_code = -1;
+ c->flags = (c->flags & ~Char::BASE_LIVE) | Char::BASE_REP;
+ }
+}
+
+void
+Metrics::add_altselector_code(Code code, int altselector_type)
+{
+ for (Kern *k = _altselectors.begin(); k != _altselectors.end(); k++)
+ if (k->in2 == code) {
+ k->kern = altselector_type;
+ return;
+ }
+ _altselectors.push_back(Kern(code, altselector_type));
+}
+
+bool
+Metrics::base_glyphs(Vector<Glyph> &v, int size) const
+{
+ bool any = false;
+ v.assign(_encoding.size(), 0);
+ for (const Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->base_code >= 0 && ch->base_code < size) {
+ v[ch->base_code] = ch->glyph;
+ any = true;
+ }
+ return any;
+}
+
+
+/*****************************************************************************/
+/* Char methods */
+
+void
+Metrics::Char::clear()
+{
+ glyph = 0;
+ base_code = -1;
+ unicode = 0;
+ ligatures.clear();
+ kerns.clear();
+ delete virtual_char;
+ virtual_char = 0;
+ pdx = pdy = adx = 0;
+ built_in1 = built_in2 = -1;
+ lookup_source = -1;
+ flags = 0;
+}
+
+void
+Metrics::Char::swap(Char &c)
+{
+ std::swap(glyph, c.glyph);
+ // NB: only a partial switch of base_code!!
+ if (base_code < 0)
+ base_code = c.base_code;
+ c.base_code = -1;
+ std::swap(unicode, c.unicode);
+ ligatures.swap(c.ligatures);
+ kerns.swap(c.kerns);
+ std::swap(virtual_char, c.virtual_char);
+ std::swap(pdx, c.pdx);
+ std::swap(pdy, c.pdy);
+ std::swap(adx, c.adx);
+ std::swap(built_in1, c.built_in1);
+ std::swap(built_in2, c.built_in2);
+ std::swap(lookup_source, c.lookup_source);
+ std::swap(flags, c.flags);
+}
+
+
+/*****************************************************************************/
+/* manipulating ligature lists */
+
+Metrics::Ligature *
+Metrics::ligature_obj(Code code1, Code code2)
+{
+ assert(valid_code(code1) && valid_code(code2));
+ Char &ch = _encoding[code1];
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (l->in2 == code2)
+ return l;
+ return 0;
+}
+
+inline void
+Metrics::new_ligature(Code in1, Code in2, Code out)
+{
+ assert(valid_code(in1) && valid_code(in2) && valid_code(out));
+ _encoding[in1].ligatures.push_back(Ligature(in2, out));
+}
+
+inline void
+Metrics::repoint_ligature(Code, Ligature *l, Code out)
+{
+ l->out = out;
+}
+
+void
+Metrics::add_ligature(Code in1, Code in2, Code out)
+{
+ if (Ligature *l = ligature_obj(in1, in2)) {
+ Char &ch = _encoding[l->out];
+ if (ch.flags & Char::BUILT) {
+ // move old ligatures to point to the true ligature
+ for (Ligature *ll = ch.ligatures.begin(); ll != ch.ligatures.end(); ll++)
+ add_ligature(out, ll->in2, ll->out);
+ repoint_ligature(in1, l, out);
+ }
+ } else
+ new_ligature(in1, in2, out);
+}
+
+Metrics::Code
+Metrics::pair_code(Code in1, Code in2, int lookup_source)
+{
+ if (const Ligature *l = ligature_obj(in1, in2)) {
+ if (lookup_source < 0)
+ _encoding[l->out].flags &= ~Char::INTERMEDIATE;
+ return l->out;
+ } else {
+ Char ch;
+ ch.glyph = VIRTUAL_GLYPH;
+ ch.flags = Char::BUILT | (lookup_source >= 0 ? Char::INTERMEDIATE : 0);
+ VirtualChar *vc = ch.virtual_char = new VirtualChar;
+ vc->name = permprintf("%s__%s", code_str(in1), code_str(in2));
+ setting(in1, vc->setting, SET_INTERMEDIATE);
+ vc->setting.push_back(Setting(Setting::KERN));
+ setting(in2, vc->setting, SET_INTERMEDIATE);
+ ch.built_in1 = in1;
+ ch.built_in2 = in2;
+ ch.lookup_source = lookup_source;
+ _encoding.push_back(ch);
+ new_ligature(in1, in2, _encoding.size() - 1);
+ return _encoding.size() - 1;
+ }
+}
+
+void
+Metrics::remove_ligatures(Code in1, Code in2)
+{
+ if (in1 == CODE_ALL) {
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ remove_ligatures(in1, in2);
+ } else {
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL)
+ ch.ligatures.clear();
+ else if (Ligature *l = ligature_obj(in1, in2)) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ }
+ }
+}
+
+
+/*****************************************************************************/
+/* manipulating kern lists */
+
+Metrics::Kern *
+Metrics::kern_obj(Code in1, Code in2)
+{
+ assert(valid_code(in1) && valid_code(in2));
+ Char &ch = _encoding[in1];
+ for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (k->in2 == in2)
+ return k;
+ return 0;
+}
+
+int
+Metrics::kern(Code in1, Code in2) const
+{
+ assert(valid_code(in1) && valid_code(in2));
+ const Char &ch = _encoding[in1];
+ for (const Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (k->in2 == in2)
+ return k->kern;
+ return 0;
+}
+
+void
+Metrics::add_kern(Code in1, Code in2, int kern)
+{
+ if (Kern *k = kern_obj(in1, in2))
+ k->kern += kern;
+ else
+ _encoding[in1].kerns.push_back(Kern(in2, kern));
+}
+
+void
+Metrics::set_kern(Code in1, Code in2, int kern)
+{
+ if (in1 == CODE_ALL) {
+ for (in1 = 0; in1 < _encoding.size(); in1++)
+ set_kern(in1, in2, kern);
+ } else {
+ Char &ch = _encoding[in1];
+ if (in2 == CODE_ALL) {
+ assert(kern == 0);
+ ch.kerns.clear();
+ } else if (Kern *k = kern_obj(in1, in2)) {
+ if (kern == 0) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ } else
+ k->kern = kern;
+ } else if (kern != 0)
+ ch.kerns.push_back(Kern(in2, kern));
+ }
+}
+
+int
+Metrics::reencode_right_ligkern(Code old_in2, Code new_in2)
+{
+ int nchanges = 0;
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->in2 == old_in2) {
+ if (new_in2 >= 0)
+ l->in2 = new_in2;
+ else {
+ *l = ch->ligatures.back();
+ ch->ligatures.pop_back();
+ l--;
+ }
+ nchanges++;
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ if (k->in2 == old_in2) {
+ if (new_in2 >= 0)
+ k->in2 = new_in2;
+ else {
+ *k = ch->kerns.back();
+ ch->kerns.pop_back();
+ k--;
+ }
+ nchanges++;
+ }
+ // XXX?
+ if (ch->context_setting(-1, old_in2) && new_in2 >= 0 && ch->built_in1 >= 0)
+ ch->built_in2 = new_in2;
+ }
+ return nchanges;
+}
+
+
+/*****************************************************************************/
+/* positioning */
+
+void
+Metrics::add_single_positioning(Code c, int pdx, int pdy, int adx)
+{
+ assert(valid_code(c));
+ Char &ch = _encoding[c];
+ ch.pdx += pdx;
+ ch.pdy += pdy;
+ ch.adx += adx;
+}
+
+
+/*****************************************************************************/
+/* changed_context structure */
+
+class Metrics::ChangedContext { public:
+ ChangedContext(int ncodes);
+ ~ChangedContext();
+ typedef Metrics::Code Code;
+
+ enum Context { CH_NONE = 0, CH_SOME = 1, CH_ALL = 2 };
+ bool allowed(Code, bool left_context) const;
+ bool pair_allowed(Code, Code) const;
+ bool virgin(Code) const;
+ void disallow(Code);
+ void disallow_pair(Code, Code);
+ private:
+ Vector<Vector<uint32_t> *> _v;
+ int _initial_ncodes;
+ mutable Vector<uint32_t> _all_sentinel;
+ ChangedContext(const ChangedContext &);
+ ChangedContext &operator=(const ChangedContext &);
+ static inline bool bit(const Vector<uint32_t> &, Code);
+ inline void ensure_all(Code) const;
+};
+
+Metrics::ChangedContext::ChangedContext(int ncodes)
+ : _v(ncodes, 0), _initial_ncodes(ncodes), _all_sentinel(((ncodes - 1) >> 5) + 1, 0xFFFFFFFFU)
+{
+}
+
+Metrics::ChangedContext::~ChangedContext()
+{
+ for (Vector<uint32_t> **v = _v.begin(); v != _v.end(); v++)
+ if (*v != &_all_sentinel)
+ delete *v;
+}
+
+inline void
+Metrics::ChangedContext::ensure_all(Code c) const
+{
+ if (c >= 0 && (c >> 5) >= _all_sentinel.size())
+ _all_sentinel.resize((c >> 5) + 1, 0xFFFFFFFFU);
+}
+
+inline bool
+Metrics::ChangedContext::bit(const Vector<uint32_t> &v, Code c)
+{
+ if (c < 0 || (c >> 5) >= v.size())
+ return false;
+ else
+ return (v[c >> 5] & (1 << (c & 0x1F))) != 0;
+}
+
+bool
+Metrics::ChangedContext::allowed(Code c, bool left_context) const
+{
+ if (c < 0)
+ return false;
+ else if (c >= _v.size())
+ return left_context;
+ else
+ return (_v[c] != &_all_sentinel);
+}
+
+bool
+Metrics::ChangedContext::pair_allowed(Code c1, Code c2) const
+{
+ ensure_all(c2);
+ if (c1 < 0 || c2 < 0)
+ return false;
+ else if (c1 >= _v.size() || c2 >= _v.size() || !_v[c1])
+ return true;
+ else
+ return !bit(*_v[c1], c2);
+}
+
+bool
+Metrics::ChangedContext::virgin(Code c) const
+{
+ return (c >= 0 && (c >= _v.size() || _v[c] == 0));
+}
+
+void
+Metrics::ChangedContext::disallow(Code c)
+{
+ assert(c >= 0);
+ if (c >= _v.size())
+ _v.resize(c + 1, 0);
+ if (_v[c] != &_all_sentinel) {
+ delete _v[c];
+ _v[c] = &_all_sentinel;
+ }
+}
+
+void
+Metrics::ChangedContext::disallow_pair(Code c1, Code c2)
+{
+ assert(c1 >= 0 && c2 >= 0);
+ if (c1 >= _v.size())
+ _v.resize(c1 + 1, 0);
+ if (!_v[c1])
+ _v[c1] = new Vector<uint32_t>;
+ if (_v[c1] != &_all_sentinel) {
+ if ((c2 >> 5) >= _v[c1]->size())
+ _v[c1]->resize((c2 >> 5) + 1, 0);
+ (*_v[c1])[c2 >> 5] |= 1 << (c2 & 0x1F);
+ }
+}
+
+
+/*****************************************************************************/
+/* applying GSUB substitutions */
+
+void
+Metrics::apply_single(Code cin, const Substitution *s, int lookup,
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ // check if encoded
+ if (!ctx.allowed(cin, false))
+ /* not encoded before this substitution began, or completely changed;
+ ingore */
+ return;
+
+ // check if substitution of this code allowed
+ if (!glyph_filter.allow_substitution(s->in_glyph(), glyph_names, unicode(cin)))
+ return;
+
+ // look for an allowed alternate
+ Glyph out = -1;
+ for (int i = 0; out < 0 && i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, unicode(cin)))
+ out = s->out_glyph(i);
+ if (out < 0) // no allowed alternate
+ return;
+
+ // apply substitution
+ if (ctx.virgin(cin)) {
+ // no one has changed this glyph yet, change it unilaterally
+ assign_emap(s->in_glyph(), -2);
+ assign_emap(out, cin);
+ assert(!_encoding[cin].virtual_char);
+ _encoding[cin].glyph = out;
+ } else {
+ // some contextual substitutions have changed this glyph, add
+ // contextual substitutions for the remaining possibilities
+ Code cout = force_encoding(out, lookup);
+ for (Code right = 0; right < _encoding.size(); right++)
+ if (_encoding[right].visible() && !_encoding[right].flag(Char::BUILT) && ctx.pair_allowed(cin, right)) {
+ Code pair = pair_code(cout, right, lookup);
+ _encoding[cout].flags &= ~Char::INTERMEDIATE;
+ add_ligature(cin, right, pair);
+ }
+ }
+
+ // no more substitutions for cin
+ ctx.disallow(cin);
+}
+
+void
+Metrics::apply_ligature(const Vector<Code> &in, const Substitution *s, int lookup)
+{
+ // build up the character pair
+ int cin1 = in[0];
+ for (const Code *inp = in.begin() + 1; inp < in.end() - 1; inp++)
+ cin1 = pair_code(cin1, *inp, lookup);
+ int cin2 = in.back();
+
+ // build up the output character
+ Vector<Code> out;
+ s->all_out_glyphs(out);
+ int cout = -1;
+ for (Glyph *outp = out.begin(); outp < out.end(); outp++) {
+ *outp = force_encoding(*outp, lookup);
+ cout = (cout < 0 ? *outp : pair_code(cout, *outp, lookup));
+ }
+ _encoding[cout].flags &= ~Char::INTERMEDIATE;
+
+ // check for replacing a fake ligature
+ int old_out = -1;
+ if (Ligature *l = ligature_obj(cin1, cin2)) {
+ if (l->out == cout) // already created this same ligature
+ return;
+ if (_encoding[l->out].flags & Char::BUILT)
+ old_out = l->out;
+ }
+
+ // make the final ligature
+ add_ligature(cin1, cin2, cout);
+
+ //fprintf(stderr, "%s : %d/%s %d/%s => %d/%s [was %d/%s]\n", s->unparse().c_str(), cin1, code_str(cin1), cin2, code_str(cin2), cout, code_str(cout), old_out, code_str(old_out));
+
+ // if appropriate, swap old ligatures to point to the new result
+ if (old_out >= 0)
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ if (l->out == old_out)
+ repoint_ligature(ch - _encoding.begin(), l, cout);
+}
+
+void
+Metrics::apply_simple_context_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup, ChangedContext &ctx,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString>& glyph_names)
+{
+ int nleft = s->left_nglyphs(), nin = s->in_nglyphs();
+ assert(codes.size() >= 2);
+
+ // check if context allows substitutions
+ for (int i = 0; i < codes.size(); ++i) {
+ if (!ctx.allowed(codes[i], i < nleft)
+ || !glyph_filter.allow_substitution(s->in_glyph(i), glyph_names, unicode(codes[i])))
+ return;
+ }
+
+ // check if any part of the combination has already changed
+ int ncheck = nleft + (nin > 2 ? 2 : nin);
+ if (ncheck == codes.size())
+ --ncheck;
+ for (const Code *inp = codes.begin(); inp < codes.begin() + ncheck; ++inp)
+ if (!ctx.pair_allowed(inp[0], inp[1]))
+ return;
+
+ // mark this combination as changed if appropriate
+ if (codes.size() == 2 && nin == 1)
+ ctx.disallow_pair(codes[0], codes[1]);
+
+ // actually apply ligature
+ apply_ligature(codes, s, lookup);
+}
+
+bool
+Metrics::next_encoding(Vector<Code> &codes, const Vector<Glyph> &glyphs) const
+{
+ if (!codes.size()) {
+ codes.assign(glyphs.size(), 0);
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], 0)) < 0)
+ return false;
+ return true;
+ } else {
+ for (int i = 0; i < glyphs.size(); ++i)
+ if ((codes[i] = encoding(glyphs[i], codes[i] + 1)) >= 0)
+ return true;
+ else
+ codes[i] = encoding(glyphs[i], 0);
+ return false;
+ }
+}
+
+int
+Metrics::apply(const Vector<Substitution>& sv, bool allow_single, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ // keep track of what substitutions we have performed
+ ChangedContext ctx(_encoding.size());
+
+ // loop over substitutions
+ int failures = 0;
+ for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
+ bool is_single = s->is_single() || s->is_alternate();
+ bool is_apply_single = is_single && allow_single;
+ bool is_apply_simple_context_ligature = !is_single && !s->is_multiple() && s->is_simple_context();
+
+ if (is_apply_single || is_apply_simple_context_ligature) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_apply_single)
+ apply_single(codes[0], s, lookup, ctx, glyph_filter, glyph_names);
+ else
+ apply_simple_context_ligature(codes, s, lookup, ctx, glyph_filter, glyph_names);
+ }
+ } else
+ failures++;
+ }
+
+ return sv.size() - failures;
+}
+
+void
+Metrics::apply_alternates_single(Code cin, const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ Code last = cin;
+ uint32_t u = unicode(cin);
+ for (int i = 0; i < s->out_nglyphs(); i++)
+ if (glyph_filter.allow_alternate(s->out_glyph(i), glyph_names, u)) {
+ Code out = force_encoding(s->out_glyph(i), lookup);
+ add_ligature(last, as->in2, out);
+ last = out;
+ }
+ } else if (as->kern <= s->out_nglyphs()) {
+ Code out = force_encoding(s->out_glyph(as->kern - 1), lookup);
+ add_ligature(cin, as->in2, out);
+ }
+}
+
+void
+Metrics::apply_alternates_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names)
+{
+ // check whether the output character is allowed
+ if (!glyph_filter.allow_alternate(s->out_glyph(), glyph_names, 0))
+ return;
+
+ // find alternate selector and apply ligature if appropriate
+ for (const Kern *as = _altselectors.begin(); as != _altselectors.end(); as++)
+ if (as->kern == 0) {
+ Vector<Code> lig(codes);
+ lig.insert(lig.begin() + 1, as->in2);
+ apply_ligature(lig, s, lookup);
+ }
+}
+
+void
+Metrics::apply_alternates(const Vector<Substitution>& sv, int lookup, const GlyphFilter& glyph_filter, const Vector<PermString>& glyph_names)
+{
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ for (const Substitution *s = sv.begin(); s != sv.end(); s++) {
+ bool is_single = s->is_single() || s->is_alternate();
+ if (is_single || s->is_ligature()) {
+ s->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); ) {
+ if (is_single)
+ apply_alternates_single(codes[0], s, lookup, glyph_filter, glyph_names);
+ else
+ apply_alternates_ligature(codes, s, lookup, glyph_filter, glyph_names);
+ }
+ }
+ }
+}
+
+
+/*****************************************************************************/
+/* applying GPOS positionings */
+
+static bool // returns old value
+assign_bitvec(int*& bitvec, int e, int n)
+{
+ if (e >= 0 && e < n) {
+ if (!bitvec) {
+ bitvec = new int[((n - 1) >> 5) + 1];
+ memset(bitvec, 0, sizeof(int) * (((n - 1) >> 5) + 1));
+ }
+ bool result = (bitvec[e >> 5] & (1 << (e & 0x1F))) != 0;
+ bitvec[e >> 5] |= (1 << (e & 0x1F));
+ return result;
+ } else
+ return false;
+}
+
+int
+Metrics::apply(const Vector<Positioning>& pv)
+{
+ // keep track of what substitutions we have performed
+ int *single_changed = 0;
+ Vector<int *> pair_changed(_encoding.size(), 0);
+ Vector<Glyph> glyphs;
+ Vector<Code> codes;
+
+ // loop over substitutions
+ int success = 0;
+ for (const Positioning *p = pv.begin(); p != pv.end(); p++) {
+ bool is_single = p->is_single();
+ if (is_single || p->is_pairkern()) {
+ p->all_in_glyphs(glyphs);
+ for (codes.clear(); next_encoding(codes, glyphs); )
+ if (is_single) {
+ if (!assign_bitvec(single_changed, codes[0], _encoding.size())) {
+ _encoding[codes[0]].pdx += p->left().pdx;
+ _encoding[codes[0]].pdy += p->left().pdy;
+ _encoding[codes[0]].adx += p->left().adx;
+ }
+ } else {
+ if (!assign_bitvec(pair_changed[codes[0]], codes[1], _encoding.size()))
+ add_kern(codes[0], codes[1], p->left().adx);
+ }
+ success++;
+ }
+ }
+
+ delete[] single_changed;
+ for (int i = 0; i < pair_changed.size(); i++)
+ delete[] pair_changed[i];
+ return success;
+}
+
+
+/*****************************************************************************/
+/* liveness marking, Ligature3s */
+
+String Metrics::Ligature3::unparse(const Metrics& m) const {
+ StringAccum sa;
+ sa << '[' << m.code_name(in1) << ' ' << m.code_name(in2)
+ << " -> " << m.code_name(out) << ']';
+ return sa.take_string();
+}
+
+inline bool
+operator<(const Metrics::Ligature3 &l1, const Metrics::Ligature3 &l2)
+{
+ // topological < : is l1's output one of l2's inputs?
+ if (l1.out == l2.in1 || l1.out == l2.in2)
+ return true;
+ else
+ return l1.in1 < l2.in1
+ || (l1.in1 == l2.in1 && (l1.in2 < l2.in2
+ || (l1.in2 == l2.in2 && l1.out < l2.out)));
+}
+
+void
+Metrics::all_ligatures(Vector<Ligature3> &all_ligs) const
+{
+ /* Develop a topologically-sorted ligature list. */
+ all_ligs.clear();
+ for (Code code = 0; code < _encoding.size(); code++)
+ for (const Ligature *l = _encoding[code].ligatures.begin(); l != _encoding[code].ligatures.end(); l++)
+ all_ligs.push_back(Ligature3(code, l->in2, l->out));
+ std::sort(all_ligs.begin(), all_ligs.end());
+}
+
+void
+Metrics::mark_liveness(int size, const Vector<Ligature3> *all_ligs)
+{
+ _liveness_marked = true;
+ bool changed;
+
+ // make sure we have ligatures
+ Vector<Ligature3> my_ligs;
+ if (!all_ligs) {
+ all_ligatures(my_ligs);
+ all_ligs = &my_ligs;
+ }
+
+ /* Characters below 'size' are in both virtual and base encodings. */
+ for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->visible())
+ ch->flags |= Char::LIVE | (ch->virtual_char ? 0 : Char::BASE_LIVE);
+
+ /* Characters reachable from live chars by live ligatures are live. */
+ redo_live_reachable:
+ for (const Ligature3 *l = all_ligs->begin(); l != all_ligs->end(); l++)
+ if (_encoding[l->in1].flag(Char::LIVE) && _encoding[l->in2].flag(Char::LIVE)) {
+ Char &ch = _encoding[l->out];
+ if (!ch.flag(Char::LIVE))
+ ch.flags |= Char::LIVE | Char::CONTEXT_ONLY | (ch.virtual_char ? 0 : Char::BASE_LIVE);
+ if (ch.flag(Char::CONTEXT_ONLY) && !ch.context_setting(l->in1, l->in2))
+ ch.flags &= ~Char::CONTEXT_ONLY;
+ }
+
+ /* Characters reachable from context-only ligatures are live. */
+ changed = false;
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->flag(Char::CONTEXT_ONLY)) {
+ Char &ch1 = _encoding[ch->built_in1];
+ Char &ch2 = _encoding[ch->built_in2];
+ if (!ch1.flag(Char::LIVE) || !ch2.flag(Char::LIVE)) {
+ ch1.flags |= Char::LIVE;
+ ch2.flags |= Char::LIVE;
+ changed = true;
+ }
+ }
+ if (changed)
+ goto redo_live_reachable;
+
+ /* Characters reachable from live settings are base-live. */
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->flag(Char::LIVE))
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0
+ && _encoding[s->x].base_code >= 0)
+ _encoding[s->x].flags |= Char::BASE_LIVE;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+}
+
+void
+Metrics::reencode(const Vector<Code> &reencoding)
+{
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++) {
+ for (Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++) {
+ l->in2 = reencoding[l->in2];
+ l->out = reencoding[l->out];
+ }
+ for (Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ k->in2 = reencoding[k->in2];
+ if (VirtualChar *vc = ch->virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0)
+ s->x = reencoding[s->x];
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (ch->built_in1 >= 0) {
+ ch->built_in1 = reencoding[ch->built_in1];
+ ch->built_in2 = reencoding[ch->built_in2];
+ }
+ if (ch->base_code >= 0)
+ ch->base_code = reencoding[ch->base_code];
+ }
+ _emap.clear();
+}
+
+
+/*****************************************************************************/
+/* shrinking the encoding */
+
+bool
+Metrics::Char::context_setting(Code in1, Code in2) const
+{
+ // return true iff this character could represent the context setting of
+ // 'in1' and 'in2'
+ if (!virtual_char || ligatures.size())
+ return false;
+ else
+ return (in1 == built_in1 || in2 == built_in2);
+}
+
+void
+Metrics::cut_encoding(int size)
+{
+ /* Function makes it so that characters below 'size' do not point to
+ characters above 'size', except for context ligatures. */
+
+ /* Change "emptyslot"s to ".notdef"s. */
+ for (Char *ch = _encoding.begin(); ch != _encoding.end(); ch++)
+ if (ch->glyph == emptyslot_glyph()) {
+ ch->glyph = 0;
+ ch->base_code = -1;
+ // 21.Feb.2007: Character isn't live any more.
+ ch->flags &= ~(Char::BASE_LIVE | Char::LIVE);
+ }
+
+ /* Maybe we don't need to do anything else. */
+ if (_encoding.size() <= size) {
+ _encoding.resize(size, Char());
+ return;
+ }
+
+ /* Need liveness markings. */
+ if (!_liveness_marked)
+ mark_liveness(size);
+
+ /* Characters below 'size' are 'good'.
+ Characters above 'size' are not 'good'. */
+ Vector<int> good(_encoding.size(), 1);
+ for (Code c = size; c < _encoding.size(); c++)
+ good[c] = 0;
+
+ /* Characters encoded via base_code are 'good', though. */
+ for (Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->base_code >= size)
+ good[ch->base_code] = 1;
+
+ /* Some fake characters might point beyond 'size'; remove them too. No
+ need for a multipass algorithm since virtual chars never point to
+ virtual chars. */
+ for (Code c = 0; c < _encoding.size(); c++) {
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ int font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0 && !good[s->x]) {
+ _encoding[c].clear();
+ goto bad_virtual_char;
+ } else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ if (c < size)
+ good[c] = 1;
+ bad_virtual_char: ;
+ }
+
+ /* Certainly none of the later ligatures or kerns will be meaningful. */
+ for (Code c = size; c < _encoding.size(); c++) {
+ _encoding[c].ligatures.clear();
+ _encoding[c].kerns.clear();
+ }
+
+ /* Remove ligatures and kerns that point beyond 'size', except for valid
+ context ligatures. Also remove ligatures that have non-live
+ components. */
+ /* 30.May.2005 -- Kerns might point involve a too-high character; kill
+ them. */
+ for (Code c = 0; c < size; c++) {
+ Char &ch = _encoding[c];
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (!good[l->in2] || l->in2 >= size
+ || (!good[l->out] && !_encoding[l->out].context_setting(c, l->in2))) {
+ *l = ch.ligatures.back();
+ ch.ligatures.pop_back();
+ l--;
+ }
+ for (Kern *k = ch.kerns.begin(); k != ch.kerns.end(); k++)
+ if (!good[k->in2] || k->in2 >= size) {
+ *k = ch.kerns.back();
+ ch.kerns.pop_back();
+ k--;
+ }
+ }
+
+ /* We are done! */
+}
+
+namespace {
+// preference-sorting extra characters
+enum {
+ CONVENTIONAL_F_LIGATURE_SCORE = 4,
+ CONVENTIONAL_F_F_LIGATURE_SCORE = 5,
+ BASIC_LATIN_LOWER_SCORE = 3,
+ BASIC_LATIN_UPPER_SCORE = 4,
+ BASIC_LATIN_OTHER_SCORE = 5,
+ LATIN1_SUPPLEMENT_SCORE = 6,
+ LOW_16_SCORE = 7,
+ OTHER_SCORE = 8,
+ NOCHAR_SCORE = 100000,
+ CONTEXT_PENALTY = 4
+};
+
+static int
+unicode_score(uint32_t u)
+{
+ if (u == 0)
+ return NOCHAR_SCORE;
+ else if (u >= 'a' && u <= 'z')
+ return BASIC_LATIN_LOWER_SCORE;
+ else if (u >= 'A' && u <= 'Z')
+ return BASIC_LATIN_UPPER_SCORE;
+ else if (u < 0x0080)
+ return BASIC_LATIN_OTHER_SCORE;
+ else if (u < 0x0100)
+ return LATIN1_SUPPLEMENT_SCORE;
+ else if (u < 0x8000)
+ return LOW_16_SCORE;
+ else
+ return OTHER_SCORE;
+}
+
+struct Slot {
+ Metrics::Code old_code;
+ Metrics::Code new_code;
+ Metrics::Glyph glyph;
+ int score;
+ int lookup_source;
+};
+
+inline bool
+operator<(const Slot &a, const Slot &b)
+{
+ // note: will give real glyphs priority over virtual ones at a given
+ // priority
+ // 6.Jul.2014 -- Make sure you include an old_code comparison; this
+ // is required to ensure that a ligature's inputs (which have smaller
+ // old_codes) are included whenever its outputs are included.
+ if (a.lookup_source != b.lookup_source)
+ return a.lookup_source < b.lookup_source;
+ if (a.score != b.score)
+ return a.score < b.score;
+ if (a.glyph != b.glyph)
+ return a.glyph < b.glyph;
+ return a.old_code < b.old_code;
+}
+}
+
+void
+Metrics::shrink_encoding(int size, const DvipsEncoding &dvipsenc, ErrorHandler *errh)
+{
+ /* Move characters around. */
+
+ /* Maybe we don't need to do anything. */
+ if (_encoding.size() <= size) {
+ cut_encoding(size);
+ return;
+ }
+
+ /* Need a list of all ligatures.. */
+ Vector<Ligature3> all_ligs;
+ all_ligatures(all_ligs);
+
+ /* Need liveness markings. */
+ if (!_liveness_marked)
+ mark_liveness(size, &all_ligs);
+
+ /* Score characters by importance. Importance relates first to Unicode
+ values, and then recursively to the importances of characters that form
+ a ligature. */
+
+ /* Create an initial set of scores, based on Unicode values. */
+ Vector<int> scores(_encoding.size(), NOCHAR_SCORE);
+ for (int i = 0; i < _encoding.size(); i++)
+ if (_encoding[i].unicode)
+ scores[i] = unicode_score(_encoding[i].unicode);
+
+ /* Prefer conventional f-ligatures. */
+ bool has_ff = false;
+ for (Ligature3* l = all_ligs.begin(); l != all_ligs.end(); ++l)
+ if (_encoding[l->in1].unicode == 'f'
+ && (_encoding[l->in2].unicode == 'f'
+ || _encoding[l->in2].unicode == 'i'
+ || _encoding[l->in2].unicode == 'l')) {
+ if (scores[l->out] > CONVENTIONAL_F_LIGATURE_SCORE)
+ scores[l->out] = CONVENTIONAL_F_LIGATURE_SCORE;
+ if (_encoding[l->in2].unicode == 'f') {
+ _encoding[l->out].flags |= Char::IS_FF;
+ has_ff = true;
+ }
+ }
+ if (has_ff)
+ for (Ligature3* l = all_ligs.begin(); l != all_ligs.end(); ++l)
+ if (_encoding[l->in1].flag(Char::IS_FF)
+ && (_encoding[l->in2].unicode == 'i'
+ || _encoding[l->in2].unicode == 'l')
+ && scores[l->out] > CONVENTIONAL_F_F_LIGATURE_SCORE)
+ scores[l->out] = CONVENTIONAL_F_F_LIGATURE_SCORE;
+
+ /* Repeat these steps until you reach a stable set of scores: Score
+ ligatures (ligscore = SUM[char scores]), then score characters touched
+ only by fakes. */
+ bool changed = true;
+ while (changed) {
+ changed = false;
+ for (Ligature3 *l = all_ligs.begin(); l != all_ligs.end(); l++) {
+ int score = scores[l->in1] + scores[l->in2];
+ if (scores[l->out] > score)
+ scores[l->out] = score, changed = true;
+ }
+
+ for (Code c = 0; c < _encoding.size(); c++)
+ if (VirtualChar *vc = _encoding[c].virtual_char) {
+ /* Make sure that if this virtual character appears, its parts
+ will also appear, by scoring the parts less */
+ int score = scores[c] - 1, font_number = 0;
+ for (Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ if (s->op == Setting::SHOW && font_number == 0
+ && score < scores[s->x])
+ scores[s->x] = score, changed = true;
+ else if (s->op == Setting::FONT)
+ font_number = s->x;
+ }
+ }
+
+ /* Rescore intermediates to not be better off than their endpoints. */
+ /* XXX multiple layers of intermediate? */
+ for (Code c = 0; c < _encoding.size(); c++) {
+ Char &ch = _encoding[c];
+ if (ch.flag(Char::INTERMEDIATE))
+ for (Ligature *l = ch.ligatures.begin(); l != ch.ligatures.end(); l++)
+ if (scores[c] < scores[l->out] && !_encoding[l->out].context_setting(c, l->in2))
+ scores[c] = scores[l->out];
+ }
+
+ /* Collect characters that want to be reassigned. */
+ Vector<Slot> slots;
+ for (Code c = size; c < _encoding.size(); c++)
+ if (scores[c] < NOCHAR_SCORE
+ && !(_encoding[c].flags & Char::CONTEXT_ONLY)
+ && (_encoding[c].flags & (Char::LIVE | Char::BASE_LIVE))) {
+ Slot slot = { c, -1, _encoding[c].glyph, scores[c], _encoding[c].lookup_source };
+ slots.push_back(slot);
+ }
+ // Sort them by score, then by glyph.
+ std::sort(slots.begin(), slots.end());
+
+ /* Prefer their old slots, if available. */
+ for (Slot *slot = slots.begin(); slot < slots.end(); slot++)
+ if (PermString g = code_name(slot->old_code)) {
+ int c = dvipsenc.encoding_of(g);
+ if (c >= 0 && _encoding[c].glyph == 0) {
+ _encoding[c].swap(_encoding[slot->old_code]);
+ slot->new_code = c;
+ }
+ }
+
+ /* List empty slots in two phases: Those not encoded by the input
+ encoding, then those encoded by the input encoding (but that character
+ wasn't available). */
+ Vector<Code> empty_codes;
+ for (int want_encoded = 0; want_encoded < 2; want_encoded++)
+ for (Code c = 0; c < size; c++)
+ if (_encoding[c].base_code < 0
+ && dvipsenc.encoded(c) == (bool) want_encoded)
+ empty_codes.push_back(c);
+
+ /* Then, assign codes to the unencoded characters. */
+ int nunencoded = 0;
+
+ for (Slot *slot = slots.begin(); slot != slots.end(); slot++) {
+ if (slot->new_code >= 0)
+ continue;
+
+ int needs = (_encoding[slot->old_code].visible_base() ? 1 : 0)
+ + (_encoding[slot->old_code].flag(Char::LIVE) ? 2 : 0);
+ assert(needs > 0);
+
+ Code dest = -1;
+ for (Code *h = empty_codes.begin(); h < empty_codes.end() && dest < 0; h++) {
+ int haves = (_encoding[*h].base_code < 0 ? 1 : 0)
+ + (!_encoding[*h].visible() ? 2 : 0);
+ if ((needs & haves) == needs)
+ dest = *h;
+ }
+
+ if (dest >= 0) {
+ if (needs & 2) {
+ assert(!_encoding[dest].visible());
+ _encoding[dest].swap(_encoding[slot->old_code]);
+ slot->new_code = dest;
+ } else {
+ _encoding[slot->old_code].base_code = dest;
+ slot->new_code = slot->old_code;
+ }
+ if (needs & 1) {
+ assert(_encoding[dest].base_code < 0 || _encoding[dest].base_code == slot->old_code);
+ _encoding[dest].base_code = slot->old_code;
+ }
+ } else
+ nunencoded++;
+ }
+
+ /* Complain if some characters can't fit. */
+ if (nunencoded) {
+ // collect names of unencoded glyphs
+ Vector<String> unencoded;
+ for (Slot *slot = slots.begin(); slot != slots.end(); slot++)
+ if (slot->new_code < 0)
+ unencoded.push_back(code_name(slot->old_code));
+ std::sort(unencoded.begin(), unencoded.end());
+ StringAccum sa;
+ for (const String* a = unencoded.begin(); a < unencoded.end(); a++)
+ sa << *a << ' ';
+ sa.pop_back();
+ sa.append_break_lines(sa.take_string(), 68, " ");
+ sa.pop_back();
+ errh->lwarning(" ", (unencoded.size() == 1 ? "not enough room in encoding, ignoring %d glyph" : "not enough room in encoding, ignoring %d glyphs"), unencoded.size());
+ errh->lmessage(" ", "(\
+The font uses more glyphs than the encoding has available slots,\n\
+so these glyphs have been left out:\n%s\n\
+To select specific glyphs, add them to the input encoding.)", sa.c_str());
+ }
+
+ /* Reencode changed slots. */
+ Vector<Code> reencoding;
+ for (Code c = 0; c < _encoding.size(); c++)
+ reencoding.push_back(c);
+ for (Slot *s = slots.begin(); s != slots.end(); s++)
+ if (s->new_code >= 0)
+ reencoding[s->old_code] = s->new_code;
+ reencode(reencoding);
+
+ check();
+}
+
+void
+Metrics::make_base(int size)
+{
+ Vector<Code> reencoding;
+ for (Code c = 0; c < size && c < _encoding.size(); c++) {
+ Char &ch = _encoding[c];
+ if (ch.base_code >= 0 && ch.base_code != c) {
+ if (!reencoding.size())
+ for (Code cc = 0; cc < _encoding.size(); cc++)
+ reencoding.push_back(cc);
+ reencoding[ch.base_code] = c;
+ reencoding[c] = ch.base_code;
+ _encoding[c].swap(_encoding[ch.base_code]);
+ }
+ if (ch.virtual_char) // remove it
+ ch.clear();
+ }
+ if (reencoding.size()) {
+ reencode(reencoding);
+ cut_encoding(size);
+ }
+ check();
+}
+
+
+/*****************************************************************************/
+/* output */
+
+bool
+Metrics::need_virtual(int size) const
+{
+ if (size > _encoding.size())
+ size = _encoding.size();
+ for (const Char *ch = _encoding.begin(); ch < _encoding.begin() + size; ch++)
+ if (ch->glyph /* actually encoded */
+ && (ch->pdx || ch->pdy || ch->adx || ch->virtual_char))
+ return true;
+ return false;
+}
+
+bool
+Metrics::need_base()
+{
+ if (!_liveness_marked)
+ mark_liveness(_encoding.size());
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if ((ch->flags & Char::BASE_LIVE) && ch->glyph != _boundary_glyph)
+ return true;
+ return false;
+}
+
+bool
+Metrics::setting(Code code, Vector<Setting> &v, SettingMode sm) const
+{
+ extern int letterspace;
+
+ if (!(sm & SET_KEEP))
+ v.clear();
+
+ if (!valid_code(code) || _encoding[code].glyph == 0)
+ return false;
+
+ const Char &ch = _encoding[code];
+
+ if (const VirtualChar *vc = ch.virtual_char) {
+ bool good = true;
+ int font_number = 0;
+
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::MOVE:
+ case Setting::RULE:
+ case Setting::PUSH:
+ case Setting::POP:
+ case Setting::SPECIAL:
+ v.push_back(*s);
+ break;
+ case Setting::FONT:
+ v.push_back(*s);
+ font_number = s->x;
+ break;
+ case Setting::SHOW:
+ if (font_number == 0)
+ good &= setting(s->x, v, (SettingMode)(sm | SET_KEEP));
+ else
+ v.push_back(*s);
+ break;
+ case Setting::KERN:
+ case Setting::KERNX:
+ if (sm & SET_INTERMEDIATE)
+ v.push_back(*s);
+ else if (font_number == 0 && s > vc->setting.begin()
+ && s + 1 < vc->setting.end()
+ && s[-1].op == Setting::SHOW
+ && s[1].op == Setting::SHOW) {
+ int k = kern(s[-1].x, s[1].x);
+ if (s->op == Setting::KERNX)
+ k -= letterspace;
+ if (k)
+ v.push_back(Setting(Setting::MOVE, k, 0));
+ }
+ break;
+ }
+
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ return good;
+
+ } else if (ch.base_code >= 0) {
+ if (ch.pdx != 0 || ch.pdy != 0)
+ v.push_back(Setting(Setting::MOVE, ch.pdx, ch.pdy));
+
+ v.push_back(Setting(Setting::SHOW, ch.base_code, ch.glyph));
+
+ if (ch.pdy != 0 || ch.adx - ch.pdx != 0)
+ v.push_back(Setting(Setting::MOVE, ch.adx - ch.pdx, -ch.pdy));
+ return true;
+
+ } else
+ return false;
+}
+
+int
+Metrics::ligatures(Code in1, Vector<Code> &in2, Vector<Code> &out, Vector<int> &context) const
+{
+ in2.clear();
+ out.clear();
+ context.clear();
+
+ const Char &in1ch = _encoding[in1];
+ for (const Ligature *l = in1ch.ligatures.begin(); l != in1ch.ligatures.end(); l++) {
+ in2.push_back(l->in2);
+ const Char &outch = _encoding[l->out];
+ if (outch.context_setting(in1, l->in2)) {
+ if (in1 == outch.built_in1 && l->in2 == outch.built_in2)
+ in2.pop_back();
+ else if (in1 == outch.built_in1) {
+ out.push_back(outch.built_in2);
+ context.push_back(-1);
+ } else {
+ out.push_back(outch.built_in1);
+ context.push_back(1);
+ }
+ } else {
+ out.push_back(l->out);
+ context.push_back(0);
+ }
+ }
+
+ return in2.size();
+}
+
+int
+Metrics::kerns(Code in1, Vector<Code> &in2, Vector<int> &kern) const
+{
+ in2.clear();
+ kern.clear();
+
+ const Char &in1ch = _encoding[in1];
+ for (const Kern *k = in1ch.kerns.begin(); k != in1ch.kerns.end(); k++)
+ if (k->kern != 0) {
+ in2.push_back(k->in2);
+ kern.push_back(k->kern);
+ }
+
+ return in2.size();
+}
+
+
+/*****************************************************************************/
+/* debugging */
+
+void
+Metrics::unparse(const Char *ch) const
+{
+ Code c;
+ if (ch >= _encoding.begin() && ch < _encoding.end())
+ c = ch - _encoding.begin();
+ else
+ c = -1;
+ fprintf(stderr, "%4d/%s%s%s%s%s%s\n", c, code_str(c),
+ (ch->flag(Char::LIVE) ? " [L]" : ""),
+ (ch->flag(Char::BASE_LIVE) ? " [B]" : ""),
+ (ch->flag(Char::CONTEXT_ONLY) ? " [C]" : ""),
+ (ch->flag(Char::BUILT) ? " [!]" : ""),
+ (ch->base_code >= 0 ? " <BC>" : ""));
+ if (ch->base_code >= 0 && ch->base_code != c)
+ fprintf(stderr, "\tBASE %d/%s\n", ch->base_code, code_str(ch->base_code));
+ if (const VirtualChar *vc = ch->virtual_char) {
+ fprintf(stderr, "\t*");
+ int curfont = 0;
+ for (const Setting *s = vc->setting.begin(); s != vc->setting.end(); s++)
+ switch (s->op) {
+ case Setting::FONT:
+ fprintf(stderr, " {F%d}", s->x);
+ curfont = s->x;
+ break;
+ case Setting::SHOW:
+ fprintf(stderr, " %d", s->x);
+ if (curfont == 0)
+ fprintf(stderr, "/%s", code_str(s->x));
+ break;
+ case Setting::KERN:
+ fprintf(stderr, " <>");
+ break;
+ case Setting::MOVE:
+ fprintf(stderr, " <%+d,%+d>", s->x, s->y);
+ break;
+ case Setting::RULE:
+ fprintf(stderr, " [%d,%d]", s->x, s->y);
+ break;
+ case Setting::PUSH:
+ fprintf(stderr, " (");
+ break;
+ case Setting::POP:
+ fprintf(stderr, " )");
+ break;
+ case Setting::SPECIAL:
+ fprintf(stderr, " S{%s}", s->s.c_str());
+ break;
+ }
+ fprintf(stderr, " ((%d/%s, %d/%s))\n", ch->built_in1, code_str(ch->built_in1), ch->built_in2, code_str(ch->built_in2));
+ }
+ for (const Ligature *l = ch->ligatures.begin(); l != ch->ligatures.end(); l++)
+ fprintf(stderr, "\t[%d/%s => %d/%s]%s\n", l->in2, code_str(l->in2), l->out, code_str(l->out), (_encoding[l->out].context_setting(c, l->in2) ? " [C]" : ""));
+#if 0
+ for (const Kern *k = ch->kerns.begin(); k != ch->kerns.end(); k++)
+ fprintf(stderr, "\t{%d/%s %+d}\n", k->in2, code_str(k->in2), k->kern);
+#endif
+}
+
+void
+Metrics::unparse() const
+{
+ for (const Char *ch = _encoding.begin(); ch < _encoding.end(); ch++)
+ if (ch->glyph)
+ unparse(ch);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh
new file mode 100644
index 00000000000..4e03246d53b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/metrics.hh
@@ -0,0 +1,288 @@
+#ifndef OTFTOTFM_METRICS_HH
+#define OTFTOTFM_METRICS_HH
+#include <efont/otfgsub.hh>
+#include <efont/otfgpos.hh>
+#include "setting.hh"
+namespace Efont { class CharstringProgram; }
+class DvipsEncoding;
+class GlyphFilter;
+
+class Metrics { public:
+
+ typedef int Code;
+ typedef Efont::OpenType::Glyph Glyph;
+ enum { VIRTUAL_GLYPH = 0x10000 };
+
+ typedef Efont::OpenType::Substitution Substitution;
+ typedef Efont::OpenType::Positioning Positioning;
+
+ Metrics(const Efont::CharstringProgram *, int nglyphs);
+ ~Metrics();
+
+ void check() const;
+
+ Glyph boundary_glyph() const { return _boundary_glyph; }
+ Glyph emptyslot_glyph() const { return _emptyslot_glyph; }
+
+ String coding_scheme() const { return _coding_scheme; }
+ void set_coding_scheme(const String &s) { _coding_scheme = s; }
+
+ int design_units() const { return _design_units; }
+ int units_per_em() const { return _units_per_em; }
+ void set_design_units(int du) { _design_units = du; }
+
+ int n_mapped_fonts() const { return _mapped_fonts.size();}
+ const Efont::CharstringProgram *mapped_font(int i) const { return _mapped_fonts[i]; }
+ const String &mapped_font_name(int i) const { return _mapped_font_names[i]; }
+ int add_mapped_font(const Efont::CharstringProgram *, const String &);
+
+ inline int encoding_size() const { return _encoding.size(); }
+ inline bool valid_code(Code) const;
+ inline bool nonvirtual_code(Code) const;
+ PermString code_name(Code) const;
+ inline const char *code_str(Code) const;
+
+ inline Glyph glyph(Code code) const;
+ inline uint32_t unicode(Code code) const;
+ inline Code encoding(Glyph g, Code after) const;
+ Code unicode_encoding(uint32_t uni) const;
+ Code force_encoding(Glyph g, int lookup_source = -1);
+ void encode(Code code, uint32_t uni, Glyph g);
+ void encode_virtual(Code, PermString, uint32_t uni, const Vector<Setting> &, bool base_char);
+
+ void add_altselector_code(Code, int altselector_type);
+ bool altselectors() const { return _altselectors.size() > 0; }
+
+ inline bool was_base_glyph(Code) const;
+ inline Code base_code(Code) const;
+ inline Glyph base_glyph(Code) const;
+ bool base_glyphs(Vector<Glyph> &, int size) const;
+
+ void add_ligature(Code in1, Code in2, Code out);
+ Code pair_code(Code, Code, int lookup_source = -1);
+ void add_kern(Code in1, Code in2, int kern);
+ void set_kern(Code in1, Code in2, int kern);
+ void add_single_positioning(Code, int pdx, int pdy, int adx);
+
+ enum { CODE_ALL = 0x7FFFFFFF };
+ void remove_ligatures(Code in1, Code in2);
+ int reencode_right_ligkern(Code old_in2, Code new_in2);
+
+ int apply(const Vector<Substitution>&, bool allow_single, int lookup, const GlyphFilter&, const Vector<PermString>& glyph_names);
+ void apply_alternates(const Vector<Substitution>&, int lookup, const GlyphFilter&, const Vector<PermString>& glyph_names);
+ int apply(const Vector<Positioning>&);
+
+ void apply_base_encoding(const String &font_name, const DvipsEncoding &, const Vector<int> &mapping);
+
+ void cut_encoding(int size);
+ void shrink_encoding(int size, const DvipsEncoding &, ErrorHandler *);
+ void make_base(int size);
+
+ bool need_virtual(int size) const;
+ bool need_base();
+ enum SettingMode { SET_NONE = 0, SET_KEEP = 1, SET_INTERMEDIATE = 3 };
+ bool setting(Code, Vector<Setting> &, SettingMode = SET_NONE) const;
+ int ligatures(Code in1, Vector<Code> &in2, Vector<Code> &out, Vector<int> &context) const;
+ int kerns(Code in1, Vector<Code> &in2, Vector<int> &kern) const;
+ int kern(Code in1, Code in2) const;
+
+ void unparse() const;
+
+ struct Ligature {
+ Code in2;
+ Code out;
+ Ligature(Code in2_, Code out_) : in2(in2_), out(out_) { }
+ };
+
+ struct Kern {
+ Code in2;
+ int kern;
+ Kern(Code in2_, int kern_) : in2(in2_), kern(kern_) { }
+ };
+
+ struct VirtualChar {
+ PermString name;
+ Vector<Setting> setting;
+ };
+
+ struct Ligature3 {
+ Code in1;
+ Code in2;
+ Code out;
+ Ligature3(Code in1_, Code in2_, Code out_) : in1(in1_), in2(in2_), out(out_) { }
+ String unparse(const Metrics& m) const;
+ };
+
+ private:
+
+ struct Char {
+ Glyph glyph;
+ Code base_code;
+ uint32_t unicode;
+ Vector<Ligature> ligatures;
+ Vector<Kern> kerns;
+ VirtualChar *virtual_char;
+ int pdx;
+ int pdy;
+ int adx;
+ Code built_in1;
+ Code built_in2;
+ int lookup_source;
+ enum { BUILT = 1, INTERMEDIATE = 2, CONTEXT_ONLY = 4, LIVE = 8,
+ BASE_LIVE = 16, BASE_REP = 32, IS_FF = 64 };
+ int flags;
+
+ Char() : virtual_char(0) { clear(); }
+ void clear();
+ void swap(Char &);
+ bool visible() const { return glyph != 0; }
+ bool visible_base() const { return glyph != 0 && glyph != VIRTUAL_GLYPH; }
+ bool flag(int f) const { return (flags & f) != 0; }
+ inline bool base_glyph() const;
+ bool context_setting(Code in1, Code in2) const;
+ };
+
+ Vector<Char> _encoding;
+ mutable Vector<int> _emap;
+
+ Glyph _boundary_glyph;
+ Glyph _emptyslot_glyph;
+
+ Vector<Kern> _altselectors;
+
+ String _coding_scheme;
+ int _design_units;
+ int _units_per_em;
+
+ bool _liveness_marked : 1;
+
+ Vector<const Efont::CharstringProgram *> _mapped_fonts;
+ Vector<String> _mapped_font_names;
+
+ Metrics(const Metrics &); // does not exist
+ Metrics &operator=(const Metrics &); // does not exist
+
+ inline void assign_emap(Glyph, Code);
+ Code hard_encoding(Glyph, Code) const;
+ bool next_encoding(Vector<Code> &codes, const Vector<Glyph> &glyphs) const;
+
+ Ligature *ligature_obj(Code, Code);
+ Kern *kern_obj(Code, Code);
+ inline void new_ligature(Code, Code, Code);
+ inline void repoint_ligature(Code, Ligature *, Code);
+
+ friend bool operator<(const Ligature3 &, const Ligature3 &);
+ void all_ligatures(Vector<Ligature3> &) const;
+ void mark_liveness(int size, const Vector<Ligature3> * = 0);
+ void reencode(const Vector<Code> &);
+
+ class ChangedContext;
+ void apply_ligature(const Vector<Code> &, const Substitution *, int lookup);
+ void apply_single(Code cin, const Substitution *s, int lookup,
+ ChangedContext &ctx, const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+ void apply_simple_context_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup, ChangedContext &ctx,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+ void apply_alternates_single(Code cin, const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+ void apply_alternates_ligature(const Vector<Code> &codes,
+ const Substitution *s, int lookup,
+ const GlyphFilter &glyph_filter,
+ const Vector<PermString> &glyph_names);
+
+ void unparse(const Char *) const;
+
+};
+
+
+inline bool
+Metrics::valid_code(Code code) const
+{
+ return code >= 0 && code < _encoding.size();
+}
+
+inline bool
+Metrics::nonvirtual_code(Code code) const
+{
+ return code >= 0 && code < _encoding.size() && !_encoding[code].virtual_char;
+}
+
+inline Metrics::Glyph
+Metrics::glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].glyph;
+}
+
+inline uint32_t
+Metrics::unicode(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].unicode;
+}
+
+inline Metrics::Glyph
+Metrics::base_glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size() || _encoding[code].base_code < 0)
+ return 0;
+ else
+ return _encoding[code].glyph;
+}
+
+inline Metrics::Code
+Metrics::base_code(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].base_code;
+}
+
+inline Metrics::Code
+Metrics::encoding(Glyph g, Code after) const
+{
+ Code c;
+ if (g >= 0 && g < _emap.size() && (c = _emap.at_u(g)) >= -1)
+ return c < 0 || c >= after ? c : -1;
+ else
+ return hard_encoding(g, after);
+}
+
+inline void
+Metrics::assign_emap(Glyph g, Code code)
+{
+ if (g >= _emap.size())
+ _emap.resize(g + 1, -1);
+ _emap[g] = (_emap[g] == -1 || _emap[g] == code ? code : -2);
+}
+
+inline const char *
+Metrics::code_str(Code code) const
+{
+ return code_name(code).c_str();
+}
+
+inline bool
+Metrics::Char::base_glyph() const
+{
+ return glyph == VIRTUAL_GLYPH ? flags & BASE_REP : glyph != 0;
+}
+
+inline bool
+Metrics::was_base_glyph(Code code) const
+{
+ if (code < 0 || code >= _encoding.size())
+ return 0;
+ else
+ return _encoding[code].base_glyph();
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1
new file mode 100644
index 00000000000..6ecb0a7591f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.1
@@ -0,0 +1,1669 @@
+'\"t
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.de Bp
+.IP \(bu 3n
+..
+.TH OTFTOTFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+otftotfm \- create TeX font metrics from OpenType fonts
+.SH SYNOPSIS
+.B otftotfm
+\%[\fB\-a\fR]
+\%[\fBoptions\fR]
+\%\fIfontfile\fR [\fItexname\fR]
+'
+.SH DESCRIPTION
+.BR Otftotfm
+creates the font metric and encoding files required to use an OpenType font
+with TeX. You supply an OpenType ".otf" or ".ttf" font file,
+a base ".enc" encoding,
+and a TeX name "\fItexname\fR" for the resulting font, and say which
+OpenType features should be turned on. Then
+.B otftotfm
+generates and installs the corresponding TeX-related metric files (".tfm"
+TeX font metrics, ".vf" virtual fonts, and ".enc" encoding files). It
+works on both PostScript-flavored and TrueType-flavored OpenType fonts,
+although TrueType-flavor support will only work easily with pdftex.
+.LP
+The easiest way to use
+.B otftotfm
+is with the
+.B \-a
+option; see Automatic Mode below. Without
+.BR \-a ,
+.B otftotfm
+writes all its output files to the current directory.
+.LP
+After running "\fBotftotfm\fR \fIfontfile\fR \fItexname\fR" and
+installing the results (manually or with
+.BR \-a ),
+you can use the OpenType font in plain TeX with a command like this:
+.Sp
+.nf
+ \efont\emyfont=\fItexname\fR at 10pt
+ {\emyfont This text uses the OpenType font.}
+.fi
+.Sp
+LaTeX users will generally make a ".fd" input file so that commands like
+"\erenewcommand{\ermdefault}{TeXName}" work correctly. See the EXAMPLE
+section for more; check the DIAGNOSTICS and FREQUENTLY ASKED QUESTIONS
+sections if you have trouble.
+'
+.SS "OpenType Features"
+.LP
+OpenType fonts support optional
+.I features
+that change their appearance. Use the
+.B \-f
+option to turn on selected features. For example, "\fB\-f\fRsmcp" replaces
+lower-case letters with the corresponding small capitals, in fonts that
+support this.
+'
+.PP
+You'll generally provide at least the "\fB\-f\fRkern" and "\fB\-f\fRliga"
+options, which activate pair kerns and f-ligatures. Other interesting
+features include "\fB\-f\fRcpsp", for capital spacing; "\fB\-f\fRdlig", for
+optional ligatures; "\fB\-f\fRlnum", "\fB\-f\fRonum", "\fB\-f\fRpnum", and
+"\fB\-f\fRtnum", to control digit glyphs; "\fB\-f\fRsmcp", for small
+capitals; "\fB\-f\fRswsh", for swash variants; and "\fB\-f\fRcswh", for
+contextual swash. See the FEATURE DIRECTORY section below for more. The
+.M otfinfo 1
+program will report which features a font supports; run "\fBotfinfo\fR
+\fB\-f\fR \fIfontfile\fR".
+'
+.PP
+Feature options can also apply a feature to a subset of characters in the
+font. For example, "\fB\-\-lf\fR smcp"
+.I only
+replaces letters with small capitals, whereas "\fB\-f\fRsmcp" might
+additionally replace digits and punctuation marks with small-capital
+versions.
+'
+.SS Automatic Mode
+.PP
+Automatic mode, triggered by the
+.BR \-a / \-\-automatic
+option, installs font metrics and encoding files where TeX can find them,
+and additionally installs a Type 1 font and mapping for
+.M dvips 1 .
+This requires a TeX installation that follows the TeX Directory Structure
+standard (http://www.tug.org/tds/), such as most Unix TeX installations.
+'
+.PP
+Automatic mode should run seamlessly out of the box.
+.B Otftotfm
+will install metrics files, encodings, map files, and Type\~1 fonts into
+.I $HOME/.texmf-var
+or any other writable TEXMF directory, and run
+.M updmap 1
+to update the global lists of installed fonts. (On older teTeX
+installations, you may first need to copy the system's
+.I updmap.cfg
+file to
+.I $HOME/texmf/web2c
+and run
+.M mktexlsr 1 .
+On newer TeXLive installations, you may need to set the TEXMFVAR environment
+variable.)
+You can then run "\fBotftotfm\fR
+.B \-a
+.IR fontfile
+.IR texname \&"
+and immediately refer to the font in TeX using the
+.I texname
+you supplied. Again, you will have to write ".fd" files and/or typescripts
+to make the font conveniently accessible from LaTeX or ConTeXt. See the
+DIAGNOSTICS section if you have problems with these instructions.
+'
+.PP
+In automatic mode,
+.B otftotfm
+searches your $TEXMFVAR or $TEXMF path for a writable directory, then
+installs files under that directory tree as follows:
+'
+.TS
+l l l .
+\fBFile type\fR \fBDirectory\fR \fBFilename\fR
+TFM TEXMF/fonts/tfm/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR[\-\-base].tfm
+VF TEXMF/fonts/vf/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR.vf
+PL TEXMF/fonts/pl/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR[\-\-base].pl
+VPL TEXMF/fonts/vpl/\fIvendor\fR/\fItypeface\fR/ \fItexname\fR.vpl
+encoding TEXMF/fonts/enc/dvips/\fIvendor\fR/ a_\fIsignature\fR.enc
+ or TEXMF/dvips/\fIvendor\fR/
+font map TEXMF/fonts/map/dvips/\fIvendor\fR/ \fIvendor\fR.map
+ or TEXMF/dvips/\fIvendor\fR/
+.TE
+.PP
+"TEXMF" stands for the writable TEXMF directory. \fITexname\fR is the
+font name supplied as
+.BR otftotfm 's
+second argument. The \fIvendor\fR and \fItypeface\fR strings are required
+by TDS; they default to "lcdftools" and the font's family name,
+respectively, but see the
+.B \-\-vendor
+and
+.B \-\-typeface
+options. \fISignature\fR is an opaque 6-character encoding signature.
+.PP
+.B Otftotfm
+also installs a font file suitable for printing. PostScript-flavored
+OpenType fonts are translated to Type 1 format and installed as PFB fonts.
+TrueType-flavored fonts are normally installed as is, since pdftex and
+pdflatex can read TrueType directly; but if you provide the
+.B \-\-type42
+option,
+.B otftotfm
+will translate TrueType fonts to Type 42 format, which dvips understands.
+.B Otftotfm
+does not overwrite existing font files.
+.PP
+The installation paths are as follows, where \fIPSname\fR is the font's
+PostScript name.
+.TS
+l l l .
+PFB TEXMF/fonts/type1/\fIvendor\fR/\fItypeface\fR/ \fIPSname\fR.pfb
+TrueType TEXMF/fonts/truetype/\fIvendor\fR/\fItypeface\fR/ \fIfontfile\fR
+Type 42 TEXMF/fonts/type42/\fIvendor\fR/\fItypeface\fR/ \fIPSname\fR.t42
+.TE
+.PP
+You can override these directories with environment variables and options
+as follows. Options take precedence over environment variables.
+'
+.TS
+l l l .
+\fBFile type\fR \fBEnvironment variable\fR \fBOption\fR
+TFM TFMDESTDIR \-\-tfm\-directory
+VF VFDESTDIR \-\-vf\-directory
+PL PLDESTDIR \-\-pl\-directory
+VPL VPLDESTDIR \-\-vpl\-directory
+encoding ENCODINGDESTDIR \-\-encoding\-directory
+PFB T1DESTDIR \-\-type1\-directory
+TrueType TRUETYPEDESTDIR \-\-truetype\-directory
+Type 42 T42DESTDIR \-\-type42\-directory
+font map \- \-\-map\-file
+.TE
+.PP
+.B Otftotfm
+will update the
+.I TEXMF/ls-R
+file when installing files under TEXMF. It will also run the
+.M updmap 1
+program after changing a map file, unless the
+.B \-\-no\-updmap
+option was supplied. However, if an executable file called
+.IR TEXMF/dvips/updmap
+exists, this file is executed (from the
+.I TEXMF/dvips
+directory) rather than the global
+.BR updmap .
+This is so you can write a fast, customized version of
+.B updmap
+if desired.
+'
+.SH EXAMPLE
+This section uses MinionPro to show one way to install OpenType fonts for
+LaTeX. We begin with six fonts: "MinionPro-Regular.otf",
+"MinionPro-It.otf", "MinionPro-Semibold.otf", "MinionPro-SemiboldIt.otf",
+"MinionPro-Bold.otf", and "MinionPro-BoldIt.otf".
+.PP
+Our first task is to decide how to encode the fonts. The "encoding scheme"
+is used by TeX to decide how to typeset accents and symbols like "$". The
+"LY1" encoding scheme has reasonable accent support and is a good choice
+for many OpenType fonts. LY1 corresponds to the "texnansx.enc" encoding
+file, so we will supply
+.B otftotfm
+with the "\fB\-e\fR texnansx" option.
+.RS
+.LP
+Expert note: Strictly speaking, LY1 corresponds to the "texnansi.enc"
+encoding file. Since the "texnansx.enc" version omits duplicate
+characters, it has more room for font-specific glyphs and is generally a
+better choice; but if you plan to type characters like "ae" directly into
+your editor, rather than using TeX commands like \eae, you should use
+"texnansi.enc".
+.RE
+.PP
+Next, we decide on a naming scheme for the font metric files. Let's use
+the OpenType font names as a base. (There's generally no need to follow
+the six-character "Karl Berry" naming scheme.) Just in case we come back
+later and add a different encoding scheme, we'll prepend "LY1--" to each
+name.
+.PP
+We're now ready to run
+.B otftotfm
+for the first set of fonts. Note the "\fB\-f\fRkern \fB\-f\fRliga"
+options, which access pair kerns and the default "f" ligatures.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Regular.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-Regular
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-It.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-It
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Semibold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-Semibold
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-SemiboldIt.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-SemiboldIt
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Bold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-Bold
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-BoldIt.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga LY1\-\-MinionPro\-BoldIt
+.fi
+.Sp
+The small-caps fonts are generated with an additional "\fB\-f\fRsmcp"
+option. We append "\-\-fsmcp" to the font metric names as well,
+differentiating them from the regular fonts. Although MinionPro's italic
+fonts support small-caps, the LaTeX font selection scheme can't access them
+easily, so we've left them off.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Regular.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1\-\-MinionPro-Regular\-\-fsmcp
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Semibold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1\-\-MinionPro\-Semibold\-\-fsmcp
+ \fBotftotfm\fR \fB\-a\fR \fB\-e\fR texnansx MinionPro\-Bold.otf \e
+ \fB\-f\fRkern \fB\-f\fRliga \fB\-f\fRsmcp LY1\-\-MinionPro\-Bold\-\-fsmcp
+.fi
+.Sp
+To get old-style numerals, just add the "\fB\-f\fRonum" option to each
+invocation -- and, to reduce confusion, append "\-\-fonum" to the font metric
+names.
+.PP
+At this point, all our font metric files are installed, and it's finally
+time to create the ".fd" file. (The ".fd" format is documented in
+.IR "The LaTeX Companion" .)
+Let's call the LaTeX font family "MinionPro". Then the ".fd" file is
+"LY1MinionPro.fd", and it contains:
+.Sp
+.nf
+ \eDeclareFontFamily{LY1}{MinionPro}{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{n}%
+ { <\-> LY1\-\-MinionPro\-Regular }{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{it}{ <\-> LY1\-\-MinionPro\-It }{}
+ \eDeclareFontShape{LY1}{MinionPro}{m}{sc}%
+ { <\-> LY1\-\-MinionPro\-Regular\-\-fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{n}%
+ { <\-> LY1\-\-MinionPro\-Semibold }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{it}%
+ { <\-> LY1\-\-MinionPro\-SemiboldIt }{}
+ \eDeclareFontShape{LY1}{MinionPro}{sb}{sc}%
+ { <\-> LY1\-\-MinionPro\-Semibold\-\-fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{n}{ <\-> LY1\-\-MinionPro-Bold }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{it}%
+ { <\-> LY1\-\-MinionPro\-BoldIt }{}
+ \eDeclareFontShape{LY1}{MinionPro}{b}{sc}%
+ { <\-> LY1\-\-MinionPro\-Bold\-\-fsmcp }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{n}%
+ { <\-> ssub * MinionPro/b/n }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{it}%
+ { <\-> ssub * MinionPro/b/it }{}
+ \eDeclareFontShape{LY1}{MinionPro}{bx}{sc}%
+ { <\-> ssub * MinionPro/b/sc }{}
+.fi
+.PP
+We're now ready to use MinionPro in LaTeX, with lines like this in the
+document preamble:
+.Sp
+.nf
+ \eusepackage[LY1]{fontenc}
+ \erenewcommand{\ermdefault}{MinionPro}
+ \erenewcommand{\ebfdefault}{b}
+.fi
+.PP
+Of course, we're free at any time to add more MinionPro variants with
+.BR otftotfm ;
+they'll become accessible to LaTeX as soon as we edit the "MinionPro.fd"
+file.
+'
+.SH OPTIONS
+With long options, you need type only as many characters as will make the
+option unique.
+.SS Font Feature and Transformation Options
+.PD 0
+.TP 5
+.BI \-s " script\fR[.\fIlang\fR], " \-\-script= "script\fR[.\fIlang\fR]"
+Apply features suitable to the script system
+.I script
+and language system
+.IR lang .
+Scripts and language systems are two-to-four-letter names assigned by
+Microsoft and Adobe. Examples include "latn" (Latin script), "grek" (Greek
+script), and "yi.YIC" (Yi script with classic characters). If
+.I lang
+is not specified,
+.B otftotfm
+will use the default language system for that
+script. You can give this option multiple times. Run "\fBotfinfo\fR
+\-s \fIfont\fR" to see the list of scripts and languages a
+font supports. Defaults to "latn".
+'
+.Sp
+.TP 5
+.BI \-f " feature\fR, " \-\-feature= "feature"
+Activate the feature named
+.IR feature .
+Features are four-letter names assigned by Microsoft and Adobe; they are
+meant to correspond to font behaviors, such as kerning or small-capitals.
+Examples include "liga" (default ligatures), "dlig" (discretionary
+ligatures), "kern" (kerning), and "c2sc" (replacing capitals with small
+capitals). Give this option multiple times to apply multiple features. Run
+"\fBotfinfo\fR \-f [\-\-script option] \fIfont\fR" to see the list
+of features a font supports for a specified script.
+Defaults to any features required by the selected scripts.
+'
+.Sp
+.TP 5
+.BI \-\-lf " feature\fR, " \-\-letter\-feature= "feature"
+Activate the feature named
+.IR feature ,
+but only for letters. For instance, the "\-f smcp" option will apply the
+small-caps feature to all characters in the encoding; this may result in
+changes to punctuation and numbers as well as letters. The "\-\-lf smcp"
+option will apply the small-caps feature only to letters, meaning
+characters with the "Letter" Unicode property.
+'
+.Sp
+.TP 5
+.BI \-\-subs\-filter " pattern"
+.TP 5
+.BI \-\-include\-subs " pattern"
+.TP 5
+.BI \-\-exclude\-subs " pattern"
+.TP 5
+.BI \-\-clear\-subs
+Limit the characters that
+.B otftotfm
+will substitute. Substitution is allowed on an input character if it
+matches at least one of the
+.B \-\-include
+patterns, and none of the
+.B \-\-exclude
+patterns. Each pattern applies to all following features, except that the
+.B \-\-clear
+option clears any accumulated patterns. The
+.BI \-\-subs\-filter " pattern"
+option acts like
+.B \-\-clear\-subs
+followed by
+.BI \-\-include\-subs " pattern\fR. "
+For pattern syntax, see GLYPH PATTERNS, below.
+.Sp
+In the command line below, the \&'<Number>' pattern will force the "onum"
+feature to substitute only numbers (and not, for example, punctuation).
+The "salt" feature can still substitute any character.
+.nf
+ \fBotftotfm\fR \fB\-f\fRsalt \fB\-\-include\-subs\fR="<Number>" \fB\-f\fRonum \.\.\.
+.fi
+'
+.Sp
+.TP 5
+.BI \-E " fac\fR, " \-\-extend= fac
+Widen, or extend, the font by a factor of
+.IR fac .
+Like
+.M afm2tfm 1 's
+.B \-e
+option.
+'
+.Sp
+.TP 5
+.BI \-S " amt\fR, " \-\-slant= amt
+Oblique, or slant, the font by
+.IR amt .
+Like
+.M afm2tfm 1 's
+.B \-s
+option.
+'
+.Sp
+.TP 5
+.BI \-L " amt\fR, " \-\-letterspacing= amt
+Letterspace each character by
+.IR amt
+units, where 1000 units equals one em. The width of each character
+increases by
+.IR amt ,
+with half the space distributed to each sidebearing. Boundary-character
+kerns are added to maintain alignment at the ends of lines.
+'
+.Sp
+.TP 5
+.BR \-\-math\-spacing "[=\fIskewchar\fR]"
+Ignore the font's claimed character widths, deriving horizontal metrics
+from bounding boxes instead. This results in similar spacing as the
+Computer Modern Math Italic font, with increased sidebearings for letters
+like f and j.
+.Sp
+If you provide
+.IR skewchar ,
+a number between 0 and 255 or a single character, then
+.B otftotfm
+adds heuristically-derived kerns to the font that may improve accent
+positions in math mode. To get the benefits, you must tell TeX about the
+.I skewchar
+with a command like "\eskewchar\efont=\fIskewchar\fR".
+'
+.Sp
+.TP 5
+.BI "\-k " "N\fR, " \-\-min\-kern= N
+Only output kerning pairs whose absolute value is
+.IR N
+or larger. Larger minimum kerns make kerning less precise, but shrink the
+output TFM file. The default minimum kern is 2.0, or 0.002 em.
+'
+.Sp
+.TP 5
+.BI \-\-space\-factor= fac
+Scale the width of the inter-word space by a factor of
+.IR fac .
+'
+.Sp
+.TP 5
+.BI \-\-design\-size= size
+Set the output font's design size to
+.IR size ,
+a value in TeX points. This value is mostly just documentation, since LaTeX
+essentially ignores fonts' design sizes, but plain TeX may occasionally use
+the design size to decide how large a font should be. (Loading a font in
+TeX "at" a particular size effectively ignores the design size; loading a
+font plain or "scaled" by a given factor uses the design size.) The default
+is taken from the input font's optical size feature, or 10pt if it has no
+such feature.
+'
+.Sp
+.TP 5
+.BI \-\-fixed\-width
+Set the font to fixed-width (its space character will have no stretch or
+shrink). Normally you won't need this option; the font will tell
+.B otftotfm
+whether it is fixed width. The opposite of
+.B \-\-fixed\-width
+is
+.BR \-\-proportional\-width .
+'
+.Sp
+.TP 5
+.BI \-\-italic\-angle= angle
+Set the output font's default italic angle to
+.IR angle ,
+a number of degrees. This value is used by TeX to position
+accents. Normally you won't need this option; the font will tell
+.B otftotfm
+its italic angle.
+.PD
+'
+.Sp
+.TP 5
+.BI \-\-x\-height= val
+Set the output font's x-height to
+.IR val .
+This value is used by TeX to position accents. Normally you won't
+need this option.
+.IR Val
+may be a number expressed in font units; \(oqx\(cq, which uses the
+height of the font's lowercase x; or \(oqfont\(cq, which uses the
+font's declared x-height metric.
+'
+.SS Encoding Options
+'
+.PD 0
+.TP 5
+.BI \-e " encoding\fR, " \-\-encoding= encoding
+Select the output metrics's base
+.M dvips 1
+encoding.
+.B Otftotfm
+will search for
+.IR encoding [.enc]
+the same way that
+.B dvips
+would, so you may not need to give a full pathname. Say
+.B \-e \-
+to start with the font's default encoding.
+See ENCODINGS, below,
+for more information.
+'
+.Sp
+.TP 5
+.BI \-\-boundary\-char= char
+Set the font's boundary character to
+.IR char ,
+which should either be a single non-digit character, or a number between \-1
+and 255. The default is taken from the encoding.
+'
+.Sp
+.TP 5
+.BI \-\-altselector\-char= char
+Set the font's alternate selector character to
+.IR char ,
+which should either be a single non-digit character, or a number between
+\&\-1 and 255. Alternate selectors let TeX authors explicitly choose
+between versions of a character. For instance, the
+\&'\-\-altselector\-char="*"' option turns the "*" character into a special
+switch that cycles between alternates. For instance, the TeX input "A"
+would produce the normal version of the "A" Unicode character, "A*" would
+produce the first alternate, "A**" would produce the second alternate, and
+so forth. Furthermore, "s*t" will activate any discretionary "s_t"
+ligature in the font.
+.Sp
+The
+.B \-\-altselector\-char
+mechanism uses the features specified by
+.BR \-\-altselector\-feature
+options.
+.Sp
+The alternate-selector character may also be specified in the encoding; see
+ENCODINGS, below. See Sivan Toledo's article cited in the SEE ALSO section
+for more information.
+'
+.Sp
+.TP 5
+.BI \-\-altselector\-feature= feature
+Activate the feature named
+.I feature
+for the
+.B \-\-altselector\-char
+mechanism. Give this option multiple times to activate multiple
+features. This option activates features only for use with
+.BR \-\-altselector\-char ;
+use the
+.B \-\-feature
+option to activate features globally. Defaults to the
+.I salt
+and
+.I dlig
+features.
+'
+.Sp
+.TP 5
+.BI \-\-alternates\-filter= pattern
+.TP 5
+.BI \-\-include\-alternates= pattern
+.TP 5
+.BI \-\-exclude\-alternates= pattern
+.TP 5
+.BI \-\-clear\-alternates
+Limit the alternate characters that
+.B otftotfm
+will select. An alternate is used if it matches at least one of the
+.B \-\-include
+patterns, and none of the
+.B \-\-exclude
+patterns. Each pattern applies to all following features, except that the
+.B \-\-clear
+option clears any accumulated patterns. The
+.BI \-\-alternates\-filter " pattern"
+option acts like
+.B \-\-clear\-alternates
+followed by
+.BI \-\-include\-alternates " pattern\fR. "
+For pattern syntax, see GLYPH PATTERNS, below.
+.Sp
+OpenType fonts can have many alternates per character, most of which aren't
+interesting. For example, the character "a" in WarnockPro-Regular has five
+alternates, "ordfeminine", "Asmall", "asuperior", "a.end", and
+"orn.013". The
+.B \-\-altselector\-char
+option lets you cycle through these alternates, but it's better to leave
+out the ones you don't want, to avoid overfull encodings. Thus, if you were
+only interested in ".end" variants, you might supply an
+\&'\-\-include\-alternates="*.end"'
+option.
+.Sp
+In the command line below, the \&'*.end' pattern will apply to "aalt"
+alternates, but not to "salt" alternates.
+.nf
+ \fBotftotfm\fR \fB\-f\fRsalt \fB\-\-include\-alternates\fR="*.end" \fB\-f\fRaalt \.\.\.
+.fi
+'
+.Sp
+.TP 5
+.BI \-\-ligkern= command
+Add a LIGKERN
+.IR command
+to the encoding. For example, \&'\fB\-\-ligkern\fR "T {L} h"' suppresses any
+T_h ligature in the font. You can supply multiple
+.B \-\-ligkern
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-position= command
+Add a POSITION
+.IR command
+to the encoding. For example, \&'\fB\-\-position\fR "T 10 0 20"' adds ten
+units of space to either side of the "T" character. You can supply
+multiple
+.B \-\-position
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-unicoding= command
+Add a UNICODING
+.IR command
+to the encoding. For example, \&'\fB\-\-unicoding\fR "pi1 =: uni03D6"' tells
+.B otftotfm
+to encode "/pi1" as U+03D6 GREEK PI SYMBOL. You can supply multiple
+.B \-\-unicoding
+options. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-no\-encoding\-commands
+Ignore any LIGKERN and/or UNICODING commands in the encoding file.
+'
+.Sp
+.TP 5
+.BI \-\-no\-default\-ligkern
+Don't include
+.BR otftotfm 's
+default LIGKERN commands.
+'
+.Sp
+.TP 5
+.BI \-\-coding\-scheme= scheme
+Add a CODINGSCHEME to the encoding. See ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-warn\-missing
+Warn about encoded characters not supported by the font. See the
+WARNMISSING command in ENCODINGS, below.
+'
+.Sp
+.TP 5
+.BI \-\-literal\-encoding= encoding
+Select the
+.M dvips 1
+encoding used for the font. No glyph substitutions will be permitted, so
+the output encoding will equal the input encoding (and
+.B otftotfm
+will not generate an output encoding).
+'
+.Sp
+.TP 5
+.BI \-\-base\-encodings= file
+.B Experts only.
+Allow the output font to refer to existing "base" fonts. This can greatly
+reduce the number of base fonts generated by
+.BR otftotfm ". "
+Each line in the
+.I file
+argument contains a TeX font name (as for
+.BR \-\-name )
+and a corresponding literal encoding file (as for
+.BR \-\-literal\-encoding );
+for example:
+.nf
+ WarnoProReg\-\-eka eka
+ WarnoProReg\-\-exp1 exp1
+.fi
+The named fonts must have been created by prior runs of
+.B otftotfm
+on the same input OpenType font, with the same
+.BR \-\-extend
+and
+.BR \-\-slant
+options as the current run. The current output font will refer to glyphs
+from the named base fonts when possible. If the base fonts cover all
+glyphs required by the output font,
+.B otftotfm
+won't generate any new base fonts at all. The
+.I file
+can also refer to dotless-J fonts using the following syntax:
+.nf
+ WarnoProReg\-\-lcdfj \- dotlessj
+.fi
+'
+.PD
+'
+'
+.SS Automatic Mode Options
+'
+.PD 0
+.TP 5
+.BI \-a "\fR, " \-\-automatic
+Select automatic mode.
+'
+.Sp
+.TP 5
+.BI \-v " vendor\fR, " \-\-vendor= vendor
+Set the font vendor name, which is used to locate files within the TDS.
+Defaults to "lcdftools".
+.Sp
+In automatic mode, TeX and friends will generally find required font files
+independently of the vendor you select.
+'
+.Sp
+.TP 5
+.BI \-\-typeface= typeface
+Set the font typeface name, which is used to locate files within the TDS.
+Defaults to the current font's family name with unsuiable characters
+removed.
+'
+.Sp
+.TP 5
+.BI \-\-no\-type1
+Do not use
+.M cfftot1 1
+to create Type 1 fonts corresponding to the OpenType input fonts.
+'
+.Sp
+.TP 5
+.BI \-\-no\-dotlessj
+Do not use
+.M t1dotlessj 1
+to create a special dotless-j font when the input font doesn't have
+dotless-j.
+'
+.Sp
+.TP 5
+.BI \-\-no\-truetype
+Do not install TrueType-flavored fonts.
+'
+.Sp
+.TP 5
+.BI \-\-type42
+Install TrueType-flavored fonts in translated Type 42 format.
+'
+.Sp
+.TP 5
+.BI \-\-no\-updmap
+Do not run an
+.M updmap 1
+program. This can be useful if you're installing a bunch of fonts; it is
+much faster to run
+.B updmap
+once, at the end, than to run it once per font.
+.PD
+'
+'
+.SS Output Options
+.PD 0
+.TP 5
+.BI \-n " texname\fR, " \-\-name= texname
+Set the TeX name of the output font, which is used in font map files and,
+in automatic mode, to generate the output filename. The default is derived
+from the OpenType font's name and the features you selected.
+'
+.Sp
+.TP 5
+.BI \-p "\fR, " \-\-pl
+Output human-readable PL and VPL metrics, not binary TFM and VF metrics.
+Note:
+.BR Otftotfm 's
+PL and VPL output files are legal, but the
+.B fontinst
+program may not accept them (it has a picky parser). Make sure to supply a
+.BR \-\-coding\-scheme ;
+if that doesn't help, run the TFM output through
+.M tftopl 1 .
+'
+.Sp
+.TP 5
+.BI \-\-no\-virtual
+Do not generate virtual fonts (VFs and VPLs).
+.B Otftotfm
+will warn if the selected font features cannot be implemented without
+virtual fonts.
+'
+.Sp
+.TP 5
+.BI \-\-no\-encoding
+Do not generate an encoding file.
+'
+.Sp
+.TP 5
+.BR \-\-output\-encoding [=\fIfile\fR]
+Only generate an encoding file; do not generate any other output. The
+encoding file is written to
+.IR file ,
+or to standard output if no
+.I file
+argument is supplied.
+'
+.Sp
+.TP 5
+.BI \-\-no\-map
+Do not generate a font map line for the font.
+'
+.\" .Sp
+.\" .TP 5
+.\" .BI \-\-base\-name name
+.\" Experts only: Set the TeX name of the "base" output font. When
+.\" .B otftotfm
+.\" needs to make a virtual font (because of font features and/or
+.\" letterspacing), it must generate at least two TFM metrics files, one for
+.\" the base font and one for the virtual font. In some cases, multiple
+.\" virtual fonts can share the same base metrics, reducing the number of
+.\" installed metrics files. This option lets you explicitly set the name of
+.\" the base output font independently from the main output font, and thus
+.\" force fonts to share base metrics. The default base name is derived from
+.\" the TeX name, with "\f(CW\-\-base\fR" appended.
+.PD
+'
+'
+.SS File Location Options
+.PD 0
+.TP 5
+.BI \-\-tfm\-directory= dir
+.TP 5
+.BI \-\-pl\-directory= dir
+.TP 5
+.BI \-\-vf\-directory= dir
+.TP 5
+.BI \-\-vpl\-directory= dir
+.TP 5
+.BI \-\-encoding\-directory= dir
+.TP 5
+.BI \-\-type1\-directory= dir
+.TP 5
+.BI \-\-truetype\-directory= dir
+.TP 5
+.BI \-\-type42\-directory= dir
+.TP 5
+.BI \-\-directory= dir
+Set the directory used for various output types. Each directory may be set
+by an environment variable, and defaults to a TDS directory in automatic
+mode, or to "." otherwise. Environment variable names and default TDS
+locations are described in the Automatic Mode section above. The
+.B \-\-directory
+option sets the default directory for all output types.
+'
+.Sp
+.TP 5
+.BI \-\-map\-file= filename
+Set file in which
+.B otftotfm
+will write a font map
+line for the font. The default is the standard output in manual mode, and
+"TEXMF/fonts/map/dvips/\fIvendor\fR/\fIvendor\fR.map" (or
+"TEXMF/dvips/\fIvendor\fR/\fIvendor\fR.map" on older installations) in
+automatic mode.
+.PD
+'
+'
+.SS Miscellaneous Options
+.PD 0
+.TP 5
+.BI \-\-glyphlist= file
+Use
+.I file
+as a Adobe glyph list, which helps translate glyph names to Unicode code
+points. Give multiple options to include multiple files.
+See ENCODINGS, below, for more information.
+'
+.Sp
+.TP 5
+.BR \-V ", " \-\-verbose
+Write progress messages to standard error.
+'
+.Sp
+.TP 5
+.BR \-\-no\-create
+Do not create or modify any files. Instead, write messages about the
+program's hypothetical progress to standard error.
+'
+.Sp
+.TP 5
+.BR \-\-force
+Generate all files, even if it looks like versions are already installed.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BI \-\-kpathsea\-debug= flags
+Set path searching debugging flags. See the
+.I Kpathsea
+manual for details.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH ENCODINGS
+.B Otftotfm
+interprets encoding files as Unicode. For example, say an input encoding
+has "/dotlessi" at position 10.
+.B Otftotfm
+detects that position 10 should contain Unicode character U+0131 LATIN
+SMALL LETTER DOTLESS I, and uses the font's glyph for that character
+(possibly modified by any active features). The selected glyph might not
+be named "dotlessi"; only the Unicode value matters.
+.PP
+.B Otftotfm
+assigns Unicode values to glyph names using a table published by Adobe (SEE
+ALSO has a reference), with extensions for TeX. For more fine-grained
+control, add UNICODING commands to the input encoding file. These commands
+have the following format:
+.nf
+ % UNICODING \fIglyph\fR =: \fIchoice1\fR [\fIchoice2\fR ...] ;
+.fi
+This tells
+.B otftotfm
+that the glyph named
+.I glyph
+translates into the first Unicode value in the
+.I choice
+list that has a character in the font. \fIGlyph\fR and the
+.IR choice s
+are PostScript glyph names; the initial "%" sign is required; and each
+UNICODING line can contain multiple commands, separated by spaced
+semicolons. For example,
+.nf
+ % UNICODING pi1 =: uni03D6 ;
+.fi
+encodes the character "/pi1" as U+03D6 GREEK PI SYMBOL,
+and
+.nf
+ % UNICODING Delta =: uni0394 uni2206 ;
+.fi
+makes U+0394 GREEK CAPITAL LETTER DELTA preferred to
+U+2206 INCREMENT as an encoding for "/Delta". You can also supply
+glyph names:
+.nf
+ % UNICODING Delta =: Deltagreek Delta ;
+.fi
+A mapping with no Unicode values removes that glyph from the input
+encoding. For instance, this erases any f-ligature characters from the
+encoding:
+.nf
+ % UNICODING ff =: ; fi =: ; fl =: ; ffi =: ; ffl =: ;
+.fi
+The slots are available for
+.BR otftfm 's
+own use, for example for other characters required by the font. (If the
+f-ligatures themselves are required by the font, for instance by a \&'liga'
+feature, then they will be stored into their old slots when possible.) Map
+a glyph to \&'emptyslot' if you don't want
+.B otftotfm
+to use the slot. For example, this will leave the \&'ff' slot unused if
+the font has no \&'ff' glyph:
+.nf
+ % UNICODING ff =: ff emptyslot ;
+.fi
+(Note that most OpenType fonts provide a visible representation for unused
+encoding slots, namely a box with an X inside.)
+.PP
+LIGKERN comments in the encoding can add ligatures and inhibit kerns, as in
+.M afm2tfm 1 .
+To add a ligature, say:
+.nf
+ % LIGKERN \fIglyph1\fR \fIglyph2\fR =: \fIresult\fR ;
+.fi
+The "=:" operator indicates a normal ligature, where both the input glyphs
+are removed and replaced by
+.IR result .
+To preserve the left-hand glyph, for an effect like "\fIglyph1\fR
+\fIglyph2\fR =: \fIglyph1\fR \fIresult\fR", use "|=:" instead; to preserve
+the right-hand glyph, use "=:|".
+.\" The other five ligature operators are not yet supported.
+To remove all kerns between two characters, say:
+.nf
+ % LIGKERN \fIglyph1\fR {} \fIglyph2\fR ;
+.fi
+A "*" matches any character, so
+.nf
+ % LIGKERN a {} * ;
+.fi
+removes all kerns with "a" as the left-hand character, and
+.nf
+ % LIGKERN * {} * ;
+.fi
+removes all kerns.
+.PP
+.B Otftotfm
+also supports extended syntax for setting kern values and inhibiting
+ligatures. To add an \fIn\fR-unit kern between two glyphs, say:
+.nf
+ % LIGKERNX \fIglyph1\fR {\fIn\fR} \fIglyph2\fR ;
+.fi
+where \fIn\fR is an integer. This:
+.nf
+ % LIGKERNX \fIglyph1\fR {L} \fIglyph2\fR ;
+.fi
+inhibits any ligature between
+.I glyph1
+and
+.IR glyph2 .
+"{LK}" and "{KL}" inhibit both ligatures and kerns.
+.PP
+You can set the
+.B \-\-boundary\-char
+and
+.B \-\-altselector\-char
+from an encoding file with commands like this:
+.nf
+ % LIGKERN || = \fIboundarychar\fR ;
+ % LIGKERNX ^^ = \fIaltselectorchar\fR ;
+.fi
+As with UNICODING, each LIGKERN or LIGKERNX line can contain multiple
+commands, separated by spaced semicolons.
+.PP
+.B Otftotfm
+has a default set of eight ligatures, namely:
+.nf
+ space l =: lslash ; space L =: Lslash ;
+ question quoteleft =: questiondown ; exclam quoteleft =: exclamdown ;
+ hyphen hyphen =: endash ; endash hyphen =: emdash ;
+ quoteleft quoteleft =: quotedblleft ;
+ quoteright quoteright =: quotedblright
+.fi
+LIGKERN commands in the encoding file and
+.B \-\-ligkern
+options can override these defaults, or supply the
+.B \-\-no\-default\-ligkern
+option to turn them off.
+.PP
+The POSITION command shifts a glyph within its bounding box. The syntax is
+.nf
+ % POSITION \fIglyph\fR \fIpdx\fR \fIpdy\fR \fIadx\fR ;
+.fi
+This will add
+.I pdx
+units of space to
+.IR glyph 's
+left edge; raise it up by
+.I pdy
+units; and add
+.I adx
+units to its width. For example, to add 10 units of space to either side
+of the "T" glyph, supply
+.nf
+ % POSITION T 10 0 20
+.fi
+To move the "degree" symbol up by 20 units, supply
+.nf
+ % POSITION degree 0 20 0
+.fi
+.PP
+The CODINGSCHEME command specifies the coding scheme for fonts using this
+encoding. This is a string, less than 40 characters long and containing no
+parentheses, that classifies the encoding for TeX's purposes. Sample
+coding schemes include "TEX TEXT", "TEX MATH ITALIC", and "EXTENDED TEX
+FONT ENCODING - LATIN". For example:
+.nf
+ % CODINGSCHEME EXTENDED TEX FONT ENCODING - LATIN
+.fi
+Most tools ignore the coding scheme; fontinst is an exception.
+.B Otftotfm
+uses the encoding's PostScript name for the default coding scheme.
+.PP
+Finally, the WARNMISSING command makes any glyphs not supported by the
+input font appear as black boxes. The
+.M dvips 1
+processor will also print a warning when encountering these glyphs. For
+example:
+.nf
+ % WARNMISSING yes
+.fi
+.PP
+The
+.BR \-\-unicoding ,
+.BR \-\-ligkern ,
+.BR \-\-position ,
+.BR \-\-coding\-scheme ,
+and
+.B \-\-warn\-missing
+options add UNICODING, LIGKERN/LIGKERNX, POSITION, CODINGSCHEME, and
+WARNMISSING commands to an encoding, and can override commands in the
+encoding itself. Some common encoding files have commands that are
+inappropriate for OpenType fonts; for example, "t1.enc" hard-codes
+f-ligatures, which can cause problems with small-cap fonts. Supply the
+.B \-\-no\-encoding\-commands
+option to ignore all commands from the encoding file. Commands from
+options like
+.B \-\-ligkern
+are processed in any case.
+'
+.SS New Glyphs
+.PP
+New glyphs, such as ligatures and contextual substitutions, are added to
+the encoding in any empty spaces, using their original locations when
+possible. If the encoding doesn't have enough space for all new glyphs,
+shorter ligatures composed of unaccented letters get precedence.
+'
+.SS Synthetic Glyphs
+.PP
+.B Otftotfm
+can synthesize some glyphs using virtual font manipulations, if a required
+glyph is not available in the input font. Specifically, it will synthesize:
+.Sp
+.PD 0
+.TP 22
+cwm
+TeX's compound word mark (a zero-width "strut" rule with height equal to the font's x-height)
+.TP
+ascendercompwordmark
+"cwm" with height equal to the font's ascenders
+.TP
+capitalcompwordmark
+"cwm" with height equal to the font's capitals
+.TP
+visualspace
+A square cup used to represent spaces
+.TP
+dotlessj
+A dotless "j", synthesized with
+.M t1dotlessj 1
+.TP
+dblbracketleft
+Kerned version of "[["
+.TP
+dblbracketright
+Kerned version of "]]"
+.TP
+bardbl
+The parallel symbol "||"
+.TP
+asteriskmath
+Vertically-centered "*"
+.TP
+ringfitted
+Ring accent centered on the width of "A"
+.TP
+twelveudash
+2/3-em-wide dash
+.TP
+threequartersemdash
+3/4-em-wide dash
+.TP
+centigrade
+"(degrees)C"
+.TP
+interrobang
+Combined "?!" symbol
+.TP
+interrobangdown
+Inverted interrobang
+.TP
+pertenthousand
+Per-ten-thousand sign (% with two extra 0s)
+.TP
+IJ
+"IJ" ligature
+.TP
+ij
+"ij" ligature
+.TP
+Germandbls
+"SS" (a capital sharp-s)
+.TP
+SSsmall
+Small-capital version of "SS"
+.TP
+FFsmall
+Small-capital version of "FF"
+.TP
+FIsmall
+Small-capital version of "FI"
+.TP
+FLsmall
+Small-capital version of "FL"
+.TP
+FFIsmall
+Small-capital version of "FFI"
+.TP
+FFLsmall
+Small-capital version of "FFL"
+.PD
+'
+'
+.SH "GLYPH PATTERNS"
+.LP
+The
+.BR \-\-include\-subs
+and
+.BR \-\-include\-alternates
+options, and their
+.B \-\-exclude
+and
+.B \-\-*\-filter
+variants, accept the following types of pattern.
+.Bp
+Glyph names. Example: "Aacute". For PostScript-flavored fonts, use
+.M otfinfo 1 's
+.B \-g
+option to see a font's glyph names, and "\fBcfftot1\fR \fIfont\fR.otf |
+\fBt1testpage\fR" to generate a PostScript file showing each glyph.
+.Bp
+Glyph name patterns using the shell-style glob-matching rules: "*" matches
+any number of characters, "?" matches any single character, and "[...]"
+matches any character in a set. Example: "*.end".
+.Bp
+Unicode category properties in angle brackets. Examples: "<Letter>",
+"<UppercaseLetter>", "<Lu>". The complete list of both short and long
+names: Letter/L, UppercaseLetter/Lu, LowercaseLetter/Ll,
+TitlecaseLetter/Lt, ModifierLetter/Lm, OtherLetter/Lo; Number/N,
+DecimalNumber/Nd, LetterNumber/Nl, OtherNumber/No; Punctuation/P,
+ConnectorPunctuation/Pc, DashPunctuation/Pd, OpenPunctuation/Ps,
+ClosePunctuation/Pe, InitialPunctuation/Pi, FinalPunctuation/Pf,
+OtherPunctuation/Po; Symbol/S, MathSymbol/Sm, CurrencySymbol/Sc,
+ModifierSymbol/Sk, OtherSymbol/So; Mark/M, SpacingMark/Mc,
+EnclosingMark/Me, NonspacingMark/Mn; Separator/Z, SpaceSeparator/Zs,
+LineSeparator/Zl, ParagraphSeparator/Zp; Other/C, Surrogate/Cs, Format/Cf,
+Control/Cc, PrivateUse/Co, Unassigned/Cn. Category values current as of
+Unicode 4.0.
+.Bp
+Unicode ranges. Example: "U+007f-U+008C".
+.PP
+The "!" prefix negates a pattern, and you can separate multiple patterns by
+spaces.
+'
+.SH "FEATURE DIRECTORY"
+.LP
+This section lists features common to Western OpenType fonts and describes
+how
+.B otftotfm
+handles them for common fonts. Please send the author mail if
+.B otftotfm
+does not handle a feature you need, or you believe it handles some feature
+incorrectly.
+.Sp
+.PD 0
+.TP 5
+.IR aalt ", Access All Alternates"
+Lets the user choose between all available alternate forms for a character.
+This includes things like superscript and subscript variants, different
+styles (swash, for example), and even ornaments. The
+.BR \-\-altselector\-feature= aalt
+option can help an
+.BR \-\-altselector\-char
+provide useful access to alternates, but the
+.I aalt
+feature isn't usually useful on its own. Try the
+.IR salt " and " calt
+features instead.
+.TP 5
+.IR c2sc ", Small Capitals From Capitals"
+Replaces capital letters with small capitals: a sort of converse of the
+more conventional
+.I smcp
+feature, which replaces lower-case letters with small capitals. Supported.
+.TP 5
+.IR calt ", Contextual Alternates"
+Lets the user choose between context-appropriate swash forms for each
+character. For example, given the word "DREW" in a cursive typeface, the "R
+E W" might be translated to calmer forms than the initial "D". There may be
+more than one choice for a given letter, in which case the user should be
+able to select among them. TeX can't support complex contextual alternates,
+or alternate selection, but
+.B otftotfm
+supports some fonts quite well. The input encoding should have lots of
+empty space for variants, and it should specify a boundary character. See
+also
+.IR cswh .
+.TP 5
+.IR case ", Case-Sensitive Forms"
+Shifts punctuation marks up to a position that works well with
+all-capital-letter sequences. For example, the hyphen character, which
+generally centers vertically on the x-height, is raised up to center
+vertically on a capital letter. Also replaces text figures with lining
+figures, and accent marks with forms more appropriate for capitals.
+Supported.
+.TP 5
+.IR cpsp ", Capital Spacing"
+Adds a bit of space on either side of each capital letter. Supported.
+(However, the OpenType tag registry suggests that
+.I cpsp
+be on by default, but applying to all-caps text only; TeX cannot easily
+implement that contextual intelligence.)
+.TP 5
+.IR cswh ", Contextual Swash"
+Lets the user choose between context-appropriate swash forms for each
+character. For example, in the words "Ab AC", the first "A" might be
+translated to a swash form, while the second might not. There may be more
+than one choice for a given letter, in which case the user should be able
+to select among them.
+.B Otftotfm
+supports some fonts quite well. The input encoding should have lots of
+empty space for swash variants, and it should specify a boundary
+character. See also
+.IR calt " and " swsh .
+.TP 5
+.IR dlig ", Discretionary Ligatures"
+Activates uncommon ligatures, such as "c_t", "s_p", and "s_t". Supported.
+.TP 5
+.IR dnom ", Denominators"
+Replaces digits and some punctuation marks with smaller forms sitting on
+the baseline, intended for fraction denominators. Supported.
+.TP 5
+.IR fina ", Terminal Forms"
+Substitutes appropriate forms for letters occurring at the ends of words.
+This feature doesn't select swash variants; it's intended for normal use,
+and the specification recommends that it be on by default. Partially
+supported: TeX will only treat spaces as the ends of words, where a correct
+implementation would probably include punctuation too. See
+.IR cswh
+for selecting swash variants active at the ends of words.
+.TP 5
+.IR frac ", Fractions"
+Replaces simple sequences like "1/2" with nice-looking fractions.
+Supported, but beware: many fonts will translate "11/32" into "1" + "1/3" +
+"2".
+.TP 5
+.IR hist ", Historical Forms"
+Replaces characters with historical variants. Usually, this means at least
+translating regular "s" to long "s". Supported.
+.TP 5
+.IR kern ", Kerning"
+Adjusts the space between characters (pair kerning). Generally supported,
+and you should probably turn it on. As a special case, "\fB\-f\fRkern" can
+also read kerning information from the "kern" table in conventional
+TrueType fonts.
+.TP 5
+.IR liga ", Standard Ligatures"
+Activates common ligatures, such as "f_f", "f_i", "f_f_j", and (in some
+Adobe fonts) "T_h". Generally supported, and you should probably turn it
+on.
+.TP 5
+.IR lnum ", Lining Figures"
+Uses lining figures, the set of digits that are all about as high as
+capital letters.
+Supported. Compare
+.IR onum ;
+see also
+.IR pnum
+and
+.IR tnum.
+.TP 5
+.IR numr ", Numerators"
+Replaces digits and some punctuation marks with smaller, raised forms
+intended for fraction numerators. Supported, but not usually useful.
+.TP 5
+.IR onum ", Oldstyle Figures"
+Uses old-style figures, also known as text figures. This is the set of
+digits that have ascenders and descenders like lower-case letters.
+Supported. Compare
+.IR lnum ;
+see also
+.IR pnum
+and
+.IR tnum .
+.TP 5
+.IR ordn ", Ordinals"
+Designed for Spanish and French. Replaces ordinal numbers, such as "2.o",
+with forms where the "o" is raised, and replaces the sequence "No" with an
+integrated glyph. Supported.
+.TP 5
+.IR ornm ", Ornaments"
+Replaces some alphabetic characters in the font with ornaments, and links
+the bullet character to a set of all bullet-like ornaments, from which the
+user can choose. Partially supported: TeX can handle alphabetic
+substitutions, but not bullet choice.
+.TP 5
+.IR pnum ", Proportional Figures"
+Digits will have different widths. Supported. Compare
+.IR tnum ;
+see also
+.IR lnum
+and
+.IR onum.
+.TP 5
+.IR salt ", Stylistic Alternates"
+Lets the user choose between stylistic alternate forms for a character.
+The
+.BR \-\-altselector\-char
+mechanism provides useful access to this feature. If you turn on
+.IR salt
+globally,
+.B otftotfm
+takes the first alternate form whenever there's more than one choice. See
+also
+.IR aalt
+and
+.IR ss01 ;
+.IR salt
+is generally more useful than
+.IR aalt
+for TeX, since it refers exclusively to stylistic alternates.
+.TP 5
+.IR sinf ", Scientific Inferiors"
+Replaces digits and some punctuation marks with smaller, lowered forms
+intended for subscripts. Supported. Compare
+.IR subs .
+.TP 5
+.IR size ", Optical Size"
+This feature stores information about the range of optical sizes for which
+the font was intended. There is no point in selecting it with
+.BR otftotfm ,
+since it should not change the font's appearance in any way.
+.TP 5
+.IR smcp ", Small Capitals"
+Replaces lower-case letters with small capitals. Supported. Compare
+.IR c2sc .
+.TP 5
+.IR ss01 - ss20 ", Stylistic Sets 1-20"
+Replaces characters with a uniform set of stylistic alternates. Differs
+from features like
+.I salt
+in that a Stylistic Set is uniform: an
+.I ssXX
+feature should never involve selection from a set of possible alternate
+characters. Supported.
+.TP 5
+.IR subs ", Subscript"
+Replaces characters with smaller, lowered forms intended for subscripts.
+Supported. Compare
+.IR sinf ;
+some fonts support
+.I sinf
+but not
+.IR subs .
+.TP 5
+.IR sups ", Superscript"
+Replaces digits, some punctuation marks, and some lower-case letters with
+smaller, raised forms intended for superscripts. Supported.
+.TP 5
+.IR swsh ", Swash"
+Activates all swash forms for each character. There may be more than one
+swash form, in which case
+.B otftotfm
+will pick the first one listed. Supported, except that swash variants
+other than the first are inaccessible. Note that some fonts with swash
+variants support the
+.I cswh
+feature exclusively.
+.TP 5
+.IR tnum ", Tabular Figures"
+All digits will have the same width, so that tables and the like will align
+visually. Supported. Compare
+.IR pnum ;
+see also
+.IR lnum
+and
+.IR onum.
+.TP 5
+.IR zero ", Slashed Zero"
+Replaces the zero character with a slashed zero. Supported.
+.PD
+'
+.SH "DIAGNOSTICS AND TROUBLESHOOTING"
+'
+.TP 5
+no writable directory found in $TEXMF
+'
+.B Otftotfm
+could not find a writable directory in your $TEXMFVAR or $TEXMF path. Did
+you create a
+.I $HOME/.texmf-var
+or
+.I $HOME/texmf
+directory? If so, run the command "kpsewhich \-\-expand\-path='$TEXMF'" to
+verify that directory is not being found. You may need to set your TEXMF
+environment variable, to \&'{!!'"$HOME"'/texmf,!!$TEXMFMAIN}', for instance
+(note the different kinds of quotes; on my machine, this expands to
+\&'{!!/home/kohler/texmf,!!$TEXMFMAIN}').
+'
+.TP 5
+\&'\fIchar\fR' has no encoding, ignoring kern removal
+.PD 0
+.TP 5
+(or ligature removal, lig/kern removal, or ligature)
+.PD
+'
+These messages indicate a slight problem with your encoding file: one of
+the LIGKERN commands referred to a character not present in the encoding.
+This might be due to a misspelling in the LIGKERN command or the encoding
+file, or it might be an oversight. Either fix the encoding file or ignore
+the warning.
+'
+.TP 5
+can't map \&'\fIchar\fR' to Unicode
+'
+Another encoding file problem: One of the glyph names in an UNICODING block
+could not be converted to Unicode. This is problematic since UNICODING
+exists wholly to translate glyph names into Unicode. Fix the encoding file
+or ignore the warning.
+'
+.TP 5
+not enough room in encoding, ignoring \fIN\fR glyph(s) ...
+'
+There wasn't space in the encoding for all the glyphs referred to by the
+features you selected. For example, maybe the font had more ligatures than
+there were empty slots in the encoding. Fix this warning by selecting fewer
+features, or by using an encoding with more empty slots, such as the 7t.enc
+encoding distributed with
+.BR otftotfm .
+'
+.TP 5
+The \&'\fB\-a\fR' option did not install my font correctly.
+'
+Try again with the \&'\fB\-\-verbose\fR' option, which causes
+.BR otftotfm
+to explain its behavior. Note that by default,
+.BR otftotfm
+will not re-install files already present in your system's TeX search paths
+(in the current directory, for instance). Use \&'\fB\-\-force\fR' to
+override this behavior.
+'
+.SH "FREQUENTLY ASKED QUESTIONS"
+.TP 5
+How can I get a small-caps "SS" in place of the German sharp-S?
+'
+Supply the option \&'\fB\-\-unicoding\fR "germandbls =: SSsmall"'.
+'
+.TP 5
+How can I prevent f-ligatures from forming in a small-caps font?
+'
+This should happen automatically, but some overzealous encoding files add
+f-ligatures even when the font doesn't request them. Try the
+"\fB\-\-no\-encoding\-commands\fR" option if this is a problem for you.
+'
+.TP 5
+\fBOtftotfm\fR seems to take a long time.
+'
+Use the
+.B \-V
+option to see what it's doing. Often the culprit is the
+.M updmap 1
+program; if you're planning to run
+.B otftotfm
+multiple times, give it the
+.B \-\-no\-updmap
+option and run
+.B updmap
+manually when you're done.
+'
+.TP 5
+How can I refer to the different forms of phi?
+'
+\fBOtftotfm\fR follows TeX practice and widely-distributed TeX encoding
+vectors, so "/phi" in an input encoding vector should map to a "straight"
+phi and "/phi1" should map to a "loopy" phi. Note that TeX practice
+differs from the PostScript standard naming conventions, in which "/phi" is
+"loopy" and "/phi1" is "straight"; this means that \fBotftotfm\fR may map
+"/phi" in an input encoding vector to a font's "/phi1" glyph, and vice
+versa. Perhaps most unambiguously, you can use "/uni03D5" for the
+"straight" form and "/uni03C6" for the "loopy" form.
+'
+.TP 5
+How can I get lining figures (that is, normal line-height digits) with small caps ('\fB\-f\fRsmcp')?
+'
+Many fonts use old-style figures by default with small caps. Since the
+default is not specified, it's wise to explicitly supply \&'\fB\-f\fRlnum' or
+\&'\fB-f\fRonum'.
+'
+.SH "BUGS"
+.\" .LP
+.\" Presumably some context-sensitive positionings and ligatures could be
+.\" implemented with TeX's boundary character, but
+.\" .B otftotfm
+.\" doesn't do that yet.
+.LP
+See the documentation for
+.B \-\-pl
+above if you have problems running
+.BR otftotfm 's
+output through
+.BR fontinst .
+'
+.SH "SEE ALSO"
+.LP
+.M pltotf 1 ,
+.M tftopl 1 ,
+.M vptovf 1 ,
+.M afm2tfm 1 ,
+.M dvips 1 ,
+.M cfftot1 1 ,
+.M otfinfo 1 ,
+.M t1dotlessj 1 ,
+.M t1testpage 1 ,
+.M ttftotype42 1 ,
+.M kpsewhich 1 ,
+.M updmap 1
+.LP
+.I "Adobe Type 1 Font Format"
+.LP
+Adobe Technical Notes #5176,
+.IR "The Compact Font Format Specification" ,
+and #5177,
+.I "The Type 2 Charstring Format"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+.LP
+.IR "A Directory Structure for TeX Files" ,
+http://www.tug.org/tds/
+.LP
+.IR "Kpathsea: A library for path searching" ,
+http://www.tug.org/kpathsea/
+.LP
+Sivan Toledo,
+.IR "Exploiting Rich Fonts" ,
+TUGboat 21(2), 2000,
+http://www.tug.org/TUGboat/Articles/tb21-2/tb67tole.pdf
+.LP
+Michel Goossens, Frank Mittelbach, and Alexander Samarin,
+.IR "The LaTeX Companion"
+(for information on the .fd file format)
+.LP
+Adobe Systems, "Unicode and Glyph Names". Refers to the glyphlist.txt file
+used to translate glyph names to Unicode code points.
+http://partners.adobe.com/public/developer/opentype/index_glyph.html
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
+.PP
+Thanks to Karl Berry, Marco Kuhlmann, Adam Lindsay, Bruce D'Arcus, Thomas
+Esser, Claire Connelly, Nelson H.F. Beebe, and Ryuji Suzuki for
+suggestions, bug reports, and help. Particular thanks to Achim Blumensath
+and Michael Zedler for suggestions and patches, some of them extensive.
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc
new file mode 100644
index 00000000000..913e4cb68e4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.cc
@@ -0,0 +1,2449 @@
+/* otftotfm.cc -- driver for translating OpenType fonts to TeX metrics
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifdef WIN32
+# define _USE_MATH_DEFINES
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1bounds.hh>
+#include <efont/otfcmap.hh>
+#include <efont/otfname.hh>
+#include <efont/otfgsub.hh>
+#include <efont/ttfkern.hh>
+#include "glyphfilter.hh"
+#include "metrics.hh"
+#include "dvipsencoding.hh"
+#include "automatic.hh"
+#include "secondary.hh"
+#include "kpseinterface.h"
+#include "util.hh"
+#include "otftotfm.hh"
+#include <lcdf/md5.h>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/hashmap.hh>
+#include <lcdf/straccum.hh>
+#include <efont/cff.hh>
+#include <efont/otf.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+#include <algorithm>
+#include <math.h>
+/* M_PI isn't defined in C99 */
+#ifndef M_PI
+# define M_PI 3.14159265358979323846264338327
+#endif
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#ifdef _MSC_VER
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUERY_SCRIPTS_OPT 303
+#define QUERY_FEATURES_OPT 304
+#define KPATHSEA_DEBUG_OPT 305
+
+#define SCRIPT_OPT 311
+#define FEATURE_OPT 312
+#define ENCODING_OPT 313
+#define LITERAL_ENCODING_OPT 314
+#define EXTEND_OPT 315
+#define SLANT_OPT 316
+#define LETTERSPACE_OPT 317
+#define LIGKERN_OPT 318
+#define CODINGSCHEME_OPT 319
+#define UNICODING_OPT 320
+#define BOUNDARY_CHAR_OPT 321
+#define DESIGN_SIZE_OPT 322
+#define MINIMUM_KERN_OPT 323
+#define ALTSELECTOR_CHAR_OPT 324
+#define INCLUDE_ALTERNATES_OPT 325
+#define EXCLUDE_ALTERNATES_OPT 326
+#define CLEAR_ALTERNATES_OPT 327
+#define ALTSELECTOR_FEATURE_OPT 328
+#define DEFAULT_LIGKERN_OPT 329
+#define NO_ECOMMAND_OPT 330
+#define LETTER_FEATURE_OPT 331
+#define INCLUDE_SUBS_OPT 332
+#define EXCLUDE_SUBS_OPT 333
+#define CLEAR_SUBS_OPT 334
+#define SUBS_FILTER_OPT 335
+#define ALTERNATES_FILTER_OPT 336
+#define SPACE_FACTOR_OPT 337
+#define MATH_SPACING_OPT 338
+#define POSITION_OPT 339
+#define WARN_MISSING_OPT 340
+#define BASE_ENCODINGS_OPT 341
+#define FIXED_PITCH_OPT 342
+#define ITALIC_ANGLE_OPT 343
+#define PROPORTIONAL_WIDTH_OPT 344
+#define X_HEIGHT_OPT 345
+
+#define AUTOMATIC_OPT 350
+#define FONT_NAME_OPT 351
+#define QUIET_OPT 352
+#define GLYPHLIST_OPT 353
+#define VENDOR_OPT 354
+#define TYPEFACE_OPT 355
+#define NOCREATE_OPT 356
+#define VERBOSE_OPT 357
+#define FORCE_OPT 358
+
+#define VIRTUAL_OPT 360
+#define PL_OPT 361
+#define TFM_OPT 362
+#define MAP_FILE_OPT 363
+#define OUTPUT_ENCODING_OPT 364
+
+#define DIR_OPTS 380
+#define ENCODING_DIR_OPT (DIR_OPTS + O_ENCODING)
+#define TFM_DIR_OPT (DIR_OPTS + O_TFM)
+#define PL_DIR_OPT (DIR_OPTS + O_PL)
+#define VF_DIR_OPT (DIR_OPTS + O_VF)
+#define VPL_DIR_OPT (DIR_OPTS + O_VPL)
+#define TYPE1_DIR_OPT (DIR_OPTS + O_TYPE1)
+#define TYPE42_DIR_OPT (DIR_OPTS + O_TYPE42)
+#define TRUETYPE_DIR_OPT (DIR_OPTS + O_TRUETYPE)
+#define DIR_OPT (DIR_OPTS + NUMODIR)
+
+#define NO_OUTPUT_OPTS 400
+#define NO_ENCODING_OPT (NO_OUTPUT_OPTS + G_ENCODING)
+#define NO_TYPE1_OPT (NO_OUTPUT_OPTS + G_TYPE1)
+#define NO_DOTLESSJ_OPT (NO_OUTPUT_OPTS + G_DOTLESSJ)
+#define NO_UPDMAP_OPT (NO_OUTPUT_OPTS + G_UPDMAP)
+#define UPDMAP_SYS_OPT (NO_OUTPUT_OPTS + G_UPDMAP_USER)
+
+#define YES_OUTPUT_OPTS 2000
+#define TRUETYPE_OPT (YES_OUTPUT_OPTS + G_TRUETYPE)
+#define TYPE42_OPT (YES_OUTPUT_OPTS + G_TYPE42)
+#define UPDMAP_USER_OPT (YES_OUTPUT_OPTS + G_UPDMAP_USER)
+
+#define CHAR_OPTTYPE (Clp_ValFirstUser)
+
+static Clp_Option options[] = {
+
+ { "script", 's', SCRIPT_OPT, Clp_ValString, 0 },
+ { "feature", 'f', FEATURE_OPT, Clp_ValString, 0 },
+ { "letter-feature", 0, LETTER_FEATURE_OPT, Clp_ValString, 0 },
+ { "lf", 0, LETTER_FEATURE_OPT, Clp_ValString, 0 },
+ { "include-substitutions", 0, INCLUDE_SUBS_OPT, Clp_ValString, 0 },
+ { "exclude-substitutions", 0, EXCLUDE_SUBS_OPT, Clp_ValString, 0 },
+ { "clear-substitutions", 0, CLEAR_SUBS_OPT, 0, 0 },
+ { "substitution-filter", 0, SUBS_FILTER_OPT, Clp_ValString, 0 },
+ { "subs-filter", 0, SUBS_FILTER_OPT, Clp_ValString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ValString, 0 },
+ { "literal-encoding", 0, LITERAL_ENCODING_OPT, Clp_ValString, 0 },
+ { "base-encodings", 0, BASE_ENCODINGS_OPT, Clp_ValString, 0 },
+ { "extend", 'E', EXTEND_OPT, Clp_ValDouble, 0 },
+ { "slant", 'S', SLANT_OPT, Clp_ValDouble, 0 },
+ { "letterspacing", 'L', LETTERSPACE_OPT, Clp_ValInt, 0 },
+ { "letterspace", 'L', LETTERSPACE_OPT, Clp_ValInt, 0 },
+ { "min-kern", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "minimum-kern", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "kern-precision", 'k', MINIMUM_KERN_OPT, Clp_ValDouble, 0 },
+ { "ligkern", 0, LIGKERN_OPT, Clp_ValString, 0 },
+ { "position", 0, POSITION_OPT, Clp_ValString, 0 },
+ { "warn-missing", 0, WARN_MISSING_OPT, 0, Clp_Negate },
+ { "no-encoding-commands", 0, NO_ECOMMAND_OPT, 0, 0 },
+ { "default-ligkern", 0, DEFAULT_LIGKERN_OPT, 0, Clp_Negate },
+ { "unicoding", 0, UNICODING_OPT, Clp_ValString, 0 },
+ { "coding-scheme", 0, CODINGSCHEME_OPT, Clp_ValString, 0 },
+ { "boundary-char", 0, BOUNDARY_CHAR_OPT, CHAR_OPTTYPE, 0 },
+ { "altselector", 0, ALTSELECTOR_CHAR_OPT, CHAR_OPTTYPE, Clp_PreferredMatch },
+ { "altselector-char", 0, ALTSELECTOR_CHAR_OPT, CHAR_OPTTYPE, 0 },
+ { "altselector-feature", 0, ALTSELECTOR_FEATURE_OPT, Clp_ValString, 0 },
+ { "design-size", 0, DESIGN_SIZE_OPT, Clp_ValDouble, 0 },
+ { "include-alternates", 0, INCLUDE_ALTERNATES_OPT, Clp_ValString, 0 },
+ { "exclude-alternates", 0, EXCLUDE_ALTERNATES_OPT, Clp_ValString, 0 },
+ { "clear-alternates", 0, CLEAR_ALTERNATES_OPT, 0, 0 },
+ { "alternates-filter", 0, ALTERNATES_FILTER_OPT, Clp_ValString, 0 },
+ { "space-factor", 0, SPACE_FACTOR_OPT, Clp_ValDouble, 0 },
+ { "math-spacing", 0, MATH_SPACING_OPT, CHAR_OPTTYPE, Clp_Negate | Clp_Optional },
+ { "fixed-pitch", 0, FIXED_PITCH_OPT, 0, Clp_Negate },
+ { "fixed-width", 0, FIXED_PITCH_OPT, 0, Clp_Negate },
+ { "proportional-width", 0, PROPORTIONAL_WIDTH_OPT, 0, Clp_Negate },
+ { "italic-angle", 0, ITALIC_ANGLE_OPT, Clp_ValDouble, 0 },
+ { "x-height", 0, X_HEIGHT_OPT, Clp_ValString, 0 },
+
+ { "pl", 'p', PL_OPT, 0, Clp_Negate },
+ { "tfm", 't', TFM_OPT, 0, Clp_Negate }, // not in documentation
+ { "virtual", 0, VIRTUAL_OPT, 0, Clp_Negate },
+ { "no-encoding", 0, NO_ENCODING_OPT, 0, 0 },
+ { "no-type1", 0, NO_TYPE1_OPT, 0, 0 },
+ { "no-dotlessj", 0, NO_DOTLESSJ_OPT, 0, 0 },
+ { "no-updmap", 0, NO_UPDMAP_OPT, 0, 0 },
+ { "updmap-sys", 0, UPDMAP_SYS_OPT, 0, 0 },
+ { "updmap-user", 0, UPDMAP_USER_OPT, 0, 0 },
+ { "truetype", 0, TRUETYPE_OPT, 0, Clp_Negate },
+ { "type42", 0, TYPE42_OPT, 0, Clp_Negate },
+ { "map-file", 0, MAP_FILE_OPT, Clp_ValString, Clp_Negate },
+ { "output-encoding", 0, OUTPUT_ENCODING_OPT, Clp_ValString, Clp_Optional },
+
+ { "automatic", 'a', AUTOMATIC_OPT, 0, Clp_Negate },
+ { "name", 'n', FONT_NAME_OPT, Clp_ValString, 0 },
+ { "vendor", 'v', VENDOR_OPT, Clp_ValString, 0 },
+ { "typeface", 0, TYPEFACE_OPT, Clp_ValString, 0 },
+
+ { "directory", 0, DIR_OPT, Clp_ValString, 0 },
+ { "encoding-directory", 0, ENCODING_DIR_OPT, Clp_ValString, 0 },
+ { "pl-directory", 0, PL_DIR_OPT, Clp_ValString, 0 },
+ { "tfm-directory", 0, TFM_DIR_OPT, Clp_ValString, 0 },
+ { "vpl-directory", 0, VPL_DIR_OPT, Clp_ValString, 0 },
+ { "vf-directory", 0, VF_DIR_OPT, Clp_ValString, 0 },
+ { "type1-directory", 0, TYPE1_DIR_OPT, Clp_ValString, 0 },
+ { "type42-directory", 0, TYPE42_DIR_OPT, Clp_ValString, 0 },
+ { "truetype-directory", 0, TRUETYPE_DIR_OPT, Clp_ValString, 0 },
+
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "glyphlist", 0, GLYPHLIST_OPT, Clp_ValString, 0 },
+ { "no-create", 0, NOCREATE_OPT, 0, 0 },
+ { "force", 0, FORCE_OPT, 0, Clp_Negate },
+ { "verbose", 'V', VERBOSE_OPT, 0, Clp_Negate },
+ { "kpathsea-debug", 0, KPATHSEA_DEBUG_OPT, Clp_ValInt, 0 },
+
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+
+ { "query-features", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "qf", 0, QUERY_FEATURES_OPT, 0, 0 },
+ { "query-scripts", 0, QUERY_SCRIPTS_OPT, 0, 0 },
+ { "qs", 0, QUERY_SCRIPTS_OPT, 0, 0 },
+
+};
+
+static const char * const default_ligkerns = "\
+space l =: lslash ; space L =: Lslash ; \
+question quoteleft =: questiondown ; \
+exclam quoteleft =: exclamdown ; \
+hyphen hyphen =: endash ; endash hyphen =: emdash ; \
+quoteleft quoteleft =: quotedblleft ; \
+quoteright quoteright =: quotedblright ;";
+
+struct BaseEncoding {
+ String font_name;
+ String secondary;
+ DvipsEncoding encoding;
+};
+
+static const char *program_name;
+static String current_time;
+static StringAccum invocation;
+
+static PermString::Initializer perm_initializer;
+static PermString dot_notdef(".notdef");
+
+static Vector<Efont::OpenType::Tag> interesting_scripts;
+static Vector<Efont::OpenType::Tag> interesting_features;
+static Vector<Efont::OpenType::Tag> altselector_features;
+static GlyphFilter null_filter;
+static HashMap<Efont::OpenType::Tag, GlyphFilter*> feature_filters(0);
+static HashMap<Efont::OpenType::Tag, GlyphFilter*> altselector_feature_filters(0);
+
+static String font_name;
+static String encoding_file;
+static Vector<BaseEncoding *> base_encodings;
+static double extend;
+static double slant;
+int letterspace;
+static double design_size;
+static double minimum_kern = 2.0;
+static double space_factor = 1.0;
+static bool math_spacing = false;
+static int skew_char = -1;
+static bool override_is_fixed_pitch = false;
+static bool is_fixed_pitch;
+static bool override_italic_angle = false;
+static double italic_angle;
+static int override_x_height = FontInfo::x_height_auto;
+static double x_height;
+
+static String out_encoding_file;
+static String out_encoding_name;
+
+unsigned output_flags = G_ENCODING | G_METRICS | G_VMETRICS | G_PSFONTSMAP | G_TYPE1 | G_DOTLESSJ | G_UPDMAP | G_TRUETYPE;
+
+bool automatic = false;
+bool verbose = false;
+bool no_create = false;
+bool quiet = false;
+bool force = false;
+
+static String otf_data;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Otftotfm%> generates TeX font metrics files from an OpenType font (PostScript\n\
+flavor only), including ligatures, kerns, and some positionings. Supply\n\
+%<-s SCRIPT[.LANG]%> options to specify a language system, %<-f FEAT%> options to\n\
+turn on optional OpenType features, and a %<-e ENC%> option to specify a base\n\
+encoding. Output files are written to the current directory (but see\n\
+%<--automatic%> and the %<directory%> options).\n\
+\n\
+Usage: %s [-a] [OPTIONS] OTFFILE FONTNAME\n\n",
+ program_name);
+ uerrh.message("\
+Font feature and transformation options:\n\
+ -s, --script=SCRIPT[.LANG] Use features for script SCRIPT[.LANG] [latn].\n\
+ -f, --feature=FEAT Activate feature FEAT.\n\
+ --lf, --letter-feature=FEAT Activate feature FEAT for letters.\n\
+ --subs-filter=PAT Substitute only characters matching PAT.\n\
+ --include-subs=PAT Same, but cumulative.\n\
+ --exclude-subs=PAT Don%,t substitute characters matching PAT.\n\
+ --clear-subs Clear included/excluded substitutions.\n\
+ -E, --extend=F Widen characters by a factor of F.\n\
+ -S, --slant=AMT Oblique characters by AMT, generally <<1.\n\
+ -L, --letterspacing=AMT Letterspace each character by AMT units.\n\
+ --math-spacing[=SKEWCH] Use letterspacing appropriate for math.\n\
+ -k, --min-kern=N Omit kerns with absolute value < N [2.0].\n\
+ --space-factor=F Scale wordspace by a factor of F.\n\
+ --design-size=SIZE Set font design size to SIZE.\n\
+ --fixed-width Set fixed width (no space stretch).\n\
+ --italic-angle=ANGLE Set font italic angle (for positioning accents).\n\
+ --x-height=AMT Set x-height to AMT units.\n\
+\n");
+ uerrh.message("\
+Encoding options:\n\
+ -e, --encoding=FILE Use DVIPS encoding FILE as a base encoding.\n\
+ --boundary-char=CHAR Set the boundary character to CHAR.\n\
+ --altselector-char=CHAR Set the alternate selector character to CHAR.\n\
+ --altselector-feature=F Activate feature F for --altselector-char.\n\
+ --alternates-filter=PAT Include only alternate characters matching PAT.\n\
+ --include-alternates=PAT Same as --alternates-filter, but cumulative.\n\
+ --exclude-alternates=PAT Ignore alternate characters matching PAT.\n\
+ --clear-alternates Clear included/excluded alternates.\n\
+ --ligkern=COMMAND Add a ligature or kern.\n\
+ --position=COMMAND Add a POSITION command.\n\
+ --unicoding=COMMAND Add a UNICODING command.\n\
+ --no-encoding-commands Ignore encoding file%,s LIGKERN/UNICODINGs.\n\
+ --no-default-ligkern Don%,t include default LIGKERNs.\n\
+ --coding-scheme=SCHEME Set the output coding scheme to SCHEME.\n\
+ --warn-missing Warn about characters not supported by font.\n\
+ --literal-encoding=FILE Use DVIPS encoding FILE verbatim.\n\
+ --base-encodings=FILE Output can refer to base fonts named in FILE.\n\
+\n");
+ uerrh.message("\
+Automatic mode options:\n\
+ -a, --automatic Install in a TeX Directory Structure.\n\
+ -v, --vendor=NAME Set font vendor for TDS [lcdftools].\n\
+ --typeface=NAME Set typeface name for TDS [<font family>].\n\
+ --no-type1 Do not generate Type 1 fonts.\n\
+ --no-dotlessj Do not generate dotless-j fonts.\n\
+ --no-truetype Do not install TrueType-flavored input fonts.\n\
+ --no-updmap Do not run updmap.\n\
+ --updmap-user Run `updmap-user` instead of `updmap-sys`.\n\
+\n\
+Output options:\n\
+ -n, --name=NAME Generated font name is NAME.\n\
+ -p, --pl Output human-readable PL/VPLs, not TFM/VFs.\n\
+ --no-virtual Do not generate VFs or VPLs.\n\
+ --no-encoding Do not generate an encoding file.\n\
+ --no-map Do not generate a psfonts.map line.\n\
+ --output-encoding[=FILE] Only generate an encoding file.\n\
+\n");
+ uerrh.message("\
+File location options:\n\
+ --tfm-directory=DIR Put TFM files in DIR [.|automatic].\n\
+ --pl-directory=DIR Put PL files in DIR [.|automatic].\n\
+ --vf-directory=DIR Put VF files in DIR [.|automatic].\n\
+ --vpl-directory=DIR Put VPL files in DIR [.|automatic].\n\
+ --encoding-directory=DIR Put encoding files in DIR [.|automatic].\n\
+ --type1-directory=DIR Put Type 1 fonts in DIR [automatic].\n\
+ --truetype-directory=DIR Put TrueType fonts in DIR [automatic].\n\
+ --directory=DIR Put output in DIR [.|automatic].\n\
+ --map-file=FILE Update FILE with psfonts.map information [-].\n\
+\n\
+Other options:\n\
+ --glyphlist=FILE Use FILE to map Adobe glyph names to Unicode.\n\
+ -V, --verbose Print progress information to standard error.\n\
+ --no-create Print messages, don't modify any files.\n\
+ --force Generate files even if versions already exist.\n"
+#if HAVE_KPATHSEA
+" --kpathsea-debug=MASK Set path searching debug flags to MASK.\n"
+#endif
+" -h, --help Print this message and exit.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n");
+}
+
+#ifndef WIN32
+extern "C" {
+static void
+sigchld_handler(int s)
+{
+#if !HAVE_SIGACTION
+ signal(s, sigchld_handler);
+#else
+ (void) s;
+#endif
+}
+}
+
+static void
+handle_sigchld()
+{
+#ifdef SIGCHLD
+ int sigchld = SIGCHLD;
+#else
+ int sigchld = SIGCLD;
+#endif
+#if HAVE_SIGACTION
+ struct sigaction sa;
+ sigaction(sigchld, 0, &sa);
+ sa.sa_handler = sigchld_handler;
+ sa.sa_flags = 0;
+ sigaction(sigchld, &sa, 0);
+#else
+ signal(sigchld, sigchld_handler);
+#endif
+}
+#endif
+
+
+// MAIN
+
+String
+suffix_font_name(const String &font_name, const String &suffix)
+{
+ const char *begin = font_name.begin(), *end = font_name.end();
+ while (end > begin && isdigit((unsigned char) end[-1]))
+ --end;
+ if (end < font_name.end() && end > begin && end[-1] != '-' && end[-1] != '+')
+ end = font_name.end();
+ else
+ while (end > begin && (end[-1] == '-' || end[-1] == '+'))
+ --end;
+ if (end == begin)
+ end = font_name.end();
+ return font_name.substring(begin, end) + suffix + font_name.substring(end, font_name.end());
+}
+
+static inline String
+make_base_font_name(const String &font_name)
+{
+ return suffix_font_name(font_name, "--base");
+}
+
+static double
+get_design_size(const FontInfo &finfo)
+{
+ try {
+ String gpos_table = finfo.otf->table("GPOS");
+ if (!gpos_table)
+ throw OpenType::Error();
+
+ ErrorHandler *errh = ErrorHandler::silent_handler();
+ OpenType::Gpos gpos(gpos_table, errh);
+
+ // extract 'size' feature(s)
+ int required_fid;
+ Vector<int> fids;
+ for (const OpenType::Tag *t = interesting_scripts.begin(); t < interesting_scripts.end(); t += 2)
+ gpos.script_list().features(t[0], t[1], required_fid, fids, 0, false);
+
+ int size_fid = gpos.feature_list().find(OpenType::Tag("size"), fids);
+ if (size_fid < 0)
+ throw OpenType::Error();
+
+ // old Adobe fonts implement an old, incorrect idea
+ // of what the FeatureParams offset means.
+ OpenType::Name name(finfo.otf->table("name"), errh);
+ OpenType::Data size_data = gpos.feature_list().size_params(size_fid, name, errh);
+ if (!size_data.length())
+ throw OpenType::Error();
+
+ double result = size_data.u16(0) / 10.;
+ // check for insane design sizes
+ if (result < 1 || result > 1000)
+ throw OpenType::Error();
+
+ // return a number in 'pt', not 'bp'
+ return result * 72.27 / 72.;
+
+ } catch (OpenType::Error) {
+ return 10.0;
+ }
+}
+
+static const char * const digit_names[] = {
+ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
+};
+
+static inline const char *
+lig_context_str(int ctx)
+{
+ return (ctx == 0 ? "LIG" : (ctx < 0 ? "/LIG" : "LIG/"));
+}
+
+static double max_printed_real;
+
+namespace {
+struct Printer {
+ Printer(FILE* f, unsigned design_units, unsigned units_per_em)
+ : f_(f), du_((double) design_units / units_per_em),
+ round_(design_units == 1000) {
+ }
+ inline double transform(double value) const;
+ void print_transformed(const char* prefix, double value) const;
+ void print(const char* prefix, double value) const;
+ String render(double value) const;
+ FILE* f_;
+ double du_;
+ bool round_;
+};
+
+inline double Printer::transform(double value) const {
+ value *= du_;
+ if (round_)
+ value = ceil(value);
+ return value;
+}
+
+void Printer::print_transformed(const char* prefix, double value) const {
+ if (round_ || value == 0 || (value > 0.01 && value - floor(value) < 0.01))
+ fprintf(f_, "%s R %g)\n", prefix, value);
+ else
+ fprintf(f_, "%s R %.4f)\n", prefix, value);
+ max_printed_real = std::max(max_printed_real, fabs(value));
+}
+
+void Printer::print(const char* prefix, double value) const {
+ print_transformed(prefix, transform(value));
+}
+
+String Printer::render(double value) const {
+ value = transform(value);
+ if (round_ || value == 0 || (value > 0.01 && value - floor(value) < 0.01))
+ return String(value);
+ else {
+ char buf[128];
+ sprintf(buf, "%.4f", value);
+ return String(buf);
+ }
+}
+} // namespace
+
+double
+font_slant(const FontInfo &finfo)
+{
+ double val = finfo.italic_angle();
+ return -tan(val * M_PI / 180.0) + slant;
+}
+
+static void
+output_pl(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, bool vpl,
+ const String &filename, ErrorHandler *errh)
+{
+ // create file
+ if (no_create) {
+ errh->message("would create %s", filename.c_str());
+ return;
+ }
+
+ if (verbose)
+ errh->message("creating %s", filename.c_str());
+ FILE *f = fopen(filename.c_str(), "wb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return;
+ }
+
+ // XXX check DESIGNSIZE and DESIGNUNITS for correctness
+
+ fprintf(f, "(COMMENT Created by '%s'%s)\n", invocation.c_str(), current_time.c_str());
+
+ // calculate a TeX FAMILY name using afm2tfm's algorithm
+ String family_name = String("TeX-") + ps_name;
+ if (family_name.length() > 19)
+ family_name = family_name.substring(0, 9) + family_name.substring(-10);
+ fprintf(f, "(FAMILY %s)\n", family_name.c_str());
+
+ if (metrics.coding_scheme())
+ fprintf(f, "(CODINGSCHEME %.39s)\n", String(metrics.coding_scheme()).c_str());
+ int design_units = metrics.design_units();
+
+ if (design_size <= 0)
+ design_size = get_design_size(finfo);
+ max_printed_real = 0;
+
+ fprintf(f, "(DESIGNSIZE R %.1f)\n"
+ "(DESIGNUNITS R %d.0)\n"
+ "(COMMENT DESIGNSIZE (1 em) IS IN POINTS)\n"
+ "(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/%d)\n"
+ "(FONTDIMEN\n", design_size, design_units, design_units);
+
+ // figure out font dimensions
+ Transform font_xform;
+ if (extend)
+ font_xform.scale(extend, 1);
+ if (slant)
+ font_xform.shear(slant);
+ double bounds[4], width;
+ Printer pr(f, design_units, metrics.units_per_em());
+
+ double actual_slant = font_slant(finfo);
+ if (actual_slant)
+ fprintf(f, " (SLANT R %g)\n", actual_slant);
+
+ if (char_bounds(bounds, width, finfo, font_xform, ' ')) {
+ // advance space width by letterspacing, scale by space_factor
+ double space_width = (width + (vpl ? letterspace : 0)) * space_factor;
+ pr.print(" (SPACE", space_width);
+ if (finfo.is_fixed_pitch()) {
+ // fixed-pitch: no space stretch or shrink
+ pr.print(" (STRETCH", 0);
+ pr.print(" (SHRINK", 0);
+ pr.print(" (EXTRASPACE", space_width);
+ } else {
+ pr.print(" (STRETCH", space_width / 2.);
+ pr.print(" (SHRINK", space_width / 3.);
+ pr.print(" (EXTRASPACE", space_width / 6.);
+ }
+ }
+
+ double x_height = finfo.x_height(font_xform);
+ if (x_height < finfo.units_per_em())
+ pr.print(" (XHEIGHT", x_height);
+
+ pr.print(" (QUAD", finfo.units_per_em());
+ fprintf(f, " )\n");
+
+ if (boundary_char >= 0)
+ fprintf(f, "(BOUNDARYCHAR D %d)\n", boundary_char);
+
+ // figure out font mapping
+ int mapped_font0 = 0;
+ Vector<int> font_mapping;
+ if (vpl) {
+ int vpl_first_font = (metrics.need_base() ? 0 : 1);
+ font_mapping.assign(metrics.n_mapped_fonts(), 0);
+ if (vpl_first_font == 1 && font_mapping.size() == 1)
+ font_mapping.push_back(0);
+ // how many times is each font used?
+ Vector<Setting> settings;
+ for (int i = 0; i < 256; i++)
+ if (metrics.setting(i, settings)) {
+ int font_number = 0;
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ if (s->op == Setting::SHOW)
+ font_mapping[font_number]++;
+ else if (s->op == Setting::FONT)
+ font_number = (int) s->x;
+ }
+ // make sure the most-used font is number 0
+ mapped_font0 = std::max_element(font_mapping.begin(), font_mapping.end()) - font_mapping.begin();
+ // prepare the mapping
+ for (int i = vpl_first_font; i < font_mapping.size(); i++)
+ font_mapping[i] = i - vpl_first_font;
+ font_mapping[mapped_font0] = 0;
+ font_mapping[vpl_first_font] = mapped_font0 - vpl_first_font;
+ if (vpl_first_font != 0)
+ font_mapping[0] = font_mapping.size() - 1;
+ // write MAPFONT
+ for (int i = 0; i < metrics.n_mapped_fonts() - vpl_first_font; i++) {
+ int j = std::find(font_mapping.begin(), font_mapping.end(), i) - font_mapping.begin();
+ String name = metrics.mapped_font_name(j);
+ if (!name)
+ name = make_base_font_name(font_name);
+ fprintf(f, "(MAPFONT D %d\n (FONTNAME %s)\n (FONTDSIZE R %.1f)\n )\n", i, name.c_str(), design_size);
+ }
+ } else
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++)
+ font_mapping.push_back(i);
+
+ // figure out the proper names and numbers for glyphs
+ Vector<String> glyph_ids;
+ Vector<String> glyph_comments(257, String());
+ Vector<String> glyph_base_comments(257, String());
+ for (int i = 0; i < metrics.encoding_size(); i++) {
+ if (metrics.glyph(i)) {
+ PermString name = metrics.code_name(i), expected_name;
+ if (i >= '0' && i <= '9')
+ expected_name = digit_names[i - '0'];
+ else if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z'))
+ expected_name = PermString((char)i);
+ String glyph_comment;
+ if (name != expected_name)
+ glyph_comment = " (COMMENT " + String(name) + ")";
+
+ int base = metrics.base_code(i);
+ if (base >= 0 && base < 256)
+ glyph_base_comments[base] = glyph_comment;
+
+ if (i >= 256)
+ continue;
+
+ char* expected_name_end;
+ if (expected_name
+ && (name == expected_name
+ || (name.length() == 7
+ && memcmp(name.data(), "uni00", 5) == 0
+ && strtol(name.c_str() + 3, &expected_name_end, 16) == i
+ && *expected_name_end == 0)))
+ glyph_ids.push_back("C " + String((char)i));
+ else
+ glyph_ids.push_back("D " + String(i));
+
+ glyph_comments[i] = glyph_base_comments[i] = glyph_comment;
+
+ } else if (i < 256)
+ glyph_ids.push_back("D " + String(i));
+ }
+ // finally, BOUNDARYCHAR
+ glyph_ids.push_back("BOUNDARYCHAR");
+
+ // LIGTABLE
+ fprintf(f, "(LIGTABLE\n");
+ Vector<int> lig_code2, lig_outcode, lig_context, kern_code2, kern_amt;
+ // don't print KRN x after printing LIG x
+ uint32_t used[8];
+ bool any_ligs = false;
+ StringAccum omitted_clig_sa;
+ for (int i = 0; i <= 256; i++)
+ if (metrics.glyph(i) && minimum_kern < 10000) {
+ int any_lig = metrics.ligatures(i, lig_code2, lig_outcode, lig_context);
+ int any_kern = metrics.kerns(i, kern_code2, kern_amt);
+ if (any_lig || any_kern) {
+ StringAccum kern_sa;
+ memset(used, 0, sizeof(used));
+ for (int j = 0; j < lig_code2.size(); j++) {
+ if (lig_outcode[j] < 257) {
+ kern_sa << " (" << lig_context_str(lig_context[j])
+ << ' ' << glyph_ids[lig_code2[j]]
+ << ' ' << glyph_ids[lig_outcode[j]]
+ << ')' << glyph_comments[lig_code2[j]]
+ << glyph_comments[lig_outcode[j]] << '\n';
+ used[lig_code2[j] >> 5] |= (1 << (lig_code2[j] & 0x1F));
+ } else {
+ omitted_clig_sa << "(COMMENT omitted "
+ << lig_context_str(lig_context[j])
+ << ' ' << metrics.code_name(i)
+ << ' ' << metrics.code_name(lig_code2[j])
+ << ' ' << metrics.code_name(lig_outcode[j])
+ << ")\n";
+ }
+ }
+ for (Vector<int>::const_iterator k2 = kern_code2.begin(); k2 < kern_code2.end(); k2++)
+ if (!(used[*k2 >> 5] & (1 << (*k2 & 0x1F)))) {
+ double this_kern = kern_amt[k2 - kern_code2.begin()];
+ if (fabs(this_kern) >= minimum_kern)
+ kern_sa << " (KRN " << glyph_ids[*k2]
+ << " R " << pr.render(this_kern)
+ << ')' << glyph_comments[*k2] << '\n';
+ }
+ if (kern_sa) {
+ if (any_ligs)
+ fprintf(f, "\n");
+ fprintf(f, " (LABEL %s)%s\n%s (STOP)\n", glyph_ids[i].c_str(), glyph_comments[i].c_str(), kern_sa.c_str());
+ any_ligs = true;
+ }
+ }
+ }
+ fprintf(f, " )\n");
+ if (omitted_clig_sa)
+ fprintf(f, "%s\n", omitted_clig_sa.c_str());
+
+ // CHARACTERs
+ Vector<Setting> settings;
+ StringAccum sa;
+ Vector<Point> push_stack;
+
+ for (int i = 0; i < 256; i++)
+ if (metrics.setting(i, settings)) {
+ fprintf(f, "(CHARACTER %s%s\n", glyph_ids[i].c_str(), glyph_comments[i].c_str());
+
+ // unparse settings into DVI commands
+ sa.clear();
+ push_stack.clear();
+ CharstringBounds boundser(font_xform);
+ int program_number = mapped_font0;
+ const CharstringProgram *program = finfo.program();
+ for (const Setting *s = settings.begin(); s < settings.end(); s++)
+ switch (s->op) {
+
+ case Setting::SHOW:
+ if (vpl || program == finfo.program())
+ boundser.char_bounds(program->glyph_context(s->y));
+ // 3.Aug.2004 -- reported by Marco Kuhlmann: Don't use
+ // glyph_ids[] array when looking at a different font.
+ if (program_number == 0)
+ sa << " (SETCHAR " << glyph_ids[s->x] << ')' << glyph_base_comments[s->x] << "\n";
+ else
+ sa << " (SETCHAR D " << s->x << ")\n";
+ break;
+
+ case Setting::MOVE: {
+ int x = 0, y = 0;
+ while (s+1 < settings.end() && s[1].op == Setting::MOVE)
+ x += s->x, y += s->y, s++;
+ if (vpl)
+ boundser.translate(s->x + x, s->y + y);
+ if (s->x + x)
+ sa << " (MOVERIGHT R " << pr.render(s->x + x) << ")\n";
+ if (s->y + y)
+ sa << " (MOVEUP R " << pr.render(s->y + y) << ")\n";
+ break;
+ }
+
+ case Setting::RULE:
+ if (vpl) {
+ boundser.mark(Point(0, 0));
+ boundser.mark(Point(s->x, s->y));
+ boundser.translate(s->x, 0);
+ }
+ sa << " (SETRULE R " << pr.render(s->y) << " R " << pr.render(s->x) << ")\n";
+ break;
+
+ case Setting::FONT:
+ if ((int) s->x != program_number) {
+ program = metrics.mapped_font((int) s->x);
+ program_number = (int) s->x;
+ sa << " (SELECTFONT D " << font_mapping[program_number] << ")\n";
+ }
+ break;
+
+ case Setting::PUSH:
+ push_stack.push_back(boundser.transform(Point(0, 0)));
+ sa << " (PUSH)\n";
+ break;
+
+ case Setting::POP: {
+ assert(push_stack.size());
+ Point p = push_stack.back() - boundser.transform(Point(0, 0));
+ if (vpl)
+ boundser.translate(p.x, p.y);
+ push_stack.pop_back();
+ sa << " (POP)\n";
+ break;
+ }
+
+ case Setting::SPECIAL: {
+ bool needhex = false;
+ for (const char *str = s->s.begin(); str < s->s.end() && !needhex; str++)
+ if (*str < ' ' || *str > '~' || *str == '(' || *str == ')')
+ needhex = true;
+ if (needhex) {
+ sa << " (SPECIALHEX ";
+ for (const char *str = s->s.begin(); str < s->s.end(); str++) {
+ static const char hexdig[] = "0123456789ABCDEF";
+ int val = (unsigned char) *str;
+ sa << hexdig[val >> 4] << hexdig[val & 0xF];
+ }
+ sa << ")\n";
+ } else
+ sa << " (SPECIAL " << s->s << ")\n";
+ break;
+ }
+
+ }
+
+ assert(push_stack.size() == 0);
+
+ // output information
+ boundser.output(bounds, width);
+ pr.print(" (CHARWD", width);
+ if (bounds[3] > 0)
+ pr.print(" (CHARHT", bounds[3]);
+ if (bounds[1] < 0)
+ pr.print(" (CHARDP", -bounds[1]);
+ if (bounds[2] > width)
+ pr.print_transformed(" (CHARIC", pr.transform(bounds[2]) - pr.transform(width));
+ if (vpl && (settings.size() > 1 || settings[0].op != Setting::SHOW))
+ fprintf(f, " (MAP\n%s )\n", sa.c_str());
+ fprintf(f, " )\n");
+ }
+
+ // at last, close the file
+ fclose(f);
+
+ // Did we print a number too big for TeX to handle? If so, try again.
+ if (max_printed_real >= 2047) {
+ if (metrics.design_units() <= 1)
+ errh->fatal("This font appears to be broken. It has characters so big that the PL format\ncannot represent them.");
+ metrics.set_design_units(metrics.design_units() > 200 ? metrics.design_units() - 250 : 1);
+ if (verbose)
+ errh->message("the font%,s metrics overflow the limits of PL files\n(reducing DESIGNUNITS to %d and trying again)", metrics.design_units());
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, filename, errh);
+ }
+}
+
+struct Lookup {
+ bool used;
+ bool required;
+ Vector<OpenType::Tag> features;
+ GlyphFilter* filter;
+ Lookup() : used(false), required(false), filter(0) { }
+};
+
+static void
+find_lookups(const OpenType::ScriptList& scripts, const OpenType::FeatureList& features, Vector<Lookup>& lookups, ErrorHandler* errh)
+{
+ Vector<int> fids, lookupids;
+ int required;
+
+ // go over all scripts
+ for (int i = 0; i < interesting_scripts.size(); i += 2) {
+ OpenType::Tag script = interesting_scripts[i];
+ OpenType::Tag langsys = interesting_scripts[i+1];
+
+ // collect features applying to this script
+ scripts.features(script, langsys, required, fids, errh);
+
+ // only use the selected features
+ features.filter(fids, interesting_features);
+
+ // mark features as having been used
+ for (int j = (required < 0 ? 0 : -1); j < fids.size(); j++) {
+ int fid = (j < 0 ? required : fids[j]);
+ OpenType::Tag ftag = features.tag(fid);
+ if (features.lookups(fid, lookupids, errh) < 0)
+ lookupids.clear();
+ for (int k = 0; k < lookupids.size(); k++) {
+ int l = lookupids[k];
+ if (l < 0 || l >= lookups.size())
+ errh->error("lookup for %<%s%> feature out of range", OpenType::Tag::langsys_text(script, langsys).c_str());
+ else {
+ lookups[l].used = true;
+ lookups[l].features.push_back(ftag);
+ if (j < 0)
+ lookups[l].required = true;
+ }
+ }
+ }
+ }
+
+ // now check for compatible glyph filters
+ for (Lookup* l = lookups.begin(); l < lookups.end(); l++)
+ if (l->used && !l->required) {
+ l->filter = feature_filters[l->features[0]];
+ for (OpenType::Tag* ft = l->features.begin() + 1; ft < l->features.end(); ft++)
+ if (!l->filter->check_eq(*feature_filters[*ft])) {
+ errh->error("%<%s%> and %<%s%> features share a lookup, but have different filters", l->features[0].text().c_str(), ft->text().c_str());
+ break;
+ }
+ }
+}
+
+static int
+write_encoding_file(String &filename, const String &encoding_name,
+ StringAccum &contents, ErrorHandler *errh)
+{
+ FILE *f;
+ int ok_retval = (access(filename.c_str(), R_OK) >= 0 ? 0 : 1);
+
+ if (no_create) {
+ errh->message((ok_retval ? "would create encoding file %s" : "would update encoding file %s"), filename.c_str());
+ return ok_retval;
+ } else if (verbose)
+ errh->message((ok_retval ? "creating encoding file %s" : "updating encoding file %s"), filename.c_str());
+
+ int fd = open(filename.c_str(), O_RDWR | O_CREAT, 0666);
+ if (fd < 0)
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ f = fdopen(fd, "r+");
+ // NB: also change update_autofont_map if you change this code
+
+#if defined(F_SETLKW) && defined(HAVE_FTRUNCATE)
+ {
+ struct flock lock;
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = 0;
+ lock.l_len = 0;
+ int result;
+ while ((result = fcntl(fd, F_SETLKW, &lock)) < 0 && errno == EINTR)
+ /* try again */;
+ if (result < 0) {
+ result = errno;
+ fclose(f);
+ return errh->error("locking %s: %s", filename.c_str(), strerror(result));
+ }
+ }
+#endif
+
+ // read old data from encoding file
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ return errh->error("%s: %s", filename.c_str(), strerror(errno));
+ String old_encodings = sa.take_string();
+ bool created = (!old_encodings);
+
+ // append old encodings
+ int pos1 = old_encodings.find_left("\n%%");
+ while (pos1 >= 0 && pos1 < old_encodings.length()) {
+ int pos2 = old_encodings.find_left("\n%%", pos1 + 1);
+ if (pos2 < 0)
+ pos2 = old_encodings.length();
+ if (old_encodings.substring(pos1 + 3, encoding_name.length()) == encoding_name) {
+ // encoding already exists, don't change it
+ fclose(f);
+ if (verbose)
+ errh->message("%s unchanged", filename.c_str());
+ return 0;
+ } else
+ contents << old_encodings.substring(pos1, pos2 - pos1);
+ pos1 = pos2;
+ }
+
+ // rewind file
+#ifdef HAVE_FTRUNCATE
+ rewind(f);
+ if (ftruncate(fd, 0) < 0)
+#endif
+ {
+ fclose(f);
+ f = fopen(filename.c_str(), "wb");
+ fd = fileno(f);
+ }
+
+ ignore_result(fwrite(contents.data(), 1, contents.length(), f));
+
+ fclose(f);
+
+ // inform about the new file if necessary
+ if (created)
+ update_odir(O_ENCODING, filename, errh);
+ return 0;
+}
+
+static bool
+output_encoding(const Metrics &metrics,
+ const Vector<PermString> &glyph_names,
+ ErrorHandler *errh)
+{
+ static const char * const hex_digits = "0123456789ABCDEF";
+
+ // collect encoding data
+ Vector<Metrics::Glyph> glyphs;
+ if (!metrics.base_glyphs(glyphs, 256))
+ return false;
+
+ StringAccum sa;
+ for (int i = 0; i < 256; i++) {
+ if ((i & 0xF) == 0)
+ sa << (i ? "\n%" : "%") << hex_digits[(i >> 4) & 0xF] << '0' << '\n' << ' ';
+ else if ((i & 0x7) == 0)
+ sa << '\n' << ' ';
+ int g = glyphs[i];
+ if (g > 0 && g < glyph_names.size())
+ sa << ' ' << '/' << glyph_names[g];
+ else
+ sa << " /.notdef";
+ }
+ sa << '\n';
+
+ // digest encoding data
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *)sa.data(), sa.length());
+ char text_digest[MD5_TEXT_DIGEST_SIZE + 1];
+ md5_final_text(text_digest, &md5);
+
+ // name encoding using digest
+ out_encoding_name = "AutoEnc_" + String(text_digest);
+
+ // create encoding filename
+ bool output_encoding_only = (bool) out_encoding_file;
+ if (!out_encoding_file)
+ out_encoding_file = getodir(O_ENCODING, errh) + String("/a_") + String(text_digest).substring(0, 6) + ".enc";
+
+ // exit if we're not responsible for generating an encoding
+ if (!(output_flags & G_ENCODING))
+ return true;
+
+ // put encoding block in a StringAccum
+ // 3.Jun.2003: stick command line definition at the end of the encoding,
+ // where it won't confuse idiotic ps2pk
+ StringAccum contents;
+ if (!output_encoding_only)
+ contents << "% THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT\n\n\
+%%" << out_encoding_name << "\n";
+ contents << "% Encoding created by otftotfm" << current_time << "\n\
+% Command line follows encoding\n";
+
+ // the encoding itself
+ contents << '/' << out_encoding_name << " [\n" << sa << "] def\n";
+
+ // write banner -- unfortunately this takes some doing
+ String banner = String("Command line: '") + String(invocation.data(), invocation.length()) + String("'");
+ char *buf = banner.mutable_data();
+ // get rid of crap characters
+ for (int i = 0; i < banner.length(); i++)
+ if (buf[i] < ' ' || buf[i] > 0176) {
+ if (buf[i] == '\n' || buf[i] == '\r')
+ buf[i] = ' ';
+ else
+ buf[i] = '.';
+ }
+ // break lines at 80 characters -- it would be nice if this were in a
+ // library
+ while (banner.length() > 0) {
+ int pos = banner.find_left(' '), last_pos = pos;
+ while (pos < 75 && pos >= 0) {
+ last_pos = pos;
+ pos = banner.find_left(' ', pos + 1);
+ }
+ if (last_pos < 0 || (pos < 0 && banner.length() < 75))
+ last_pos = banner.length();
+ contents << "% " << banner.substring(0, last_pos) << '\n';
+ banner = banner.substring(last_pos + 1);
+ }
+
+ // open encoding file
+ if (out_encoding_file == "-")
+ ignore_result(fwrite(contents.data(), 1, contents.length(), stdout));
+ else if (write_encoding_file(out_encoding_file, out_encoding_name, contents, errh) == 1)
+ update_odir(O_ENCODING, out_encoding_file, errh);
+ return true;
+}
+
+static void
+output_tfm(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo, String tfm_filename, String vf_filename,
+ String pl_filename, ErrorHandler *errh)
+{
+ bool had_pl_filename = !pl_filename.empty();
+ bool vpl = vf_filename;
+
+ if (!pl_filename) {
+ if (no_create) {
+ errh->message("would write %s to temporary file", (vpl ? "VPL" : "PL"));
+ pl_filename = "<temporary>";
+ } else {
+ int pl_fd = temporary_file(pl_filename, errh);
+ if (pl_fd < 0)
+ return;
+ output_pl(metrics, ps_name, boundary_char, finfo, vpl, pl_filename, errh);
+ close(pl_fd);
+ }
+ }
+
+ StringAccum command;
+ if (vpl)
+ command << "vptovf " << shell_quote(pl_filename) << ' ' << shell_quote(vf_filename) << ' ' << shell_quote(tfm_filename) << " 2>&1";
+ else
+ command << "pltotf " << shell_quote(pl_filename) << ' ' << shell_quote(tfm_filename) << " 2>&1";
+
+ FILE* cmdfile = mypopen(command.c_str(), "r", errh);
+ int status;
+ if (cmdfile) {
+ StringAccum results;
+ while (!feof(cmdfile)) {
+ char* buf = results.reserve(BUFSIZ);
+ results.adjust_length(fread(buf, 1, BUFSIZ, cmdfile));
+ }
+ // compensate for shitty vptovf/pltotf messages
+ char* by_units, *last_line;
+ while (!results.empty()
+ && (by_units = strstr((char*) results.c_str(), " units"))
+ && (last_line = strrchr((char*) results.c_str(), '\n'))
+ && results.end() - last_line > 1
+ && isdigit((unsigned char) last_line[1])) {
+ char* start_number = last_line + 1;
+ char* end_number = last_line + 2;
+ while (end_number < results.end()
+ && isdigit((unsigned char) *end_number))
+ ++end_number;
+ if (end_number < results.end() && *end_number == '.') {
+ char* dot = end_number;
+ ++end_number;
+ while (end_number < results.end()
+ && end_number < dot + 8
+ && isdigit((unsigned char) *end_number))
+ ++end_number;
+ }
+ String number(start_number, end_number);
+ char* by_units_dest = by_units + 1 + (end_number - start_number);
+ memmove(by_units_dest, by_units + 1, start_number - (by_units + 1));
+ memmove(by_units + 1, number.begin(), number.length());
+ }
+ if (!results.empty())
+ fwrite(results.begin(), 1, results.length(), stderr);
+ status = pclose(cmdfile);
+ } else
+ status = -1;
+
+ if (!no_create && !had_pl_filename)
+ unlink(pl_filename.c_str());
+
+ if (status != 0)
+ errh->fatal("%s execution failed", (vpl ? "vptovf" : "pltotf"));
+ else {
+ update_odir(O_TFM, tfm_filename, errh);
+ if (vpl)
+ update_odir(O_VF, vf_filename, errh);
+ }
+}
+
+void
+output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
+ ErrorHandler *errh)
+{
+ String base_font_name = font_name;
+ bool need_virtual = metrics.need_virtual(257);
+ if (need_virtual) {
+ if (output_flags & G_VMETRICS)
+ base_font_name = make_base_font_name(font_name);
+ else if (output_flags & G_METRICS)
+ errh->warning("features require virtual fonts");
+ }
+
+ // output virtual metrics
+ if (!(output_flags & G_VMETRICS))
+ /* do nothing */;
+ else if (!need_virtual) {
+ if (automatic) {
+ // erase old virtual font
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ if (no_create)
+ errh->message("would remove potential VF file %<%s%>", vf.c_str());
+ else {
+ if (verbose)
+ errh->message("removing potential VF file %<%s%>", vf.c_str());
+ if (unlink(vf.c_str()) < 0 && errno != ENOENT)
+ errh->error("removing %s: %s", vf.c_str(), strerror(errno));
+ }
+ }
+ } else {
+ String vplfile;
+ if (output_flags & G_ASCII) {
+ vplfile = getodir(O_VPL, errh) + "/" + font_name + ".vpl";
+ output_pl(metrics, ps_name, boundary_char, finfo, true, vplfile, errh);
+ update_odir(O_VPL, vplfile, errh);
+ }
+ if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + font_name + ".tfm";
+ String vf = getodir(O_VF, errh) + "/" + font_name + ".vf";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, vf, vplfile, errh);
+ }
+ }
+
+ // quit if no base needed
+ metrics.make_base(257);
+ if (!metrics.need_base())
+ return;
+
+ // output metrics
+ double save_minimum_kern = minimum_kern;
+ if (need_virtual)
+ minimum_kern = 100000;
+ if (output_flags & G_METRICS) {
+ String plfile;
+ if (output_flags & G_ASCII) {
+ plfile = getodir(O_PL, errh) + "/" + base_font_name + ".pl";
+ output_pl(metrics, ps_name, boundary_char, finfo, false, plfile, errh);
+ update_odir(O_PL, plfile, errh);
+ }
+ if (output_flags & G_BINARY) {
+ String tfm = getodir(O_TFM, errh) + "/" + base_font_name + ".tfm";
+ output_tfm(metrics, ps_name, boundary_char, finfo, tfm, String(), plfile, errh);
+ }
+ }
+ minimum_kern = save_minimum_kern;
+
+ // print DVIPS map line
+ if (errh->nerrors() == 0 && (output_flags & G_PSFONTSMAP)) {
+ StringAccum sa;
+ sa << base_font_name << ' ' << ps_name << " \"";
+ if (extend)
+ sa << extend << " ExtendFont ";
+ if (slant)
+ sa << slant << " SlantFont ";
+ if (encoding_name)
+ sa << encoding_name << " ReEncodeFont\" <[" << pathname_filename(encoding_file);
+ else
+ sa << "\"";
+ sa << ' ' << dvips_include(ps_name, finfo, errh) << '\n';
+ update_autofont_map(base_font_name, sa.take_string(), errh);
+ // if virtual font, remove any map line for base font name
+ if (base_font_name != font_name)
+ update_autofont_map(font_name, "", errh);
+ }
+}
+
+
+enum { F_GSUB_TRY = 1, F_GSUB_PART = 2, F_GSUB_ALL = 4,
+ F_GPOS_TRY = 8, F_GPOS_PART = 16, F_GPOS_ALL = 32,
+ X_UNUSED = 0, X_BOTH_NONE = 1, X_GSUB_NONE = 2,
+ X_GSUB_PART = 3, X_GPOS_NONE = 4, X_GPOS_PART = 5, X_COUNT };
+
+static const char * const x_messages[] = {
+ "% ignored, not supported by font",
+ "% ignored, too complex for me",
+ "complex substitutions from % ignored",
+ "some complex substitutions from % ignored",
+ "complex positionings from % ignored",
+ "some complex positionings from % ignored",
+};
+
+static void
+report_underused_features(const HashMap<uint32_t, int> &feature_usage, ErrorHandler *errh)
+{
+ Vector<String> x[X_COUNT];
+ for (int i = 0; i < interesting_features.size(); i++) {
+ OpenType::Tag f = interesting_features[i];
+ int fu = feature_usage[f.value()];
+ String ftext = errh->format("%<%s%>", f.text().c_str());
+ if (fu == 0)
+ x[X_UNUSED].push_back(ftext);
+ else if ((fu & (F_GSUB_TRY | F_GPOS_TRY)) == fu)
+ x[X_BOTH_NONE].push_back(ftext);
+ else {
+ if (fu & F_GSUB_TRY) {
+ if ((fu & (F_GSUB_PART | F_GSUB_ALL)) == 0)
+ x[X_GSUB_NONE].push_back(ftext);
+ else if (fu & F_GSUB_PART)
+ x[X_GSUB_PART].push_back(ftext);
+ }
+ if (fu & F_GPOS_TRY) {
+ if ((fu & (F_GPOS_PART | F_GPOS_ALL)) == 0)
+ x[X_GPOS_NONE].push_back(ftext);
+ else if (fu & F_GPOS_PART)
+ x[X_GPOS_PART].push_back(ftext);
+ }
+ }
+ }
+
+ for (int i = 0; i < X_COUNT; i++)
+ if (x[i].size())
+ goto found;
+ return;
+
+ found:
+ for (int i = 0; i < X_COUNT; i++)
+ if (x[i].size()) {
+ StringAccum sa;
+ const char* msg_pct = strchr(x_messages[i], '%');
+ sa.append(x_messages[i], msg_pct - x_messages[i]);
+ const char* sep = (x[i].size() > 2 ? ", " : " ");
+ for (const String* a = x[i].begin(); a < x[i].end() - 1; a++)
+ sa << *a << sep;
+ sa << (x[i].size() > 1 ? "and " : "") << x[i].back()
+ << (x[i].size() > 1 ? " features" : " feature") << (msg_pct+1);
+ sa.append_break_lines(sa.take_string(), 58);
+ errh->warning("%s", sa.c_str());
+ }
+}
+
+static String otf_filename;
+
+static String
+main_dvips_map(const String &ps_name, const FontInfo &finfo, ErrorHandler *errh)
+{
+ if (String fn = installed_type1(otf_filename, ps_name, (output_flags & G_TYPE1) != 0, errh))
+ return "<" + pathname_filename(fn);
+ if (!finfo.cff) {
+ String ttf_fn, t42_fn;
+ ttf_fn = installed_truetype(otf_filename, (output_flags & G_TRUETYPE) != 0, errh);
+ t42_fn = installed_type42(otf_filename, ps_name, (output_flags & G_TYPE42) != 0, errh);
+ if (t42_fn && (!ttf_fn || (output_flags & G_TYPE42) != 0))
+ return "<" + pathname_filename(t42_fn);
+ else if (ttf_fn)
+ return "<" + pathname_filename(ttf_fn);
+ }
+ return "<" + pathname_filename(otf_filename);
+}
+
+static void
+do_gsub(Metrics& metrics, const OpenType::Font& otf,
+ DvipsEncoding& dvipsenc, bool dvipsenc_literal,
+ HashMap<uint32_t, int>& feature_usage,
+ const Vector<PermString>& glyph_names, ErrorHandler* errh)
+{
+ // find activated GSUB features
+ OpenType::Gsub gsub(otf.table("GSUB"), &otf, errh);
+ Vector<Lookup> lookups(gsub.nlookups(), Lookup());
+ find_lookups(gsub.script_list(), gsub.feature_list(), lookups, errh);
+
+ // find all characters that might result
+ Vector<bool> used(glyph_names.size(), false);
+ for (Metrics::Code c = 0; c < metrics.encoding_size(); ++c) {
+ Metrics::Glyph g = metrics.glyph(c);
+ if (g >= 0 && g < used.size())
+ used[g] = true;
+ }
+ for (int i = 0; i < lookups.size(); ++i)
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ l.mark_out_glyphs(gsub, used);
+ }
+ OpenType::Coverage used_coverage(used);
+
+ // apply activated GSUB features
+ Vector<OpenType::Substitution> subs;
+ for (int i = 0; i < lookups.size(); i++)
+ if (lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ subs.clear();
+ bool understood = l.unparse_automatics(gsub, subs, used_coverage);
+
+ // check for -ffina, which should apply only at the ends of words,
+ // and -finit, which should apply only at the beginnings.
+ OpenType::Tag feature = (lookups[i].features.size() == 1 ? lookups[i].features[0] : OpenType::Tag());
+ if (feature == OpenType::Tag("fina") || feature == OpenType::Tag("fin2") || feature == OpenType::Tag("fin3")) {
+ if (dvipsenc.boundary_char() < 0)
+ errh->warning("%<-ffina%> requires a boundary character\n(The input encoding didn%,t specify a boundary character, but\nI need one to implement %<-ffina%> features correctly. Try\nthe %<--boundary-char%> option.)");
+ else {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_right(bg);
+ }
+ } else if (feature == OpenType::Tag("init")) {
+ int bg = metrics.boundary_glyph();
+ for (int j = 0; j < subs.size(); j++)
+ subs[j].add_outer_left(bg);
+ }
+
+ //for (int subno = 0; subno < subs.size(); subno++) fprintf(stderr, "%5d\t%s\n", i, subs[subno].unparse().c_str());
+
+ // figure out which glyph filter to use
+ int nunderstood = metrics.apply(subs, !dvipsenc_literal, i, *lookups[i].filter, glyph_names);
+
+ // mark as used
+ int d = (understood && nunderstood == subs.size() ? F_GSUB_ALL : (nunderstood ? F_GSUB_PART : 0)) + F_GSUB_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
+
+ // apply alternate selectors
+ if (metrics.altselectors() && !dvipsenc_literal) {
+ // do lookups
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ Vector<Lookup> alt_lookups(gsub.nlookups(), Lookup());
+ find_lookups(gsub.script_list(), gsub.feature_list(), alt_lookups, ErrorHandler::silent_handler());
+ Vector<OpenType::Substitution> alt_subs;
+ for (int i = 0; i < alt_lookups.size(); i++)
+ if (alt_lookups[i].used) {
+ OpenType::GsubLookup l = gsub.lookup(i);
+ alt_subs.clear();
+ (void) l.unparse_automatics(gsub, alt_subs, used_coverage);
+ metrics.apply_alternates(alt_subs, i, *alt_lookups[i].filter, glyph_names);
+ }
+ altselector_features.swap(interesting_features);
+ altselector_feature_filters.swap(feature_filters);
+ }
+}
+
+static bool
+kern_feature_requested()
+{
+ return std::find(interesting_features.begin(), interesting_features.end(),
+ OpenType::Tag("kern")) != interesting_features.end();
+}
+
+static void
+do_try_ttf_kern(Metrics& metrics, const OpenType::Font& otf, HashMap<uint32_t, int>& feature_usage, ErrorHandler* errh)
+{
+ // if no GPOS "kern" lookups and "kern" requested, try "kern" table
+ if (!kern_feature_requested())
+ return;
+ try {
+ OpenType::KernTable kern(otf.table("kern"), errh);
+ Vector<OpenType::Positioning> poss;
+ bool understood = kern.unparse_automatics(poss, errh);
+ int nunderstood = metrics.apply(poss);
+
+ // mark as used
+ int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
+ feature_usage.find_force(OpenType::Tag("kern").value()) |= d;
+ } catch (OpenType::BlankTable) {
+ // nada
+ } catch (OpenType::Error e) {
+ errh->warning("kern %<%s%> error, continuing", e.description.c_str());
+ }
+}
+
+static void
+do_gpos(Metrics& metrics, const OpenType::Font& otf, HashMap<uint32_t, int>& feature_usage, ErrorHandler* errh)
+{
+ OpenType::Gpos gpos(otf.table("GPOS"), errh);
+ Vector<Lookup> lookups(gpos.nlookups(), Lookup());
+ find_lookups(gpos.script_list(), gpos.feature_list(), lookups, errh);
+
+ // OpenType recommends that if GPOS exists, but the "kern" feature loads
+ // no lookups, we use the TrueType "kern" table, if any.
+ if (kern_feature_requested()) {
+ OpenType::Tag kern_tag("kern");
+ for (Lookup *l = lookups.begin(); l != lookups.end(); ++l)
+ if (std::find(l->features.begin(), l->features.end(), kern_tag) != l->features.end())
+ goto skip_ttf_kern;
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ skip_ttf_kern: ;
+ }
+
+ Vector<OpenType::Positioning> poss;
+ for (int i = 0; i < lookups.size(); i++)
+ if (lookups[i].used) {
+ OpenType::GposLookup l = gpos.lookup(i);
+ poss.clear();
+ bool understood = l.unparse_automatics(poss, errh);
+ int nunderstood = metrics.apply(poss);
+
+ // mark as used
+ int d = (understood && nunderstood == poss.size() ? F_GPOS_ALL : (nunderstood ? F_GPOS_PART : 0)) + F_GPOS_TRY;
+ for (int j = 0; j < lookups[i].features.size(); j++)
+ feature_usage.find_force(lookups[i].features[j].value()) |= d;
+ }
+}
+
+static void
+do_math_spacing(Metrics &metrics, const FontInfo &finfo,
+ const DvipsEncoding &dvipsenc)
+{
+ Transform font_xform;
+ if (extend)
+ font_xform.scale(extend, 1);
+ if (slant)
+ font_xform.shear(slant);
+ CharstringBounds boundser(font_xform);
+
+ double x_height = finfo.x_height(font_xform);
+ double actual_slant = font_slant(finfo);
+ int boundary_char = dvipsenc.boundary_char();
+
+ double bounds[4], width;
+
+ for (int code = 0; code < metrics.encoding_size(); code++)
+ if (metrics.was_base_glyph(code)
+ && code != boundary_char
+ && char_bounds(bounds, width, finfo, font_xform, metrics.unicode(code))) {
+ int left_sb = (bounds[0] < 0 ? (int) ceil(-bounds[0]) : 0);
+ metrics.add_single_positioning(code, left_sb, 0, left_sb);
+
+ if (skew_char >= 0 && code < 256) {
+ double sheight = std::max(bounds[3], x_height) - 0.5 * x_height;
+ double right_sb = std::max(bounds[2] - width, 0.0);
+ double desired = left_sb + 0.5 * width + actual_slant * sheight + 0.25 * right_sb;
+ double computed = 0.5 * (left_sb + width + right_sb);
+ int skew = (int) (desired - computed);
+ metrics.add_kern(code, skew_char, skew);
+ }
+ }
+}
+
+static void
+do_file(const String &otf_filename, const OpenType::Font &otf,
+ const DvipsEncoding &dvipsenc_in, bool dvipsenc_literal,
+ ErrorHandler *errh)
+{
+ FontInfo finfo(&otf, errh);
+ if (!finfo.ok())
+ return;
+ if (!finfo.cff)
+ errh->warning("TrueType-flavored font support is experimental");
+ if (override_is_fixed_pitch)
+ finfo.set_is_fixed_pitch(is_fixed_pitch);
+ if (override_italic_angle)
+ finfo.set_italic_angle(italic_angle);
+ if (override_x_height != FontInfo::x_height_auto)
+ finfo.set_x_height(override_x_height, x_height);
+
+ // save glyph names
+ Vector<PermString> glyph_names;
+ finfo.glyph_names(glyph_names);
+ OpenType::debug_glyph_names = glyph_names;
+
+ // set typeface name from font family name
+ {
+ String typeface = finfo.family_name();
+
+ // make it reasonable for the shell
+ StringAccum sa;
+ for (int i = 0; i < typeface.length(); i++)
+ if (isalnum((unsigned char) typeface[i]) || typeface[i] == '_' || typeface[i] == '-' || typeface[i] == '.' || typeface[i] == ',' || typeface[i] == '+')
+ sa << typeface[i];
+
+ set_typeface(sa.length() ? sa.take_string() : font_name, false);
+ }
+
+ // initialize encoding
+ DvipsEncoding dvipsenc(dvipsenc_in); // make copy
+ Metrics metrics(finfo.program(), finfo.nglyphs());
+ // encode boundary glyph at 256; pretend its Unicode value is '\n'
+ metrics.encode(256, '\n', metrics.boundary_glyph());
+ if (dvipsenc_literal)
+ dvipsenc.make_metrics(metrics, finfo, 0, true, errh);
+ else {
+ T1Secondary secondary(finfo, font_name, otf_filename);
+ dvipsenc.make_metrics(metrics, finfo, &secondary, false, errh);
+ }
+
+ // maintain statistics about features
+ HashMap<uint32_t, int> feature_usage(0);
+
+ // apply activated GSUB features
+ try {
+ do_gsub(metrics, otf, dvipsenc, dvipsenc_literal, feature_usage, glyph_names, errh);
+ } catch (OpenType::BlankTable) {
+ // nada
+ } catch (OpenType::Error e) {
+ errh->warning("GSUB %<%s%> error, continuing", e.description.c_str());
+ }
+
+ // apply LIGKERN ligature commands to the result
+ dvipsenc.apply_ligkern_lig(metrics, errh);
+
+ // test fake ligature mechanism
+ //metrics.add_threeligature('T', 'h', 'e', '0');
+
+ // reencode characters to fit within 8 bytes (+ 1 for the boundary)
+ if (!dvipsenc_literal)
+ metrics.shrink_encoding(257, dvipsenc_in, errh);
+
+ // apply activated GPOS features
+ try {
+ do_gpos(metrics, otf, feature_usage, errh);
+ } catch (OpenType::BlankTable) {
+ do_try_ttf_kern(metrics, otf, feature_usage, errh);
+ } catch (OpenType::Error e) {
+ errh->warning("GPOS %<%s%> error, continuing", e.description.c_str());
+ }
+
+ // apply LIGKERN kerning and POS positioning commands to the result
+ dvipsenc.apply_ligkern_kern(metrics, errh);
+ dvipsenc.apply_position(metrics, errh);
+
+ // use prespecified raw fonts
+ for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
+ if (!(*be)->secondary) {
+ Vector<int> mapp;
+ (*be)->encoding.make_base_mappings(mapp, finfo);
+ metrics.apply_base_encoding((*be)->font_name, (*be)->encoding, mapp);
+ }
+
+ // remove extra characters
+ metrics.cut_encoding(257);
+ //metrics.unparse();
+ int boundary_char = dvipsenc.boundary_char();
+
+ // apply letterspacing, if any
+ if (letterspace)
+ for (int code = 0; code < metrics.encoding_size(); code++)
+ if (metrics.was_base_glyph(code) && code != boundary_char) {
+ metrics.add_single_positioning(code, letterspace / 2, 0, letterspace);
+ if (code < 256) {
+ metrics.add_kern(code, 256, -letterspace / 2);
+ metrics.add_kern(256, code, -letterspace / 2);
+ }
+ }
+
+ // apply math letterspacing, if any
+ if (math_spacing)
+ do_math_spacing(metrics, finfo, dvipsenc);
+
+ // reencode right components of boundary_glyph as boundary_char
+ if (metrics.reencode_right_ligkern(256, boundary_char) > 0
+ && boundary_char < 0) {
+ errh->warning("no boundary character, ignoring some ligatures and/or kerns\n");
+ errh->message("(You may want to try the --boundary-char option.)");
+ }
+
+ // report unused and underused features if any
+ report_underused_features(feature_usage, errh);
+
+ // figure out our FONTNAME
+ if (!font_name) {
+ // derive font name from OpenType font name
+ font_name = finfo.postscript_name();
+ if (encoding_file) {
+ int slash = encoding_file.find_right('/') + 1;
+ int dot = encoding_file.find_right('.');
+ if (dot < slash) // includes dot < 0 case
+ dot = encoding_file.length();
+ font_name += String("--") + encoding_file.substring(slash, dot - slash);
+ }
+ if (interesting_scripts.size() != 2 || interesting_scripts[0] != OpenType::Tag("latn") || interesting_scripts[1].valid())
+ for (int i = 0; i < interesting_scripts.size(); i += 2) {
+ font_name += String("--S") + interesting_scripts[i].text();
+ if (interesting_scripts[i+1].valid())
+ font_name += String(".") + interesting_scripts[i+1].text();
+ }
+ for (int i = 0; i < interesting_features.size(); i++)
+ if (feature_usage[interesting_features[i].value()])
+ font_name += String("--F") + interesting_features[i].text();
+ }
+
+ // output encoding
+ if (dvipsenc_literal) {
+ out_encoding_name = dvipsenc_in.name();
+ out_encoding_file = dvipsenc_in.filename();
+ } else
+ output_encoding(metrics, glyph_names, errh);
+
+ // set up coding scheme
+ if (metrics.coding_scheme())
+ metrics.set_design_units(1);
+ else
+ metrics.set_coding_scheme(out_encoding_name);
+
+ // force no type 1
+ if (!finfo.cff && (output_flags & G_TYPE1)) {
+ errh->warning("assuming --no-type1 since this font is TrueType-flavored");
+ output_flags &= ~G_TYPE1;
+ }
+
+ // output
+ ::otf_filename = otf_filename;
+ output_metrics(metrics, finfo.postscript_name(), dvipsenc.boundary_char(),
+ finfo,
+ out_encoding_name, out_encoding_file,
+ font_name, main_dvips_map, errh);
+}
+
+
+String
+installed_metrics_font_name(const String &base_font_name, const String &secondary)
+{
+ for (BaseEncoding **be = base_encodings.begin(); be != base_encodings.end(); be++)
+ if ((*be)->secondary == secondary && ::font_name == base_font_name)
+ return (*be)->font_name;
+ return String();
+}
+
+
+extern "C" {
+static int
+clp_parse_char(Clp_Parser *clp, const char *arg, int complain, void *)
+{
+ if (arg[0] && !arg[1] && !isdigit((unsigned char) arg[0])) {
+ clp->val.i = (unsigned char)arg[0];
+ return 1;
+ } else if (arg[0] == '-' || isdigit((unsigned char) arg[0])) {
+ char *end;
+ clp->val.i = strtol(arg, &end, 10);
+ if (clp->val.i <= 255 && !*end)
+ return 1;
+ }
+ if (complain)
+ Clp_OptionError(clp, "'%O' expects a character, not '%s'", arg);
+ return 0;
+}
+}
+
+static void
+parse_base_encodings(const String &filename, ErrorHandler *errh)
+{
+ String str = read_file(filename, errh, true);
+ String print_filename = (filename == "-" ? "<stdin>" : filename) + ":";
+ int lineno = 1;
+ str.c_str();
+ const char *s_end = str.end();
+ for (const char *s = str.begin(); s != s_end; ) {
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ // skip comments and blank lines
+ if (s != s_end && *s != '%' && *s != '#' && *s != '\n' && *s != '\r') {
+ const char *w1 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ BaseEncoding *be = new BaseEncoding;
+ be->font_name = str.substring(w1, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ const char *w2 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ String efile = str.substring(w2, s);
+ while (s != s_end && isspace((unsigned char) *s) && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && !isspace((unsigned char) *s) && *s != '%' && *s != '#') {
+ const char *w3 = s;
+ while (s != s_end && !isspace((unsigned char) *s))
+ s++;
+ be->secondary = str.substring(w3, s);
+ }
+ LandmarkErrorHandler lerrh(errh, print_filename + String(lineno));
+ int before = lerrh.nerrors();
+ if (be->secondary)
+ /* encoding ignored */;
+ else if (!efile)
+ lerrh.error("missing encoding name");
+ else if (String path = locate_encoding(efile, errh))
+ be->encoding.parse(path, true, true, &lerrh);
+ else
+ lerrh.error("encoding %<%s%> not found", efile.c_str());
+ if (lerrh.nerrors() == before)
+ base_encodings.push_back(be);
+ else
+ delete be;
+ }
+ while (s != s_end && *s != '\n' && *s != '\r')
+ s++;
+ if (s != s_end && *s == '\r')
+ s++;
+ if (s != s_end && *s == '\n')
+ s++;
+ lineno++;
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifndef WIN32
+ handle_sigchld();
+#endif
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ Clp_AddType(clp, CHAR_OPTTYPE, 0, clp_parse_char, 0);
+ program_name = Clp_ProgramName(clp);
+#if HAVE_KPATHSEA
+ kpsei_init(argv[0], "lcdftools");
+#endif
+#ifdef HAVE_CTIME
+ {
+ time_t t = time(0);
+ char *c = ctime(&t);
+ current_time = " on " + String(c).substring(0, -1); // get rid of \n
+ }
+#endif
+ for (int i = 0; i < argc; i++)
+ invocation << (i ? " " : "") << argv[i];
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ const char *input_file = 0;
+ Vector<String> glyphlist_files;
+ bool literal_encoding = false;
+ bool have_encoding_file = false;
+ Vector<String> ligkern;
+ Vector<String> pos;
+ Vector<String> unicoding;
+ Vector<String> base_encoding_files;
+ bool no_ecommand = false, default_ligkern = true;
+ int warn_missing = -1;
+ unsigned specified_output_flags = 0;
+ String codingscheme;
+ const char* odirs[NUMODIR + 1];
+ for (int i = 0; i <= NUMODIR; ++i) {
+ odirs[i] = 0;
+ }
+
+ GlyphFilter current_substitution_filter;
+ GlyphFilter current_alternate_filter;
+ GlyphFilter* current_filter_ptr = &null_filter;
+ Vector<GlyphFilter*> allocated_filters;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case SCRIPT_OPT: {
+ String arg = clp->vstr;
+ int period = arg.find_left('.');
+ OpenType::Tag scr(period <= 0 ? arg : arg.substring(0, period));
+ if (scr.valid() && period > 0) {
+ OpenType::Tag lang(arg.substring(period + 1));
+ if (lang.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(lang);
+ } else
+ usage_error(errh, "bad language tag");
+ } else if (scr.valid()) {
+ interesting_scripts.push_back(scr);
+ interesting_scripts.push_back(OpenType::Tag());
+ } else
+ usage_error(errh, "bad script tag");
+ break;
+ }
+
+ case FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ interesting_features.push_back(t);
+ feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case LETTER_FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (feature_filters[t])
+ usage_error(errh, "feature %<%s%> included twice", t.text().c_str());
+ else {
+ interesting_features.push_back(t);
+ GlyphFilter* gf = new GlyphFilter;
+ gf->add_substitution_filter("<Letter>", false, errh);
+ *gf += current_alternate_filter;
+ feature_filters.insert(t, gf);
+ }
+ break;
+ }
+
+ case SUBS_FILTER_OPT:
+ current_substitution_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_SUBS_OPT:
+ case INCLUDE_SUBS_OPT:
+ current_substitution_filter.add_substitution_filter(clp->vstr, opt == EXCLUDE_SUBS_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_SUBS_OPT:
+ current_substitution_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->vstr;
+ have_encoding_file = true;
+ break;
+
+ case LITERAL_ENCODING_OPT:
+ if (encoding_file)
+ usage_error(errh, "encoding specified twice");
+ encoding_file = clp->vstr;
+ have_encoding_file = true;
+ literal_encoding = true;
+ break;
+
+ case BASE_ENCODINGS_OPT:
+ base_encoding_files.push_back(clp->vstr);
+ break;
+
+ case EXTEND_OPT:
+ if (extend)
+ usage_error(errh, "extend value specified twice");
+ extend = clp->val.d;
+ break;
+
+ case SLANT_OPT:
+ if (slant)
+ usage_error(errh, "slant value specified twice");
+ slant = clp->val.d;
+ break;
+
+ case LETTERSPACE_OPT:
+ if (letterspace)
+ usage_error(errh, "letterspacing value specified twice");
+ letterspace = clp->val.i;
+ break;
+
+ case SPACE_FACTOR_OPT:
+ if (space_factor != 1)
+ usage_error(errh, "space factor specified twice");
+ space_factor = clp->val.d;
+ break;
+
+ case MATH_SPACING_OPT:
+ math_spacing = !clp->negated;
+ if (math_spacing && clp->have_val) {
+ if (clp->val.i < 0 || clp->val.i > 255)
+ usage_error(errh, "--math-spacing skew character must be between 0 and 255");
+ skew_char = clp->val.i;
+ }
+ break;
+
+ case DESIGN_SIZE_OPT:
+ if (design_size > 0)
+ usage_error(errh, "design size value specified twice");
+ else if (clp->val.d <= 0)
+ usage_error(errh, "design size must be > 0");
+ design_size = clp->val.d;
+ break;
+
+ case LIGKERN_OPT:
+ ligkern.push_back(clp->vstr);
+ break;
+
+ case POSITION_OPT:
+ pos.push_back(clp->vstr);
+ break;
+
+ case WARN_MISSING_OPT:
+ warn_missing = !clp->negated;
+ break;
+
+ case NO_ECOMMAND_OPT:
+ no_ecommand = true;
+ break;
+
+ case DEFAULT_LIGKERN_OPT:
+ default_ligkern = !clp->negated;
+ break;
+
+ case BOUNDARY_CHAR_OPT:
+ ligkern.push_back(String("|| = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_CHAR_OPT:
+ ligkern.push_back(String("^^ = ") + String(clp->val.i));
+ break;
+
+ case ALTSELECTOR_FEATURE_OPT: {
+ OpenType::Tag t(clp->vstr);
+ if (!t.valid())
+ usage_error(errh, "bad feature tag");
+ else if (altselector_feature_filters[t])
+ usage_error(errh, "altselector feature %<%s%> included twice", t.text().c_str());
+ else {
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ altselector_features.push_back(t);
+ altselector_feature_filters.insert(t, current_filter_ptr);
+ }
+ break;
+ }
+
+ case ALTERNATES_FILTER_OPT:
+ current_alternate_filter = null_filter;
+ /* fallthru */
+ case EXCLUDE_ALTERNATES_OPT:
+ case INCLUDE_ALTERNATES_OPT:
+ current_alternate_filter.add_alternate_filter(clp->vstr, opt == EXCLUDE_ALTERNATES_OPT, errh);
+ current_filter_ptr = 0;
+ break;
+
+ case CLEAR_ALTERNATES_OPT:
+ current_alternate_filter = null_filter;
+ current_filter_ptr = 0;
+ break;
+
+ case UNICODING_OPT:
+ unicoding.push_back(clp->vstr);
+ break;
+
+ case CODINGSCHEME_OPT:
+ if (codingscheme)
+ usage_error(errh, "coding scheme specified twice");
+ codingscheme = clp->vstr;
+ if (codingscheme.length() > 39)
+ errh->warning("only first 39 characters of coding scheme are significant");
+ if (codingscheme.find_left('(') >= 0 || codingscheme.find_left(')') >= 0)
+ usage_error(errh, "coding scheme cannot contain parentheses");
+ break;
+
+ case AUTOMATIC_OPT:
+ automatic = !clp->negated;
+ break;
+
+ case VENDOR_OPT:
+ if (!set_vendor(clp->vstr))
+ usage_error(errh, "vendor name specified twice");
+ break;
+
+ case TYPEFACE_OPT:
+ if (!set_typeface(clp->vstr, true))
+ usage_error(errh, "typeface name specified twice");
+ break;
+
+ case VIRTUAL_OPT:
+ if (clp->negated)
+ output_flags &= ~G_VMETRICS;
+ else
+ output_flags |= G_VMETRICS;
+ specified_output_flags |= G_VMETRICS;
+ break;
+
+ case NO_ENCODING_OPT:
+ case NO_TYPE1_OPT:
+ case NO_DOTLESSJ_OPT:
+ case NO_UPDMAP_OPT:
+ case UPDMAP_SYS_OPT:
+ output_flags &= ~(opt - NO_OUTPUT_OPTS);
+ specified_output_flags |= opt - NO_OUTPUT_OPTS;
+ break;
+
+ case TRUETYPE_OPT:
+ case TYPE42_OPT:
+ case UPDMAP_USER_OPT:
+ if (!clp->negated)
+ output_flags |= (opt - YES_OUTPUT_OPTS);
+ else
+ output_flags &= ~(opt - YES_OUTPUT_OPTS);
+ specified_output_flags |= opt - YES_OUTPUT_OPTS;
+ break;
+
+ case OUTPUT_ENCODING_OPT:
+ if (out_encoding_file)
+ usage_error(errh, "encoding output file specified twice");
+ out_encoding_file = (clp->have_val ? clp->vstr : "-");
+ output_flags = G_ENCODING;
+ specified_output_flags = -1;
+ break;
+
+ case MINIMUM_KERN_OPT:
+ minimum_kern = clp->val.d;
+ break;
+
+ case MAP_FILE_OPT:
+ if (clp->negated)
+ output_flags &= ~G_PSFONTSMAP;
+ else {
+ output_flags |= G_PSFONTSMAP;
+ if (!set_map_file(clp->vstr))
+ usage_error(errh, "map file specified twice");
+ }
+ specified_output_flags |= G_PSFONTSMAP;
+ break;
+
+ case PL_OPT:
+ if (clp->negated)
+ output_flags &= ~G_ASCII;
+ else
+ output_flags |= G_ASCII;
+ specified_output_flags |= G_ASCII;
+ break;
+
+ case TFM_OPT:
+ if (clp->negated)
+ output_flags &= ~G_BINARY;
+ else
+ output_flags |= G_BINARY;
+ specified_output_flags |= G_BINARY;
+ break;
+
+ case ENCODING_DIR_OPT:
+ case TFM_DIR_OPT:
+ case PL_DIR_OPT:
+ case VF_DIR_OPT:
+ case VPL_DIR_OPT:
+ case TYPE1_DIR_OPT:
+ case TRUETYPE_DIR_OPT:
+ case TYPE42_DIR_OPT:
+ case DIR_OPT:
+ if (!odirs[opt - DIR_OPTS])
+ odirs[opt - DIR_OPTS] = clp->vstr;
+ else
+ usage_error(errh, "%s directory specified twice", odirname(opt - DIR_OPTS));
+ break;
+
+ case FONT_NAME_OPT:
+ font_name:
+ if (font_name)
+ usage_error(errh, "font name specified twice");
+ font_name = clp->vstr;
+ break;
+
+ case FIXED_PITCH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !clp->negated;
+ break;
+
+ case PROPORTIONAL_WIDTH_OPT:
+ override_is_fixed_pitch = true;
+ is_fixed_pitch = !!clp->negated;
+ break;
+
+ case ITALIC_ANGLE_OPT:
+ override_italic_angle = true;
+ italic_angle = clp->val.d;
+ break;
+
+ case GLYPHLIST_OPT:
+ glyphlist_files.push_back(clp->vstr);
+ break;
+
+ case QUERY_FEATURES_OPT:
+ usage_error(errh, "run %<otfinfo --query-features%> instead");
+ break;
+
+ case QUERY_SCRIPTS_OPT:
+ usage_error(errh, "run %<otfinfo --query-scripts%> instead");
+ break;
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ // 9.Nov.05 -- need a new SilentErrorHandler, because we use
+ // the base SilentErrorHandler elsewhere to ignore errors
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERBOSE_OPT:
+ verbose = !clp->negated;
+ break;
+
+ case NOCREATE_OPT:
+ no_create = clp->negated;
+ break;
+
+ case FORCE_OPT:
+ force = !clp->negated;
+ break;
+
+ case KPATHSEA_DEBUG_OPT:
+#if HAVE_KPATHSEA
+ kpsei_set_debug_flags(clp->val.u);
+#else
+ errh->warning("Not compiled with kpathsea!");
+#endif
+ break;
+
+ case X_HEIGHT_OPT: {
+ char* ends;
+ if (strcmp(clp->vstr, "auto") == 0)
+ override_x_height = FontInfo::x_height_auto;
+ else if (strcmp(clp->vstr, "x") == 0)
+ override_x_height = FontInfo::x_height_x;
+ else if (strcmp(clp->vstr, "font") == 0
+ || strcmp(clp->vstr, "os/2") == 0)
+ override_x_height = FontInfo::x_height_os2;
+ else if ((x_height = strtod(clp->vstr, &ends)) >= 0
+ && *ends == 0 && *clp->vstr != 0)
+ override_x_height = FontInfo::x_height_explicit;
+ else
+ usage_error(errh, "bad --x-height option");
+ break;
+ }
+
+ case VERSION_OPT:
+ printf("otftotfm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2002-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && font_name)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto font_name;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ // check for odd option combinations
+ if (warn_missing > 0 && !(output_flags & G_VMETRICS))
+ errh->warning("%<--warn-missing%> has no effect with %<--no-virtual%>");
+ if (!(specified_output_flags & (G_BINARY | G_ASCII)))
+ output_flags |= G_BINARY;
+
+ // set up file names
+ if (!input_file)
+ usage_error(errh, "no font filename provided");
+ if (encoding_file == "-")
+ encoding_file = "";
+
+ // set up output directories
+ if (odirs[NUMODIR]) {
+ for (int i = 0; i < NUMODIR; ++i)
+ if (!odirs[i])
+ odirs[i] = odirs[NUMODIR];
+ }
+ for (int i = 0; i < NUMODIR; ++i)
+ if (odirs[i])
+ setodir(i, odirs[i]);
+
+ // set up feature filters
+ if (!altselector_features.size()) {
+ if (!current_filter_ptr) {
+ current_filter_ptr = new GlyphFilter(current_substitution_filter + current_alternate_filter);
+ allocated_filters.push_back(current_filter_ptr);
+ }
+ altselector_features.push_back(OpenType::Tag("dlig"));
+ altselector_feature_filters.insert(OpenType::Tag("dlig"), current_filter_ptr);
+ altselector_features.push_back(OpenType::Tag("salt"));
+ altselector_feature_filters.insert(OpenType::Tag("salt"), current_filter_ptr);
+ } else if (!current_filter_ptr) {
+ errh->warning("some filtering options ignored");
+ errh->message("(--include-*, --exclude-*, and --*-filter options must occur\nbefore the feature options to which they should apply.)");
+ }
+
+ try {
+ // read font
+ otf_data = read_file(input_file, errh);
+ if (errh->nerrors())
+ exit(1);
+
+ LandmarkErrorHandler cerrh(errh, printable_filename(input_file));
+ BailErrorHandler bail_errh(&cerrh);
+
+ OpenType::Font otf(otf_data, &bail_errh);
+ assert(otf.ok());
+
+ // figure out scripts we care about
+ if (!interesting_scripts.size()) {
+ interesting_scripts.push_back(Efont::OpenType::Tag("latn"));
+ interesting_scripts.push_back(Efont::OpenType::Tag());
+ }
+ std::sort(interesting_features.begin(), interesting_features.end());
+ std::sort(altselector_features.begin(), altselector_features.end());
+
+ // find glyphlist
+ if (!glyphlist_files.size()) {
+#if HAVE_KPATHSEA
+ if (String g = kpsei_find_file("glyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("glyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
+#endif
+ glyphlist_files.push_back(GLYPHLISTDIR "/glyphlist.txt");
+#if HAVE_KPATHSEA
+ if (String g = kpsei_find_file("texglyphlist.txt", KPSEI_FMT_MAP)) {
+ glyphlist_files.push_back(g);
+ if (verbose)
+ errh->message("texglyphlist.txt found with kpathsea at %s", g.c_str());
+ } else
+#endif
+ glyphlist_files.push_back(GLYPHLISTDIR "/texglyphlist.txt");
+ }
+
+ // read glyphlist
+ for (String *g = glyphlist_files.begin(); g < glyphlist_files.end(); g++)
+ if (String s = read_file(*g, errh, true))
+ DvipsEncoding::add_glyphlist(s);
+
+ // read base encodings
+ for (String *s = base_encoding_files.begin(); s < base_encoding_files.end(); s++)
+ parse_base_encodings(*s, errh);
+
+ // read encoding
+ DvipsEncoding dvipsenc;
+ if (encoding_file) {
+ if (String path = locate_encoding(encoding_file, errh))
+ dvipsenc.parse(path, no_ecommand, no_ecommand, errh);
+ else
+ errh->fatal("encoding %<%s%> not found", encoding_file.c_str());
+ } else {
+ String cff_data(otf.table("CFF"));
+ if (!cff_data) {
+ errh->error("explicit encoding required for TrueType fonts");
+ errh->message("(Use %<-e ENCODING%> to choose an encoding. %<-e texnansx%> often works.)");
+ exit(1);
+ } else if (!have_encoding_file) {
+ errh->warning("no encoding provided");
+ errh->message("(Use %<-e ENCODING%> to choose an encoding. %<-e texnansx%> often works,\nor say %<-e -%> to turn off this warning.)");
+ }
+
+ // use encoding from font
+ Cff cff(cff_data, otf.units_per_em(), &bail_errh);
+ Cff::FontParent *font = cff.font(PermString(), &bail_errh);
+ assert(cff.ok() && font->ok());
+ if (Type1Encoding *t1e = font->type1_encoding()) {
+ for (int i = 0; i < 256; i++)
+ dvipsenc.encode(i, (*t1e)[i]);
+ } else
+ errh->fatal("font has no encoding, specify one explicitly");
+ }
+
+ // apply default ligkern commands
+ if (default_ligkern)
+ dvipsenc.parse_ligkern(default_ligkerns, 0, ErrorHandler::silent_handler());
+
+ // apply command-line ligkern commands and coding scheme
+ cerrh.set_landmark("--ligkern command");
+ for (int i = 0; i < ligkern.size(); i++)
+ dvipsenc.parse_ligkern(ligkern[i], 1, &cerrh);
+ cerrh.set_landmark("--position command");
+ for (int i = 0; i < pos.size(); i++)
+ dvipsenc.parse_position(pos[i], 1, &cerrh);
+ cerrh.set_landmark("--unicoding command");
+ for (int i = 0; i < unicoding.size(); i++)
+ dvipsenc.parse_unicoding(unicoding[i], 1, &cerrh);
+ if (codingscheme)
+ dvipsenc.set_coding_scheme(codingscheme);
+ if (warn_missing >= 0)
+ dvipsenc.set_warn_missing(warn_missing);
+
+ do_file(input_file, otf, dvipsenc, literal_encoding, errh);
+
+ } catch (OpenType::Error e) {
+ errh->error("unhandled exception %<%s%>", e.description.c_str());
+ }
+
+ for (int i = 0; i < allocated_filters.size(); ++i)
+ delete allocated_filters[i];
+ Clp_DeleteParser(clp);
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh
new file mode 100644
index 00000000000..368a7b8135d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/otftotfm.hh
@@ -0,0 +1,24 @@
+#ifndef OTFTOTFM_OTFTOTFM_HH
+#define OTFTOTFM_OTFTOTFM_HH
+#include <lcdf/string.hh>
+class Metrics;
+class FontInfo;
+class StringAccum;
+class ErrorHandler;
+
+String suffix_font_name(const String &font_name, const String &suffix);
+
+String installed_metrics_font_name(const String &font_name, const String &secondary);
+
+void output_metrics(Metrics &metrics, const String &ps_name, int boundary_char,
+ const FontInfo &finfo,
+ const String &encoding_name, const String &encoding_file,
+ const String &font_name,
+ String (*dvips_include)(const String &ps_name, const FontInfo &, ErrorHandler *),
+ ErrorHandler *errh);
+
+double font_cap_height(const FontInfo &, const Transform &);
+double font_ascender(const FontInfo &, const Transform &);
+double font_slant(const FontInfo &);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc
new file mode 100644
index 00000000000..64343f7db21
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.cc
@@ -0,0 +1,706 @@
+/* secondary.{cc,hh} -- code for generating fake glyphs
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#include <config.h>
+#include "secondary.hh"
+#include "metrics.hh"
+#include "automatic.hh"
+#include "otftotfm.hh"
+#include "util.hh"
+#include <efont/t1bounds.hh>
+#include <efont/t1font.hh>
+#include <efont/t1rw.hh>
+#include <efont/otfname.hh>
+#include <efont/otfos2.hh>
+#include <efont/otfpost.hh>
+#include <efont/t1csgen.hh>
+#include <efont/t1unparser.hh>
+#include <efont/ttfcs.hh>
+#include <lcdf/straccum.hh>
+#include <stdarg.h>
+#include <errno.h>
+#include <limits.h>
+#include <algorithm>
+
+enum {
+ U_EXCLAMDOWN = 0x00A1, // U+00A1 INVERTED EXCLAMATION MARK
+ U_DEGREE = 0x00B0, // U+00B0 DEGREE SIGN
+ U_QUESTIONDOWN = 0x00BF, // U+00BF INVERTED QUESTION MARK
+ U_IJ = 0x0132, // U+0132 LATIN CAPITAL LIGATURE IJ
+ U_ij = 0x0133, // U+0133 LATIN SMALL LIGATURE IJ
+ U_DOTLESSJ = 0x0237, // U+0237 LATIN SMALL LETTER DOTLESS J
+ U_RINGABOVE = 0x02DA, // U+02DA RING ABOVE
+ U_COMBININGRINGABOVE = 0x030A, // U+030A COMBINING RING ABOVE
+ U_CWM = 0x200C, // U+200C ZERO WIDTH NON-JOINER
+ U_ENDASH = 0x2013, // U+2013 EN DASH
+ U_PERTENTHOUSAND = 0x2031, // U+2031 PER TEN THOUSAND SIGN
+ U_INTERROBANG = 0x203D, // U+203D INTERROBANG
+ U_FRACTION = 0x2044, // U+2044 FRACTION SLASH
+ U_CENTIGRADE = 0x2103, // U+2103 DEGREE CELSIUS
+ U_ASTERISKMATH = 0x2217, // U+2217 ASTERISK OPERATOR
+ U_BARDBL = 0x2225, // U+2225 PARALLEL TO
+ U_VISIBLESPACE = 0x2423, // U+2423 OPEN BOX
+ U_DBLBRACKETLEFT = 0x27E6, // U+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ U_DBLBRACKETRIGHT = 0x27E7, // U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ U_INTERROBANGDOWN = 0x2E18, // U+2E18 INVERTED INTERROBANG
+ U_ALTSELECTOR = 0xD802, // invalid Unicode
+ U_CAPITALCWM = 0xD809, // invalid Unicode
+ U_ASCENDERCWM = 0xD80A, // invalid Unicode
+ U_TWELVEUDASH = 0xD80C, // invalid Unicode
+ U_RINGFITTED = 0xD80D, // invalid Unicode
+
+ // BEGIN BACKWARDS COMPATIBILITY -- newer texglyphlist.txt does not include
+ // these code points
+ U_SS = 0xD800, // invalid Unicode
+ U_SSSMALL = 0xD803, // invalid Unicode
+ U_FFSMALL = 0xD804, // invalid Unicode
+ U_FISMALL = 0xD805, // invalid Unicode
+ U_FLSMALL = 0xD806, // invalid Unicode
+ U_FFISMALL = 0xD807, // invalid Unicode
+ U_FFLSMALL = 0xD808, // invalid Unicode
+ // END BACKWARDS COMPATIBILITY
+
+ U_VS1 = 0xFE00,
+ U_VS16 = 0xFE0F,
+ U_VS17 = 0xE0100,
+ U_VS256 = 0xE01FF,
+ U_DOTLESSJ_2 = 0xF6BE,
+ U_THREEQUARTERSEMDASH = 0xF6DE,
+ U_FSMALL = 0xF766,
+ U_ISMALL = 0xF769,
+ U_LSMALL = 0xF76C,
+ U_SSMALL = 0xF773,
+ U_MATHDOTLESSJ = 0x1D6A5 // U+1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J
+};
+
+
+FontInfo::FontInfo(const Efont::OpenType::Font *otf_, ErrorHandler *errh)
+ : otf(otf_), cmap(0), cff_file(0), cff(0), post(0), name(0), _nglyphs(-1),
+ _got_glyph_names(false), _ttb_program(0), _override_is_fixed_pitch(false),
+ _override_italic_angle(false), _override_x_height(x_height_auto)
+{
+ cmap = new Efont::OpenType::Cmap(otf->table("cmap"), errh);
+ assert(cmap->ok());
+
+ if (String cff_string = otf->table("CFF")) {
+ cff_file = new Efont::Cff(cff_string, otf->units_per_em(), errh);
+ if (!cff_file->ok())
+ return;
+ Efont::Cff::FontParent *fp = cff_file->font(PermString(), errh);
+ if (!fp || !fp->ok())
+ return;
+ if (!(cff = dynamic_cast<Efont::Cff::Font *>(fp))) {
+ errh->error("CID-keyed fonts not supported");
+ return;
+ }
+ _nglyphs = cff->nglyphs();
+ }
+
+ if (!cff) {
+ post = new Efont::OpenType::Post(otf->table("post"), errh);
+ // read number of glyphs from 'maxp' -- should probably be elsewhere
+ if (Efont::OpenType::Data maxp = otf->table("maxp"))
+ if (maxp.length() >= 6)
+ _nglyphs = maxp.u16(4);
+ if (_nglyphs < 0 && post->ok())
+ _nglyphs = post->nglyphs();
+ }
+
+ name = new Efont::OpenType::Name(otf->table("name"), errh);
+}
+
+FontInfo::~FontInfo()
+{
+ delete cmap;
+ delete cff_file;
+ delete post;
+ delete name;
+ delete _ttb_program;
+}
+
+bool
+FontInfo::ok() const
+{
+ if (cff)
+ return cmap->ok() && cff->ok();
+ else
+ return post && post->ok() && name && name->ok();
+}
+
+bool
+FontInfo::glyph_names(Vector<PermString> &glyph_names) const
+{
+ program()->glyph_names(glyph_names);
+ return true;
+}
+
+int
+FontInfo::glyphid(PermString name) const
+{
+ if (cff)
+ return cff->glyphid(name);
+ else {
+ if (!_got_glyph_names) {
+ glyph_names(_glyph_names);
+ _got_glyph_names = true;
+ }
+ PermString *found = std::find(_glyph_names.begin(), _glyph_names.end(), name);
+ if (found == _glyph_names.end())
+ return 0;
+ return found - _glyph_names.begin();
+ }
+}
+
+String
+FontInfo::family_name() const
+{
+ if (cff)
+ return cff->dict_string(Efont::Cff::oFamilyName);
+ else
+ return name->english_name(Efont::OpenType::Name::N_FAMILY);
+}
+
+String
+FontInfo::postscript_name() const
+{
+ if (cff)
+ return cff->font_name();
+ else
+ return name->english_name(Efont::OpenType::Name::N_POSTSCRIPT);
+}
+
+const Efont::CharstringProgram *
+FontInfo::program() const
+{
+ if (cff)
+ return cff;
+ else {
+ if (!_ttb_program)
+ _ttb_program = new Efont::TrueTypeBoundsCharstringProgram(otf);
+ return _ttb_program;
+ }
+}
+
+bool
+FontInfo::is_fixed_pitch() const
+{
+ if (_override_is_fixed_pitch)
+ return _is_fixed_pitch;
+ else if (cff) {
+ double d;
+ return (cff->dict_value(Efont::Cff::oIsFixedPitch, &d) && d);
+ } else
+ return post->is_fixed_pitch();
+}
+
+double
+FontInfo::italic_angle() const
+{
+ if (_override_italic_angle)
+ return _italic_angle;
+ else if (cff) {
+ double d;
+ (void) cff->dict_value(Efont::Cff::oItalicAngle, &d);
+ return d;
+ } else
+ return post->italic_angle();
+}
+
+double FontInfo::x_height(const Transform& font_xform) const {
+ if (_override_x_height == x_height_explicit)
+ return _x_height;
+ double x1 = -1, x2 = -1;
+ if (_override_x_height != x_height_os2)
+ // XXX what if 'x', 'm', 'z' were subject to substitution?
+ x1 = char_one_bound(*this, font_xform, 3, false, units_per_em(),
+ (int) 'x', (int) 'm', (int) 'z', 0);
+ if (_override_x_height != x_height_x)
+ try {
+ Efont::OpenType::Os2 os2(otf->table("OS/2"));
+ x2 = (Point(0, os2.x_height()) * font_xform).y;
+ } catch (Efont::OpenType::Bounds) {
+ }
+ static bool warned = false;
+ if (_override_x_height == x_height_auto
+ && x1 >= 0
+ && x2 >= 0
+ && fabs(x1 - x2) > units_per_em() / 50.) {
+ if (!warned) {
+ ErrorHandler* errh = ErrorHandler::default_handler();
+ errh->warning("font x-height and height of %<x%> differ by %d%%", (int) (fabs(x1 - x2) * 100 / units_per_em()));
+ errh->message("(The height of %<x%> is usually more reliable than the x-height, so I%,m\nusing that. Or try --use-x-height or --no-use-x-height.)\n");
+ warned = true;
+ }
+ return x1;
+ } else
+ return x2 >= 0 ? x2 : x1;
+}
+
+
+/* */
+
+Secondary::~Secondary()
+{
+}
+
+bool
+Secondary::encode_uni(int code, PermString name,
+ const uint32_t* uni_begin, const uint32_t* uni_end,
+ Metrics &metrics, ErrorHandler *errh)
+{
+ uint32_t uni = 0;
+ if (uni_begin + 1 == uni_end)
+ uni = *uni_begin;
+
+ SettingSet set(this, metrics);
+ int max_s = 0;
+ while (uni_begin != uni_end) {
+ int s = setting(*uni_begin, set, errh);
+ if (s == 0)
+ return false;
+ max_s = (max_s > s ? max_s : s);
+ ++uni_begin;
+ set.checkpoint();
+ }
+
+ if (uni == U_ALTSELECTOR
+ || (uni >= U_VS1 && uni <= U_VS16)
+ || (uni >= U_VS17 && uni <= U_VS256)) {
+ int selector = 0;
+ if (uni >= U_VS1 && uni <= U_VS16)
+ selector = uni - U_VS1 + 1;
+ else if (uni >= U_VS17 && uni <= U_VS256)
+ selector = uni - U_VS17 + 17;
+ metrics.add_altselector_code(code, selector);
+ name = selector ? permprintf("<vs%d>", selector) : PermString("<altselector>");
+ }
+
+ metrics.encode_virtual(code, name, 0, set.settings(), max_s > 1);
+ return true;
+}
+
+T1Secondary::T1Secondary(const FontInfo &finfo, const String &font_name,
+ const String &otf_file_name)
+ : Secondary(finfo), _font_name(font_name), _otf_file_name(otf_file_name),
+ _units_per_em(finfo.units_per_em()),
+ _xheight((int) ceil(finfo.x_height(Transform()))),
+ _spacewidth(_units_per_em)
+{
+ double bounds[4], width;
+ if (char_bounds(bounds, width, finfo, Transform(), ' '))
+ _spacewidth = (int) ceil(width);
+}
+
+int
+Secondary::setting(uint32_t uni, SettingSet& set, ErrorHandler *errh)
+{
+ if (_next)
+ return _next->setting(uni, set, errh);
+ else
+ return 0;
+}
+
+SettingSet& SettingSet::show(int uni) {
+ if (!ok_)
+ return *this;
+ int code = metrics_.unicode_encoding(uni);
+ if (code < 0) {
+ Glyph glyph = s_->_finfo.cmap->map_uni(uni);
+ if (glyph != 0)
+ code = metrics_.force_encoding(glyph);
+ }
+ if (code < 0) {
+ ok_ = false;
+ while (v_.size() > original_size_)
+ v_.pop_back();
+ } else {
+ if (!v_.empty()
+ && v_.back().op == Setting::SHOW
+ && kern_type_)
+ v_.push_back(Setting(kern_type_));
+ v_.push_back(Setting(Setting::SHOW, code, metrics_.base_glyph(code)));
+ }
+ return *this;
+}
+
+
+static String dotlessj_file_name;
+
+static String
+dotlessj_dvips_include(const String &, const FontInfo &, ErrorHandler *)
+{
+ return "<" + pathname_filename(dotlessj_file_name);
+}
+
+int
+T1Secondary::dotlessj_font(Metrics &metrics, ErrorHandler *errh, Glyph &dj_glyph)
+{
+ if (!_font_name || !_finfo.otf || !_finfo.cff)
+ return -1;
+
+ String dj_name;
+ bool install_metrics;
+ // XXX make sure dotlessj is for the main font?
+ if ((dj_name = installed_metrics_font_name(_font_name, "dotlessj")))
+ install_metrics = false;
+ else {
+ dj_name = suffix_font_name(_font_name, "--lcdfj");
+ install_metrics = true;
+ }
+
+ // is dotlessj already mapped?
+ for (int i = 0; i < metrics.n_mapped_fonts(); i++)
+ if (metrics.mapped_font_name(i) == dj_name)
+ return i;
+
+ if (String filename = installed_type1_dotlessj(_otf_file_name, _finfo.cff->font_name(), (output_flags & G_DOTLESSJ), errh)) {
+
+ // check for special case: "\0" means the font's "j" is already
+ // dotless
+ if (filename == String("\0", 1))
+ return J_NODOT;
+
+ // open dotless-j font file
+ FILE *f = fopen(filename.c_str(), "rb");
+ if (!f) {
+ errh->error("%s: %s", filename.c_str(), strerror(errno));
+ return -1;
+ }
+
+ // read font
+ Efont::Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == 128)
+ reader = new Efont::Type1PFBReader(f);
+ else
+ reader = new Efont::Type1PFAReader(f);
+ Efont::Type1Font *font = new Efont::Type1Font(*reader);
+ delete reader;
+
+ if (!font->ok()) {
+ errh->error("%s: no glyphs in dotless-J font", filename.c_str());
+ delete font;
+ return -1;
+ }
+
+ // find dotless-J character
+ Vector<PermString> glyph_names;
+ font->glyph_names(glyph_names);
+ Vector<PermString>::iterator g = std::find(glyph_names.begin(), glyph_names.end(), "uni0237");
+ if (g == glyph_names.end()) {
+ errh->error("%s: dotless-J font has no %<uni0237%> glyph", filename.c_str());
+ delete font;
+ return -1;
+ }
+ dj_glyph = g - glyph_names.begin();
+
+ // create metrics for dotless-J
+ if (install_metrics) {
+ Metrics dj_metrics(font, 256);
+ dj_metrics.encode('j', U_DOTLESSJ, dj_glyph);
+ ::dotlessj_file_name = filename;
+ output_metrics(dj_metrics, font->font_name(), -1, _finfo, String(), String(), dj_name, dotlessj_dvips_include, errh);
+ } else if (verbose)
+ errh->message("using %<%s%> for dotless-J font metrics", dj_name.c_str());
+
+ // add font to metrics
+ return metrics.add_mapped_font(font, dj_name);
+
+ } else
+ return -1;
+}
+
+int
+T1Secondary::setting(uint32_t uni, SettingSet& set, ErrorHandler *errh)
+{
+ Transform xform;
+ extern int letterspace;
+
+ if (set.show(uni).check())
+ return 1;
+
+ switch (uni) {
+
+ case U_CWM:
+ case U_ALTSELECTOR:
+ set.push_back(Setting::RULE, 0, _xheight);
+ return 1;
+
+ case U_CAPITALCWM:
+ set.push_back(Setting::RULE, 0, font_cap_height(_finfo, xform));
+ return 1;
+
+ case U_ASCENDERCWM:
+ set.push_back(Setting::RULE, 0, font_ascender(_finfo, xform));
+ return 1;
+
+ case U_VISIBLESPACE: {
+ int sb = (int) (0.050 * _units_per_em), h = (int) (0.150 * _units_per_em),
+ lw = (int) (0.040 * _units_per_em);
+ set.move(sb, -h);
+ set.push_back(Setting::RULE, lw, h);
+ set.push_back(Setting::RULE, _spacewidth, lw);
+ set.push_back(Setting::RULE, lw, h);
+ set.move(sb, h);
+ return 2;
+ }
+
+ case U_SS:
+ if (set.show('S').show('S').check())
+ return 1;
+ break;
+
+ case U_SSSMALL:
+ if (set.show(U_SSMALL).show(U_SSMALL).check()
+ || set.show('s').show('s').check())
+ return 1;
+ break;
+
+ case U_FFSMALL:
+ if (set.show(U_FSMALL).show(U_FSMALL).check()
+ || set.show('f').show('f').check())
+ return 1;
+ break;
+
+ case U_FISMALL:
+ if (set.show(U_FSMALL).show(U_ISMALL).check()
+ || set.show('f').show('i').check())
+ return 1;
+ break;
+
+ case U_FLSMALL:
+ if (set.show(U_FSMALL).show(U_LSMALL).check()
+ || set.show('f').show('l').check())
+ return 1;
+ break;
+
+ case U_FFISMALL:
+ if (set.show(U_FSMALL).show(U_FSMALL).show(U_ISMALL).check()
+ || set.show('f').show('f').show('i').check())
+ return 1;
+ break;
+
+ case U_FFLSMALL:
+ if (set.show(U_FSMALL).show(U_FSMALL).show(U_LSMALL).check()
+ || set.show('f').show('f').show('l').check())
+ return 1;
+ break;
+
+ case U_IJ:
+ if (set.show('I').show('J').check())
+ return 1;
+ break;
+
+ case U_ij:
+ if (set.show('i').show('j').check())
+ return 1;
+ break;
+
+ case U_DOTLESSJ:
+ case U_DOTLESSJ_2:
+ case U_MATHDOTLESSJ: {
+ Glyph dj_glyph;
+ int which = dotlessj_font(set.metrics(), errh, dj_glyph);
+ if (which >= 0) {
+ set.push_back(Setting::FONT, which);
+ set.push_back(Setting::SHOW, 'j', dj_glyph);
+ return 2;
+ } else if (which == J_NODOT && set.show('j').check())
+ return 1;
+ break;
+ }
+
+ case U_DBLBRACKETLEFT:
+ if (set.show('[').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, '[', 0);
+ set.move((int) (-0.666 * d - letterspace));
+ }
+ set.show('[');
+ return 1;
+ }
+ break;
+
+ case U_DBLBRACKETRIGHT:
+ if (set.show(']').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, ']', 0);
+ set.move((int) (-0.666 * d - letterspace));
+ }
+ set.show(']');
+ return 1;
+ }
+ break;
+
+ case U_BARDBL:
+ if (set.show('|').check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, Transform(), 4, true, 0, '|', 0);
+ set.move((int) (-0.333 * d - letterspace));
+ }
+ set.show('|');
+ return 1;
+ }
+ break;
+
+ case U_ASTERISKMATH: {
+ double bounds[5];
+ double dropdown = 0;
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '*'))
+ dropdown += std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
+ if (char_bounds(bounds, bounds[4], _finfo, xform, '('))
+ dropdown -= std::max(bounds[3], 0.) + std::min(bounds[1], 0.);
+ int dy = (int) (-dropdown / 2);
+ if (set.move(0, dy).show('*').move(0, -dy).check())
+ return 1;
+ break;
+ }
+
+ case U_TWELVEUDASH:
+ if (set.show(U_ENDASH).check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ set.move((int) (_units_per_em * 0.667 - 2 * d - letterspace));
+ }
+ set.show(U_ENDASH);
+ return 1;
+ }
+ break;
+
+ case U_THREEQUARTERSEMDASH:
+ if (set.show(U_ENDASH).check()) {
+ if (!_finfo.is_fixed_pitch()) {
+ double d = char_one_bound(_finfo, xform, 4, true, 0, U_ENDASH, 0);
+ set.move((int) (_units_per_em * 0.750 - 2 * d - letterspace));
+ }
+ set.show(U_ENDASH);
+ return 1;
+ }
+ break;
+
+ case U_CENTIGRADE:
+ // TODO: set italic correction to that of a 'C'
+ if (set.show(U_DEGREE).kernx(true).show('C').kernx(false).check())
+ return 1;
+ break;
+
+ case U_INTERROBANG: {
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, '?', 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, '!', 0)) * 0.5
+ + 0.050 * _units_per_em;
+ if (set.push_back(Setting::PUSH).move((int) exclam_offset)
+ .show('!').push_back(Setting::POP).show('?').check())
+ return 1;
+ break;
+ }
+
+ case U_INTERROBANGDOWN: {
+ double exclam_offset =
+ (char_one_bound(_finfo, xform, 4, true, 0, U_QUESTIONDOWN, 0)
+ - char_one_bound(_finfo, xform, 4, true, 0, U_EXCLAMDOWN, 0)) * 0.5
+ + 0.050 * _units_per_em;
+ if (set.push_back(Setting::PUSH).move((int) exclam_offset)
+ .show(U_EXCLAMDOWN).push_back(Setting::POP).show(U_QUESTIONDOWN).check())
+ return 1;
+ break;
+ }
+
+ case U_PERTENTHOUSAND:
+ if (set.show(0xF661).kernx(true).show(U_FRACTION)
+ .show(0xF655).show(0xF655).show(0xF655).kernx(false).check())
+ return 1;
+ break;
+
+ case U_RINGFITTED: {
+ int A_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, 'A', 0);
+ uint32_t ring_char = U_RINGABOVE;
+ int ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ if (ring_width <= -_units_per_em) {
+ ring_char = U_COMBININGRINGABOVE;
+ ring_width = char_one_bound(_finfo, xform, 4, true, -_units_per_em, ring_char, 0);
+ }
+ if (A_width > -_units_per_em && ring_width > -_units_per_em) {
+ int offset = (A_width - ring_width) / 2;
+ if (set.move(offset).show(ring_char).move(A_width - ring_width - offset).check()) {
+ return 1;
+ }
+ }
+ break;
+ }
+
+ }
+
+ // variant selectors get the same setting as ALTSELECTOR
+ if ((uni >= U_VS1 && uni <= U_VS16) || (uni >= U_VS17 && uni <= U_VS256))
+ return setting(U_ALTSELECTOR, set, errh);
+
+ // otherwise, try other secondaries
+ return Secondary::setting(uni, set, errh);
+}
+
+
+bool
+char_bounds(double bounds[4], double& width, const FontInfo &finfo,
+ const Transform &transform, uint32_t uni)
+{
+ if (Efont::OpenType::Glyph g = finfo.cmap->map_uni(uni))
+ return Efont::CharstringBounds::bounds(transform, finfo.program()->glyph_context(g), bounds, width);
+ else
+ return false;
+}
+
+double
+char_one_bound(const FontInfo &finfo, const Transform &transform,
+ int dimen, bool max, double best, int uni, ...)
+{
+ double bounds[5];
+ va_list val;
+ va_start(val, uni);
+ while (uni != 0) {
+ if (char_bounds(bounds, bounds[4], finfo, transform, uni))
+ if (max ? bounds[dimen] > best : bounds[dimen] < best)
+ best = bounds[dimen];
+ uni = va_arg(val, int);
+ }
+ va_end(val);
+ return best;
+}
+
+double
+font_cap_height(const FontInfo &finfo, const Transform &font_xform)
+{
+ try {
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.cap_height();
+ } catch (Efont::OpenType::Bounds) {
+ // XXX what if 'H', 'O', 'B' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, false, finfo.units_per_em(),
+ (int) 'H', (int) 'O', (int) 'B', 0);
+ }
+}
+
+double
+font_ascender(const FontInfo &finfo, const Transform &font_xform)
+{
+ try {
+ Efont::OpenType::Os2 os2(finfo.otf->table("OS/2"));
+ return os2.typo_ascender();
+ } catch (Efont::OpenType::Bounds) {
+ // XXX what if 'd', 'l' were subject to substitution?
+ return char_one_bound(finfo, font_xform, 3, true,
+ finfo.x_height(font_xform),
+ (int) 'd', (int) 'l', 0);
+ }
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh
new file mode 100644
index 00000000000..1330e9450a8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/secondary.hh
@@ -0,0 +1,177 @@
+#ifndef OTFTOTFM_SECONDARY_HH
+#define OTFTOTFM_SECONDARY_HH
+#include <efont/otfcmap.hh>
+#include <efont/cff.hh>
+#include "setting.hh"
+class Metrics;
+class Secondary;
+class Transform;
+namespace Efont { class TrueTypeBoundsCharstringProgram; }
+
+struct FontInfo {
+
+ const Efont::OpenType::Font *otf;
+ const Efont::OpenType::Cmap *cmap;
+
+ Efont::Cff *cff_file;
+ const Efont::Cff::Font *cff;
+
+ const Efont::OpenType::Post *post;
+ const Efont::OpenType::Name *name;
+
+ FontInfo(const Efont::OpenType::Font *otf, ErrorHandler *);
+ ~FontInfo();
+
+ bool ok() const;
+
+ int nglyphs() const { return _nglyphs; }
+ bool glyph_names(Vector<PermString> &) const;
+ int glyphid(PermString) const;
+ const Efont::CharstringProgram *program() const;
+ int units_per_em() const {
+ return program()->units_per_em();
+ }
+
+ bool is_fixed_pitch() const;
+ double italic_angle() const;
+ double x_height(const Transform& font_xform) const;
+
+ void set_is_fixed_pitch(bool is_fixed_pitch) {
+ _override_is_fixed_pitch = true;
+ _is_fixed_pitch = is_fixed_pitch;
+ }
+ void set_italic_angle(double italic_angle) {
+ _override_italic_angle = true;
+ _italic_angle = italic_angle;
+ }
+ enum { x_height_auto = 0, x_height_explicit,
+ x_height_os2, x_height_x };
+ void set_x_height(int source, double x_height) {
+ _override_x_height = source;
+ _x_height = x_height;
+ }
+
+ String family_name() const;
+ String postscript_name() const;
+
+ private:
+
+ int _nglyphs;
+ mutable Vector<PermString> _glyph_names;
+ mutable bool _got_glyph_names;
+ mutable Vector<uint32_t> _unicodes;
+ mutable Efont::TrueTypeBoundsCharstringProgram *_ttb_program;
+ bool _override_is_fixed_pitch;
+ bool _override_italic_angle;
+ bool _is_fixed_pitch;
+ uint8_t _override_x_height;
+ double _italic_angle;
+ double _x_height;
+
+};
+
+class SettingSet {
+public:
+ inline SettingSet(Secondary* s, Metrics& m);
+ inline SettingSet& push_back(Setting s);
+ inline SettingSet& push_back(int op, int x = 0, int y = 0);
+ inline SettingSet& move(int x, int y = 0);
+ SettingSet& show(int uni);
+ inline SettingSet& kernx(bool is_kernx);
+ inline bool check();
+ inline void checkpoint();
+ inline Metrics& metrics() const;
+ inline const Vector<Setting>& settings() const;
+private:
+ Secondary* s_;
+ Vector<Setting> v_;
+ int original_size_;
+ Metrics& metrics_;
+ int kern_type_;
+ bool ok_;
+ typedef Efont::OpenType::Glyph Glyph;
+};
+
+class Secondary { public:
+ Secondary(const FontInfo& finfo) : _finfo(finfo), _next(0) { }
+ virtual ~Secondary();
+ void set_next(Secondary *s) { _next = s; }
+ typedef Efont::OpenType::Glyph Glyph;
+ bool encode_uni(int code, PermString name, const uint32_t* uni_first, const uint32_t* uni_last, Metrics &metrics, ErrorHandler *errh);
+ inline bool encode_uni(int code, PermString name, uint32_t uni, Metrics& m, ErrorHandler* errh);
+ virtual int setting(uint32_t uni, SettingSet&, ErrorHandler *);
+ protected:
+ const FontInfo& _finfo;
+
+ friend class SettingSet;
+ private:
+ Secondary *_next;
+};
+
+class T1Secondary : public Secondary { public:
+ T1Secondary(const FontInfo &, const String &font_name, const String &otf_file_name);
+ int setting(uint32_t uni, SettingSet&, ErrorHandler *);
+ private:
+ String _font_name;
+ String _otf_file_name;
+ int _units_per_em;
+ int _xheight;
+ int _spacewidth;
+ enum { J_NODOT = -1031892 /* unlikely value */ };
+ int dotlessj_font(Metrics &, ErrorHandler *, Glyph &dj_glyph);
+};
+
+bool char_bounds(double bounds[4], double& width, const FontInfo &,
+ const Transform &, uint32_t uni);
+
+double char_one_bound(const FontInfo &, const Transform &,
+ int dimen, bool max, double best, int uni, ...);
+
+inline SettingSet::SettingSet(Secondary* s, Metrics& m)
+ : s_(s), original_size_(0), metrics_(m),
+ kern_type_(Setting::KERN), ok_(true) {
+}
+
+inline SettingSet& SettingSet::kernx(bool is_kernx) {
+ kern_type_ = is_kernx ? Setting::KERNX : Setting::KERN;
+ return *this;
+}
+
+inline SettingSet& SettingSet::push_back(Setting s) {
+ if (ok_)
+ v_.push_back(s);
+ return *this;
+}
+
+inline SettingSet& SettingSet::push_back(int op, int x, int y) {
+ return push_back(Setting(op, x, y));
+}
+
+inline SettingSet& SettingSet::move(int x, int y) {
+ return push_back(Setting(Setting::MOVE, x, y));
+}
+
+inline bool SettingSet::check() {
+ bool ok = ok_;
+ ok_ = true;
+ return ok;
+}
+
+inline void SettingSet::checkpoint() {
+ assert(ok_);
+ original_size_ = v_.size();
+}
+
+inline Metrics& SettingSet::metrics() const {
+ return metrics_;
+}
+
+inline const Vector<Setting>& SettingSet::settings() const {
+ return v_;
+}
+
+inline bool Secondary::encode_uni(int code, PermString name, uint32_t uni, Metrics& m, ErrorHandler* errh) {
+ return encode_uni(code, name, &uni, &uni + 1, m, errh);
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh
new file mode 100644
index 00000000000..af1854174b2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/setting.hh
@@ -0,0 +1,18 @@
+#ifndef OTFTOTFM_SETTING_HH
+#define OTFTOTFM_SETTING_HH
+#include <lcdf/string.hh>
+
+struct Setting {
+ enum { NONE, FONT, SHOW, KERN, KERNX, MOVE, RULE, PUSH, POP,
+ SPECIAL, DEAD };
+ int op;
+ int x;
+ int y;
+ String s;
+ Setting(int op_in, int x_in = 0, int y_in = 0)
+ : op(op_in), x(x_in), y(y_in) { }
+ Setting(int op_in, const String &s_in) : op(op_in), s(s_in) { }
+ bool valid_op() const { return op >= FONT && op <= SPECIAL; }
+};
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc
new file mode 100644
index 00000000000..de8d1e6c032
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.cc
@@ -0,0 +1,483 @@
+/* uniprop.{cc,hh} -- code for Unicode character properties
+ *
+ * Copyright (c) 2004-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#include <config.h>
+#include "uniprop.hh"
+#include <lcdf/string.hh>
+
+const unsigned char UnicodeProperty::property_pages[] = {
+ 0, P_Cn,
+ 0, P_Cc, 32, P_Zs, 33, P_Po, 36, P_Sc, 37, P_Po, 40, P_Ps, 41, P_Pe, 42, P_Po, 43, P_Sm, 44, P_Po, 45, P_Pd, 46, P_Po, 48, P_Nd, 58, P_Po, 60, P_Sm, 63, P_Po, 65, P_Lu, 91, P_Ps, 92, P_Po, 93, P_Pe, 94, P_Sk, 95, P_Pc, 96, P_Sk, 97, P_Ll, 123, P_Ps, 124, P_Sm, 125, P_Pe, 126, P_Sm, 127, P_Cc, 160, P_Zs, 161, P_Po, 162, P_Sc, 166, P_So, 167, P_Po, 168, P_Sk, 169, P_So, 170, P_Lo, 171, P_Pi, 172, P_Sm, 173, P_Cf, 174, P_So, 175, P_Sk, 176, P_So, 177, P_Sm, 178, P_No, 180, P_Sk, 181, P_Ll, 182, P_Po, 184, P_Sk, 185, P_No, 186, P_Lo, 187, P_Pf, 188, P_No, 191, P_Po, 192, P_Lu, 215, P_Sm, 216, P_Lu, 223, P_Ll, 247, P_Sm, 248, P_Ll,
+ 0, P_Lul, 56, P_Ll, 57, P_Lul, 73, P_Ll, 74, P_Lul, 120, P_Lu, 122, P_Ll, 123, P_Lul, 127, P_Ll, 129, P_Lu, 131, P_Ll, 132, P_Lul, 134, P_Lu, 136, P_Ll, 137, P_Lu, 140, P_Ll, 142, P_Lu, 146, P_Ll, 147, P_Lu, 149, P_Ll, 150, P_Lu, 153, P_Ll, 156, P_Lu, 158, P_Ll, 159, P_Lu, 161, P_Ll, 162, P_Lul, 166, P_Lu, 168, P_Ll, 169, P_Lul, 171, P_Ll, 172, P_Lul, 174, P_Lu, 176, P_Ll, 177, P_Lu, 180, P_Ll, 181, P_Lul, 183, P_Lu, 185, P_Ll, 187, P_Lo, 188, P_Lul, 190, P_Ll, 192, P_Lo, 196, P_Lu, 197, P_Lt, 198, P_Ll, 199, P_Lu, 200, P_Lt, 201, P_Ll, 202, P_Lu, 203, P_Lt, 204, P_Ll, 205, P_Lul, 221, P_Ll, 222, P_Lul, 240, P_Ll, 241, P_Lu, 242, P_Lt, 243, P_Ll, 244, P_Lul, 246, P_Lu, 249, P_Ll, 250, P_Lul,
+ 0, P_Lul, 52, P_Ll, 58, P_Lu, 60, P_Ll, 61, P_Lu, 63, P_Ll, 65, P_Lul, 67, P_Lu, 71, P_Ll, 72, P_Lul, 80, P_Ll, 148, P_Lo, 149, P_Ll, 176, P_Lm, 194, P_Sk, 198, P_Lm, 210, P_Sk, 224, P_Lm, 229, P_Sk, 236, P_Lm, 237, P_Sk, 238, P_Lm, 239, P_Sk,
+ 0, P_Mn, 112, P_Lul, 116, P_Lm, 117, P_Sk, 118, P_Lul, 120, P_Cn, 122, P_Lm, 123, P_Ll, 126, P_Po, 127, P_Lu, 128, P_Cn, 132, P_Sk, 134, P_Lu, 135, P_Po, 136, P_Lu, 139, P_Cn, 140, P_Lu, 141, P_Cn, 142, P_Lu, 144, P_Ll, 145, P_Lu, 162, P_Cn, 163, P_Lu, 172, P_Ll, 207, P_Lul, 209, P_Ll, 210, P_Lu, 213, P_Ll, 216, P_Lul, 240, P_Ll, 244, P_Lul, 246, P_Sm, 247, P_Lul, 249, P_Lu, 251, P_Ll, 253, P_Lu,
+ 0, P_Lu, 48, P_Ll, 96, P_Lul, 130, P_So, 131, P_Mn, 136, P_Me, 138, P_Lul, 192, P_Lu, 194, P_Ll, 195, P_Lul, 207, P_Ll, 208, P_Lul,
+ 0, P_Lul, 48, P_Cn, 49, P_Lu, 87, P_Cn, 89, P_Lm, 90, P_Po, 96, P_Cn, 97, P_Ll, 136, P_Cn, 137, P_Po, 138, P_Pd, 139, P_Cn, 141, P_So, 143, P_Sc, 144, P_Cn, 145, P_Mn, 190, P_Pd, 191, P_Mn, 192, P_Po, 193, P_Mn, 195, P_Po, 196, P_Mn, 198, P_Po, 199, P_Mn, 200, P_Cn, 208, P_Lo, 235, P_Cn, 240, P_Lo, 243, P_Po, 245, P_Cn,
+ 0, P_Cf, 6, P_Sm, 9, P_Po, 11, P_Sc, 12, P_Po, 14, P_So, 16, P_Mn, 27, P_Po, 28, P_Cf, 29, P_Cn, 30, P_Po, 32, P_Lo, 64, P_Lm, 65, P_Lo, 75, P_Mn, 96, P_Nd, 106, P_Po, 110, P_Lo, 112, P_Mn, 113, P_Lo, 212, P_Po, 213, P_Lo, 214, P_Mn, 221, P_Cf, 222, P_So, 223, P_Mn, 229, P_Lm, 231, P_Mn, 233, P_So, 234, P_Mn, 238, P_Lo, 240, P_Nd, 250, P_Lo, 253, P_So, 255, P_Lo,
+ 0, P_Po, 14, P_Cn, 15, P_Cf, 16, P_Lo, 17, P_Mn, 18, P_Lo, 48, P_Mn, 75, P_Cn, 77, P_Lo, 166, P_Mn, 177, P_Lo, 178, P_Cn, 192, P_Nd, 202, P_Lo, 235, P_Mn, 244, P_Lm, 246, P_So, 247, P_Po, 250, P_Lm, 251, P_Cn,
+ 0, P_Lo, 22, P_Mn, 26, P_Lm, 27, P_Mn, 36, P_Lm, 37, P_Mn, 40, P_Lm, 41, P_Mn, 46, P_Cn, 48, P_Po, 63, P_Cn, 64, P_Lo, 89, P_Mn, 92, P_Cn, 94, P_Po, 95, P_Cn, 160, P_Lo, 181, P_Cn, 182, P_Lo, 190, P_Cn, 212, P_Mn, 226, P_Cf, 227, P_Mn,
+ 0, P_Mn, 3, P_Mc, 4, P_Lo, 58, P_Mn, 59, P_Mc, 60, P_Mn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 73, P_Mc, 77, P_Mn, 78, P_Mc, 80, P_Lo, 81, P_Mn, 88, P_Lo, 98, P_Mn, 100, P_Po, 102, P_Nd, 112, P_Po, 113, P_Lm, 114, P_Lo, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 143, P_Lo, 145, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 179, P_Cn, 182, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 197, P_Cn, 199, P_Mc, 201, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Lo, 207, P_Cn, 215, P_Mc, 216, P_Cn, 220, P_Lo, 222, P_Cn, 223, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Lo, 242, P_Sc, 244, P_No, 250, P_So, 251, P_Sc, 252, P_Cn,
+ 0, P_Cn, 1, P_Mn, 3, P_Mc, 4, P_Cn, 5, P_Lo, 11, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 55, P_Cn, 56, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Cn, 62, P_Mc, 65, P_Mn, 67, P_Cn, 71, P_Mn, 73, P_Cn, 75, P_Mn, 78, P_Cn, 81, P_Mn, 82, P_Cn, 89, P_Lo, 93, P_Cn, 94, P_Lo, 95, P_Cn, 102, P_Nd, 112, P_Mn, 114, P_Lo, 117, P_Mn, 118, P_Cn, 129, P_Mn, 131, P_Mc, 132, P_Cn, 133, P_Lo, 142, P_Cn, 143, P_Lo, 146, P_Cn, 147, P_Lo, 169, P_Cn, 170, P_Lo, 177, P_Cn, 178, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 193, P_Mn, 198, P_Cn, 199, P_Mn, 201, P_Mc, 202, P_Cn, 203, P_Mc, 205, P_Mn, 206, P_Cn, 208, P_Lo, 209, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Po, 241, P_Sc, 242, P_Cn, 249, P_Lo, 250, P_Cn,
+ 0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 63, P_Mn, 64, P_Mc, 65, P_Mn, 69, P_Cn, 71, P_Mc, 73, P_Cn, 75, P_Mc, 77, P_Mn, 78, P_Cn, 86, P_Mn, 87, P_Mc, 88, P_Cn, 92, P_Lo, 94, P_Cn, 95, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_So, 113, P_Lo, 114, P_No, 120, P_Cn, 130, P_Mn, 131, P_Lo, 132, P_Cn, 133, P_Lo, 139, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 150, P_Cn, 153, P_Lo, 155, P_Cn, 156, P_Lo, 157, P_Cn, 158, P_Lo, 160, P_Cn, 163, P_Lo, 165, P_Cn, 168, P_Lo, 171, P_Cn, 174, P_Lo, 186, P_Cn, 190, P_Mc, 192, P_Mn, 193, P_Mc, 195, P_Cn, 198, P_Mc, 201, P_Cn, 202, P_Mc, 205, P_Mn, 206, P_Cn, 208, P_Lo, 209, P_Cn, 215, P_Mc, 216, P_Cn, 230, P_Nd, 240, P_No, 243, P_So, 249, P_Sc, 250, P_So, 251, P_Cn,
+ 0, P_Mn, 1, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 41, P_Cn, 42, P_Lo, 58, P_Cn, 61, P_Lo, 62, P_Mn, 65, P_Mc, 69, P_Cn, 70, P_Mn, 73, P_Cn, 74, P_Mn, 78, P_Cn, 85, P_Mn, 87, P_Cn, 88, P_Lo, 91, P_Cn, 96, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_Cn, 120, P_No, 127, P_So, 128, P_Lo, 129, P_Mn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 141, P_Cn, 142, P_Lo, 145, P_Cn, 146, P_Lo, 169, P_Cn, 170, P_Lo, 180, P_Cn, 181, P_Lo, 186, P_Cn, 188, P_Mn, 189, P_Lo, 190, P_Mc, 191, P_Mn, 192, P_Mc, 197, P_Cn, 198, P_Mn, 199, P_Mc, 201, P_Cn, 202, P_Mc, 204, P_Mn, 206, P_Cn, 213, P_Mc, 215, P_Cn, 222, P_Lo, 223, P_Cn, 224, P_Lo, 226, P_Mn, 228, P_Cn, 230, P_Nd, 240, P_Cn, 241, P_Lo, 243, P_Cn,
+ 0, P_Cn, 1, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 14, P_Lo, 17, P_Cn, 18, P_Lo, 59, P_Cn, 61, P_Lo, 62, P_Mc, 65, P_Mn, 69, P_Cn, 70, P_Mc, 73, P_Cn, 74, P_Mc, 77, P_Mn, 78, P_Lo, 79, P_So, 80, P_Cn, 84, P_Lo, 87, P_Mc, 88, P_No, 95, P_Lo, 98, P_Mn, 100, P_Cn, 102, P_Nd, 112, P_No, 121, P_So, 122, P_Lo, 128, P_Cn, 130, P_Mc, 132, P_Cn, 133, P_Lo, 151, P_Cn, 154, P_Lo, 178, P_Cn, 179, P_Lo, 188, P_Cn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 199, P_Cn, 202, P_Mn, 203, P_Cn, 207, P_Mc, 210, P_Mn, 213, P_Cn, 214, P_Mn, 215, P_Cn, 216, P_Mc, 224, P_Cn, 230, P_Nd, 240, P_Cn, 242, P_Mc, 244, P_Po, 245, P_Cn,
+ 0, P_Cn, 1, P_Lo, 49, P_Mn, 50, P_Lo, 52, P_Mn, 59, P_Cn, 63, P_Sc, 64, P_Lo, 70, P_Lm, 71, P_Mn, 79, P_Po, 80, P_Nd, 90, P_Po, 92, P_Cn, 129, P_Lo, 131, P_Cn, 132, P_Lo, 133, P_Cn, 135, P_Lo, 137, P_Cn, 138, P_Lo, 139, P_Cn, 141, P_Lo, 142, P_Cn, 148, P_Lo, 152, P_Cn, 153, P_Lo, 160, P_Cn, 161, P_Lo, 164, P_Cn, 165, P_Lo, 166, P_Cn, 167, P_Lo, 168, P_Cn, 170, P_Lo, 172, P_Cn, 173, P_Lo, 177, P_Mn, 178, P_Lo, 180, P_Mn, 186, P_Cn, 187, P_Mn, 189, P_Lo, 190, P_Cn, 192, P_Lo, 197, P_Cn, 198, P_Lm, 199, P_Cn, 200, P_Mn, 206, P_Cn, 208, P_Nd, 218, P_Cn, 220, P_Lo, 224, P_Cn,
+ 0, P_Lo, 1, P_So, 4, P_Po, 19, P_So, 20, P_Po, 21, P_So, 24, P_Mn, 26, P_So, 32, P_Nd, 42, P_No, 52, P_So, 53, P_Mn, 54, P_So, 55, P_Mn, 56, P_So, 57, P_Mn, 58, P_Ps, 59, P_Pe, 60, P_Ps, 61, P_Pe, 62, P_Mc, 64, P_Lo, 72, P_Cn, 73, P_Lo, 109, P_Cn, 113, P_Mn, 127, P_Mc, 128, P_Mn, 133, P_Po, 134, P_Mn, 136, P_Lo, 141, P_Mn, 152, P_Cn, 153, P_Mn, 189, P_Cn, 190, P_So, 198, P_Mn, 199, P_So, 205, P_Cn, 206, P_So, 208, P_Po, 213, P_So, 217, P_Po, 219, P_Cn,
+ 0, P_Lo, 43, P_Mc, 45, P_Mn, 49, P_Mc, 50, P_Mn, 56, P_Mc, 57, P_Mn, 59, P_Mc, 61, P_Mn, 63, P_Lo, 64, P_Nd, 74, P_Po, 80, P_Lo, 86, P_Mc, 88, P_Mn, 90, P_Lo, 94, P_Mn, 97, P_Lo, 98, P_Mc, 101, P_Lo, 103, P_Mc, 110, P_Lo, 113, P_Mn, 117, P_Lo, 130, P_Mn, 131, P_Mc, 133, P_Mn, 135, P_Mc, 141, P_Mn, 142, P_Lo, 143, P_Mc, 144, P_Nd, 154, P_Mc, 157, P_Mn, 158, P_So, 160, P_Lu, 198, P_Cn, 199, P_Lu, 200, P_Cn, 205, P_Lu, 206, P_Cn, 208, P_Lo, 251, P_Po, 252, P_Lm, 253, P_Lo,
+ 0, P_Lo,
+ 0, P_Lo, 73, P_Cn, 74, P_Lo, 78, P_Cn, 80, P_Lo, 87, P_Cn, 88, P_Lo, 89, P_Cn, 90, P_Lo, 94, P_Cn, 96, P_Lo, 137, P_Cn, 138, P_Lo, 142, P_Cn, 144, P_Lo, 177, P_Cn, 178, P_Lo, 182, P_Cn, 184, P_Lo, 191, P_Cn, 192, P_Lo, 193, P_Cn, 194, P_Lo, 198, P_Cn, 200, P_Lo, 215, P_Cn, 216, P_Lo,
+ 0, P_Lo, 17, P_Cn, 18, P_Lo, 22, P_Cn, 24, P_Lo, 91, P_Cn, 93, P_Mn, 96, P_Po, 105, P_No, 125, P_Cn, 128, P_Lo, 144, P_So, 154, P_Cn, 160, P_Lu, 246, P_Cn, 248, P_Ll, 254, P_Cn,
+ 0, P_Pd, 1, P_Lo,
+ 0, P_Lo, 109, P_Po, 111, P_Lo, 128, P_Zs, 129, P_Lo, 155, P_Ps, 156, P_Pe, 157, P_Cn, 160, P_Lo, 235, P_Po, 238, P_Nl, 241, P_Lo, 249, P_Cn,
+ 0, P_Lo, 13, P_Cn, 14, P_Lo, 18, P_Mn, 21, P_Cn, 32, P_Lo, 50, P_Mn, 53, P_Po, 55, P_Cn, 64, P_Lo, 82, P_Mn, 84, P_Cn, 96, P_Lo, 109, P_Cn, 110, P_Lo, 113, P_Cn, 114, P_Mn, 116, P_Cn, 128, P_Lo, 180, P_Mn, 182, P_Mc, 183, P_Mn, 190, P_Mc, 198, P_Mn, 199, P_Mc, 201, P_Mn, 212, P_Po, 215, P_Lm, 216, P_Po, 219, P_Sc, 220, P_Lo, 221, P_Mn, 222, P_Cn, 224, P_Nd, 234, P_Cn, 240, P_No, 250, P_Cn,
+ 0, P_Po, 6, P_Pd, 7, P_Po, 11, P_Mn, 14, P_Cf, 15, P_Cn, 16, P_Nd, 26, P_Cn, 32, P_Lo, 67, P_Lm, 68, P_Lo, 120, P_Cn, 128, P_Lo, 133, P_Mn, 135, P_Lo, 169, P_Mn, 170, P_Lo, 171, P_Cn, 176, P_Lo, 246, P_Cn,
+ 0, P_Lo, 31, P_Cn, 32, P_Mn, 35, P_Mc, 39, P_Mn, 41, P_Mc, 44, P_Cn, 48, P_Mc, 50, P_Mn, 51, P_Mc, 57, P_Mn, 60, P_Cn, 64, P_So, 65, P_Cn, 68, P_Po, 70, P_Nd, 80, P_Lo, 110, P_Cn, 112, P_Lo, 117, P_Cn, 128, P_Lo, 172, P_Cn, 176, P_Lo, 202, P_Cn, 208, P_Nd, 218, P_No, 219, P_Cn, 222, P_So,
+ 0, P_Lo, 23, P_Mn, 25, P_Mc, 27, P_Mn, 28, P_Cn, 30, P_Po, 32, P_Lo, 85, P_Mc, 86, P_Mn, 87, P_Mc, 88, P_Mn, 95, P_Cn, 96, P_Mn, 97, P_Mc, 98, P_Mn, 99, P_Mc, 101, P_Mn, 109, P_Mc, 115, P_Mn, 125, P_Cn, 127, P_Mn, 128, P_Nd, 138, P_Cn, 144, P_Nd, 154, P_Cn, 160, P_Po, 167, P_Lm, 168, P_Po, 174, P_Cn, 176, P_Mn, 190, P_Me, 191, P_Cn,
+ 0, P_Mn, 4, P_Mc, 5, P_Lo, 52, P_Mn, 53, P_Mc, 54, P_Mn, 59, P_Mc, 60, P_Mn, 61, P_Mc, 66, P_Mn, 67, P_Mc, 69, P_Lo, 76, P_Cn, 80, P_Nd, 90, P_Po, 97, P_So, 107, P_Mn, 116, P_So, 125, P_Cn, 128, P_Mn, 130, P_Mc, 131, P_Lo, 161, P_Mc, 162, P_Mn, 166, P_Mc, 168, P_Mn, 170, P_Mc, 171, P_Mn, 174, P_Lo, 176, P_Nd, 186, P_Lo, 230, P_Mn, 231, P_Mc, 232, P_Mn, 234, P_Mc, 237, P_Mn, 238, P_Mc, 239, P_Mn, 242, P_Mc, 244, P_Cn, 252, P_Po,
+ 0, P_Lo, 36, P_Mc, 44, P_Mn, 52, P_Mc, 54, P_Mn, 56, P_Cn, 59, P_Po, 64, P_Nd, 74, P_Cn, 77, P_Lo, 80, P_Nd, 90, P_Lo, 120, P_Lm, 126, P_Po, 128, P_Ll, 137, P_Cn, 192, P_Po, 200, P_Cn, 208, P_Mn, 211, P_Po, 212, P_Mn, 225, P_Mc, 226, P_Mn, 233, P_Lo, 237, P_Mn, 238, P_Lo, 242, P_Mc, 244, P_Mn, 245, P_Lo, 247, P_Cn, 248, P_Mn, 250, P_Cn,
+ 0, P_Ll, 44, P_Lm, 107, P_Ll, 120, P_Lm, 121, P_Ll, 155, P_Lm, 192, P_Mn, 246, P_Cn, 251, P_Mn,
+ 0, P_Lul, 150, P_Ll, 158, P_Lul,
+ 0, P_Ll, 8, P_Lu, 16, P_Ll, 22, P_Cn, 24, P_Lu, 30, P_Cn, 32, P_Ll, 40, P_Lu, 48, P_Ll, 56, P_Lu, 64, P_Ll, 70, P_Cn, 72, P_Lu, 78, P_Cn, 80, P_Ll, 88, P_Cn, 89, P_Lu, 90, P_Cn, 91, P_Lu, 92, P_Cn, 93, P_Lu, 94, P_Cn, 95, P_Lul, 97, P_Ll, 104, P_Lu, 112, P_Ll, 126, P_Cn, 128, P_Ll, 136, P_Lt, 144, P_Ll, 152, P_Lt, 160, P_Ll, 168, P_Lt, 176, P_Ll, 181, P_Cn, 182, P_Ll, 184, P_Lu, 188, P_Lt, 189, P_Sk, 190, P_Ll, 191, P_Sk, 194, P_Ll, 197, P_Cn, 198, P_Ll, 200, P_Lu, 204, P_Lt, 205, P_Sk, 208, P_Ll, 212, P_Cn, 214, P_Ll, 216, P_Lu, 220, P_Cn, 221, P_Sk, 224, P_Ll, 232, P_Lu, 237, P_Sk, 240, P_Cn, 242, P_Ll, 245, P_Cn, 246, P_Ll, 248, P_Lu, 252, P_Lt, 253, P_Sk, 255, P_Cn,
+ 0, P_Zs, 11, P_Cf, 16, P_Pd, 22, P_Po, 24, P_Pi, 25, P_Pf, 26, P_Ps, 27, P_Pi, 29, P_Pf, 30, P_Ps, 31, P_Pi, 32, P_Po, 40, P_Zl, 41, P_Zp, 42, P_Cf, 47, P_Zs, 48, P_Po, 57, P_Pi, 58, P_Pf, 59, P_Po, 63, P_Pc, 65, P_Po, 68, P_Sm, 69, P_Ps, 70, P_Pe, 71, P_Po, 82, P_Sm, 83, P_Po, 84, P_Pc, 85, P_Po, 95, P_Zs, 96, P_Cf, 101, P_Cn, 102, P_Cf, 112, P_No, 113, P_Lm, 114, P_Cn, 116, P_No, 122, P_Sm, 125, P_Ps, 126, P_Pe, 127, P_Lm, 128, P_No, 138, P_Sm, 141, P_Ps, 142, P_Pe, 143, P_Cn, 144, P_Lm, 157, P_Cn, 160, P_Sc, 191, P_Cn, 208, P_Mn, 221, P_Me, 225, P_Mn, 226, P_Me, 229, P_Mn, 241, P_Cn,
+ 0, P_So, 2, P_Lu, 3, P_So, 7, P_Lu, 8, P_So, 10, P_Ll, 11, P_Lu, 14, P_Ll, 16, P_Lu, 19, P_Ll, 20, P_So, 21, P_Lu, 22, P_So, 24, P_Sm, 25, P_Lu, 30, P_So, 36, P_Lu, 37, P_So, 38, P_Lu, 39, P_So, 40, P_Lu, 41, P_So, 42, P_Lu, 46, P_So, 47, P_Ll, 48, P_Lu, 52, P_Ll, 53, P_Lo, 57, P_Ll, 58, P_So, 60, P_Ll, 62, P_Lu, 64, P_Sm, 69, P_Lul, 71, P_Ll, 74, P_So, 75, P_Sm, 76, P_So, 78, P_Ll, 79, P_So, 80, P_No, 96, P_Nl, 131, P_Lul, 133, P_Nl, 137, P_No, 138, P_So, 140, P_Cn, 144, P_Sm, 149, P_So, 154, P_Sm, 156, P_So, 160, P_Sm, 161, P_So, 163, P_Sm, 164, P_So, 166, P_Sm, 167, P_So, 174, P_Sm, 175, P_So, 206, P_Sm, 208, P_So, 210, P_Sm, 211, P_So, 212, P_Sm, 213, P_So, 244, P_Sm,
+ 0, P_Sm,
+ 0, P_So, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_So, 32, P_Sm, 34, P_So, 41, P_Ps, 42, P_Pe, 43, P_So, 124, P_Sm, 125, P_So, 155, P_Sm, 180, P_So, 220, P_Sm, 226, P_So, 255, P_Cn,
+ 0, P_So, 39, P_Cn, 64, P_So, 75, P_Cn, 96, P_No, 156, P_So, 234, P_No,
+ 0, P_So, 183, P_Sm, 184, P_So, 193, P_Sm, 194, P_So, 248, P_Sm,
+ 0, P_So, 111, P_Sm, 112, P_So,
+ 0, P_So, 104, P_Ps, 105, P_Pe, 106, P_Ps, 107, P_Pe, 108, P_Ps, 109, P_Pe, 110, P_Ps, 111, P_Pe, 112, P_Ps, 113, P_Pe, 114, P_Ps, 115, P_Pe, 116, P_Ps, 117, P_Pe, 118, P_No, 148, P_So, 192, P_Sm, 197, P_Ps, 198, P_Pe, 199, P_Sm, 230, P_Ps, 231, P_Pe, 232, P_Ps, 233, P_Pe, 234, P_Ps, 235, P_Pe, 236, P_Ps, 237, P_Pe, 238, P_Ps, 239, P_Pe, 240, P_Sm,
+ 0, P_So,
+ 0, P_Sm, 131, P_Ps, 132, P_Pe, 133, P_Ps, 134, P_Pe, 135, P_Ps, 136, P_Pe, 137, P_Ps, 138, P_Pe, 139, P_Ps, 140, P_Pe, 141, P_Ps, 142, P_Pe, 143, P_Ps, 144, P_Pe, 145, P_Ps, 146, P_Pe, 147, P_Ps, 148, P_Pe, 149, P_Ps, 150, P_Pe, 151, P_Ps, 152, P_Pe, 153, P_Sm, 216, P_Ps, 217, P_Pe, 218, P_Ps, 219, P_Pe, 220, P_Sm, 252, P_Ps, 253, P_Pe, 254, P_Sm,
+ 0, P_So, 48, P_Sm, 69, P_So, 71, P_Sm, 77, P_So, 116, P_Cn, 118, P_So, 150, P_Cn, 152, P_So, 186, P_Cn, 189, P_So, 201, P_Cn, 202, P_So, 210, P_Cn, 236, P_So, 240, P_Cn,
+ 0, P_Lu, 47, P_Cn, 48, P_Ll, 95, P_Cn, 96, P_Lul, 98, P_Lu, 101, P_Ll, 103, P_Lul, 109, P_Lu, 113, P_Ll, 114, P_Lul, 116, P_Ll, 117, P_Lul, 119, P_Ll, 124, P_Lm, 126, P_Lu, 129, P_Ll, 130, P_Lul, 228, P_Ll, 229, P_So, 235, P_Lul, 239, P_Mn, 242, P_Lul, 244, P_Cn, 249, P_Po, 253, P_No, 254, P_Po,
+ 0, P_Ll, 38, P_Cn, 39, P_Ll, 40, P_Cn, 45, P_Ll, 46, P_Cn, 48, P_Lo, 104, P_Cn, 111, P_Lm, 112, P_Po, 113, P_Cn, 127, P_Mn, 128, P_Lo, 151, P_Cn, 160, P_Lo, 167, P_Cn, 168, P_Lo, 175, P_Cn, 176, P_Lo, 183, P_Cn, 184, P_Lo, 191, P_Cn, 192, P_Lo, 199, P_Cn, 200, P_Lo, 207, P_Cn, 208, P_Lo, 215, P_Cn, 216, P_Lo, 223, P_Cn, 224, P_Mn,
+ 0, P_Po, 2, P_Pi, 3, P_Pf, 4, P_Pi, 5, P_Pf, 6, P_Po, 9, P_Pi, 10, P_Pf, 11, P_Po, 12, P_Pi, 13, P_Pf, 14, P_Po, 23, P_Pd, 24, P_Po, 26, P_Pd, 27, P_Po, 28, P_Pi, 29, P_Pf, 30, P_Po, 32, P_Pi, 33, P_Pf, 34, P_Ps, 35, P_Pe, 36, P_Ps, 37, P_Pe, 38, P_Ps, 39, P_Pe, 40, P_Ps, 41, P_Pe, 42, P_Po, 47, P_Lm, 48, P_Po, 58, P_Pd, 60, P_Po, 64, P_Pd, 65, P_Po, 66, P_Ps, 67, P_Po, 69, P_Cn, 128, P_So, 154, P_Cn, 155, P_So, 244, P_Cn,
+ 0, P_So, 214, P_Cn, 240, P_So, 252, P_Cn,
+ 0, P_Zs, 1, P_Po, 4, P_So, 5, P_Lm, 6, P_Lo, 7, P_Nl, 8, P_Ps, 9, P_Pe, 10, P_Ps, 11, P_Pe, 12, P_Ps, 13, P_Pe, 14, P_Ps, 15, P_Pe, 16, P_Ps, 17, P_Pe, 18, P_So, 20, P_Ps, 21, P_Pe, 22, P_Ps, 23, P_Pe, 24, P_Ps, 25, P_Pe, 26, P_Ps, 27, P_Pe, 28, P_Pd, 29, P_Ps, 30, P_Pe, 32, P_So, 33, P_Nl, 42, P_Mn, 46, P_Mc, 48, P_Pd, 49, P_Lm, 54, P_So, 56, P_Nl, 59, P_Lm, 60, P_Lo, 61, P_Po, 62, P_So, 64, P_Cn, 65, P_Lo, 151, P_Cn, 153, P_Mn, 155, P_Sk, 157, P_Lm, 159, P_Lo, 160, P_Pd, 161, P_Lo, 251, P_Po, 252, P_Lm, 255, P_Lo,
+ 0, P_Cn, 5, P_Lo, 46, P_Cn, 49, P_Lo, 143, P_Cn, 144, P_So, 146, P_No, 150, P_So, 160, P_Lo, 187, P_Cn, 192, P_So, 228, P_Cn, 240, P_Lo,
+ 0, P_So, 31, P_Cn, 32, P_No, 42, P_So, 72, P_No, 80, P_So, 81, P_No, 96, P_So, 128, P_No, 138, P_So, 177, P_No, 192, P_So, 255, P_Cn,
+ 0, P_Lo, 1, P_Cn,
+ 0, P_Cn, 181, P_Lo, 182, P_Cn, 192, P_So,
+ 0, P_Cn, 213, P_Lo, 214, P_Cn,
+ 0, P_Lo, 21, P_Lm, 22, P_Lo,
+ 0, P_Lo, 141, P_Cn, 144, P_So, 199, P_Cn, 208, P_Lo, 248, P_Lm, 254, P_Po,
+ 0, P_Lo, 12, P_Lm, 13, P_Po, 16, P_Lo, 32, P_Nd, 42, P_Lo, 44, P_Cn, 64, P_Lul, 110, P_Lo, 111, P_Mn, 112, P_Me, 115, P_Po, 116, P_Mn, 126, P_Po, 127, P_Lm, 128, P_Lul, 156, P_Lm, 158, P_Mn, 160, P_Lo, 230, P_Nl, 240, P_Mn, 242, P_Po, 248, P_Cn,
+ 0, P_Sk, 23, P_Lm, 32, P_Sk, 34, P_Lul, 48, P_Ll, 50, P_Lul, 112, P_Lm, 113, P_Ll, 121, P_Lul, 125, P_Lu, 127, P_Ll, 128, P_Lul, 136, P_Lm, 137, P_Sk, 139, P_Lul, 143, P_Lo, 144, P_Lul, 148, P_Ll, 150, P_Lul, 170, P_Lu, 175, P_Cn, 176, P_Lu, 181, P_Ll, 182, P_Lul, 184, P_Cn, 247, P_Lo, 248, P_Lm, 250, P_Ll, 251, P_Lo,
+ 0, P_Lo, 2, P_Mn, 3, P_Lo, 6, P_Mn, 7, P_Lo, 11, P_Mn, 12, P_Lo, 35, P_Mc, 37, P_Mn, 39, P_Mc, 40, P_So, 44, P_Cn, 48, P_No, 54, P_So, 56, P_Sc, 57, P_So, 58, P_Cn, 64, P_Lo, 116, P_Po, 120, P_Cn, 128, P_Mc, 130, P_Lo, 180, P_Mc, 196, P_Mn, 198, P_Cn, 206, P_Po, 208, P_Nd, 218, P_Cn, 224, P_Mn, 242, P_Lo, 248, P_Po, 251, P_Lo, 252, P_Po, 253, P_Lo, 254, P_Cn,
+ 0, P_Nd, 10, P_Lo, 38, P_Mn, 46, P_Po, 48, P_Lo, 71, P_Mn, 82, P_Mc, 84, P_Cn, 95, P_Po, 96, P_Lo, 125, P_Cn, 128, P_Mn, 131, P_Mc, 132, P_Lo, 179, P_Mn, 180, P_Mc, 182, P_Mn, 186, P_Mc, 188, P_Mn, 189, P_Mc, 193, P_Po, 206, P_Cn, 207, P_Lm, 208, P_Nd, 218, P_Cn, 222, P_Po, 224, P_Lo, 229, P_Mn, 230, P_Lm, 231, P_Lo, 240, P_Nd, 250, P_Lo, 255, P_Cn,
+ 0, P_Lo, 41, P_Mn, 47, P_Mc, 49, P_Mn, 51, P_Mc, 53, P_Mn, 55, P_Cn, 64, P_Lo, 67, P_Mn, 68, P_Lo, 76, P_Mn, 77, P_Mc, 78, P_Cn, 80, P_Nd, 90, P_Cn, 92, P_Po, 96, P_Lo, 112, P_Lm, 113, P_Lo, 119, P_So, 122, P_Lo, 123, P_Mc, 124, P_Mn, 125, P_Mc, 126, P_Lo, 176, P_Mn, 177, P_Lo, 178, P_Mn, 181, P_Lo, 183, P_Mn, 185, P_Lo, 190, P_Mn, 192, P_Lo, 193, P_Mn, 194, P_Lo, 195, P_Cn, 219, P_Lo, 221, P_Lm, 222, P_Po, 224, P_Lo, 235, P_Mc, 236, P_Mn, 238, P_Mc, 240, P_Po, 242, P_Lo, 243, P_Lm, 245, P_Mc, 246, P_Mn, 247, P_Cn,
+ 0, P_Cn, 1, P_Lo, 7, P_Cn, 9, P_Lo, 15, P_Cn, 17, P_Lo, 23, P_Cn, 32, P_Lo, 39, P_Cn, 40, P_Lo, 47, P_Cn, 48, P_Ll, 91, P_Sk, 92, P_Lm, 96, P_Ll, 102, P_Cn, 112, P_Ll, 192, P_Lo, 227, P_Mc, 229, P_Mn, 230, P_Mc, 232, P_Mn, 233, P_Mc, 235, P_Po, 236, P_Mc, 237, P_Mn, 238, P_Cn, 240, P_Nd, 250, P_Cn,
+ 0, P_Cn, 163, P_Lo, 164, P_Cn, 176, P_Lo, 199, P_Cn, 203, P_Lo, 252, P_Cn,
+ 0, P_Cs, 1, P_Cn,
+ 0, P_Cn, 127, P_Cs, 129, P_Cn, 255, P_Cs,
+ 0, P_Cn, 255, P_Cs,
+ 0, P_Co, 1, P_Cn,
+ 0, P_Cn, 255, P_Co,
+ 0, P_Lo, 110, P_Cn, 112, P_Lo, 218, P_Cn,
+ 0, P_Ll, 7, P_Cn, 19, P_Ll, 24, P_Cn, 29, P_Lo, 30, P_Mn, 31, P_Lo, 41, P_Sm, 42, P_Lo, 55, P_Cn, 56, P_Lo, 61, P_Cn, 62, P_Lo, 63, P_Cn, 64, P_Lo, 66, P_Cn, 67, P_Lo, 69, P_Cn, 70, P_Lo, 178, P_Sk, 194, P_Cn, 211, P_Lo,
+ 0, P_Lo, 62, P_Pe, 63, P_Ps, 64, P_Cn, 80, P_Lo, 144, P_Cn, 146, P_Lo, 200, P_Cn, 240, P_Lo, 252, P_Sc, 253, P_So, 254, P_Cn,
+ 0, P_Mn, 16, P_Po, 23, P_Ps, 24, P_Pe, 25, P_Po, 26, P_Cn, 32, P_Mn, 48, P_Po, 49, P_Pd, 51, P_Pc, 53, P_Ps, 54, P_Pe, 55, P_Ps, 56, P_Pe, 57, P_Ps, 58, P_Pe, 59, P_Ps, 60, P_Pe, 61, P_Ps, 62, P_Pe, 63, P_Ps, 64, P_Pe, 65, P_Ps, 66, P_Pe, 67, P_Ps, 68, P_Pe, 69, P_Po, 71, P_Ps, 72, P_Pe, 73, P_Po, 77, P_Pc, 80, P_Po, 83, P_Cn, 84, P_Po, 88, P_Pd, 89, P_Ps, 90, P_Pe, 91, P_Ps, 92, P_Pe, 93, P_Ps, 94, P_Pe, 95, P_Po, 98, P_Sm, 99, P_Pd, 100, P_Sm, 103, P_Cn, 104, P_Po, 105, P_Sc, 106, P_Po, 108, P_Cn, 112, P_Lo, 117, P_Cn, 118, P_Lo, 253, P_Cn, 255, P_Cf,
+ 0, P_Cn, 1, P_Po, 4, P_Sc, 5, P_Po, 8, P_Ps, 9, P_Pe, 10, P_Po, 11, P_Sm, 12, P_Po, 13, P_Pd, 14, P_Po, 16, P_Nd, 26, P_Po, 28, P_Sm, 31, P_Po, 33, P_Lu, 59, P_Ps, 60, P_Po, 61, P_Pe, 62, P_Sk, 63, P_Pc, 64, P_Sk, 65, P_Ll, 91, P_Ps, 92, P_Sm, 93, P_Pe, 94, P_Sm, 95, P_Ps, 96, P_Pe, 97, P_Po, 98, P_Ps, 99, P_Pe, 100, P_Po, 102, P_Lo, 112, P_Lm, 113, P_Lo, 158, P_Lm, 160, P_Lo, 191, P_Cn, 194, P_Lo, 200, P_Cn, 202, P_Lo, 208, P_Cn, 210, P_Lo, 216, P_Cn, 218, P_Lo, 221, P_Cn, 224, P_Sc, 226, P_Sm, 227, P_Sk, 228, P_So, 229, P_Sc, 231, P_Cn, 232, P_So, 233, P_Sm, 237, P_So, 239, P_Cn, 249, P_Cf, 252, P_So, 254, P_Cn,
+ 0, P_Lo, 12, P_Cn, 13, P_Lo, 39, P_Cn, 40, P_Lo, 59, P_Cn, 60, P_Lo, 62, P_Cn, 63, P_Lo, 78, P_Cn, 80, P_Lo, 94, P_Cn, 128, P_Lo, 251, P_Cn,
+ 0, P_Po, 3, P_Cn, 7, P_No, 52, P_Cn, 55, P_So, 64, P_Nl, 117, P_No, 121, P_So, 138, P_No, 140, P_So, 143, P_Cn, 144, P_So, 156, P_Cn, 160, P_So, 161, P_Cn, 208, P_So, 253, P_Mn, 254, P_Cn,
+ 0, P_Cn, 128, P_Lo, 157, P_Cn, 160, P_Lo, 209, P_Cn, 224, P_Mn, 225, P_No, 252, P_Cn,
+ 0, P_Lo, 32, P_No, 36, P_Cn, 48, P_Lo, 65, P_Nl, 66, P_Lo, 74, P_Nl, 75, P_Cn, 80, P_Lo, 118, P_Mn, 123, P_Cn, 128, P_Lo, 158, P_Cn, 159, P_Po, 160, P_Lo, 196, P_Cn, 200, P_Lo, 208, P_Po, 209, P_Nl, 214, P_Cn,
+ 0, P_Lu, 40, P_Ll, 80, P_Lo, 158, P_Cn, 160, P_Nd, 170, P_Cn, 176, P_Lu, 212, P_Cn, 216, P_Ll, 252, P_Cn,
+ 0, P_Lo, 40, P_Cn, 48, P_Lo, 100, P_Cn, 111, P_Po, 112, P_Cn,
+ 0, P_Lo, 55, P_Cn, 64, P_Lo, 86, P_Cn, 96, P_Lo, 104, P_Cn,
+ 0, P_Lo, 6, P_Cn, 8, P_Lo, 9, P_Cn, 10, P_Lo, 54, P_Cn, 55, P_Lo, 57, P_Cn, 60, P_Lo, 61, P_Cn, 63, P_Lo, 86, P_Cn, 87, P_Po, 88, P_No, 96, P_Lo, 119, P_So, 121, P_No, 128, P_Lo, 159, P_Cn, 167, P_No, 176, P_Cn, 224, P_Lo, 243, P_Cn, 244, P_Lo, 246, P_Cn, 251, P_No,
+ 0, P_Lo, 22, P_No, 28, P_Cn, 31, P_Po, 32, P_Lo, 58, P_Cn, 63, P_Po, 64, P_Cn, 128, P_Lo, 184, P_Cn, 188, P_No, 190, P_Lo, 192, P_No, 208, P_Cn, 210, P_No,
+ 0, P_Lo, 1, P_Mn, 4, P_Cn, 5, P_Mn, 7, P_Cn, 12, P_Mn, 16, P_Lo, 20, P_Cn, 21, P_Lo, 24, P_Cn, 25, P_Lo, 52, P_Cn, 56, P_Mn, 59, P_Cn, 63, P_Mn, 64, P_No, 72, P_Cn, 80, P_Po, 89, P_Cn, 96, P_Lo, 125, P_No, 127, P_Po, 128, P_Lo, 157, P_No, 160, P_Cn, 192, P_Lo, 200, P_So, 201, P_Lo, 229, P_Mn, 231, P_Cn, 235, P_No, 240, P_Po, 247, P_Cn,
+ 0, P_Lo, 54, P_Cn, 57, P_Po, 64, P_Lo, 86, P_Cn, 88, P_No, 96, P_Lo, 115, P_Cn, 120, P_No, 128, P_Lo, 146, P_Cn, 153, P_Po, 157, P_Cn, 169, P_No, 176, P_Cn,
+ 0, P_Lo, 73, P_Cn, 128, P_Lu, 179, P_Cn, 192, P_Ll, 243, P_Cn, 250, P_No,
+ 0, P_Cn, 96, P_No, 127, P_Cn,
+ 0, P_Mc, 1, P_Mn, 2, P_Mc, 3, P_Lo, 56, P_Mn, 71, P_Po, 78, P_Cn, 82, P_No, 102, P_Nd, 112, P_Cn, 127, P_Mn, 130, P_Mc, 131, P_Lo, 176, P_Mc, 179, P_Mn, 183, P_Mc, 185, P_Mn, 187, P_Po, 189, P_Cf, 190, P_Po, 194, P_Cn, 208, P_Lo, 233, P_Cn, 240, P_Nd, 250, P_Cn,
+ 0, P_Mn, 3, P_Lo, 39, P_Mn, 44, P_Mc, 45, P_Mn, 53, P_Cn, 54, P_Nd, 64, P_Po, 68, P_Cn, 80, P_Lo, 115, P_Mn, 116, P_Po, 118, P_Lo, 119, P_Cn, 128, P_Mn, 130, P_Mc, 131, P_Lo, 179, P_Mc, 182, P_Mn, 191, P_Mc, 193, P_Lo, 197, P_Po, 202, P_Mn, 205, P_Po, 206, P_Cn, 208, P_Nd, 218, P_Lo, 219, P_Po, 220, P_Lo, 221, P_Po, 224, P_Cn, 225, P_No, 245, P_Cn,
+ 0, P_Lo, 18, P_Cn, 19, P_Lo, 44, P_Mc, 47, P_Mn, 50, P_Mc, 52, P_Mn, 53, P_Mc, 54, P_Mn, 56, P_Po, 62, P_Mn, 63, P_Cn, 128, P_Lo, 135, P_Cn, 136, P_Lo, 137, P_Cn, 138, P_Lo, 142, P_Cn, 143, P_Lo, 158, P_Cn, 159, P_Lo, 169, P_Po, 170, P_Cn, 176, P_Lo, 223, P_Mn, 224, P_Mc, 227, P_Mn, 235, P_Cn, 240, P_Nd, 250, P_Cn,
+ 0, P_Mn, 2, P_Mc, 4, P_Cn, 5, P_Lo, 13, P_Cn, 15, P_Lo, 17, P_Cn, 19, P_Lo, 41, P_Cn, 42, P_Lo, 49, P_Cn, 50, P_Lo, 52, P_Cn, 53, P_Lo, 58, P_Cn, 60, P_Mn, 61, P_Lo, 62, P_Mc, 64, P_Mn, 65, P_Mc, 69, P_Cn, 71, P_Mc, 73, P_Cn, 75, P_Mc, 78, P_Cn, 80, P_Lo, 81, P_Cn, 87, P_Mc, 88, P_Cn, 93, P_Lo, 98, P_Mc, 100, P_Cn, 102, P_Mn, 109, P_Cn, 112, P_Mn, 117, P_Cn,
+ 0, P_Lo, 53, P_Mc, 56, P_Mn, 64, P_Mc, 66, P_Mn, 69, P_Mc, 70, P_Mn, 71, P_Lo, 75, P_Po, 80, P_Nd, 90, P_Cn, 91, P_Po, 92, P_Cn, 93, P_Po, 94, P_Cn, 128, P_Lo, 176, P_Mc, 179, P_Mn, 185, P_Mc, 186, P_Mn, 187, P_Mc, 191, P_Mn, 193, P_Mc, 194, P_Mn, 196, P_Lo, 198, P_Po, 199, P_Lo, 200, P_Cn, 208, P_Nd, 218, P_Cn,
+ 0, P_Cn, 128, P_Lo, 175, P_Mc, 178, P_Mn, 182, P_Cn, 184, P_Mc, 188, P_Mn, 190, P_Mc, 191, P_Mn, 193, P_Po, 216, P_Lo, 220, P_Mn, 222, P_Cn,
+ 0, P_Lo, 48, P_Mc, 51, P_Mn, 59, P_Mc, 61, P_Mn, 62, P_Mc, 63, P_Mn, 65, P_Po, 68, P_Lo, 69, P_Cn, 80, P_Nd, 90, P_Cn, 96, P_Po, 109, P_Cn, 128, P_Lo, 171, P_Mn, 172, P_Mc, 173, P_Mn, 174, P_Mc, 176, P_Mn, 182, P_Mc, 183, P_Mn, 184, P_Cn, 192, P_Nd, 202, P_Cn,
+ 0, P_Lo, 26, P_Cn, 29, P_Mn, 32, P_Mc, 34, P_Mn, 38, P_Mc, 39, P_Mn, 44, P_Cn, 48, P_Nd, 58, P_No, 60, P_Po, 63, P_So, 64, P_Cn,
+ 0, P_Cn, 160, P_Lu, 192, P_Ll, 224, P_Nd, 234, P_No, 243, P_Cn, 255, P_Lo,
+ 0, P_Cn, 192, P_Lo, 249, P_Cn,
+ 0, P_Lo, 9, P_Cn, 10, P_Lo, 47, P_Mc, 48, P_Mn, 55, P_Cn, 56, P_Mn, 62, P_Mc, 63, P_Mn, 64, P_Lo, 65, P_Po, 70, P_Cn, 80, P_Nd, 90, P_No, 109, P_Cn, 112, P_Po, 114, P_Lo, 144, P_Cn, 146, P_Mn, 168, P_Cn, 169, P_Mc, 170, P_Mn, 177, P_Mc, 178, P_Mn, 180, P_Mc, 181, P_Mn, 183, P_Cn,
+ 0, P_Lo, 154, P_Cn,
+ 0, P_Nl, 111, P_Cn, 112, P_Po, 117, P_Cn, 128, P_Lo,
+ 0, P_Lo, 68, P_Cn,
+ 0, P_Lo, 47, P_Cn,
+ 0, P_Lo, 71, P_Cn,
+ 0, P_Lo, 57, P_Cn, 64, P_Lo, 95, P_Cn, 96, P_Nd, 106, P_Cn, 110, P_Po, 112, P_Cn, 208, P_Lo, 238, P_Cn, 240, P_Mn, 245, P_Po, 246, P_Cn,
+ 0, P_Lo, 48, P_Mn, 55, P_Po, 60, P_So, 64, P_Lm, 68, P_Po, 69, P_So, 70, P_Cn, 80, P_Nd, 90, P_Cn, 91, P_No, 98, P_Cn, 99, P_Lo, 120, P_Cn, 125, P_Lo, 144, P_Cn,
+ 0, P_Lo, 69, P_Cn, 80, P_Lo, 81, P_Mc, 127, P_Cn, 143, P_Mn, 147, P_Lm, 160, P_Cn, 224, P_Lm, 225, P_Cn,
+ 0, P_Cn, 236, P_Lo, 237, P_Cn,
+ 0, P_Lo, 243, P_Cn,
+ 0, P_Lo, 2, P_Cn,
+ 0, P_Lo, 107, P_Cn, 112, P_Lo, 125, P_Cn, 128, P_Lo, 137, P_Cn, 144, P_Lo, 154, P_Cn, 156, P_So, 157, P_Mn, 159, P_Po, 160, P_Cf, 164, P_Cn,
+ 0, P_So, 246, P_Cn,
+ 0, P_So, 39, P_Cn, 41, P_So, 101, P_Mc, 103, P_Mn, 106, P_So, 109, P_Mc, 115, P_Cf, 123, P_Mn, 131, P_So, 133, P_Mn, 140, P_So, 170, P_Mn, 174, P_So, 233, P_Cn,
+ 0, P_So, 66, P_Mn, 69, P_So, 70, P_Cn,
+ 0, P_So, 87, P_Cn, 96, P_No, 114, P_Cn,
+ 0, P_Lu, 26, P_Ll, 52, P_Lu, 78, P_Ll, 85, P_Cn, 86, P_Ll, 104, P_Lu, 130, P_Ll, 156, P_Lu, 157, P_Cn, 158, P_Lu, 160, P_Cn, 162, P_Lu, 163, P_Cn, 165, P_Lu, 167, P_Cn, 169, P_Lu, 173, P_Cn, 174, P_Lu, 182, P_Ll, 186, P_Cn, 187, P_Ll, 188, P_Cn, 189, P_Ll, 196, P_Cn, 197, P_Ll, 208, P_Lu, 234, P_Ll,
+ 0, P_Ll, 4, P_Lu, 6, P_Cn, 7, P_Lu, 11, P_Cn, 13, P_Lu, 21, P_Cn, 22, P_Lu, 29, P_Cn, 30, P_Ll, 56, P_Lu, 58, P_Cn, 59, P_Lu, 63, P_Cn, 64, P_Lu, 69, P_Cn, 70, P_Lu, 71, P_Cn, 74, P_Lu, 81, P_Cn, 82, P_Ll, 108, P_Lu, 134, P_Ll, 160, P_Lu, 186, P_Ll, 212, P_Lu, 238, P_Ll,
+ 0, P_Ll, 8, P_Lu, 34, P_Ll, 60, P_Lu, 86, P_Ll, 112, P_Lu, 138, P_Ll, 166, P_Cn, 168, P_Lu, 193, P_Sm, 194, P_Ll, 219, P_Sm, 220, P_Ll, 226, P_Lu, 251, P_Sm, 252, P_Ll,
+ 0, P_Ll, 21, P_Sm, 22, P_Ll, 28, P_Lu, 53, P_Sm, 54, P_Ll, 79, P_Sm, 80, P_Ll, 86, P_Lu, 111, P_Sm, 112, P_Ll, 137, P_Sm, 138, P_Ll, 144, P_Lu, 169, P_Sm, 170, P_Ll, 195, P_Sm, 196, P_Ll, 202, P_Lul, 204, P_Cn, 206, P_Nd,
+ 0, P_Mn, 55, P_So, 59, P_Mn, 109, P_So, 117, P_Mn, 118, P_So, 132, P_Mn, 133, P_So, 135, P_Po, 140, P_Cn, 155, P_Mn, 160, P_Cn, 161, P_Mn, 176, P_Cn,
+ 0, P_Mn, 7, P_Cn, 8, P_Mn, 25, P_Cn, 27, P_Mn, 34, P_Cn, 35, P_Mn, 37, P_Cn, 38, P_Mn, 43, P_Cn,
+ 0, P_Lo, 197, P_Cn, 199, P_No, 208, P_Mn, 215, P_Cn,
+ 0, P_Lu, 34, P_Ll, 68, P_Mn, 75, P_Cn, 80, P_Nd, 90, P_Cn, 94, P_Po, 96, P_Cn,
+ 0, P_Lo, 4, P_Cn, 5, P_Lo, 32, P_Cn, 33, P_Lo, 35, P_Cn, 36, P_Lo, 37, P_Cn, 39, P_Lo, 40, P_Cn, 41, P_Lo, 51, P_Cn, 52, P_Lo, 56, P_Cn, 57, P_Lo, 58, P_Cn, 59, P_Lo, 60, P_Cn, 66, P_Lo, 67, P_Cn, 71, P_Lo, 72, P_Cn, 73, P_Lo, 74, P_Cn, 75, P_Lo, 76, P_Cn, 77, P_Lo, 80, P_Cn, 81, P_Lo, 83, P_Cn, 84, P_Lo, 85, P_Cn, 87, P_Lo, 88, P_Cn, 89, P_Lo, 90, P_Cn, 91, P_Lo, 92, P_Cn, 93, P_Lo, 94, P_Cn, 95, P_Lo, 96, P_Cn, 97, P_Lo, 99, P_Cn, 100, P_Lo, 101, P_Cn, 103, P_Lo, 107, P_Cn, 108, P_Lo, 115, P_Cn, 116, P_Lo, 120, P_Cn, 121, P_Lo, 125, P_Cn, 126, P_Lo, 127, P_Cn, 128, P_Lo, 138, P_Cn, 139, P_Lo, 156, P_Cn, 161, P_Lo, 164, P_Cn, 165, P_Lo, 170, P_Cn, 171, P_Lo, 188, P_Cn, 240, P_Sm, 242, P_Cn,
+ 0, P_So, 44, P_Cn, 48, P_So, 148, P_Cn, 160, P_So, 175, P_Cn, 177, P_So, 192, P_Cn, 193, P_So, 208, P_Cn, 209, P_So, 246, P_Cn,
+ 0, P_No, 13, P_Cn, 16, P_So, 47, P_Cn, 48, P_So, 108, P_Cn, 112, P_So, 173, P_Cn, 230, P_So,
+ 0, P_So, 3, P_Cn, 16, P_So, 60, P_Cn, 64, P_So, 73, P_Cn, 80, P_So, 82, P_Cn,
+ 0, P_So, 251, P_Sk,
+ 0, P_So, 211, P_Cn, 224, P_So, 237, P_Cn, 240, P_So, 247, P_Cn,
+ 0, P_So, 116, P_Cn, 128, P_So, 213, P_Cn,
+ 0, P_So, 12, P_Cn, 16, P_So, 72, P_Cn, 80, P_So, 90, P_Cn, 96, P_So, 136, P_Cn, 144, P_So, 174, P_Cn,
+ 0, P_Cn, 16, P_So, 31, P_Cn, 32, P_So, 40, P_Cn, 48, P_So, 49, P_Cn, 51, P_So, 63, P_Cn, 64, P_So, 76, P_Cn, 80, P_So, 95, P_Cn, 128, P_So, 146, P_Cn, 192, P_So, 193, P_Cn,
+ 0, P_Cn, 214, P_Lo, 215, P_Cn,
+ 0, P_Cn, 52, P_Lo, 53, P_Cn, 64, P_Lo, 65, P_Cn,
+ 0, P_Cn, 29, P_Lo, 30, P_Cn, 32, P_Lo, 33, P_Cn,
+ 0, P_Cn, 161, P_Lo, 162, P_Cn,
+ 0, P_Lo, 30, P_Cn,
+ 0, P_Cn, 1, P_Cf, 2, P_Cn, 32, P_Cf, 128, P_Cn,
+ 0, P_Mn, 240, P_Cn,
+ 0, P_Cn, 253, P_Co, 254, P_Cn,
+};
+const unsigned int UnicodeProperty::property_offsets[] = {
+ 0x0, 2, 122,
+ 0x100, 122, 248,
+ 0x200, 248, 294,
+ 0x300, 294, 366,
+ 0x400, 366, 390,
+ 0x500, 390, 450,
+ 0x600, 450, 520,
+ 0x700, 520, 560,
+ 0x800, 560, 606,
+ 0x900, 606, 728,
+ 0xA00, 728, 878,
+ 0xB00, 878, 1040,
+ 0xC00, 1040, 1174,
+ 0xD00, 1174, 1290,
+ 0xE00, 1290, 1398,
+ 0xF00, 1398, 1486,
+ 0x1000, 1486, 1576,
+ 0x1100, 1576, 1578,
+ 0x1200, 1578, 1632,
+ 0x1300, 1632, 1666,
+ 0x1400, 1666, 1670,
+ 0x1500, 1576, 1578,
+ 0x1600, 1670, 1696,
+ 0x1700, 1696, 1770,
+ 0x1800, 1770, 1810,
+ 0x1900, 1810, 1866,
+ 0x1A00, 1866, 1930,
+ 0x1B00, 1930, 2012,
+ 0x1C00, 2012, 2076,
+ 0x1D00, 2076, 2094,
+ 0x1E00, 2094, 2100,
+ 0x1F00, 2100, 2228,
+ 0x2000, 2228, 2342,
+ 0x2100, 2342, 2474,
+ 0x2200, 2474, 2476,
+ 0x2300, 2476, 2512,
+ 0x2400, 2512, 2526,
+ 0x2500, 2526, 2538,
+ 0x2600, 2538, 2544,
+ 0x2700, 2544, 2608,
+ 0x2800, 2608, 2610,
+ 0x2900, 2610, 2674,
+ 0x2A00, 2474, 2476,
+ 0x2B00, 2674, 2706,
+ 0x2C00, 2706, 2760,
+ 0x2D00, 2760, 2822,
+ 0x2E00, 2822, 2908,
+ 0x2F00, 2908, 2916,
+ 0x3000, 2916, 3020,
+ 0x3100, 3020, 3046,
+ 0x3200, 3046, 3072,
+ 0x3300, 2608, 2610,
+ 0x3400, 3072, 3076,
+ 0x3500, 0, 2,
+ 0x4D00, 3076, 3084,
+ 0x4E00, 3072, 3076,
+ 0x4F00, 0, 2,
+ 0x9F00, 3084, 3090,
+ 0xA000, 3090, 3096,
+ 0xA100, 1576, 1578,
+ 0xA400, 3096, 3110,
+ 0xA500, 1576, 1578,
+ 0xA600, 3110, 3156,
+ 0xA700, 3156, 3214,
+ 0xA800, 3214, 3284,
+ 0xA900, 3284, 3350,
+ 0xAA00, 3350, 3448,
+ 0xAB00, 3448, 3506,
+ 0xAC00, 3072, 3076,
+ 0xAD00, 0, 2,
+ 0xD700, 3506, 3520,
+ 0xD800, 3520, 3524,
+ 0xD900, 0, 2,
+ 0xDB00, 3524, 3532,
+ 0xDC00, 3520, 3524,
+ 0xDD00, 0, 2,
+ 0xDF00, 3532, 3536,
+ 0xE000, 3536, 3540,
+ 0xE100, 0, 2,
+ 0xF800, 3540, 3544,
+ 0xF900, 1576, 1578,
+ 0xFA00, 3544, 3552,
+ 0xFB00, 3552, 3596,
+ 0xFC00, 1576, 1578,
+ 0xFD00, 3596, 3620,
+ 0xFE00, 3620, 3730,
+ 0xFF00, 3730, 3850,
+ 0x10000, 3850, 3878,
+ 0x10100, 3878, 3914,
+ 0x10200, 3914, 3930,
+ 0x10300, 3930, 3970,
+ 0x10400, 3970, 3990,
+ 0x10500, 3990, 4002,
+ 0x10600, 1576, 1578,
+ 0x10700, 4002, 4014,
+ 0x10800, 4014, 4066,
+ 0x10900, 4066, 4096,
+ 0x10A00, 4096, 4162,
+ 0x10B00, 4162, 4192,
+ 0x10C00, 4192, 4206,
+ 0x10D00, 0, 2,
+ 0x10E00, 4206, 4212,
+ 0x10F00, 0, 2,
+ 0x11000, 4212, 4262,
+ 0x11100, 4262, 4328,
+ 0x11200, 4328, 4388,
+ 0x11300, 4388, 4460,
+ 0x11400, 4460, 4520,
+ 0x11500, 4520, 4546,
+ 0x11600, 4546, 4596,
+ 0x11700, 4596, 4622,
+ 0x11800, 4622, 4636,
+ 0x11900, 0, 2,
+ 0x11A00, 4636, 4642,
+ 0x11B00, 0, 2,
+ 0x11C00, 4642, 4696,
+ 0x11D00, 0, 2,
+ 0x12000, 1576, 1578,
+ 0x12300, 4696, 4700,
+ 0x12400, 4700, 4710,
+ 0x12500, 4710, 4714,
+ 0x12600, 0, 2,
+ 0x13000, 1576, 1578,
+ 0x13400, 4714, 4718,
+ 0x13500, 0, 2,
+ 0x14400, 1576, 1578,
+ 0x14600, 4718, 4722,
+ 0x14700, 0, 2,
+ 0x16800, 1576, 1578,
+ 0x16A00, 4722, 4748,
+ 0x16B00, 4748, 4780,
+ 0x16C00, 0, 2,
+ 0x16F00, 4780, 4800,
+ 0x17000, 3072, 3076,
+ 0x17100, 0, 2,
+ 0x18700, 4800, 4806,
+ 0x18800, 1576, 1578,
+ 0x18A00, 4806, 4810,
+ 0x18B00, 0, 2,
+ 0x1B000, 4810, 4814,
+ 0x1B100, 0, 2,
+ 0x1BC00, 4814, 4840,
+ 0x1BD00, 0, 2,
+ 0x1D000, 4840, 4844,
+ 0x1D100, 4844, 4874,
+ 0x1D200, 4874, 4882,
+ 0x1D300, 4882, 4890,
+ 0x1D400, 4890, 4946,
+ 0x1D500, 4946, 5000,
+ 0x1D600, 5000, 5032,
+ 0x1D700, 5032, 5074,
+ 0x1D800, 2608, 2610,
+ 0x1DA00, 5074, 5102,
+ 0x1DB00, 0, 2,
+ 0x1E000, 5102, 5122,
+ 0x1E100, 0, 2,
+ 0x1E800, 5122, 5132,
+ 0x1E900, 5132, 5148,
+ 0x1EA00, 0, 2,
+ 0x1EE00, 5148, 5284,
+ 0x1EF00, 0, 2,
+ 0x1F000, 5284, 5308,
+ 0x1F100, 5308, 5326,
+ 0x1F200, 5326, 5342,
+ 0x1F300, 5342, 5346,
+ 0x1F400, 2608, 2610,
+ 0x1F600, 5346, 5358,
+ 0x1F700, 5358, 5366,
+ 0x1F800, 5366, 5386,
+ 0x1F900, 5386, 5420,
+ 0x1FA00, 0, 2,
+ 0x20000, 3072, 3076,
+ 0x20100, 0, 2,
+ 0x2A600, 5420, 5426,
+ 0x2A700, 3072, 3076,
+ 0x2A800, 0, 2,
+ 0x2B700, 5426, 5436,
+ 0x2B800, 5436, 5446,
+ 0x2B900, 0, 2,
+ 0x2CE00, 5446, 5452,
+ 0x2CF00, 0, 2,
+ 0x2F800, 1576, 1578,
+ 0x2FA00, 5452, 5456,
+ 0x2FB00, 0, 2,
+ 0xE0000, 5456, 5466,
+ 0xE0100, 5466, 5470,
+ 0xE0200, 0, 2,
+ 0xF0000, 3536, 3540,
+ 0xF0100, 0, 2,
+ 0xFFF00, 5470, 5476,
+ 0x100000, 3536, 3540,
+ 0x100100, 0, 2,
+ 0x10FF00, 5470, 5476,
+ 0x110000, 0, 2,
+};
+const int UnicodeProperty::nproperty_offsets = (sizeof(UnicodeProperty::property_offsets) / (3*sizeof(unsigned int)));
+
+inline const unsigned int *
+UnicodeProperty::find_offset(uint32_t u)
+{
+ // Up to U+1A00 each page has its own definition.
+ if (u < 0x1A00)
+ return &property_offsets[3*(u >> 8)];
+ // At or after U+1A00, binary search.
+ int l = 0x1A, r = nproperty_offsets - 2;
+ while (l <= r) {
+ int m = (l + r) / 2;
+ const unsigned int *ptr = &property_offsets[3*m];
+ if (u < ptr[0])
+ r = m - 1;
+ else if (u >= ptr[3])
+ l = m + 1;
+ else
+ return ptr;
+ }
+ // If search fails, return last record, which will be all-unassigned.
+ return &property_offsets[3*(nproperty_offsets - 1)];
+}
+
+int
+UnicodeProperty::property(uint32_t u)
+{
+ const unsigned int *offsets = find_offset(u);
+
+ // Now we only care about the last byte.
+ u &= 255;
+
+ // Binary search within record.
+ int l = offsets[1], r = offsets[2] - 4;
+ const unsigned char *the_ptr;
+ while (l <= r) {
+ int m = ((l + r) / 2) & ~1;
+ const unsigned char *ptr = &property_pages[m];
+ if (u < ptr[0])
+ r = m - 2;
+ else if (u >= ptr[2])
+ l = m + 2;
+ else {
+ the_ptr = ptr;
+ goto found_ptr;
+ }
+ }
+ the_ptr = &property_pages[l];
+
+ found_ptr:
+ // Found right block.
+ if (the_ptr[1] == P_Lul)
+ return ((u - the_ptr[0]) % 2 ? P_Ll : P_Lu);
+ else
+ return the_ptr[1];
+}
+
+static const char property_names[] =
+ "Cn\0Co\0Cs\0Cf\0Cc\0\0\0\0\0\0\0\0\0\0"
+ "Zs\0Zl\0Zp\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Mn\0Mc\0Me\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Lo\0Lu\0Ll\0Lt\0Lm\0\0\0\0\0\0\0\0\0\0"
+ "No\0Nd\0Nl\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+ "Po\0Pc\0Pd\0Ps\0Pe\0Pi\0Pf\0\0\0\0"
+ "So\0Sm\0Sc\0Sk";
+
+static const char * const property_long_names[] = {
+ "Unassigned", "PrivateUse", "Surrogate", "Format", "Control", 0, 0, 0,
+ "SpaceSeparator", "LineSeparator", "ParagraphSeparator", 0, 0, 0, 0, 0,
+ "NonspacingMark", "SpacingMark", "EnclosingMark", 0, 0, 0, 0, 0,
+ "OtherLetter", "UppercaseLetter", "LowercaseLetter", "TitlecaseLetter", "ModifierLetter", 0, 0, 0,
+ "OtherNumber", "DecimalNumber", "LetterNumber", 0, 0, 0, 0, 0,
+ "OtherPunctuation", "ConnectorPunctuation", "DashPunctuation", "OpenPunctuation", "ClosePunctuation", "InitialPunctuation", "FinalPunctuation", 0,
+ "OtherSymbol", "MathSymbol", "CurrencySymbol", "ModifierSymbol"
+};
+
+static const char * const property_category_long_names[] = {
+ "Other", "Separator", "Mark", "Letter", "Number", "Punctuation", "Symbol"
+};
+
+
+const char *
+UnicodeProperty::property_name(int p)
+{
+ if (p >= 0 && p <= P_Sk && property_names[p*3])
+ return &property_names[p*3];
+ else
+ return "?";
+}
+
+bool
+UnicodeProperty::parse_property(const String &s, int &prop, int &prop_mask)
+{
+ if (s.length() == 0)
+ return false;
+ else if (s.length() <= 2) {
+ for (int i = 0; i <= P_S; i += 010)
+ if (property_names[3*i] == s[0]) {
+ if (s.length() == 1) {
+ prop = i;
+ prop_mask = P_TMASK;
+ return true;
+ }
+ for (; property_names[3*i]; i++)
+ if (property_names[3*i+1] == s[1]) {
+ prop = i;
+ prop_mask = 0377;
+ return true;
+ }
+ break;
+ }
+ return false;
+ } else {
+ const char * const *dict = property_category_long_names;
+ for (int i = 0; i <= P_S; i += 010, dict++)
+ if (s == *dict) {
+ prop = i;
+ prop_mask = P_TMASK;
+ return true;
+ }
+ dict = property_long_names;
+ for (int i = 0; i <= P_Sk; i++, dict++)
+ if (*dict && s == *dict) {
+ prop = i;
+ prop_mask = 0377;
+ return true;
+ }
+ return false;
+ }
+}
+
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh
new file mode 100644
index 00000000000..a92a319d659
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/uniprop.hh
@@ -0,0 +1,34 @@
+#ifndef OTFTOTFM_UNIPROP_HH
+#define OTFTOTFM_UNIPROP_HH
+#include <efont/otf.hh>
+
+class UnicodeProperty { public:
+
+ enum {
+ P_C = 000, P_Cn = 000, P_Co = 001, P_Cs = 002, P_Cf = 003, P_Cc = 004,
+ P_Z = 010, P_Zs = 010, P_Zl = 011, P_Zp = 012,
+ P_M = 020, P_Mn = 020, P_Mc = 021, P_Me = 022,
+ P_L = 030, P_Lo = 030, P_Lu = 031, P_Ll = 032, P_Lt = 033, P_Lm = 034,
+ P_N = 040, P_No = 040, P_Nd = 041, P_Nl = 042,
+ P_P = 050, P_Po = 050, P_Pc = 051, P_Pd = 052, P_Ps = 053, P_Pe = 054, P_Pi = 055, P_Pf = 056,
+ P_S = 060, P_So = 060, P_Sm = 061, P_Sc = 062, P_Sk = 063,
+ P_TMASK = 0370,
+ P_MAX = 0377
+ };
+
+ static int property(uint32_t uni);
+ static const char* property_name(int p);
+ static bool parse_property(const String&, int& prop, int& prop_mask);
+
+ private:
+
+ enum { P_Lul = 070 };
+ static const unsigned char property_pages[];
+ static const unsigned int property_offsets[];
+ static const int nproperty_offsets;
+
+ static inline const unsigned int* find_offset(uint32_t uni);
+
+};
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc
new file mode 100644
index 00000000000..920c5c001d2
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.cc
@@ -0,0 +1,299 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "util.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <ctype.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <io.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning)
+{
+ FILE *f;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(filename.c_str(), "rb"))) {
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<stdin>");
+ else
+ return s;
+}
+
+String
+pathname_filename(const String &path)
+{
+ int slash = path.find_right('/');
+ if (slash >= 0 && slash != path.length() - 1)
+ return path.substring(slash + 1);
+ else
+ return path;
+}
+
+static String
+simplify_filename(String x)
+{
+ while (x.substring(0, 2) == "./")
+ x = x.substring(2);
+ int pos;
+ while ((pos = x.find_left("/./")) >= 0)
+ x = x.substring(0, pos) + x.substring(pos + 2);
+ return x;
+}
+
+bool
+same_filename(const String &a, const String &b)
+{
+ return simplify_filename(a) == simplify_filename(b);
+}
+
+String
+shell_quote(const String &str)
+{
+ if (!str)
+ return String::make_stable("\"\"");
+
+ const char *begin = str.begin();
+ const char *end = str.end();
+ StringAccum sa;
+
+#if defined(_MSDOS) || defined(_WIN32)
+ sa.append('\"');
+
+ for (const char *s = begin; s < end; ++s)
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '\\' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else if (*s == '\"') {
+ sa.append(begin, s);
+ sa.append("\"\"\"", 3);
+ begin = s + 1;
+ } else {
+ sa.append(begin, s + 1);
+ begin = s + 1;
+ }
+
+ if (sa.length() > 1) {
+ sa.append(begin, end);
+ sa.append('\"');
+ return sa.take_string();
+ }
+#else
+ for (const char *s = begin; s < end; s++)
+ if (isalnum((unsigned char) *s) || *s == '_' || *s == '-' || *s == '+' || *s == '/' || *s == ':' || *s == '.')
+ /* do nothing */;
+ else {
+ sa.append(begin, s);
+ sa.append('\\');
+ begin = s;
+ }
+
+ if (sa.length()) {
+ sa.append(begin, end);
+ return sa.take_string();
+ }
+#endif
+
+ return str;
+}
+
+int
+mysystem(const char *command, ErrorHandler *errh)
+{
+ if (no_create) {
+ errh->message("would run %s", command);
+ return 0;
+ } else {
+ if (verbose)
+ errh->message("running %s", command);
+ return system(command);
+ }
+}
+
+FILE*
+mypopen(const char* command, const char* type, ErrorHandler* errh)
+{
+ if (no_create) {
+ errh->message("would run %s", command);
+ return popen("true", type);
+ } else {
+ if (verbose)
+ errh->message("running %s", command);
+ return popen(command, type);
+ }
+}
+
+#if !HAVE_MKSTEMP
+static const char *
+my_tmpnam()
+{
+# ifndef WIN32
+ return tmpnam(0);
+# else
+ const char *dir = getenv("TEMP");
+ return _tempnam(dir ? dir : ".", "otftmp.");
+# endif
+}
+#endif
+
+int
+temporary_file(String &filename, ErrorHandler *errh)
+{
+ if (no_create)
+ return 0; // random number suffices
+
+#if HAVE_MKSTEMP
+ const char *tmpdir = getenv("TMPDIR");
+ if (tmpdir)
+ filename = String(tmpdir) + "/otftotfm.XXXXXX";
+ else {
+# ifdef P_tmpdir
+ filename = P_tmpdir "/otftotfm.XXXXXX";
+# else
+ filename = "/tmp/otftotfm.XXXXXX";
+# endif
+ }
+ int fd = mkstemp(filename.mutable_c_str());
+ if (fd < 0)
+ errh->error("temporary file %<%s%>: %s", filename.c_str(), strerror(errno));
+ return fd;
+#else // !HAVE_MKSTEMP
+ for (int tries = 0; tries < 5; tries++) {
+ if (!(filename = my_tmpnam()))
+ return errh->error("cannot create temporary file");
+# ifdef O_EXCL
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_EXCL | O_TRUNC, 0600);
+# else
+ int fd = ::open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600);
+# endif
+ if (fd >= 0)
+ return fd;
+ }
+ return errh->error("temporary file %<%s%>: %s", filename.c_str(), strerror(errno));
+#endif
+}
+
+bool
+parse_unicode_number(const char* begin, const char* end, int require_prefix, uint32_t& result)
+{
+ bool allow_lower = (require_prefix == 1);
+ if (require_prefix < 0)
+ /* do not look for prefix */;
+ else if (begin + 7 == end && begin[0] == 'u' && begin[1] == 'n' && begin[2] == 'i')
+ begin += 3;
+ else if (begin + 5 <= end && begin + 7 >= end && begin[0] == 'u')
+ begin++;
+ else if (begin + 3 <= end && begin + 8 >= end && begin[0] == 'U' && begin[1] == '+')
+ begin += 2, allow_lower = true;
+ else if (require_prefix > 1)
+ /* some prefix was required */
+ return false;
+
+ uint32_t value;
+ for (value = 0; begin < end; begin++)
+ if (*begin >= '0' && *begin <= '9')
+ value = (value << 4) | (*begin - '0');
+ else if (*begin >= 'A' && *begin <= 'F')
+ value = (value << 4) | (*begin - 'A' + 10);
+ else if (allow_lower && *begin >= 'a' && *begin <= 'f')
+ value = (value << 4) | (*begin - 'a' + 10);
+ else
+ return false;
+
+ if (value > 0
+ && (value <= 0xD7FF || (value >= 0xE000 && value <= 0x10FFFF))) {
+ result = value;
+ return true;
+ } else
+ return false;
+}
+
+#if 0
+String
+shell_command_output(String cmdline, const String &input, ErrorHandler *errh, bool strip_newlines)
+{
+ FILE *f = tmpfile();
+ if (!f)
+ errh->fatal("cannot create temporary file: %s", strerror(errno));
+ ignore_result(fwrite(input.data(), 1, input.length(), f));
+ fflush(f);
+ rewind(f);
+
+ String new_cmdline = cmdline + " 0<&" + String(fileno(f));
+ FILE *p = popen(new_cmdline.c_str(), "r");
+ if (!p)
+ errh->fatal("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(2048)) {
+ amt = fread(x, 1, 2048, p);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0 && sa.length() < 200000);
+ if (amt != 0)
+ errh->warning("%<%s%> output too long, truncated", cmdline.c_str());
+ else if (!feof(p) || ferror(p))
+ errh->error("%<%s%>: %s", cmdline.c_str(), strerror(errno));
+
+ fclose(f);
+ pclose(p);
+ while (strip_newlines && sa && (sa.back() == '\n' || sa.back() == '\r'))
+ sa.pop_back();
+ return sa.take_string();
+}
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh
new file mode 100644
index 00000000000..6eb5415fc9a
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/otftotfm/util.hh
@@ -0,0 +1,37 @@
+#ifndef OTFTOTFM_UTIL_HH
+#define OTFTOTFM_UTIL_HH
+#include <lcdf/string.hh>
+#include <lcdf/globmatch.hh>
+#include <stdio.h>
+class ErrorHandler;
+
+extern bool no_create;
+extern bool verbose;
+extern bool force;
+
+enum { G_ENCODING = 1, G_METRICS = 2, G_VMETRICS = 4, G_TYPE1 = 8,
+ G_PSFONTSMAP = 16, G_BINARY = 32, G_ASCII = 64, G_DOTLESSJ = 128,
+ G_UPDMAP = 256, G_TRUETYPE = 512, G_TYPE42 = 1024, G_UPDMAP_USER = 2048 };
+
+extern unsigned output_flags;
+
+String read_file(String filename, ErrorHandler *, bool warn = false);
+String printable_filename(const String &);
+String pathname_filename(const String &);
+bool same_filename(const String &a, const String &b);
+String shell_quote(const String &);
+int temporary_file(String &, ErrorHandler *);
+int mysystem(const char *command, ErrorHandler *);
+FILE* mypopen(const char* command, const char* type, ErrorHandler* errh);
+bool parse_unicode_number(const char*, const char*, int require_prefix, uint32_t& result);
+
+#ifdef WIN32
+#define WEXITSTATUS(es) (es)
+#endif
+
+template <typename T>
+void ignore_result(T result) {
+ (void) result;
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.am
new file mode 100644
index 00000000000..41360807e13
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1dotlessj
+man_MANS = t1dotlessj.1
+
+t1dotlessj_SOURCES = t1dotlessj.cc
+
+t1dotlessj_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1dotlessj.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.in
new file mode 100644
index 00000000000..e7c9cead16b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/Makefile.in
@@ -0,0 +1,748 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1dotlessj$(EXEEXT)
+subdir = lcdf-typetools-src/t1dotlessj
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1dotlessj_OBJECTS = t1dotlessj.$(OBJEXT)
+t1dotlessj_OBJECTS = $(am_t1dotlessj_OBJECTS)
+t1dotlessj_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t1dotlessj.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1dotlessj_SOURCES)
+DIST_SOURCES = $(t1dotlessj_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1dotlessj.1
+t1dotlessj_SOURCES = t1dotlessj.cc
+t1dotlessj_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1dotlessj.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/t1dotlessj/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/t1dotlessj/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+t1dotlessj$(EXEEXT): $(t1dotlessj_OBJECTS) $(t1dotlessj_DEPENDENCIES) $(EXTRA_t1dotlessj_DEPENDENCIES)
+ @rm -f t1dotlessj$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1dotlessj_OBJECTS) $(t1dotlessj_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1dotlessj.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/t1dotlessj.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/t1dotlessj.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1
new file mode 100644
index 00000000000..a839fca3492
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.1
@@ -0,0 +1,96 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1DOTLESSJ 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1dotlessj \- create a dotless-j PostScript Type 1 font
+.SH SYNOPSIS
+.B t1dotlessj
+\%[OPTIONS...]
+.I font
+.RI [ outputfile ]
+.SH DESCRIPTION
+.BR T1dotlessj
+creates a PostScript Type\~1 font whose only character is a dotless 'j'
+matching the input font's design. It works simply by removing the dot from
+the input font's 'j'. The output font has three characters: '.notdef',
+\&'space', and 'uni0237', where 'uni0237' is the dotless 'j'. The command
+fails if the input font already has a dotless 'j' character, or if there
+seems to be no dot to remove. T1dotlessj writes the created PFA or PFB font
+to the standard output (but see the
+.B \-\-output
+option); if no input file is supplied, it reads a PFA or PFB font from the
+standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-\-output "=\fIfile\fR, " \-o " \fIfile"
+Send output to
+.I file
+instead of standard output.
+'
+.Sp
+.TP 5
+.BR \-\-pfb ", " \-b
+Output a PFB font. This is the default.
+'
+.Sp
+.TP 5
+.BR \-\-pfa ", " \-a
+Output a PFA font.
+'
+.Sp
+.TP 5
+.BR \-\-name "=\fIname\fR, " \-n " \fIname"
+Set the output font's PostScript name to
+.IR name .
+The default is
+.IR InputFontName "LCDFJ."
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "RETURN VALUES"
+.B T1dotlessj
+exits with one of the following values:
+.TP 5
+0
+A dotless-j font was successfully generated.
+.TP 5
+1
+The font already contained a dotless-j character.
+.TP 5
+2
+The font's "j" character had no dot to remove.
+.TP 5
+3
+The font had no "j" character.
+.TP 5
+>3
+An error occurred.
+'
+.SH "SEE ALSO"
+.LP
+.I "Adobe Type 1 Font Format"
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc
new file mode 100644
index 00000000000..9a70c4183a1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1dotlessj/t1dotlessj.cc
@@ -0,0 +1,425 @@
+/* t1dotlessj.cc -- driver for creating dotlessj characters from Type 1 fonts
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1csgen.hh>
+#include <efont/t1bounds.hh>
+#include <efont/t1unparser.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+// also see otftotfm/automatic.cc
+enum { EXIT_NORMAL = 0, EXIT_DOTLESSJ_EXISTS = 1, EXIT_J_NODOT = 2,
+ EXIT_NO_J = 3, EXIT_ERROR = 4 };
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define PFA_OPT 304
+#define PFB_OPT 305
+#define OUTPUT_OPT 306
+#define NAME_OPT 307
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "name", 'n', NAME_OPT, Clp_ValString, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(EXIT_ERROR);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1dotlessj%> reads a PostScript Type 1 font, derives a new PostScript Type 1\n\
+font containing just a dotlessj character (by chopping the dot from the j),\n\
+and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE instead of standard output.\n\
+ -n, --name=NAME Set output font%,s PostScript name.\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not report errors to standard error.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// Sectioner
+
+class Sectioner : public Type1CharstringGenInterp { public:
+
+ Sectioner(int precision);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+ void act_flex(int, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, const Point &, double);
+
+ void run(const CharstringContext &g);
+ void undot(PermString, ErrorHandler *);
+ Type1Charstring gen(Type1Font *);
+
+ private:
+
+ CharstringBounds _boundser;
+
+ Vector<String> _sections;
+ Vector<int> _bounds;
+
+ void append_bounds();
+
+};
+
+Sectioner::Sectioner(int precision)
+ : Type1CharstringGenInterp(precision)
+{
+ set_direct_hint_replacement(true);
+}
+
+void
+Sectioner::act_line(int cmd, const Point &p0, const Point &p1)
+{
+ Type1CharstringGenInterp::act_line(cmd, p0, p1);
+ _boundser.act_line(cmd, p0, p1);
+}
+
+void
+Sectioner::act_curve(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Type1CharstringGenInterp::act_curve(cmd, p0, p1, p2, p3);
+ _boundser.act_curve(cmd, p0, p1, p2, p3);
+}
+
+void
+Sectioner::act_flex(int cmd, const Point &p0, const Point &p1, const Point &p2, const Point &p3_4, const Point &p5, const Point &p6, const Point &p7, double flex_depth)
+{
+ Type1CharstringGenInterp::act_flex(cmd, p0, p1, p2, p3_4, p5, p6, p7, flex_depth);
+ _boundser.act_flex(cmd, p0, p1, p2, p3_4, p5, p6, p7, flex_depth);
+}
+
+void Sectioner::append_bounds() {
+ double bb[5];
+ _boundser.output(bb, bb[4]);
+ _bounds.push_back((int) floor(bb[0]));
+ _bounds.push_back((int) floor(bb[1]));
+ _bounds.push_back((int) ceil(bb[2]));
+ _bounds.push_back((int) ceil(bb[3]));
+}
+
+void
+Sectioner::act_closepath(int cmd)
+{
+ Type1CharstringGenInterp::act_closepath(cmd);
+ Type1Charstring result;
+ Type1CharstringGenInterp::intermediate_output(result);
+ _sections.push_back(result.data_string());
+ append_bounds();
+ _boundser.clear();
+}
+
+void
+Sectioner::run(const CharstringContext &g)
+{
+ _boundser.clear();
+ Type1Charstring last_section;
+ Type1CharstringGenInterp::run(g, last_section);
+ _sections.push_back(last_section.data_string());
+ append_bounds();
+}
+
+void
+Sectioner::undot(PermString font_name, ErrorHandler *errh)
+{
+ //for (String *s = _sections.begin(); s < _sections.end(); s++)
+ // fprintf(stderr, "%d %s\n", s - _sections.begin(), CharstringUnparser::unparse(Type1Charstring(*s)).c_str());
+
+ if (_sections.size() < 3)
+ errh->fatal("<%d>%s: %<j%> is already dotless", -EXIT_J_NODOT, font_name.c_str());
+
+ int topmost = -1;
+ for (int i = 0; i < _sections.size() - 1; i++)
+ if (topmost < 0 || _bounds[i*4 + 1] > _bounds[topmost*4 + 1])
+ topmost = i;
+
+ // check if any sections are below this
+ for (int i = 0; i < _sections.size() - 1; i++)
+ if (_bounds[i*4 + 1] < _bounds[topmost*4 + 1])
+ goto found_below;
+ errh->fatal("<%d>%s: %<j%> is already dotless", -EXIT_J_NODOT, font_name.c_str());
+
+ found_below:
+ _sections[topmost] = String();
+}
+
+Type1Charstring
+Sectioner::gen(Type1Font *font)
+{
+ StringAccum sa;
+ for (String *s = _sections.begin(); s < _sections.end(); s++)
+ sa << *s;
+ Type1Charstring in(sa.take_string()), out;
+ Type1CharstringGenInterp gen(precision());
+ gen.set_hint_replacement_storage(font);
+ gen.run(CharstringContext(program(), &in), out);
+ return out;
+}
+
+
+// MAIN
+
+static Type1Font *
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("<%d>%s: %s", -EXIT_ERROR, filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("<%d>%s: empty file", -EXIT_ERROR, filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal("<%d>%s: no glyphs in font", -EXIT_ERROR, filename);
+
+ delete reader;
+ return font;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *input_file = 0;
+ FILE *outputf = 0;
+ const char *private_use_dotlessj = "uniF6BE";
+ bool binary = true;
+ const char *font_name = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case NAME_OPT:
+ font_name = clp->vstr;
+ break;
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case OUTPUT_OPT:
+ output_file:
+ if (outputf)
+ usage_error(errh, "output file specified twice");
+ if (strcmp(clp->vstr, "-") == 0)
+ outputf = stdout;
+ else if (!(outputf = fopen(clp->vstr, "wb")))
+ errh->fatal("<%d>%s: %s", -EXIT_ERROR, clp->vstr, strerror(errno));
+ break;
+
+ case VERSION_OPT:
+ printf("t1dotlessj (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2003-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && outputf)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto output_file;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ Type1Font *font = do_file(input_file, psres, errh);
+ if (!input_file || strcmp(input_file, "-") == 0)
+ input_file = "<stdin>";
+
+ // check for existing dotlessj
+ if (font->glyph("dotlessj"))
+ errh->fatal("<%d>%s: already has a %<dotlessj%> glyph", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (font->glyph("uni0237"))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<uni0237%>", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (font->glyph("u0237"))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<u0237%>", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str());
+ else if (private_use_dotlessj && font->glyph(private_use_dotlessj))
+ errh->fatal("<%d>%s: already has a dotlessj glyph at %<%s%>", -EXIT_DOTLESSJ_EXISTS, font->font_name().c_str(), private_use_dotlessj);
+
+ // check for j
+ Type1Charstring *j_cs = font->glyph("j");
+ if (!j_cs)
+ j_cs = font->glyph("uni006A");
+ if (!j_cs)
+ j_cs = font->glyph("u006A");
+ if (!j_cs)
+ errh->fatal("<%d>%s: has no %<j%> glyph to make dotless", -EXIT_NO_J, font->font_name().c_str());
+
+ // make new font
+ String actual_font_name = (font_name ? String(font_name) : font->font_name() + String("LCDFJ"));
+ if (actual_font_name.length() > 29 && !font_name) {
+ errh->warning("derived font name %<%s%> longer than 29 characters", actual_font_name.c_str());
+ errh->message("(Use the %<--name%> option to supply your own name.)");
+ }
+
+ Vector<double> xuid_extension;
+ xuid_extension.push_back(0x00237237);
+ Type1Font *dotless_font = Type1Font::skeleton_make_copy(font, actual_font_name, &xuid_extension);
+ dotless_font->skeleton_common_subrs();
+
+ // copy space and .notdef
+ if (Type1Charstring *notdef = font->glyph(".notdef"))
+ dotless_font->add_glyph(Type1Subr::make_glyph(".notdef", *notdef, " |-"));
+ if (Type1Charstring *space = font->glyph("space")) {
+ dotless_font->add_glyph(Type1Subr::make_glyph("space", *space, " |-"));
+ dotless_font->type1_encoding()->put(' ', "space");
+ }
+
+ // create dotless j
+ Sectioner sec(5);
+ sec.run(CharstringContext(font, j_cs));
+ sec.undot(font->font_name(), errh);
+ Type1Subr *dotlessj = Type1Subr::make_glyph("uni0237", sec.gen(dotless_font), " |-");
+ dotless_font->add_glyph(dotlessj);
+ //fprintf(stderr, "! %s\n", CharstringUnparser::unparse(dotlessj->t1cs()).c_str());
+
+ // encode dotless j
+ dotless_font->type1_encoding()->clear();
+ dotless_font->type1_encoding()->put('j', "uni0237");
+
+ // write it to output
+ if (!outputf)
+ outputf = stdout;
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outputf), _O_BINARY);
+#endif
+ if (binary) {
+ Type1PFBWriter w(outputf);
+ dotless_font->write(w);
+ } else {
+ Type1PFAWriter w(outputf);
+ dotless_font->write(w);
+ }
+
+ return (errh->nerrors() == 0 ? EXIT_NORMAL : EXIT_ERROR);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.am
new file mode 100644
index 00000000000..c76b5671fe5
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1lint
+man_MANS = t1lint.1
+
+t1lint_SOURCES = cscheck.hh cscheck.cc \
+ t1lint.cc
+
+t1lint_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1lint.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.in
new file mode 100644
index 00000000000..4511598ebfa
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/Makefile.in
@@ -0,0 +1,771 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1lint$(EXEEXT)
+subdir = lcdf-typetools-src/t1lint
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1lint_OBJECTS = cscheck.$(OBJEXT) t1lint.$(OBJEXT)
+t1lint_OBJECTS = $(am_t1lint_OBJECTS)
+t1lint_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cscheck.Po ./$(DEPDIR)/t1lint.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(t1lint_SOURCES)
+DIST_SOURCES = $(t1lint_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1lint.1
+t1lint_SOURCES = cscheck.hh cscheck.cc \
+ t1lint.cc
+
+t1lint_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1lint.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/t1lint/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/t1lint/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+t1lint$(EXEEXT): $(t1lint_OBJECTS) $(t1lint_DEPENDENCIES) $(EXTRA_t1lint_DEPENDENCIES)
+ @rm -f t1lint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1lint_OBJECTS) $(t1lint_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cscheck.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1lint.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/cscheck.Po
+ -rm -f ./$(DEPDIR)/t1lint.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/cscheck.Po
+ -rm -f ./$(DEPDIR)/t1lint.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc
new file mode 100644
index 00000000000..e6b4eaab848
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.cc
@@ -0,0 +1,553 @@
+/* cscheck.{cc,hh} -- checking Type 1 charstrings for validity
+ *
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "cscheck.hh"
+#include <efont/t1item.hh>
+#include <lcdf/error.hh>
+#include <efont/t1unparser.hh>
+
+using namespace Efont;
+
+#define CHECK_STACK_GE(numargs) do { if (size() < numargs) return error(errUnderflow, cmd); } while (0)
+#define CHECK_STACK_EQ(numargs) do { CHECK_STACK_GE(numargs); if (size() > numargs) _errh->warning("too many arguments to %<%s%> (have %d, expected %d)", Charstring::command_name(cmd).c_str(), size(), numargs); } while (0)
+#define CHECK_STACK_CPEQ(numargs) do { CHECK_STACK_EQ(numargs); if (!_cp_exists) return error(errCurrentPoint, cmd); } while (0)
+
+
+CharstringChecker::CharstringChecker()
+ : CharstringInterp(), _errh(0)
+{
+ set_careful(true);
+}
+
+CharstringChecker::CharstringChecker(const Vector<double> &weight)
+ : CharstringInterp(weight), _errh(0)
+{
+ set_careful(true);
+}
+
+
+void
+CharstringChecker::stem(double y, double dy, const char *cmd_name)
+{
+ bool is_v = (cmd_name[0] == 'v');
+ Vector<double> &hints = (is_v ? _h_vstem : _h_hstem);
+ const char *dimen_name = (is_v ? "x" : "y");
+ if (dy < 0) {
+ y += dy;
+ dy = -dy;
+ }
+ if (dy < 0.5)
+ _errh->warning("small delta-%s in %<%s%> (%g)", dimen_name, cmd_name, dy);
+ for (int i = 0; i < hints.size(); i += 2)
+ if ((hints[i] >= y && hints[i+1] <= y)
+ || (hints[i] >= y+dy && hints[i+1] <= y+dy))
+ _errh->warning("overlapping %<%s%> hints", cmd_name);
+ hints.push_back(y);
+ hints.push_back(y+dy);
+}
+
+void
+CharstringChecker::check_stem3(const char *cmd_name)
+{
+ bool is_v = (cmd_name[0] == 'v');
+ Vector<double> &hints = (is_v ? _h_vstem : _h_hstem);
+ Vector<double> &old_hints = (is_v ? _h_vstem3 : _h_hstem3);
+ assert(hints.size() == 6);
+
+ // sort hints
+ int i0, i1, i2;
+ if (hints[0] > hints[2])
+ i0 = 2, i1 = 0;
+ else
+ i0 = 0, i1 = 2;
+ if (hints[4] < hints[i0])
+ i2 = i1, i1 = i0, i0 = 4;
+ else if (hints[4] < hints[i1])
+ i2 = i1, i1 = 4;
+ else
+ i2 = 4;
+
+ // check constraints. count "almost equal" as equal
+ double stemw0 = hints[i0+1] - hints[i0];
+ double stemw2 = hints[i2+1] - hints[i2];
+ if ((int)(1024*(stemw0 - stemw2) + .5) != 0)
+ _errh->error("bad %<%s%>: extreme stem widths unequal (%g, %g)", cmd_name, stemw0, stemw2);
+
+ double c0 = (hints[i0] + hints[i0+1])/2;
+ double c1 = (hints[i1] + hints[i1+1])/2;
+ double c2 = (hints[i2] + hints[i2+1])/2;
+ if ((int)(1024*((c1 - c0) - (c2 - c1)) + .5) != 0)
+ _errh->error("bad %<%s%>: stem gaps unequal (%g, %g)", cmd_name, c1-c0, c2-c1);
+
+ // compare to old hints
+ if (old_hints.size()) {
+ for (int i = 0; i < old_hints.size(); i++)
+ if (hints[i] != old_hints[i]) {
+ _errh->warning("%<%s%> conflicts with old %<%s%>", cmd_name, cmd_name);
+ break;
+ }
+ }
+ old_hints = hints;
+}
+
+void
+CharstringChecker::moveto(double, double, bool cp_exists)
+{
+ _cp_exists = cp_exists;
+}
+
+void
+CharstringChecker::rmoveto(double, double)
+{
+ _cp_exists = true;
+ _just_flexed = false;
+}
+
+void
+CharstringChecker::rlineto(double, double)
+{
+}
+
+void
+CharstringChecker::rrcurveto(double, double, double, double, double, double)
+{
+}
+
+
+bool
+CharstringChecker::error(int which, int data)
+{
+ CharstringInterp::error(which, data);
+ _errh->error("%s", error_string().c_str());
+ return false;
+}
+
+bool
+CharstringChecker::callothersubr()
+{
+ int othersubrnum = (int)top(0);
+ int n = (int)top(1);
+ int i;
+
+ pop(2);
+ if (othersubrnum < 0 || size() < n)
+ return false;
+
+ if (!_started && (othersubrnum < Cs::othcCountercontrolpart
+ || othersubrnum > Cs::othcMM6))
+ _errh->warning("first command not %<hsbw%> or %<sbw%>");
+
+ bool retval = true;
+
+ switch (othersubrnum) {
+
+ case Cs::othcFlexend:
+ if (n != 3) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ if (!_flex) {
+ _errh->error("no Flex in progress");
+ retval = false;
+ } else if (ps_size() != 16) {
+ _errh->error("Flex needs 16 arguments, have %d", ps_size());
+ retval = false;
+ } else {
+ ps_clear();
+ ps_push(top(0));
+ ps_push(top(1));
+ _flex = false;
+ }
+ break;
+
+ case Cs::othcFlexbegin:
+ if (n != 0) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ ps_clear();
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _flex = true;
+ _just_flexed = true;
+ //_flex_connect = _connect;
+ break;
+
+ case Cs::othcFlexmiddle:
+ if (n != 0) {
+ _errh->error("wrong number of arguments to Flex");
+ goto unknown;
+ }
+ if (!_flex)
+ retval = error(errFlex, 0);
+ else {
+ if (_just_flexed)
+ _errh->error("Flex control points must be separated by a moveto");
+ ps_push(_cp.x);
+ ps_push(_cp.y);
+ _just_flexed = true;
+ }
+ break;
+
+ case Cs::othcReplacehints:
+ if (n != 1) {
+ _errh->error("wrong number of arguments to hint replacement");
+ goto unknown;
+ }
+ ps_clear();
+ ps_push(top());
+ _h_hstem.clear();
+ _h_vstem.clear();
+ break;
+
+ case Cs::othcCountercontrolpart:
+ case Cs::othcCountercontrol:
+ if (_counter_controlled)
+ _errh->error("duplicate counter control instructions");
+ else if (_started
+ && _last_command != 256 + Cs::othcCountercontrolpart
+ && _last_command != Cs::cSbw
+ && _last_command != Cs::cHsbw)
+ _errh->error("counter control must appear immediately after %<sbw%> or %<hsbw%>");
+ if (n < 0 || n > 22)
+ _errh->error("too many arguments to counter control, max 22");
+ else if (n != size()) {
+ _errh->error("too few arguments to counter control, expected %d", size());
+ n = size();
+ }
+ ps_clear();
+ _counter_controlled = (othersubrnum == Cs::othcCountercontrol);
+ break;
+
+ case Cs::othcMM1:
+ case Cs::othcMM2:
+ case Cs::othcMM3:
+ case Cs::othcMM4:
+ case Cs::othcMM6:
+ retval = mm_command(othersubrnum, n);
+ goto skip_pop;
+
+ default: // unknown
+ unknown:
+ _errh->warning("unknown callothersubr %<%d%>", othersubrnum);
+ ps_clear();
+ for (i = 0; i < n; i++)
+ ps_push(top(i));
+ break;
+
+ }
+
+ pop(n);
+ if (_last_command == 256 + Cs::othcCountercontrolpart
+ && othersubrnum != Cs::othcCountercontrol)
+ _errh->error("partial counter control instruction");
+ _last_command = 256 + othersubrnum;
+ skip_pop:
+ return retval;
+}
+
+//#define DEBUG(s) printf s
+#define DEBUG(s)
+
+bool
+CharstringChecker::type1_command(int cmd)
+{
+ if (_subrno < 0)
+ ++_ncommand;
+ if (cmd == Cs::cCallsubr) {
+ int old_subrno = _subrno;
+ _subrno = (size() > 1 ? (int) top(0) : -300);
+ bool result = callsubr_command();
+ _subrno = old_subrno;
+ return result;
+ } else if (cmd == Cs::cCallothersubr) {
+ CHECK_STACK_GE(2);
+ return callothersubr();
+ } else if (cmd == Cs::cReturn) {
+ return false;
+ } else if (cmd == Cs::cPop || cmd == Cs::cDiv) {
+ return arith_command(cmd);
+ }
+
+ if (cmd != Cs::cHsbw && cmd != Cs::cSbw) {
+ if (!_started)
+ _errh->warning("first command not %<hsbw%> or %<sbw%>");
+ } else {
+ if (_started)
+ _errh->error("duplicate %<hsbw%> or %<sbw%>");
+ }
+ _started = true;
+
+ switch (cmd) {
+
+ case Cs::cHsbw:
+ CHECK_STACK_EQ(2);
+ moveto(at(0), 0, false);
+ clear();
+ break;
+
+ case Cs::cSbw:
+ CHECK_STACK_EQ(4);
+ moveto(at(0), at(1), false);
+ clear();
+ break;
+
+ case Cs::cClosepath:
+ _cp_exists = false;
+ clear();
+ break;
+
+ case Cs::cHlineto:
+ CHECK_STACK_CPEQ(1);
+ rlineto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHmoveto:
+ CHECK_STACK_EQ(1);
+ rmoveto(at(0), 0);
+ clear();
+ break;
+
+ case Cs::cHvcurveto:
+ CHECK_STACK_CPEQ(4);
+ rrcurveto(at(0), 0, at(1), at(2), 0, at(3));
+ clear();
+ break;
+
+ case Cs::cRlineto:
+ CHECK_STACK_CPEQ(2);
+ rlineto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRmoveto:
+ CHECK_STACK_EQ(2);
+ rmoveto(at(0), at(1));
+ clear();
+ break;
+
+ case Cs::cRrcurveto:
+ CHECK_STACK_CPEQ(6);
+ rrcurveto(at(0), at(1), at(2), at(3), at(4), at(5));
+ clear();
+ break;
+
+ case Cs::cVhcurveto:
+ CHECK_STACK_CPEQ(4);
+ rrcurveto(0, at(0), at(1), at(2), at(3), 0);
+ clear();
+ break;
+
+ case Cs::cVlineto:
+ CHECK_STACK_CPEQ(1);
+ rlineto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cVmoveto:
+ CHECK_STACK_EQ(1);
+ rmoveto(0, at(0));
+ clear();
+ break;
+
+ case Cs::cHstem:
+ CHECK_STACK_EQ(2);
+ if (_hstem3 && !_hstem)
+ _errh->error("charstring has both %<hstem%> and %<hstem3%>");
+ _hstem = true;
+ stem(at(0), at(1), "hstem");
+ clear();
+ break;
+
+ case Cs::cVstem:
+ CHECK_STACK_EQ(2);
+ if (_vstem3 && !_vstem)
+ _errh->error("charstring has both %<vstem%> and %<vstem3%>");
+ _vstem = true;
+ stem(at(0), at(1), "vstem");
+ clear();
+ break;
+
+ case Cs::cEndchar:
+ set_done();
+ _last_command = cmd;
+ return false;
+
+ case Cs::cDotsection:
+ break;
+
+ case Cs::cVstem3:
+ CHECK_STACK_EQ(6);
+ if (_vstem && !_vstem3)
+ _errh->error("charstring has both %<vstem%> and %<vstem3%>");
+ _vstem3 = true;
+ _h_vstem.clear();
+ stem(at(0), at(1), "vstem3");
+ stem(at(2), at(3), "vstem3");
+ stem(at(4), at(5), "vstem3");
+ check_stem3("vstem3");
+ clear();
+ break;
+
+ case Cs::cHstem3:
+ CHECK_STACK_EQ(6);
+ if (_hstem && !_hstem3)
+ _errh->error("charstring has both %<hstem%> and %<hstem3%>");
+ _hstem3 = true;
+ _h_hstem.clear();
+ stem(at(0), at(1), "hstem3");
+ stem(at(2), at(3), "hstem3");
+ stem(at(4), at(5), "hstem3");
+ check_stem3("hstem3");
+ clear();
+ break;
+
+ case Cs::cSeac: {
+ CHECK_STACK_EQ(5);
+#if 0
+ double asb = at(0);
+ double adx = at(1);
+ double ady = at(2);
+ int bchar = (int)at(3);
+ int achar = (int)at(4);
+
+ double ax = adx - asb + _sidebearing.x;
+ double ay = ady + _sidebearing.y;
+
+ Point real_sidebearing = _sidebearing;
+ Point real_char_width = _char_width;
+ Point original_origin = _origin;
+
+ Type1Encoding *adobe = Type1Encoding::standard_encoding();
+ if (!adobe)
+ return error(errInternal, cmd);
+ Type1Charstring *t1cs = get_glyph((*adobe)[achar]);
+ if (!t1cs) ERROR(errGlyph);
+ _origin = Point(ax, ay);
+ init();
+ t1cs->run(*this);
+ _origin = original_origin;
+ if (error()) return false;
+
+ t1cs = get_glyph((*adobe)[bchar]);
+ if (!t1cs) ERROR(errGlyph);
+ init();
+ t1cs->run(*this);
+ _sidebearing = real_sidebearing;
+ _char_width = real_char_width;
+#endif
+ return false;
+ }
+
+ case Cs::cSetcurrentpoint:
+ CHECK_STACK_EQ(2);
+ _cp = Point(at(0), at(1));
+ _cp_exists = true;
+ clear();
+ break;
+
+ case Cs::cPut:
+ case Cs::cGet:
+ case Cs::cStore:
+ case Cs::cLoad:
+ return vector_command(cmd);
+
+ default:
+ return arith_command(cmd);
+
+ }
+
+ if (_last_command == 256 + Cs::othcCountercontrolpart)
+ _errh->error("partial counter control instruction");
+ _last_command = cmd;
+ return true;
+}
+
+bool
+CharstringChecker::check(const CharstringContext &g, ErrorHandler *errh)
+{
+ CharstringCheckerErrorHandler<CharstringChecker> merrh(errh, this);
+ _errh = &merrh;
+ int old_errors = errh->nerrors();
+
+ _started = false;
+ _flex = false;
+ _hstem = _hstem3 = _vstem = _vstem3 = false;
+ _just_flexed = _counter_controlled = false;
+ _last_command = -1;
+ _h_hstem.clear();
+ _h_vstem.clear();
+ _h_hstem3.clear();
+ _h_vstem3.clear();
+ _ncommand = 0;
+ _subrno = -1;
+
+ CharstringInterp::interpret(g);
+
+ return errh->nerrors() == old_errors;
+}
+
+
+
+CharstringSubrChecker::CharstringSubrChecker()
+ : CharstringInterp(), _errh(0)
+{
+ set_careful(true);
+}
+
+CharstringSubrChecker::CharstringSubrChecker(const Vector<double> &weight)
+ : CharstringInterp(weight), _errh(0)
+{
+ set_careful(true);
+}
+
+bool
+CharstringSubrChecker::error(int error, int data)
+{
+ CharstringInterp::error(error, data);
+ _errh->error("%s", error_string().c_str());
+ return false;
+}
+
+bool
+CharstringSubrChecker::type1_command(int cmd)
+{
+ switch (cmd) {
+ case Cs::cReturn:
+ _returned = true;
+ return false;
+ default:
+ clear();
+ return true;
+ }
+}
+
+bool
+CharstringSubrChecker::check(const CharstringContext &g, ErrorHandler *errh)
+{
+ CharstringCheckerErrorHandler<CharstringSubrChecker> merrh(errh, this);
+ _errh = &merrh;
+ int old_errors = errh->nerrors();
+
+ _returned = false;
+
+ CharstringInterp::interpret(g);
+
+ if (!_returned)
+ _errh->error("subroutine does not return");
+ return errh->nerrors() == old_errors;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.hh
new file mode 100644
index 00000000000..d9de5134109
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/cscheck.hh
@@ -0,0 +1,136 @@
+#ifndef CSCHECK_HH
+#define CSCHECK_HH
+#include <efont/t1interp.hh>
+#include <lcdf/point.hh>
+#include <lcdf/vector.hh>
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <ctype.h>
+
+template <typename T>
+class CharstringCheckerErrorHandler : public ErrorVeneer { public:
+
+ CharstringCheckerErrorHandler(ErrorHandler *errh, T *checker)
+ : ErrorVeneer(errh), _checker(checker) {
+ }
+
+ String decorate(const String &str);
+
+ private:
+
+ T *_checker;
+
+};
+
+class CharstringChecker : public Efont::CharstringInterp { public:
+
+ CharstringChecker();
+ CharstringChecker(const Vector<double> &weight_vec);
+
+ bool error(int, int);
+ bool callothersubr();
+ bool type1_command(int);
+
+ bool check(const Efont::CharstringContext &, ErrorHandler *);
+
+ int ncommand() const {
+ return _ncommand;
+ }
+ int subrno() const {
+ return _subrno;
+ }
+
+ private:
+
+ ErrorHandler *_errh;
+ int _ncommand;
+ int _subrno;
+
+ Point _cp;
+
+ bool _started;
+ bool _flex;
+ bool _cp_exists;
+
+ bool _hstem;
+ bool _hstem3;
+ bool _vstem;
+ bool _vstem3;
+
+ bool _just_flexed;
+ bool _counter_controlled;
+ int _last_command;
+
+ Vector<double> _h_hstem;
+ Vector<double> _h_vstem;
+
+ Vector<double> _h_hstem3;
+ Vector<double> _h_vstem3;
+
+ void stem(double, double, const char *);
+ void check_stem3(const char *);
+
+ void moveto(double, double, bool cp_exists = true);
+ void rmoveto(double, double);
+ void rlineto(double, double);
+ void rrcurveto(double, double, double, double, double, double);
+
+};
+
+class CharstringSubrChecker : public Efont::CharstringInterp { public:
+
+ CharstringSubrChecker();
+ CharstringSubrChecker(const Vector<double> &weight_vec);
+
+ bool error(int, int);
+ bool type1_command(int);
+
+ bool check(const Efont::CharstringContext &, ErrorHandler *);
+
+ int ncommand() const {
+ return -1;
+ }
+ int subrno() const {
+ return -1;
+ }
+
+ private:
+
+ ErrorHandler *_errh;
+
+ bool _returned;
+
+};
+
+
+template <typename T> String
+CharstringCheckerErrorHandler<T>::decorate(const String &str)
+{
+ StringAccum sa;
+ const char *s = skip_anno(str.begin(), str.end());
+ while (s < str.end() && isspace((unsigned char) *s))
+ ++s;
+ sa.append(str.begin(), s);
+ if (_checker->subrno() >= 0)
+ sa << "called from ";
+ if (_checker->ncommand() >= 0)
+ sa << "command " << (_checker->ncommand() - 1) << ':';
+ if (sa)
+ sa << ' ';
+ if (s + 11 < str.end() && memcmp(s, "charstring ", 11) == 0) {
+ bool quote_parity = 0;
+ const char *last = s + 11;
+ for (const char *x = last; x != str.end(); ++x)
+ if (*x == '\'') {
+ sa.append(last, x);
+ sa << format(quote_parity ? "%>" : "%<");
+ quote_parity = !quote_parity;
+ last = x + 1;
+ }
+ sa.append(last, str.end());
+ } else
+ sa.append(s, str.end());
+ return ErrorVeneer::decorate(sa.take_string());
+}
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1
new file mode 100644
index 00000000000..5ab620b81a3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.1
@@ -0,0 +1,48 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1LINT 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1lint \- check a PostScript Type 1 font for correctness
+.SH SYNOPSIS
+.B t1lint
+\%\fIfont\fR [\fIfont\fR...]
+.SH DESCRIPTION
+.BR T1lint
+checks PostScript Type 1 font programs for correctness. Any errors or
+variances from the specification are reported to standard error. If there
+are no errors, the command prints nothing. It exits with status 0 if all
+fonts were OK, and status 1 otherwise. If no input files are supplied,
+t1lint reads a font from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages. The only output will be the exit
+status.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M t1disasm 1
+.LP
+.I "Adobe Type 1 Font Format"
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc
new file mode 100644
index 00000000000..1d5c6363f65
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1lint/t1lint.cc
@@ -0,0 +1,450 @@
+/* t1lint.cc -- driver for checking Type 1 fonts for validity
+ *
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1mm.hh>
+#include "cscheck.hh"
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1lint%> checks a PostScript Type 1 font for correctness. Any errors or\n\
+divergences from the specification are reported to standard error. Nothing is\n\
+printed for correct fonts. The command exits with status 0 if there are no\n\
+errors, and status 1 otherwise.\n\
+\n\
+Usage: %s [OPTION]... FONT [...]\n\
+\n\
+Each FONT is the name of a PFA or PFB font file.\n\
+\n\
+Options:\n\
+ -h, --help Print this message and exit.\n\
+ -q, --quiet Do not report errors to standard error.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+/*****
+ * CHECKS
+ **/
+
+static bool
+get_num_array(Type1Font *font, int dictionary, const char *name,
+ Vector<double> &v, ErrorHandler *errh, bool mandatory = false)
+{
+ if (Type1Definition *d = font->dict(dictionary, name)) {
+ if (d->value_numvec(v))
+ return true;
+ errh->error("%s not an array of numbers", name);
+ v.clear();
+ } else if (mandatory)
+ errh->error("%s not defined", name);
+ return false;
+}
+
+static bool
+get_integer(Type1Font *font, int dictionary, const char *name,
+ int &v, ErrorHandler *errh, bool mandatory = false)
+{
+ Type1Definition *d = font->dict(dictionary, name);
+ double scratch;
+ if (d && d->value_int(v))
+ return true;
+ else if (d && d->value_num(scratch)) {
+ errh->warning("%s not an integer", name);
+ v = (int)scratch;
+ return true;
+ } else if (d)
+ errh->error("%s not a number", name);
+ else if (mandatory)
+ errh->error("%s not defined", name);
+ return false;
+}
+
+// BLUES
+
+static void
+check_blue_array(Vector<double> &blues, const char *name, double BlueScale,
+ ErrorHandler *errh)
+{
+ if (blues.size() % 2 != 0) {
+ errh->error("%s has an odd number of entries", name);
+ blues.push_back(blues.back());
+ }
+
+ for (int i = 0; i < blues.size(); i++)
+ if (blues[i] != (double)((int)blues[i])) {
+ errh->warning("some %s entries are not integers", name);
+ break;
+ }
+
+ double max_diff = 1 / BlueScale;
+ for (int i = 0; i < blues.size(); i += 2) {
+ if (blues[i] > blues[i+1])
+ errh->error("%s zone %d in the wrong order", name, i/2);
+ else if (blues[i+1] - blues[i] >= max_diff)
+ errh->error("%s zone %d too large in relation to BlueScale (size %g, max %g [%g])", name, i/2, blues[i+1] - blues[i], max_diff, BlueScale);
+ }
+}
+
+static void
+check_blue_overlap(Vector<double> &bl1, const char *name1,
+ Vector<double> &bl2, const char *name2, int BlueFuzz,
+ ErrorHandler *errh)
+{
+ int min_fuzz = 2*BlueFuzz + 1;
+ for (int i = 2; i < bl1.size(); i += 2) {
+ int thresh = (&bl1 == &bl2 ? i : bl2.size());
+ for (int j = 0; j < thresh; j += 2) {
+ if ((bl2[j] >= bl1[i] && bl2[j] <= bl1[i+1])
+ || (bl2[j+1] >= bl1[i] && bl2[j+1] <= bl1[i+1]))
+ errh->error("%s zone %d and %s zone %d overlap",
+ name1, i/2, name2, j/2);
+ else if ((bl2[j] >= bl1[i+1] && bl2[j] < bl1[i+1]+min_fuzz)
+ || (bl2[j+1] <= bl1[i] && bl2[j+1]+min_fuzz > bl1[i]))
+ errh->error("%s zone %d and %s zone %d overlap within BlueFuzz",
+ name1, i/2, name2, j/2);
+ }
+ }
+}
+
+static void
+check_blues(Type1Font *font, ErrorHandler *errh)
+{
+ Type1Definition *d;
+
+ // BlueScale
+ double BlueScale;
+ bool ok = false;
+ if ((d = font->p_dict("BlueScale"))) {
+ if (!d->value_num(BlueScale))
+ errh->error("BlueScale not a real number");
+ else if (BlueScale <= 0)
+ errh->error("BlueScale less than or equal to 0");
+ else {
+ if (BlueScale > 0.5)
+ errh->error("suspiciously large BlueScale (%g)", BlueScale);
+ ok = true;
+ }
+ }
+ if (!ok) BlueScale = 0.039625;
+
+ // BlueShift
+ int BlueShift = -1;
+ if (get_integer(font, Type1Font::dP, "BlueShift", BlueShift, errh)
+ && BlueShift < 0)
+ errh->error("BlueShift less than 0");
+ if (BlueShift < 0)
+ BlueShift = 7;
+
+ // BlueFuzz
+ int BlueFuzz = -1;
+ if (get_integer(font, Type1Font::dP, "BlueFuzz", BlueFuzz, errh)
+ && BlueFuzz < 0)
+ errh->error("BlueFuzz less than 0");
+ if (BlueFuzz < 0)
+ BlueFuzz = 1;
+ else if (BlueFuzz > 10)
+ errh->warning("suspiciously large BlueFuzz (%d)", BlueFuzz);
+
+ // BlueValues
+ Vector<double> BlueValues, OtherBlues;
+ get_num_array(font, Type1Font::dP, "BlueValues", BlueValues, errh, true);
+ get_num_array(font, Type1Font::dP, "OtherBlues", OtherBlues, errh);
+
+ check_blue_array(BlueValues, "BlueValues", BlueScale, errh);
+ if (BlueValues.size() > 14)
+ errh->error("too many zones in BlueValues (max 7)");
+ check_blue_array(OtherBlues, "OtherBlues", BlueScale, errh);
+ if (OtherBlues.size() > 10)
+ errh->error("too many zones in OtherBlues (max 5)");
+
+ check_blue_overlap(BlueValues, "BlueValues", BlueValues, "BlueValues", BlueFuzz, errh);
+ check_blue_overlap(OtherBlues, "OtherBlues", OtherBlues, "OtherBlues", BlueFuzz, errh);
+ check_blue_overlap(BlueValues, "BlueValues", OtherBlues, "OtherBlues", BlueFuzz, errh);
+
+ // FamilyBlues
+ Vector<double> FamilyBlues, FamilyOtherBlues;
+ get_num_array(font, Type1Font::dP, "FamilyBlues", FamilyBlues, errh);
+ get_num_array(font, Type1Font::dP, "FamilyOtherBlues", FamilyOtherBlues, errh);
+
+ check_blue_array(FamilyBlues, "FamilyBlues", BlueScale, errh);
+ if (FamilyBlues.size() > 14)
+ errh->error("too many zones in FamilyBlues (max 7)");
+ check_blue_array(FamilyOtherBlues, "FamilyOtherBlues", BlueScale, errh);
+ if (FamilyOtherBlues.size() > 10)
+ errh->error("too many zones in FamilyOtherBlues (max 5)");
+
+ check_blue_overlap(FamilyBlues, "FamilyBlues", FamilyBlues, "FamilyBlues", BlueFuzz, errh);
+ check_blue_overlap(FamilyOtherBlues, "FamilyOtherBlues", FamilyOtherBlues, "FamilyOtherBlues", BlueFuzz, errh);
+ check_blue_overlap(FamilyBlues, "FamilyBlues", FamilyOtherBlues, "FamilyOtherBlues", BlueFuzz, errh);
+}
+
+
+// STEMS
+
+void
+check_stem_snap(Vector<double> &stem_snap, double main, bool is_v,
+ ErrorHandler *errh)
+{
+ const char *name = (is_v ? "V" : "H");
+ if (stem_snap.size() > 12)
+ errh->error("StemSnap%s has more than 12 entries", name);
+ for (int i = 0; i < stem_snap.size() - 1; i++)
+ if (stem_snap[i] >= stem_snap[i+1]) {
+ errh->error("StemSnap%s is not sorted in increasing order", name);
+ break;
+ }
+ for (int i = 0; i < stem_snap.size(); i++)
+ if (stem_snap[i] == main)
+ return;
+ if (main >= 0)
+ errh->warning("Std%sW not in StemSnap%s array", name, name);
+}
+
+void
+check_stems(Type1Font *font, ErrorHandler *errh)
+{
+ Vector<double> StdHW, StdVW, StemSnapH, StemSnapV;
+ if (get_num_array(font, Type1Font::dP, "StdHW", StdHW, errh)) {
+ if (StdHW.size() != 1)
+ errh->error("StdHW has %d entries (exactly one required)", StdHW.size());
+ if (StdHW.size() > 0 && StdHW[0] <= 0)
+ errh->error("StdHW entry less than or equal to 0");
+ }
+ if (get_num_array(font, Type1Font::dP, "StdVW", StdVW, errh)) {
+ if (StdVW.size() != 1)
+ errh->error("StdVW has %d entries (exactly one required)", StdVW.size());
+ if (StdVW.size() > 0 && StdVW[0] <= 0)
+ errh->error("StdVW entry less than or equal to 0");
+ }
+
+ if (get_num_array(font, Type1Font::dP, "StemSnapH", StemSnapH, errh))
+ check_stem_snap(StemSnapH, StdHW.size() ? StdHW[0] : -1000, false, errh);
+ if (get_num_array(font, Type1Font::dP, "StemSnapV", StemSnapV, errh))
+ check_stem_snap(StemSnapV, StdVW.size() ? StdVW[0] : -1000, true, errh);
+}
+
+
+// MAIN
+
+static void
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh,
+ ErrorHandler *err_errh)
+{
+ FILE *f;
+ if (strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ err_errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ err_errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+
+ if (font) {
+ LandmarkErrorHandler cerrh(errh, filename);
+
+ // check UniqueID values
+ int UniqueID = -1, UniqueID2 = -1;
+ if (get_integer(font, Type1Font::dF, "UniqueID", UniqueID, errh)
+ && (UniqueID < 0 || UniqueID > 0xFFFFFF))
+ cerrh.error("UniqueID not in the range 0-16777215");
+ if (get_integer(font, Type1Font::dP, "UniqueID", UniqueID2, errh)
+ && (UniqueID2 < 0 || UniqueID2 > 0xFFFFFF))
+ cerrh.error("Private UniqueID not in the range 0-16777215");
+ if (UniqueID >= 0 && UniqueID2 >= 0 && UniqueID != UniqueID2)
+ cerrh.error("Private UniqueID does not equal font UniqueID");
+
+ // check XUID values
+ Vector<double> XUID;
+ if (get_num_array(font, Type1Font::dF, "XUID", XUID, errh)) {
+ if (XUID.size() == 0)
+ cerrh.error("empty XUID");
+ for (int i = 0; i < XUID.size(); i++) {
+ if (floor(XUID[i]) != XUID[i] || XUID[i] < 0 || XUID[i] > 0xFFFFFF) {
+ cerrh.error("element of XUID not an integer in the range 0-16777215");
+ break;
+ }
+ }
+ }
+
+ check_blues(font, &cerrh);
+ check_stems(font, &cerrh);
+
+ MultipleMasterSpace *mmspace = font->create_mmspace(&cerrh);
+ Vector<double> weight_vector;
+ if (mmspace)
+ weight_vector = mmspace->default_weight_vector();
+ int gc = font->nglyphs();
+ CharstringChecker cc(weight_vector);
+
+ for (int i = 0; i < gc; i++) {
+ ContextErrorHandler derrh
+ (&cerrh, "While interpreting %<%s%>:", font->glyph_name(i).c_str());
+ cc.check(font->glyph_context(i), &derrh);
+ }
+
+ int ns = font->nsubrs();
+ CharstringSubrChecker csc(weight_vector);
+ for (int i = 0; i < ns; ++i)
+ if (Type1Charstring *cs = font->subr(i)) {
+ ContextErrorHandler derrh(&cerrh, "While interpreting subr %d:", i);
+ CharstringContext cctx(font, cs);
+ csc.check(cctx, &derrh);
+ }
+ }
+
+ delete font;
+ delete reader;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *err_errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ ErrorHandler *out_errh = new FileErrorHandler(stdout);
+ ErrorHandler *errh = out_errh;
+ int nfiles = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = out_errh;
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("t1lint (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ do_file(clp->vstr, psres, errh, err_errh);
+ nfiles++;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(err_errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (nfiles == 0)
+ do_file("-", psres, errh, err_errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.am
new file mode 100644
index 00000000000..035c5cb1c9d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1rawafm
+man_MANS = t1rawafm.1
+
+t1rawafm_SOURCES = t1rawafm.cc
+
+t1rawafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1rawafm.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.in
new file mode 100644
index 00000000000..817fcbdf485
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/Makefile.in
@@ -0,0 +1,748 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1rawafm$(EXEEXT)
+subdir = lcdf-typetools-src/t1rawafm
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1rawafm_OBJECTS = t1rawafm.$(OBJEXT)
+t1rawafm_OBJECTS = $(am_t1rawafm_OBJECTS)
+t1rawafm_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t1rawafm.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1rawafm_SOURCES)
+DIST_SOURCES = $(t1rawafm_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1rawafm.1
+t1rawafm_SOURCES = t1rawafm.cc
+t1rawafm_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1rawafm.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/t1rawafm/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/t1rawafm/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+t1rawafm$(EXEEXT): $(t1rawafm_OBJECTS) $(t1rawafm_DEPENDENCIES) $(EXTRA_t1rawafm_DEPENDENCIES)
+ @rm -f t1rawafm$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1rawafm_OBJECTS) $(t1rawafm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1rawafm.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/t1rawafm.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/t1rawafm.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1
new file mode 100644
index 00000000000..9a367a31a52
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.1
@@ -0,0 +1,55 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1RAWAFM 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1rawafm \- produce raw AFM metrics from a PostScript Type 1 font
+.SH SYNOPSIS
+\fBt1rawafm\fR \%[OPTIONS...] [\fIfont\fR [\fIoutputfile\fR]]
+.SH DESCRIPTION
+.BR T1rawafm
+generates an AFM file with the information available in a PostScript
+Type\~1 font. The AFM file will lack kerns, ligature information, and
+composite characters, but is otherwise usable. The AFM file is written to
+the standard output (but see the
+.B \-\-output
+option). If no input font file is supplied,
+.B t1rawafm
+reads a PFA or PFB font from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-\-output "=\fIfile\fR, " \-o " \fIfile"
+Send output to
+.I file
+instead of standard output.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "RETURN VALUES"
+.B T1rawafm
+exits with value 0 if an AFM metrics file was successfully generated, and 1
+otherwise.
+'
+.SH "SEE ALSO"
+.LP
+.IR "Adobe Type 1 Font Format" ,
+.IR "Adobe Font Metrics File Format Specification v4.1"
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc
new file mode 100644
index 00000000000..eaf919d1e28
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc
@@ -0,0 +1,369 @@
+/* t1rawafm.cc -- driver for generating a raw AFM file from a font
+ *
+ * Copyright (c) 2008-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1mm.hh>
+#include <efont/t1interp.hh>
+#include <efont/t1bounds.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/globmatch.hh>
+#include <lcdf/transform.hh>
+#include <algorithm>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define SMOKE_OPT 305
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... [FONT [OUTPUT]]", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1rawafm%> generates a raw (kernless and ligatureless) AFM file corresponding\n\
+to the specified Type 1 font file and writes it to the standard output.\n\
+\n\
+Usage: %s [OPTION]... [FONT [OUTPUT]]\n\
+\n\
+FONT is the name of a PFA or PFB font file. If omitted, t1rawafm will read a\n\
+font file from the standard input.\n\
+\n\
+Options:\n\
+ -o, --output=FILE Write output to FILE instead of standard output.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// MAIN
+
+static Type1Font *font;
+
+static void
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal("%s: not a Type 1 font", filename);
+
+ delete reader;
+}
+
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+struct fontinfo_t {
+ const char *afm_name;
+ int dict;
+ const char *dict_name;
+ bool as_string;
+};
+
+static const fontinfo_t fontinfo_strings[] = {
+ { "Version", Type1Font::dFI, "version", true },
+ { "Notice", Type1Font::dFI, "Notice", true },
+ { "FullName", Type1Font::dFI, "FullName", true },
+ { "FamilyName", Type1Font::dFI, "FamilyName", true },
+ { "Weight", Type1Font::dFI, "Weight", true },
+ { "ItalicAngle", Type1Font::dFI, "ItalicAngle", false },
+ { "IsFixedPitch", Type1Font::dFI, "isFixedPitch", false },
+ { "UnderlinePosition", Type1Font::dFI, "UnderlinePosition", false },
+ { "UnderlineThickness", Type1Font::dFI, "UnderlineThickness", false }
+};
+
+static String
+strip_newlines(const String &str)
+{
+ StringAccum sa;
+ const char *end = str.end(), *last = str.begin();
+ for (const char *s = str.begin(); s != end; ++s)
+ if (*s == '\n' || *s == '\r' || *s == '\f' || *s == '\v') {
+ sa.append(last, s);
+ last = s + 1;
+ }
+ if (last == str.begin())
+ return str;
+ else {
+ sa.append(last, end);
+ return sa.take_string();
+ }
+}
+
+static void
+write_char(FILE *outf, int c, PermString n, Type1Charstring *g, const Transform &font_transform, Type1Font *font)
+{
+ double bb[4], wx;
+ CharstringBounds::bounds(font_transform, CharstringContext(font, g), bb, wx);
+ fprintf(outf, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n",
+ c, (int) ceil(wx), n.c_str(),
+ (int) floor(bb[0]), (int) floor(bb[1]),
+ (int) ceil(bb[2]), (int) ceil(bb[3]));
+}
+
+static void
+write_afm(FILE *outf, Type1Font *font)
+{
+ fprintf(outf, "StartFontMetrics 2.0\n\
+Comment Generated by t1rawafm\n");
+
+ for (size_t i = 0; i < sizeof(fontinfo_strings) / sizeof(fontinfo_t); ++i)
+ if (Type1Definition *t1d = font->dict(fontinfo_strings[i].dict,
+ fontinfo_strings[i].dict_name)) {
+ if (!fontinfo_strings[i].as_string)
+ fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, t1d->value().c_str());
+ else {
+ String s;
+ if (t1d->value_string(s))
+ fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, strip_newlines(s).c_str());
+ }
+ }
+
+ Transform font_transform;
+ {
+ double font_matrix[6];
+ font->font_matrix(font_matrix);
+ font_transform = Transform(font_matrix);
+ font_transform.scale(1000);
+ }
+
+ double bb[4], wx;
+ if (Type1Charstring *t1cs = font->glyph("H")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "CapHeight %d\n", (int) ceil(bb[3]));
+ }
+ if (Type1Charstring *t1cs = font->glyph("x")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "XHeight %d\n", (int) ceil(bb[3]));
+ }
+ if (Type1Charstring *t1cs = font->glyph("d")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[3])
+ fprintf(outf, "Ascender %d\n", (int) ceil(bb[3]));
+ }
+ if (Type1Charstring *t1cs = font->glyph("p")) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx);
+ if (bb[1])
+ fprintf(outf, "Descender %d\n", (int) floor(bb[1]));
+ }
+
+ Vector<double> vd;
+ if (Type1Definition *t1d = font->p_dict("StdHW"))
+ if (t1d->value_numvec(vd) && vd.size() > 0)
+ fprintf(outf, "StdHW %d\n", (int) ceil(vd[0]));
+ if (Type1Definition *t1d = font->p_dict("StdVW"))
+ if (t1d->value_numvec(vd) && vd.size() > 0)
+ fprintf(outf, "StdVW %d\n", (int) ceil(vd[0]));
+
+ double fontbb[4] = { 1000000, 1000000, -1000000, -1000000 };
+ for (int i = 0; i < font->nglyphs(); ++i) {
+ CharstringBounds::bounds(font_transform, CharstringContext(font, font->glyph(i)), bb, wx);
+ fontbb[0] = std::min(fontbb[0], bb[0]);
+ fontbb[1] = std::min(fontbb[1], bb[1]);
+ fontbb[2] = std::max(fontbb[2], bb[2]);
+ fontbb[3] = std::max(fontbb[3], bb[3]);
+ }
+ fprintf(outf, "FontBBox %d %d %d %d\n",
+ (int) floor(fontbb[0]), (int) floor(fontbb[1]),
+ (int) ceil(fontbb[2]), (int) ceil(fontbb[3]));
+
+ fprintf(outf, "FontName %s\n", font->font_name().c_str());
+
+ int nglyphs = font->nglyphs();
+ PermString dot_notdef(".notdef");
+ if (font->glyph(dot_notdef))
+ --nglyphs;
+ fprintf(outf, "Characters %d\n", nglyphs);
+
+ fprintf(outf, "StartCharMetrics %d\n", nglyphs);
+ HashMap<PermString, int> done_yet(0);
+ done_yet.insert(dot_notdef, 1);
+ if (Type1Encoding *enc = font->type1_encoding()) {
+ for (int i = 0; i < 256; ++i) {
+ PermString n = enc->elt(i);
+ if (!done_yet[n])
+ if (Type1Charstring *g = font->glyph(n)) {
+ write_char(outf, i, n, g, font_transform, font);
+ done_yet.insert(n, true);
+ }
+ }
+ }
+ for (int i = 0; i < font->nglyphs(); ++i) {
+ PermString n = font->glyph_name(i);
+ if (!done_yet[n])
+ write_char(outf, -1, n, font->glyph(i), font_transform, font);
+ }
+ fprintf(outf, "EndCharMetrics\n");
+
+ fprintf(outf, "EndFontMetrics\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *output_file = 0;
+ Vector<String> glyph_patterns;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case OUTPUT_OPT:
+ output_file:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->vstr;
+ break;
+
+ case VERSION_OPT:
+ printf("t1rawafm (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2008-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (font)
+ goto output_file;
+ else
+ do_file(clp->vstr, psres, errh);
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!font)
+ do_file(0, psres, errh);
+
+ FILE *outf;
+ if (!output_file || strcmp(output_file, "-") == 0)
+ outf = stdout;
+ else {
+ outf = fopen(output_file, "w");
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+
+ write_afm(outf, font);
+
+ exit(0);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.am
new file mode 100644
index 00000000000..b022669f5d3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1reencode
+man_MANS = t1reencode.1
+
+t1reencode_SOURCES = t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1reencode.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.in
new file mode 100644
index 00000000000..c2c4aa6bb54
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/Makefile.in
@@ -0,0 +1,771 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1reencode$(EXEEXT)
+subdir = lcdf-typetools-src/t1reencode
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1reencode_OBJECTS = t1reencode.$(OBJEXT) util.$(OBJEXT)
+t1reencode_OBJECTS = $(am_t1reencode_OBJECTS)
+t1reencode_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t1reencode.Po ./$(DEPDIR)/util.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(t1reencode_SOURCES)
+DIST_SOURCES = $(t1reencode_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1reencode.1
+t1reencode_SOURCES = t1reencode.cc \
+ util.cc util.hh
+
+t1reencode_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1reencode.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/t1reencode/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/t1reencode/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+t1reencode$(EXEEXT): $(t1reencode_OBJECTS) $(t1reencode_DEPENDENCIES) $(EXTRA_t1reencode_DEPENDENCIES)
+ @rm -f t1reencode$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1reencode_OBJECTS) $(t1reencode_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1reencode.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/t1reencode.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/t1reencode.Po
+ -rm -f ./$(DEPDIR)/util.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1
new file mode 100644
index 00000000000..8ded8a4e5b7
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.1
@@ -0,0 +1,205 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1REENCODE 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1reencode \- re-encode a PostScript Type 1 font
+.SH SYNOPSIS
+.B t1reencode
+\%\-e ENCODING
+\%[OPTIONS...]
+.I font
+.RI [ outputfile ]
+.SH DESCRIPTION
+.BR T1reencode
+changes a PostScript Type\~1 font's embedded encoding. The re-encoded font
+is written to the standard output (but see the
+.B \-\-output
+option). If no input font file is supplied,
+.B t1reencode
+reads a PFA or PFB font from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-\-encoding "=\fIfile\fR, " \-e " \fIfile"
+Read the encoding from
+.IR file ,
+which must contain an encoding in
+.M dvips 1
+format. Alternatively,
+.I file
+can be one of the following special names, in which case the corresponding
+standard encoding is used.
+.Sp
+.RS
+.TP 23
+.B Name
+.B Source
+.TP
+StandardEncoding
+Adobe
+.TP
+ISOLatin1Encoding
+Adobe/ISO (synonym: ISO_8859_1_Encoding)
+.TP
+ExpertEncoding
+Adobe
+.TP
+ExpertSubsetEncoding
+Adobe
+.TP
+SymbolEncoding
+Adobe
+.TP
+ISOLatin2Encoding
+ISO (synonym: ISO_8859_2_Encoding)
+.TP
+ISOLatin3Encoding
+ISO (synonym: ISO_8859_3_Encoding)
+.TP
+ISOLatin4Encoding
+ISO (synonym: ISO_8859_4_Encoding)
+.TP
+ISOCyrillicEncoding
+ISO (synonym: ISO_8859_5_Encoding)
+.TP
+ISOGreekEncoding
+ISO (synonym: ISO_8859_7_Encoding)
+.TP
+ISOLatin5Encoding
+ISO (synonym: ISO_8859_9_Encoding)
+.TP
+ISOLatin6Encoding
+ISO (synonym: ISO_8859_10_Encoding)
+.TP
+ISOThaiEncoding
+ISO (synonym: ISO_8859_11_Encoding)
+.TP
+ISOLatin7Encoding
+ISO (synonym: ISO_8859_13_Encoding)
+.TP
+ISOLatin8Encoding
+ISO (synonym: ISO_8859_14_Encoding)
+.TP
+ISOLatin9Encoding
+ISO (synonym: ISO_8859_15_Encoding)
+.TP
+KOI8REncoding
+-
+.RE
+'
+.Sp
+.TP 5
+.BR \-\-encoding\-text "=\fItext\fR, " \-E " \fItext"
+Use the encoding in the
+.I text
+argument, which must be formatted as a
+.M dvips 1
+encoding. One of
+.B \-\-encoding
+and
+.B \-\-encoding\-text
+must be supplied.
+'
+.Sp
+.TP 5
+.BR \-\-name "=\fIname\fR, " \-n " \fIname"
+Set the output font's PostScript name to
+.IR name .
+The default is the input font name followed by the encoding's name.
+'
+.Sp
+.TP 5
+.BR \-\-full-name "=\fIname\fR, " \-N " \fIname"
+Set the output font's FullName to
+.IR name .
+The default is the input FullName followed by the encoding's name.
+'
+.Sp
+.TP 5
+.BR \-\-output "=\fIfile\fR, " \-o " \fIfile"
+Send output to
+.I file
+instead of standard output.
+'
+.Sp
+.TP 5
+.BR \-\-pfb ", " \-b
+Output a PFB font. This is the default.
+'
+.Sp
+.TP 5
+.BR \-\-pfa ", " \-a
+Output a PFA font.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "RETURN VALUES"
+.B T1reencode
+exits with value 0 if a re-encoded font was successfully generated, and 1
+otherwise.
+'
+.SH "NOTES"
+.LP
+.B T1reencode
+should be used only in special situations. It's generally much better to
+use PostScript commands to re-encode a font; for instance, executing the
+PostScript commands to generate two differently-encoded versions of a
+single font will take up much less memory than loading two
+.BR t1reencode d
+fonts.
+'
+.SH "EXAMPLES"
+.PP
+This command re-encodes Frutiger Roman in the ISO Latin\~1 encoding. The new
+font will have the PostScript name Frutiger-RomanISOLatin1Encoding.
+.Sp
+.nf
+ \fBt1reencode\fR \fB\-e\fR ISOLatin1Encoding FrutiRom.pfb \e
+ \fB\-o\fR FrutiRomISOL1.pfb
+.fi
+.Sp
+This series of commands, which use
+.M cfftot1 1
+and
+.M otftotfm 1
+as well as
+.B t1reencode
+itself, generate a version of Warnock Pro Regular with old-style figures in
+the slots for numbers (because of
+.BR otftotfm 's
+.BR \-f onum
+option). The new font will be called WarnockPro-RegularOsF.
+.Sp
+.nf
+ \fBotftotfm\fR \fB\-f\fRonum WarnockPro-Regular.otf \e
+ \fB\-\-output\-encoding\fR /tmp/osf.enc
+ \fBcfftot1\fR WarnockPro-Regular.otf | \fBt1reencode\fR \fB\-e\fR /tmp/osf.enc \e
+ \fB\-n\fR WarnockPro-RegularOsF \fB\-N\fR "Warnock Pro Regular OsF" \e
+ \fB\-o\fR WarnoProRegOsF.pfb
+.fi
+'
+.SH "SEE ALSO"
+.LP
+.IR "Adobe Type 1 Font Format" ,
+.M dvips 1 ,
+.M cfftot1 1 ,
+.M otftotfm 1
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc
new file mode 100644
index 00000000000..ff428b5ce5d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/t1reencode.cc
@@ -0,0 +1,1109 @@
+/* t1reencode.cc -- driver for reencoding Type 1 fonts
+ *
+ * Copyright (c) 2005-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1rw.hh>
+#include <efont/psres.hh>
+#include <lcdf/error.hh>
+#include <lcdf/clp.h>
+#include <ctype.h>
+#include <errno.h>
+#include "util.hh"
+#include <lcdf/md5.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define ENCODING_OPT 304
+#define ENCODING_TEXT_OPT 305
+#define PFA_OPT 306
+#define PFB_OPT 307
+#define FONTNAME_OPT 308
+#define FULLNAME_OPT 309
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "pfa", 'a', PFA_OPT, 0, 0 },
+ { "pfb", 'b', PFB_OPT, 0, 0 },
+ { "name", 'n', FONTNAME_OPT, Clp_ValString, 0 },
+ { "fullname", 'N', FULLNAME_OPT, Clp_ValString, 0 },
+ { "full-name", 'N', FULLNAME_OPT, Clp_ValString, 0 },
+ { "encoding", 'e', ENCODING_OPT, Clp_ValString, 0 },
+ { "encoding-text", 'E', ENCODING_TEXT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+static HashMap<PermString, int> glyph_order(-1);
+static String encoding_name;
+
+static const char ISOLatin1Encoding[] = "/ISOLatin1Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright\n\
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /quoteleft /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /dotlessi /grave /acute /circumflex /tilde /.notdef /breve /dotaccent\n\
+ /.notdef /.notdef /ring /.notdef /.notdef /hungarumlaut /ogonek /caron\n\
+ /.notdef /exclamdown /cent /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /.notdef /mu /paragraph /periodcentered\n\
+ /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /.notdef /Odieresis /multiply\n\
+ /Oslash /.notdef /.notdef /.notdef /.notdef /Yacute /Thorn /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /.notdef /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /.notdef /oacute /ocircumflex /otilde /odieresis /.notdef\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn\n\
+] def\n";
+
+static const char ISOLatin2Encoding[] = "/ISOLatin2Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section\n\
+ /dieresis /Scaron /Scedilla /Tcaron /Zacute /uni00AD /Zcaron /Zdotaccent\n\
+ /degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron\n\
+ /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent\n\
+ /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron\n\
+ /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply\n\
+ /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /uni0162 /germandbls\n\
+ /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla\n\
+ /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron\n\
+ /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide\n\
+ /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /uni0163 /dotaccent\n\
+] def\n";
+
+static const char ISOLatin3Encoding[] = "/ISOLatin3Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Hbar /breve /sterling /currency /yen /Hcircumflex /section\n\
+ /dieresis /Idotaccent /Scedilla /Gbreve /Jcircumflex /uni00AD /registered /Zdotaccent\n\
+ /degree /hbar /twosuperior /threesuperior /acute /mu /hcircumflex /periodcentered\n\
+ /cedilla /dotlessi /scedilla /gbreve /jcircumflex /onehalf /threequarters /zdotaccent\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Cdotaccent /Ccircumflex /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Gdotaccent /Odieresis /multiply\n\
+ /Gcircumflex /Ugrave /Uacute /Ucircumflex /Udieresis /Ubreve /Scircumflex /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /cdotaccent /ccircumflex /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /ograve /oacute /ocircumflex /gdotaccent /odieresis /divide\n\
+ /gcircumflex /ugrave /uacute /ucircumflex /udieresis /ubreve /scircumflex /dotaccent\n\
+] def\n";
+
+static const char ISOLatin4Encoding[] = "/ISOLatin4Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /kgreenlandic /Rcommaaccent /currency /Itilde /Lcommaaccent /section\n\
+ /dieresis /Scaron /Emacron /Gcommaaccent /Tbar /uni00AD /Zcaron /macron\n\
+ /degree /aogonek /ogonek /rcommaaccent /acute /itilde /lcommaaccent /caron\n\
+ /cedilla /scaron /emacron /gcommaaccent /tbar /Eng /zcaron /eng\n\
+ /Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Edotaccent /Iacute /Icircumflex /Imacron\n\
+ /Dcroat /Ncommaaccent /Omacron /Kcommaaccent /Ocircumflex /Otilde /Odieresis /multiply\n\
+ /Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Utilde /Umacron /germandbls\n\
+ /amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek\n\
+ /ccaron /eacute /eogonek /edieresis /edotaccent /iacute /icircumflex /imacron\n\
+ /dcroat /ncommaaccent /omacron /kcommaaccent /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /uogonek /uacute /ucircumflex /udieresis /utilde /umacron /dotaccent\n\
+] def\n";
+
+static const char ISOCyrillicEncoding[] = "/ISOCyrillicEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /afii10023 /afii10051 /afii10052 /afii10053 /afii10054 /afii10055 /afii10056\n\
+ /afii10057 /afii10058 /afii10059 /afii10060 /afii10061 /uni00AD /afii10062 /afii10145\n\
+ /afii10017 /afii10018 /afii10019 /afii10020 /afii10021 /afii10022 /afii10024 /afii10025\n\
+ /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032 /afii10033\n\
+ /afii10034 /afii10035 /afii10036 /afii10037 /afii10038 /afii10039 /afii10040 /afii10041\n\
+ /afii10042 /afii10043 /afii10044 /afii10045 /afii10046 /afii10047 /afii10048 /afii10049\n\
+ /afii10065 /afii10066 /afii10067 /afii10068 /afii10069 /afii10070 /afii10072 /afii10073\n\
+ /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080 /afii10081\n\
+ /afii10082 /afii10083 /afii10084 /afii10085 /afii10086 /afii10087 /afii10088 /afii10089\n\
+ /afii10090 /afii10091 /afii10092 /afii10093 /afii10094 /afii10095 /afii10096 /afii10097\n\
+ /afii61352 /afii10071 /afii10099 /afii10100 /afii10101 /afii10102 /afii10103 /afii10104\n\
+ /afii10105 /afii10106 /afii10107 /afii10108 /afii10109 /section /afii10110 /afii10193\n\
+] def\n";
+
+static const char ISOGreekEncoding[] = "/ISOGreekEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /afii64937 /afii57929 /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /afii00208\n\
+ /degree /plusminus /twosuperior /threesuperior /tonos /dieresistonos /Alphatonos /periodcentered\n\
+ /Epsilontonos /Etatonos /Iotatonos /guillemotright /Omicrontonos /onehalf /Upsilontonos /Omegatonos\n\
+ /iotadieresistonos /Alpha /Beta /Gamma /uni0394 /Epsilon /Zeta /Eta\n\
+ /Theta /Iota /Kappa /Lambda /Mu /Nu /Xi /Omicron\n\
+ /Pi /Rho /Ograve /Sigma /Tau /Upsilon /Phi /Chi\n\
+ /Psi /uni03A9 /Iotadieresis /Upsilondieresis /alphatonos /epsilontonos /etatonos /iotatonos\n\
+ /upsilondieresistonos /alpha /beta /gamma /delta /epsilon /zeta /eta\n\
+ /theta /iota /kappa /lambda /uni03BC /nu /xi /omicron\n\
+ /pi /rho /sigma1 /sigma /tau /upsilon /phi /chi\n\
+ /psi /omega /iotadieresis /upsilondieresis /omicrontonos /upsilontonos /omegatonos /ydieresis\n\
+] def\n";
+
+static const char ISOLatin5Encoding[] = "/ISOLatin5Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /exclamdown /cent /sterling /currency /yen /brokenbar /section\n\
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered\n\
+ /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Gbreve /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Idotaccent /Scedilla /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /gbreve /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /dotlessi /scedilla /ydieresis\n\
+] def\n";
+
+static const char ISOLatin6Encoding[] = "/ISOLatin6Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /Aogonek /Emacron /Gcommaaccent /Imacron /Itilde /Kcommaaccent /section\n\
+ /Lcommaaccent /Dcroat /Scaron /Tbar /Zcaron /uni00AD /Umacron /Eng\n\
+ /degree /aogonek /emacron /gcommaaccent /imacron /itilde /kcommaaccent /periodcentered\n\
+ /lcommaaccent /dcroat /scaron /tbar /zcaron /macron /umacron /eng\n\
+ /Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek\n\
+ /Ccaron /Eacute /Eogonek /Edieresis /Emacron /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ncommaaccent /Omacron /Oacute /Ocircumflex /Otilde /Odieresis /Utilde\n\
+ /Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls\n\
+ /amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek\n\
+ /ccaron /eacute /eogonek /edieresis /emacron /iacute /icircumflex /idieresis\n\
+ /eth /ncommaaccent /omacron /oacute /ocircumflex /otilde /odieresis /utilde\n\
+ /oslash /uogonek /uacute /ucircumflex /udieresis /yacute /thorn /kgreenlandic\n\
+] def\n";
+
+static const char ISOThaiEncoding[] = "/ISOThaiEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /uni0E01 /uni0E02 /uni0E03 /uni0E04 /uni0E05 /uni0E06 /uni0E07\n\
+ /uni0E08 /uni0E09 /uni0E0A /uni0E0B /uni0E0C /uni0E0D /uni0E0E /uni0E0F\n\
+ /uni0E10 /uni0E11 /uni0E12 /uni0E13 /uni0E14 /uni0E15 /uni0E16 /uni0E17\n\
+ /uni0E18 /uni0E19 /uni0E1A /uni0E1B /uni0E1C /uni0E1D /uni0E1E /uni0E1F\n\
+ /uni0E20 /uni0E21 /uni0E22 /uni0E23 /uni0E24 /uni0E25 /uni0E26 /uni0E27\n\
+ /uni0E28 /uni0E29 /uni0E2A /uni0E2B /uni0E2C /uni0E2D /uni0E2E /uni0E2F\n\
+ /uni0E30 /uni0E31 /uni0E32 /uni0E33 /uni0E34 /uni0E35 /uni0E36 /uni0E37\n\
+ /uni0E38 /uni0E39 /uni0E3A /.notdef /space /.notdef /.notdef /uni0E3F\n\
+ /uni0E40 /uni0E41 /uni0E42 /uni0E43 /uni0E44 /uni0E45 /uni0E46 /uni0E47\n\
+ /uni0E48 /uni0E49 /uni0E4A /uni0E4B /uni0E4C /uni0E4D /uni0E4E /uni0E4F\n\
+ /uni0E50 /uni0E51 /uni0E52 /uni0E53 /uni0E54 /uni0E55 /uni0E56 /uni0E57\n\
+ /uni0E58 /uni0E59 /uni0E5A /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+] def\n";
+
+static const char ISOLatin7Encoding[] = "/ISOLatin7Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /quotedblright /cent /sterling /currency /quotedblbase /brokenbar /section\n\
+ /Oslash /copyright /rcommaaccent /guillemotleft /logicalnot /uni00AD /registered /AE\n\
+ /degree /plusminus /twosuperior /threesuperior /quotedblleft /mu /paragraph /periodcentered\n\
+ /oslash /onesuperior /.notdef /guillemotright /onequarter /onehalf /threequarters /ae\n\
+ /Aogonek /Iogonek /Amacron /Cacute /Adieresis /Aring /Eogonek /Emacron\n\
+ /Ccaron /Eacute /Zacute /Edotaccent /Gcommaaccent /Kcommaaccent /Imacron /Lcommaaccent\n\
+ /Scaron /Nacute /Ncommaaccent /Oacute /Omacron /Otilde /Odieresis /multiply\n\
+ /Uogonek /Lslash /Uacute /Ucircumflex /Udieresis /Zdotaccent /Zcaron /germandbls\n\
+ /aogonek /Iogonek /amacron /cacute /adieresis /aring /eogonek /emacron\n\
+ /ccaron /eacute /zacute /edotaccent /gcommaaccent /kcommaaccent /imacron /lcommaaccent\n\
+ /scaron /nacute /ncommaaccent /oacute /omacron /otilde /odieresis /divide\n\
+ /uogonek /lslash /uacute /ucircumflex /udieresis /zdotaccent /zcaron /quoteright\n\
+] def\n";
+
+static const char ISOLatin8Encoding[] = "/ISOLatin8Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /uni1E02 /uni1E03 /sterling /Cdotaccent /cdotaccent /uni1E0A /section\n\
+ /Wgrave /copyright /Wacute /uni1E0B /Ygrave /uni00AD /registered /Ydieresis\n\
+ /uni1E1E /uni1E1F /Gdotaccent /gdotaccent /uni1E40 /uni1E41 /paragraph /uni1E56\n\
+ /wgrave /uni1E57 /wacute /uni1E60 /ygrave /Wdieresis /wdieresis /uni1E61\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Wcircumflex /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /uni1E6A\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Ycircumflex /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /wcircumflex /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /uni1E6B\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /ycircumflex /ydieresis\n\
+] def\n";
+
+static const char ISOLatin9Encoding[] = "/ISOLatin9Encoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /uni00A0 /exclamdown /cent /sterling /Euro /yen /Scaron /section\n\
+ /scaron /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /macron\n\
+ /degree /plusminus /twosuperior /threesuperior /Zcaron /mu /paragraph /periodcentered\n\
+ /zcaron /onesuperior /ordmasculine /guillemotright /OE /oe /Ydieresis /questiondown\n\
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla\n\
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis\n\
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply\n\
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls\n\
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla\n\
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis\n\
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide\n\
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis\n\
+] def\n";
+
+static const char KOI8REncoding[] = "/KOI8REncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle\n\
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /at /A /B /C /D /E /F /G\n\
+ /H /I /J /K /L /M /N /O\n\
+ /P /Q /R /S /T /U /V /W\n\
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore\n\
+ /grave /a /b /c /d /e /f /g\n\
+ /h /i /j /k /l /m /n /o\n\
+ /p /q /r /s /t /u /v /w\n\
+ /x /y /z /braceleft /bar /braceright /asciitilde /.notdef\n\
+ /SF100000 /SF110000 /SF010000 /SF030000 /SF020000 /SF040000 /SF080000 /SF090000\n\
+ /SF060000 /SF070000 /SF050000 /upblock /dnblock /block /lfblock /rtblock\n\
+ /ltshade /shade /dkshade /integraltp /filledbox /uni2219 /radical /approxequal\n\
+ /lessequal /greaterequal /uni00A0 /integralbt /degree /twosuperior /periodcentered /divide\n\
+ /SF430000 /SF240000 /SF510000 /afii10071 /SF520000 /SF390000 /SF220000 /SF210000\n\
+ /SF250000 /SF500000 /SF490000 /SF380000 /SF280000 /SF270000 /SF260000 /SF360000\n\
+ /SF370000 /SF420000 /SF190000 /afii10023 /SF200000 /SF230000 /SF470000 /SF480000\n\
+ /SF410000 /SF450000 /SF460000 /SF400000 /SF540000 /SF530000 /SF440000 /copyright\n\
+ /afii10096 /afii10065 /afii10066 /afii10088 /afii10069 /afii10070 /afii10086 /afii10068\n\
+ /afii10087 /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080\n\
+ /afii10081 /afii10097 /afii10082 /afii10083 /afii10084 /afii10085 /afii10072 /afii10067\n\
+ /afii10094 /afii10093 /afii10073 /afii10090 /afii10095 /afii10091 /afii10089 /afii10092\n\
+ /afii10048 /afii10017 /afii10018 /afii10040 /afii10021 /afii10022 /afii10038 /afii10020\n\
+ /afii10039 /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032\n\
+ /afii10033 /afii10049 /afii10034 /afii10035 /afii10036 /afii10037 /afii10024 /afii10019\n\
+ /afii10046 /afii10045 /afii10025 /afii10042 /afii10047 /afii10043 /afii10041 /afii10044\n\
+] def\n";
+
+static const char ExpertEncoding[] = "/ExpertEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclamsmall /Hungarumlautsmall /.notdef /dollaroldstyle /dollarsuperior /ampersandsmall /Acutesmall\n\
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /comma /hyphen /period /fraction\n\
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle\n\
+ /eightoldstyle /nineoldstyle /colon /semicolon /commasuperior /threequartersemdash /periodsuperior /questionsmall\n\
+ /.notdef /asuperior /bsuperior /centsuperior /dsuperior /esuperior /.notdef /.notdef\n\
+ /.notdef /isuperior /.notdef /.notdef /lsuperior /msuperior /nsuperior /osuperior\n\
+ /.notdef /.notdef /rsuperior /ssuperior /tsuperior /.notdef /ff /fi\n\
+ /fl /ffi /ffl /parenleftinferior /.notdef /parenrightinferior /Circumflexsmall /hyphensuperior\n\
+ /Gravesmall /Asmall /Bsmall /Csmall /Dsmall /Esmall /Fsmall /Gsmall\n\
+ /Hsmall /Ismall /Jsmall /Ksmall /Lsmall /Msmall /Nsmall /Osmall\n\
+ /Psmall /Qsmall /Rsmall /Ssmall /Tsmall /Usmall /Vsmall /Wsmall\n\
+ /Xsmall /Ysmall /Zsmall /colonmonetary /onefitted /rupiah /Tildesmall /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /exclamdownsmall /centoldstyle /Lslashsmall /.notdef /.notdef /Scaronsmall /Zcaronsmall\n\
+ /Dieresissmall /Brevesmall /Caronsmall /.notdef /Dotaccentsmall /.notdef /.notdef /Macronsmall\n\
+ /.notdef /.notdef /figuredash /hypheninferior /.notdef /.notdef /Ogoneksmall /Ringsmall\n\
+ /Cedillasmall /.notdef /.notdef /.notdef /onequarter /onehalf /threequarters /questiondownsmall\n\
+ /oneeighth /threeeighths /fiveeighths /seveneighths /onethird /twothirds /.notdef /.notdef\n\
+ /zerosuperior /onesuperior /twosuperior /threesuperior /foursuperior /fivesuperior /sixsuperior /sevensuperior\n\
+ /eightsuperior /ninesuperior /zeroinferior /oneinferior /twoinferior /threeinferior /fourinferior /fiveinferior\n\
+ /sixinferior /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior /periodinferior /commainferior\n\
+ /Agravesmall /Aacutesmall /Acircumflexsmall /Atildesmall /Adieresissmall /Aringsmall /AEsmall /Ccedillasmall\n\
+ /Egravesmall /Eacutesmall /Ecircumflexsmall /Edieresissmall /Igravesmall /Iacutesmall /Icircumflexsmall /Idieresissmall\n\
+ /Ethsmall /Ntildesmall /Ogravesmall /Oacutesmall /Ocircumflexsmall /Otildesmall /Odieresissmall /OEsmall\n\
+ /Oslashsmall /Ugravesmall /Uacutesmall /Ucircumflexsmall /Udieresissmall /Yacutesmall /Thornsmall\n\
+] def\n";
+
+static const char ExpertSubsetEncoding[] = "/ExpertSubsetEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /.notdef /.notdef /.notdef /dollaroldstyle /dollarsuperior /.notdef /.notdef\n\
+ /parenleftsuperior /parenrightsuperior /twodotenleader /onedotenleader /comma /hyphen /period /fraction\n\
+ /zerooldstyle /oneoldstyle /twooldstyle /threeoldstyle /fouroldstyle /fiveoldstyle /sixoldstyle /sevenoldstyle\n\
+ /eightoldstyle /nineoldstyle /colon /semicolon /commasuperior /threequartersemdash /periodsuperior /.notdef\n\
+ /.notdef /asuperior /bsuperior /centsuperior /dsuperior /esuperior /.notdef /.notdef\n\
+ /.notdef /isuperior /.notdef /.notdef /lsuperior /msuperior /nsuperior /osuperior\n\
+ /.notdef /.notdef /rsuperior /ssuperior /tsuperior /.notdef /ff /fi\n\
+ /fl /ffi /ffl /parenleftinferior /.notdef /parenrightinferior /.notdef /hyphensuperior\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /colonmonetary /onefitted /rupiah /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /centoldstyle /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /figuredash /hypheninferior /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /onequarter /onehalf /threequarters /.notdef\n\
+ /oneeighth /threeeighths /fiveeighths /seveneighths /onethird /twothirds /.notdef /.notdef\n\
+ /zerosuperior /onesuperior /twosuperior /threesuperior /foursuperior /fivesuperior /sixsuperior /sevensuperior\n\
+ /eightsuperior /ninesuperior /zeroinferior /oneinferior /twoinferior /threeinferior /fourinferior /fiveinferior\n\
+ /sixinferior /seveninferior /eightinferior /nineinferior /centinferior /dollarinferior /periodinferior /commainferior\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+] def\n";
+
+static const char SymbolEncoding[] = "/SymbolEncoding [\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /space /exclam /universal /numbersign /existential /percent /ampersand /suchthat\n\
+ /parenleft /parenright /asteriskmath /plus /comma /minus /period /slash\n\
+ /zero /one /two /three /four /five /six /seven\n\
+ /eight /nine /colon /semicolon /less /equal /greater /question\n\
+ /congruent /Alpha /Beta /Chi /Delta /Epsilon /Phi /Gamma\n\
+ /Eta /Iota /theta1 /Kappa /Lambda /Mu /Nu /Omicron\n\
+ /Pi /Theta /Rho /Sigma /Tau /Upsilon /sigma1 /Omega\n\
+ /Xi /Psi /Zeta /bracketleft /therefore /bracketright /perpendicular /underscore\n\
+ /radicalex /alpha /beta /chi /delta /epsilon /phi /gamma\n\
+ /eta /iota /phi1 /kappa /lambda /mu /nu /omicron\n\
+ /pi /theta /rho /sigma /tau /upsilon /omega1 /omega\n\
+ /xi /psi /zeta /braceleft /bar /braceright /similar /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef\n\
+ /.notdef /Upsilon1 /minute /lessequal /fraction /infinity /florin /club\n\
+ /diamond /heart /spade /arrowboth /arrowleft /arrowup /arrowright /arrowdown\n\
+ /degree /plusminus /second /greaterequal /multiply /proportional /partialdiff /bullet\n\
+ /divide /notequal /equivalence /approxequal /ellipsis /arrowvertex /arrowhorizex /carriagereturn\n\
+ /aleph /Ifraktur /Rfraktur /weierstrass /circlemultiply /circleplus /emptyset /intersection\n\
+ /union /propersuperset /reflexsuperset /notsubset /propersubset /reflexsubset /element /notelement\n\
+ /angle /gradient /registerserif /copyrightserif /trademarkserif /product /radical /dotmath\n\
+ /logicalnot /logicaland /logicalor /arrowdblboth /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown\n\
+ /lozenge /angleleft /registersans /copyrightsans /trademarksans /summation /parenlefttp /parenleftex\n\
+ /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt /bracelefttp /braceleftmid /braceleftbt /braceex\n\
+ /.notdef /angleright /integral /integraltp /integralex /integralbt /parenrighttp /parenrightex\n\
+ /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt /bracerighttp /bracerightmid /bracerightbt\n\
+] def\n";
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1reencode%> changes a Type 1 font%,s embedded encoding and writes the\n\
+reencoded font to the standard output.\n\
+\n\
+Usage: %s [OPTION]... [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -e, --encoding=FILE Read the encoding from FILE (in DVIPS format).\n\
+ -E, --encoding-text=ENC The ENC argument is the encoding text.\n\
+ -n, --name=NAME Set output font%,s PostScript name.\n\
+ -N, --full-name=NAME Set output font%,s full name.\n\
+ -a, --pfa Output PFA font.\n\
+ -b, --pfb Output PFB font. This is the default.\n\
+ -o, --output=FILE Write output to FILE instead of standard out.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// FONT MANIPULATION
+
+static void
+kill_def(Type1Font* font, Type1Definition *t1d, int whichd)
+{
+ if (!t1d || font->dict(whichd, t1d->name()) != t1d)
+ return;
+
+ int icount = font->nitems();
+ for (int i = font->first_dict_item(whichd); i < icount; i++)
+ if (font->item(i) == t1d) {
+ StringAccum sa;
+ sa << '%';
+ t1d->gen(sa);
+ PermString name = t1d->name();
+ Type1CopyItem *t1ci = new Type1CopyItem(sa.take_string());
+ font->set_item(i, t1ci);
+ font->set_dict(whichd, name, 0);
+ return;
+ }
+
+ assert(0);
+}
+
+static void
+adjust_font_definitions(Type1Font* font, Type1Encoding* encoding, String new_name, String new_full_name)
+{
+ // prepare an MD5 digest over the encoding
+ StringAccum etext;
+ for (int i = 0; i < 256; i++)
+ etext << encoding->elt(i) << ' ';
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char*) etext.data(), etext.length() - 1);
+
+ // save UniqueID, then kill its definition
+ int uniqueid;
+ Type1Definition *t1d = font->dict("UniqueID");
+ bool have_uniqueid = (t1d && t1d->value_int(uniqueid));
+ kill_def(font, t1d, Type1Font::dFont);
+ kill_def(font, font->p_dict("UniqueID"), Type1Font::dPrivate);
+
+ // prepare XUID
+ t1d = font->dict("XUID");
+ Vector<double> xuid;
+ if (!t1d || !t1d->value_numvec(xuid)) {
+ if (have_uniqueid) {
+ t1d = font->ensure(Type1Font::dFont, "XUID");
+ xuid.clear();
+ xuid.push_back(1);
+ xuid.push_back(uniqueid);
+ } else if (t1d) {
+ kill_def(font, t1d, Type1Font::dFont);
+ t1d = 0;
+ }
+ }
+ if (t1d) {
+ uint8_t digest[MD5_DIGEST_SIZE + 2]; // leave 2 bytes of space
+ md5_final((unsigned char *) digest, &md5);
+ digest[MD5_DIGEST_SIZE] = digest[MD5_DIGEST_SIZE + 1] = 0;
+
+ // append digest to XUID; each element must be less than 2^24
+ for (int i = 0; i < MD5_DIGEST_SIZE; i += 3)
+ xuid.push_back((digest[i] << 16) | (digest[i+1] << 8) | digest[i+2]);
+ t1d->set_numvec(xuid);
+ }
+
+ // prepare new font name
+ if (!encoding_name) {
+ char text_digest[MD5_TEXT_DIGEST_SIZE + 1];
+ md5_final_text(text_digest, &md5);
+ encoding_name = "AutoEnc_" + String(text_digest);
+ }
+
+ t1d = font->dict("FontName");
+ PermString name;
+ if (t1d && t1d->value_name(name)) {
+ if (!new_name)
+ new_name = name + encoding_name;
+ t1d->set_name(new_name.c_str());
+ font->uncache_defs(); // remove cached font name
+ }
+
+ // add a FullName too
+ String full_name;
+ t1d = font->fi_dict("FullName");
+ if (t1d && t1d->value_string(full_name)) {
+ if (!new_full_name)
+ new_full_name = full_name + "_" + encoding_name + " Enc";
+ t1d->set_string(new_full_name.c_str());
+ }
+
+ // add header comments
+ {
+ StringAccum sa;
+#if HAVE_CTIME
+ time_t cur_time = time(0);
+ char *time_str = ctime(&cur_time);
+ sa << "%% Created by t1reencode-" VERSION " on " << time_str;
+ sa.pop_back();
+#else
+ sa << "%% Created by t1reencode-" VERSION ".";
+#endif
+
+ font->add_header_comment(sa.take_string().c_str());
+ font->add_header_comment("%% T1reencode is free software. See <http://www.lcdf.org/type/>.");
+ }
+}
+
+
+// ENCODING READER
+
+static String
+tokenize(const String &s, int &pos_in, int &line)
+{
+ const char *data = s.data();
+ int len = s.length();
+ int pos = pos_in;
+ while (1) {
+ // skip whitespace
+ while (pos < len && isspace((unsigned char) data[pos])) {
+ if (data[pos] == '\n')
+ line++;
+ else if (data[pos] == '\r' && (pos + 1 == len || data[pos+1] != '\n'))
+ line++;
+ pos++;
+ }
+
+ if (pos >= len) {
+ pos_in = len;
+ return String();
+ } else if (data[pos] == '%') {
+ for (pos++; pos < len && data[pos] != '\n' && data[pos] != '\r'; pos++)
+ /* nada */;
+ } else if (data[pos] == '[' || data[pos] == ']' || data[pos] == '{' || data[pos] == '}') {
+ pos_in = pos + 1;
+ return s.substring(pos, 1);
+ } else if (data[pos] == '(') {
+ int first = pos, nest = 0;
+ for (pos++; pos < len && (data[pos] != ')' || nest); pos++)
+ switch (data[pos]) {
+ case '(': nest++; break;
+ case ')': nest--; break;
+ case '\\':
+ if (pos + 1 < len)
+ pos++;
+ break;
+ case '\n': line++; break;
+ case '\r':
+ if (pos + 1 == len || data[pos+1] != '\n')
+ line++;
+ break;
+ }
+ pos_in = (pos < len ? pos + 1 : len);
+ return s.substring(first, pos_in - first);
+ } else {
+ int first = pos;
+ while (pos < len && data[pos] == '/')
+ pos++;
+ while (pos < len && data[pos] != '/' && !isspace((unsigned char) data[pos]) && data[pos] != '[' && data[pos] != ']' && data[pos] != '%' && data[pos] != '(' && data[pos] != '{' && data[pos] != '}')
+ pos++;
+ pos_in = pos;
+ return s.substring(first, pos - first);
+ }
+ }
+}
+
+static String
+landmark(const String &filename, int line)
+{
+ return filename + String::make_stable(":", 1) + String(line);
+}
+
+Type1Encoding *
+parse_encoding(String s, String filename, ErrorHandler *errh)
+{
+ filename = printable_filename(filename);
+ int pos = 0, line = 1;
+
+ // parse text
+ String token = tokenize(s, pos, line);
+ if (!token || token[0] != '/') {
+ errh->lerror(landmark(filename, line), "parse error, expected name");
+ return 0;
+ }
+ encoding_name = token.substring(1);
+
+ if (tokenize(s, pos, line) != "[") {
+ errh->lerror(landmark(filename, line), "parse error, expected [");
+ return 0;
+ }
+
+ Type1Encoding *t1e = new Type1Encoding;
+ int e = 0;
+ while ((token = tokenize(s, pos, line)) && token[0] == '/') {
+ if (e > 255) {
+ errh->lwarning(landmark(filename, line), "more than 256 characters in encoding");
+ break;
+ }
+ t1e->put(e, token.substring(1));
+ e++;
+ }
+ return t1e;
+}
+
+
+
+// MAIN
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+static Type1Font *
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+ if (!font->ok())
+ errh->fatal("%s: no glyphs in font", filename);
+
+ delete reader;
+ return font;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *input_file = 0;
+ const char *output_file = 0;
+ const char *encoding_file = 0;
+ const char *encoding_text = 0;
+ const char *new_font_name = 0;
+ const char *new_full_name = 0;
+ bool binary = true;
+ Vector<String> glyph_patterns;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case ENCODING_OPT:
+ if (encoding_file || encoding_text)
+ errh->fatal("encoding already specified");
+ encoding_file = clp->vstr;
+ break;
+
+ case ENCODING_TEXT_OPT:
+ if (encoding_file || encoding_text)
+ errh->fatal("encoding already specified");
+ encoding_text = clp->vstr;
+ break;
+
+ case FONTNAME_OPT:
+ if (new_font_name)
+ errh->fatal("font name already specified");
+ new_font_name = clp->vstr;
+ break;
+
+ case FULLNAME_OPT:
+ if (new_full_name)
+ errh->fatal("full name already specified");
+ new_full_name = clp->vstr;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->vstr;
+ break;
+
+ case PFA_OPT:
+ binary = false;
+ break;
+
+ case PFB_OPT:
+ binary = true;
+ break;
+
+ case VERSION_OPT:
+ printf("t1reencode (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ if (input_file && output_file)
+ errh->fatal("too many arguments");
+ else if (input_file)
+ output_file = clp->vstr;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ // read the font
+ Type1Font *font = do_file(input_file, psres, errh);
+ if (!input_file || strcmp(input_file, "-") == 0)
+ input_file = "<stdin>";
+
+ // read the encoding
+ if (!encoding_file && !encoding_text)
+ errh->fatal("missing %<-e ENCODING%> argument");
+ Type1Encoding *t1e = 0;
+ if (strcmp(encoding_file, "StandardEncoding") == 0) {
+ t1e = Type1Encoding::standard_encoding();
+ encoding_name = encoding_file;
+ } else {
+ String text;
+ if (strcmp(encoding_file, "ISOLatin1Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_1_Encoding") == 0)
+ text = String::make_stable(ISOLatin1Encoding);
+ else if (strcmp(encoding_file, "ISOLatin2Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_2_Encoding") == 0)
+ text = String::make_stable(ISOLatin2Encoding);
+ else if (strcmp(encoding_file, "ISOLatin3Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_3_Encoding") == 0)
+ text = String::make_stable(ISOLatin3Encoding);
+ else if (strcmp(encoding_file, "ISOLatin4Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_4_Encoding") == 0)
+ text = String::make_stable(ISOLatin4Encoding);
+ else if (strcmp(encoding_file, "ISOCyrillicEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_5_Encoding") == 0)
+ text = String::make_stable(ISOCyrillicEncoding);
+ else if (strcmp(encoding_file, "ISOGreekEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_7_Encoding") == 0)
+ text = String::make_stable(ISOGreekEncoding);
+ else if (strcmp(encoding_file, "ISO_8859_9_Encoding") == 0
+ || strcmp(encoding_file, "ISOLatin5Encoding") == 0)
+ text = String::make_stable(ISOLatin5Encoding);
+ else if (strcmp(encoding_file, "ISOLatin6Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_10_Encoding") == 0)
+ text = String::make_stable(ISOLatin6Encoding);
+ else if (strcmp(encoding_file, "ISOThaiEncoding") == 0
+ || strcmp(encoding_file, "ISO_8859_11_Encoding") == 0)
+ text = String::make_stable(ISOThaiEncoding);
+ else if (strcmp(encoding_file, "ISOLatin7Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_13_Encoding") == 0)
+ text = String::make_stable(ISOLatin7Encoding);
+ else if (strcmp(encoding_file, "ISOLatin8Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_14_Encoding") == 0)
+ text = String::make_stable(ISOLatin8Encoding);
+ else if (strcmp(encoding_file, "ISOLatin9Encoding") == 0
+ || strcmp(encoding_file, "ISO_8859_15_Encoding") == 0)
+ text = String::make_stable(ISOLatin9Encoding);
+ else if (strcmp(encoding_file, "KOI8REncoding") == 0)
+ text = String::make_stable(KOI8REncoding);
+ else if (strcmp(encoding_file, "ExpertEncoding") == 0)
+ text = String::make_stable(ExpertEncoding);
+ else if (strcmp(encoding_file, "ExpertSubsetEncoding") == 0)
+ text = String::make_stable(ExpertSubsetEncoding);
+ else if (strcmp(encoding_file, "SymbolEncoding") == 0)
+ text = String::make_stable(SymbolEncoding);
+ else if (encoding_text)
+ text = String::make_stable(encoding_text), encoding_file = "<argument>";
+ else if ((text = read_file(encoding_file, errh)), errh->nerrors() > 0)
+ exit(1);
+ if (!(t1e = parse_encoding(text, encoding_file, errh)))
+ exit(1);
+ }
+
+ // set the encoding
+ font->add_type1_encoding(t1e);
+
+ // adjust definitions
+ adjust_font_definitions(font, t1e, new_font_name, new_full_name);
+
+ // write it to output
+ FILE *outf;
+ if (!output_file || strcmp(output_file, "-") == 0)
+ outf = stdout;
+ else {
+ outf = fopen(output_file, "w");
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+ if (binary) {
+ Type1PFBWriter w(outf);
+ font->write(w);
+ } else {
+ Type1PFAWriter w(outf);
+ font->write(w);
+ }
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc
new file mode 100644
index 00000000000..2e3495cf963
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.cc
@@ -0,0 +1,78 @@
+/* util.{cc,hh} -- various bits
+ *
+ * Copyright (c) 2003-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include "util.hh"
+#include <lcdf/error.hh>
+#include <lcdf/straccum.hh>
+#include <lcdf/vector.hh>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+String
+read_file(String filename, ErrorHandler *errh, bool warning)
+{
+ FILE *f;
+ if (!filename || filename == "-") {
+ filename = "<stdin>";
+ f = stdin;
+#if defined(_MSDOS) || defined(_WIN32)
+ // Set the file mode to binary
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(filename.c_str(), "rb"))) {
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ return String();
+ }
+
+ StringAccum sa;
+ int amt;
+ do {
+ if (char *x = sa.reserve(8192)) {
+ amt = fread(x, 1, 8192, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->xmessage((warning ? errh->e_warning : errh->e_error) + ErrorHandler::make_landmark_anno(filename), strerror(errno));
+ if (f != stdin)
+ fclose(f);
+ return sa.take_string();
+}
+
+String
+printable_filename(const String &s)
+{
+ if (!s || s == "-")
+ return String::make_stable("<stdin>");
+ else
+ return s;
+}
+
+String
+pathname_filename(const String &path)
+{
+ int slash = path.find_right('/');
+ if (slash >= 0 && slash != path.length() - 1)
+ return path.substring(slash + 1);
+ else
+ return path;
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.hh b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.hh
new file mode 100644
index 00000000000..34b9c9c5a22
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1reencode/util.hh
@@ -0,0 +1,10 @@
+#ifndef T1REENCODE_UTIL_HH
+#define T1REENCODE_UTIL_HH
+#include <lcdf/string.hh>
+class ErrorHandler;
+
+String read_file(String filename, ErrorHandler *, bool warn = false);
+String printable_filename(const String &);
+String pathname_filename(const String &);
+
+#endif
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.am
new file mode 100644
index 00000000000..3e530d8f469
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = t1testpage
+man_MANS = t1testpage.1
+
+t1testpage_SOURCES = t1testpage.cc
+
+t1testpage_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = t1testpage.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.in
new file mode 100644
index 00000000000..9241f7b06d6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/Makefile.in
@@ -0,0 +1,748 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = t1testpage$(EXEEXT)
+subdir = lcdf-typetools-src/t1testpage
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_t1testpage_OBJECTS = t1testpage.$(OBJEXT)
+t1testpage_OBJECTS = $(am_t1testpage_OBJECTS)
+t1testpage_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/t1testpage.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(t1testpage_SOURCES)
+DIST_SOURCES = $(t1testpage_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = t1testpage.1
+t1testpage_SOURCES = t1testpage.cc
+t1testpage_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = t1testpage.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/t1testpage/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/t1testpage/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+t1testpage$(EXEEXT): $(t1testpage_OBJECTS) $(t1testpage_DEPENDENCIES) $(EXTRA_t1testpage_DEPENDENCIES)
+ @rm -f t1testpage$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(t1testpage_OBJECTS) $(t1testpage_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1testpage.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/t1testpage.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/t1testpage.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1
new file mode 100644
index 00000000000..d46e48538eb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.1
@@ -0,0 +1,66 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH T1TESTPAGE 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+t1testpage \- create a PostScript proof for a Type 1 font
+.SH SYNOPSIS
+.B t1testpage
+\%[\fIfont...\fR]
+.SH DESCRIPTION
+.BR T1testpage
+creates a PostScript proof document for the specified Type 1 font file and
+writes it to the standard output. The proof shows every glyph in the
+font, including its glyph name and encoding. The
+.I font
+argument should be the name of a PFA or PFB font file. If more than one
+.I font
+is given, the output proof contains all the fonts in order. If
+.I font
+is omitted,
+t1testpage will read a font file from the standard input.
+.PP
+T1testpage is preliminary software.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BR \-g " \fIglyphs\fR, " \-\-glyph= \fIglyphs
+Print only glyphs matching
+.IR glyphs .
+The argument is a glyph pattern, using shell-like matching rules; thus,
+.BR "\-g " 'A*'
+will match the glyphs 'A', 'Atilde', and 'Ampersand', among others. You
+can give this option multiple times, or supply multiple space-separated
+patterns in a single option.
+'
+.Sp
+.TP 5
+.BR \-s ", " \-\-smoke
+Print smoke proofs, one glyph per page. This option is preliminary.
+'
+.Sp
+.TP 5
+.BR \-o " \fIfile\fR, " \-\-output= \fIfile
+Write the output proof to
+.I file
+instead of the standard output.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc
new file mode 100644
index 00000000000..7931b45087b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1testpage/t1testpage.cc
@@ -0,0 +1,748 @@
+/* t1testpage.cc -- driver for generating Type 1 fonts' test pages
+ *
+ * Copyright (c) 1999-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/psres.hh>
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <efont/t1mm.hh>
+#include <efont/t1interp.hh>
+#include <efont/t1bounds.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <lcdf/globmatch.hh>
+#include <lcdf/transform.hh>
+#include <algorithm>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define OUTPUT_OPT 303
+#define GLYPH_OPT 304
+#define SMOKE_OPT 305
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "version", 0, VERSION_OPT, 0, 0 },
+ { "glyph", 'g', GLYPH_OPT, Clp_ValString, 0 },
+ { "smoke", 's', SMOKE_OPT, 0, Clp_Negate }
+};
+
+
+static const char *program_name;
+static PermString::Initializer initializer;
+static HashMap<PermString, int> glyph_order(-1);
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTION]... FONT", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<T1testpage%> creates a PostScript proof document for the specified Type 1\n\
+font file and writes it to the standard output. The proof shows every\n\
+glyph in the font, including its glyph name and encoding.\n\
+\n\
+Usage: %s [OPTION]... [FONT...]\n\
+\n\
+Each FONT is the name of a PFA or PFB font file. If omitted, t1testpage will\n\
+read a font file from the standard input.\n\
+\n\
+Options:\n\
+ -g, --glyph=GLYPH Limit output to one or more GLYPHs.\n\
+ -s, --smoke Print smoke proofs, one character per page.\n\
+ -o, --output=FILE Write output to FILE instead of standard out.\n\
+ -h, --help Print this message and exit.\n\
+ --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// OUTPUTTER
+
+namespace {
+
+class Testpager { public:
+ Testpager(FILE *f)
+ : _f(f), _pageno(1) {
+ }
+ virtual ~Testpager() {
+ fclose(_f);
+ }
+ virtual void prolog(const Vector<Type1Font *> &fonts) = 0;
+ void newpage() {
+ fprintf(_f, "%%%%Page: %d %d\n", _pageno, _pageno);
+ ++_pageno;
+ }
+ virtual void font(Type1Font *font, const Vector<PermString>& glyph_names) = 0;
+ virtual void epilog() {
+ fprintf(_f, "%%%%EOF\n");
+ }
+ protected:
+ FILE *_f;
+ int _pageno;
+};
+
+class GridTestpager : public Testpager { public:
+ GridTestpager(FILE *f)
+ : Testpager(f) {
+ }
+ void prolog(const Vector<Type1Font *> &fonts);
+ void font(Type1Font *font, const Vector<PermString>& glyph_names);
+};
+
+class SmokeTestpager : public Testpager { public:
+ SmokeTestpager(FILE *f)
+ : Testpager(f) {
+ }
+ void prolog(const Vector<Type1Font *> &fonts);
+ void font(Type1Font *font, const Vector<PermString>& glyph_names);
+};
+
+}
+
+
+// MAIN
+
+static Type1Font *
+do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!filename || strcmp(filename, "-") == 0) {
+ f = stdin;
+ filename = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else
+ f = fopen(filename, "rb");
+
+ if (!f) {
+ // check for PostScript name
+ Filename fn = psres->filename_value("FontOutline", filename);
+ f = fn.open_read();
+ }
+
+ if (!f)
+ errh->fatal("%s: %s", filename, strerror(errno));
+
+ Type1Reader *reader;
+ int c = getc(f);
+ ungetc(c, f);
+ if (c == EOF)
+ errh->fatal("%s: empty file", filename);
+ if (c == 128)
+ reader = new Type1PFBReader(f);
+ else
+ reader = new Type1PFAReader(f);
+
+ Type1Font *font = new Type1Font(*reader);
+
+ delete reader;
+ return font;
+}
+
+void
+GridTestpager::prolog(const Vector<Type1Font *> &fonts)
+{
+ fprintf(_f, "%%!PS-Adobe-3.0\n\
+%%%%LanguageLevel: 2\n\
+%%%%DocumentMedia: Plain 612 792 white ( )\n\
+%%%%BeginProlog\n");
+ fprintf(_f, "/magicstr 1 string def\n\
+/magicbox { %% row col char name encoding magicbox -\n\
+ 5 3 roll 54 mul 36 add exch 54 mul neg 682 add moveto currentpoint\n\
+ .8 setgray 54 0 rlineto 0 54 rlineto -54 0 rlineto closepath stroke\n\
+ 0 setgray moveto\n\
+ gsave /Helvetica 7 selectfont 3 1.5 rmoveto show grestore\n\
+ gsave /Helvetica 7 selectfont 3 45.5 rmoveto show grestore\n\
+ magicstr 0 3 -1 roll put\n\
+ magicstr stringwidth pop 54 sub -2 div 16 rmoveto magicstr show\n\
+} bind def\n");
+ Type1PFAWriter w(_f);
+ for (Vector<Type1Font *>::const_iterator it = fonts.begin();
+ it != fonts.end(); ++it)
+ (*it)->write(w);
+ fprintf(_f, "%%%%EndProlog\n");
+}
+
+void
+GridTestpager::font(Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ HashMap<PermString, int> encodings(-1);
+ if (Type1Encoding *encoding = font->type1_encoding())
+ for (int i = 255; i >= 0; i--)
+ if (encoding->elt(i))
+ encodings.insert(encoding->elt(i), i);
+
+ int per_row = 10;
+ int nrows = 13;
+ int per_page = nrows * per_row;
+
+ int page = 0, gi = -1;
+ for (Vector<PermString>::const_iterator it = glyph_names.begin();
+ it != glyph_names.end(); ++it) {
+ // allow font that doesn't have all glyphs
+ if (!font->glyph(*it))
+ continue;
+
+ ++gi;
+ if (gi % per_page == 0) {
+ if (page)
+ fprintf(_f, "showpage restore\n");
+ ++page;
+ newpage();
+ fprintf(_f, "save\n");
+ // make new font
+ fprintf(_f, "/%s findfont dup length dict begin\n\
+ { 1 index /FID ne {def} {pop pop} ifelse } forall\n /Encoding [",
+ font->font_name().c_str());
+ int gx = 0;
+ for (Vector<PermString>::const_iterator xit = it;
+ xit != glyph_names.end() && gx < per_page; ++xit)
+ if (font->glyph(*xit)) {
+ ++gx;
+ fprintf(_f, " /%s", xit->c_str());
+ if (gx % 10 == 9)
+ fprintf(_f, "\n");
+ }
+ fprintf(_f, " ] def\n currentdict end /X exch definefont pop\n\
+/Helvetica-Bold 16 selectfont 36 742 moveto (%s) show\n\
+/X 24 selectfont\n", font->font_name().c_str());
+ }
+
+ int row = (gi % per_page) / per_row;
+ int col = gi % per_row;
+
+ fprintf(_f, "%d %d %d (%s)", row, col, gi % per_page, it->c_str());
+ if (encodings[*it] >= 0) {
+ int e = encodings[*it];
+ if (e == '\\')
+ fprintf(_f, " ('\\\\\\\\')");
+ else if (e == '\'')
+ fprintf(_f, " ('\\\\'')");
+ else if (e == '(' || e == ')')
+ fprintf(_f, " ('\\%c')", e);
+ else if (e >= 32 && e < 127)
+ fprintf(_f, " ('%c')", e);
+ else
+ fprintf(_f, " ('\\\\%03o')", e);
+ } else
+ fprintf(_f, " ()");
+ fprintf(_f, " magicbox\n");
+ }
+
+ if (page)
+ fprintf(_f, "showpage restore\n");
+}
+
+
+
+/*****
+ * SMOKE PROOFS
+ **/
+
+inline StringAccum&
+operator<<(StringAccum& sa, const Point& p)
+{
+ return sa << p.x << ' ' << p.y;
+}
+
+class Smoker : public CharstringInterp { public:
+
+ Smoker(const Transform&);
+
+ void act_line(int, const Point &, const Point &);
+ void act_curve(int, const Point &, const Point &, const Point &, const Point &);
+ void act_closepath(int);
+
+ String char_postscript() { return _char_sa.take_string(); }
+ String points_postscript() { return _points_sa.take_string(); }
+
+ bool run(const CharstringContext&);
+
+ private:
+
+ Transform _xform;
+ StringAccum _char_sa;
+ StringAccum _points_sa;
+ Point _char_cp;
+
+ inline void maybe_move(const Point&);
+
+};
+
+Smoker::Smoker(const Transform& xform)
+ : _xform(xform)
+{
+}
+
+void
+Smoker::maybe_move(const Point& p)
+{
+ if (_char_cp.x < -100000 || _char_cp != p) {
+ _char_sa << (p * _xform) << " moveto\n";
+ _points_sa << (p * _xform) << " pA\n";
+ }
+}
+
+void
+Smoker::act_line(int cmd, const Point& p0, const Point& p1)
+{
+ Point xp1 = p1 * _xform;
+
+ maybe_move(p0);
+ _char_sa << xp1 << " lineto\n";
+ if (cmd == Charstring::cRlineto
+ || cmd == Charstring::cHlineto
+ || cmd == Charstring::cVlineto)
+ _points_sa << xp1 << " pA\n";
+ _char_cp = p1;
+}
+
+void
+Smoker::act_curve(int, const Point &p0, const Point &p1, const Point &p2, const Point &p3)
+{
+ Point xp1 = p1 * _xform;
+ Point xp2 = p2 * _xform;
+ Point xp3 = p3 * _xform;
+
+ maybe_move(p0);
+ _char_sa << xp1 << ' ' << xp2 << ' ' << xp3 << " curveto\n";
+ _points_sa << xp1 << " pC " << xp2 << " pC " << xp3 << " pA\n";
+ _char_cp = p3;
+}
+
+void
+Smoker::act_closepath(int)
+{
+ _char_sa << "closepath\n";
+}
+
+bool
+Smoker::run(const CharstringContext& g)
+{
+ _char_sa.clear();
+ _points_sa.clear();
+ _char_cp.x = -200000;
+ return CharstringInterp::interpret(g);
+}
+
+#define LEFT_BOUND 72.
+#define RIGHT_BOUND (7.5 * 72)
+#define BOTTOM_BOUND 72.
+#define TOP_BOUND (7.5 * 72)
+
+static Transform
+bounds2xform(CharstringBounds& bounds, bool expand = false)
+{
+ if (expand) {
+ Point vec = bounds.bb_top_right() - bounds.bb_bottom_left();
+ bounds.act_line(0, bounds.bb_bottom_left() - 0.1 * vec, bounds.bb_top_right() + 0.1 * vec);
+ }
+ bounds.act_line(0, Point(0, 0), bounds.width());
+ bounds.act_line(0, Point(0, 0), Point(1, 1));
+
+ double true_width = std::max(bounds.bb_right(), 0.) - std::min(bounds.bb_left(), 0.);
+ double true_height = std::max(bounds.bb_top(), 0.) - std::min(bounds.bb_bottom(), 0.);
+ double x_scale = (RIGHT_BOUND - LEFT_BOUND) / true_width;
+ double y_scale = (TOP_BOUND - BOTTOM_BOUND) / true_height;
+ double scale = std::min(x_scale, y_scale);
+ double origin_x = LEFT_BOUND;
+ if (bounds.bb_left() < 0)
+ origin_x += -bounds.bb_left() * scale;
+ double origin_y = BOTTOM_BOUND;
+ if (bounds.bb_bottom() < 0)
+ origin_y += -bounds.bb_bottom() * scale;
+ return Transform(scale, 0, 0, scale, origin_x, origin_y);
+}
+
+static const char* const bounds_glyphs[] = {
+ "A", "Eacute", "Ecircumflex", "l", "g", "p", "q", "j", "J", "emdash", 0
+};
+
+void
+SmokeTestpager::prolog(const Vector<Type1Font *> &)
+{
+ fprintf(_f, "%%!PS-Adobe-3.0\n%%%%LanguageLevel: 2\n%%%%BeginProlog\n");
+ fprintf(_f, "/pA { %% x y pA -\n\
+ moveto\n\
+ -2 -2 rmoveto 4 0 rlineto 0 4 rlineto -4 0 rlineto closepath\n\
+ gsave 1 setgray stroke grestore 0 setgray fill\n\
+} bind def\n\
+/pC { %% x y pC -\n\
+ 2 copy moveto 2 0 rmoveto 2 0 360 arc\n\
+ gsave 1 setgray stroke grestore 0.1 setgray fill\n\
+} bind def\n\
+");
+ fprintf(_f, "%%%%EndProlog\n");
+}
+
+void
+SmokeTestpager::font(Type1Font* font, const Vector<PermString>& glyph_names)
+{
+ HashMap<PermString, int> encodings(-1);
+ if (Type1Encoding *encoding = font->type1_encoding())
+ for (int i = 255; i >= 0; i--)
+ encodings.insert(encoding->elt(i), i);
+
+ // First, calculate font bounds, and from there, the transform.
+ CharstringBounds bounds;
+ for (const char* const* bg = bounds_glyphs; *bg; bg++)
+ if (CharstringContext cc = font->glyph_context(*bg))
+ bounds.char_bounds(cc, false);
+ if (bounds.bb_left() == bounds.bb_right())
+ for (int gi = 0; gi < glyph_names.size(); gi++)
+ bounds.char_bounds(font->glyph_context(glyph_names[gi]), false);
+ Transform font_xform = bounds2xform(bounds, true);
+
+ for (int gi = 0; gi < glyph_names.size(); gi++) {
+ // allow font that doesn't have all glyphs
+ if (!font->glyph(glyph_names[gi]))
+ continue;
+
+ newpage();
+ fprintf(_f, "save\n");
+
+ CharstringContext cc = font->glyph_context(glyph_names[gi]);
+ bounds.clear();
+ bounds.char_bounds(cc, false);
+
+ Transform xform(font_xform);
+ if (bounds.bb_known()) {
+ Point lb = bounds.bb_bottom_left() * xform;
+ Point rt = bounds.bb_top_right() * xform;
+ Point wd = bounds.width() * xform;
+ if (lb.x < LEFT_BOUND || lb.y < BOTTOM_BOUND
+ || rt.x > RIGHT_BOUND || rt.y > TOP_BOUND
+ || wd.x < LEFT_BOUND || wd.x > RIGHT_BOUND
+ || wd.y < BOTTOM_BOUND || wd.y > TOP_BOUND)
+ xform = bounds2xform(bounds);
+ }
+
+ Smoker smoker(xform);
+ smoker.run(font->glyph_context(glyph_names[gi]));
+ fprintf(_f, "%g %g moveto 0 %g rlineto %g %g moveto 0 %g rlineto %g %g moveto %g 0 rlineto 0 setgray stroke\n",
+ (Point(0, 0) * xform).x, BOTTOM_BOUND - 36, TOP_BOUND - BOTTOM_BOUND + 72,
+ (bounds.width() * xform).x, BOTTOM_BOUND - 36, TOP_BOUND - BOTTOM_BOUND + 72,
+ LEFT_BOUND - 36, (Point(0, 0) * xform).y, RIGHT_BOUND - LEFT_BOUND + 72);
+
+ fprintf(_f, "%s\n0.5 setgray fill\n\n1 setlinewidth\n%s\nshowpage\nrestore\n", smoker.char_postscript().c_str(), smoker.points_postscript().c_str());
+ }
+}
+
+
+/*****
+ * MAIN PROGRAM
+ **/
+
+int
+click_strcmp(PermString a, PermString b)
+{
+ const char *ad = a.c_str(), *ae = a.c_str() + a.length();
+ const char *bd = b.c_str(), *be = b.c_str() + b.length();
+
+ while (ad < ae && bd < be) {
+ if (isdigit((unsigned char) *ad) && isdigit((unsigned char) *bd)) {
+ // compare the two numbers, but don't treat them as numbers in
+ // case of overflow
+ // first, skip initial '0's
+ const char *iad = ad, *ibd = bd;
+ while (ad < ae && *ad == '0')
+ ad++;
+ while (bd < be && *bd == '0')
+ bd++;
+ int longer_zeros = (ad - iad) - (bd - ibd);
+ // skip to end of number
+ const char *nad = ad, *nbd = bd;
+ while (ad < ae && isdigit((unsigned char) *ad))
+ ad++;
+ while (bd < be && isdigit((unsigned char) *bd))
+ bd++;
+ // longer number must be larger
+ if ((ad - nad) != (bd - nbd))
+ return (ad - nad) - (bd - nbd);
+ // otherwise, compare numbers with the same length
+ for (; nad < ad && nbd < bd; nad++, nbd++)
+ if (*nad != *nbd)
+ return *nad - *nbd;
+ // finally, longer string of initial '0's wins
+ if (longer_zeros != 0)
+ return longer_zeros;
+ } else if (isdigit((unsigned char) *ad))
+ return (isalpha((unsigned char) *bd) ? -1 : 1);
+ else if (isdigit((unsigned char) *bd))
+ return (isalpha((unsigned char) *ad) ? 1 : -1);
+ else {
+ int d = tolower((unsigned char) *ad) - tolower((unsigned char) *bd);
+ if (d != 0)
+ return d;
+ ad++;
+ bd++;
+ }
+ }
+
+ if ((ae - ad) != (be - bd))
+ return (ae - ad) - (be - bd);
+ else {
+ assert(a.length() == b.length());
+ return memcmp(a.c_str(), b.c_str(), a.length());
+ }
+}
+
+extern "C" {
+static int CDECL
+glyphcompare(const void *lv, const void *rv)
+{
+ const PermString* ln = (const PermString*)lv;
+ const PermString* rn = (const PermString*)rv;
+
+ // try first without the '.'s
+ const char* ldot = strchr(ln->c_str(), '.');
+ const char* rdot = strchr(rn->c_str(), '.');
+ if (ldot == ln->begin())
+ ldot = 0;
+ if (rdot == rn->begin())
+ rdot = 0;
+ if (ldot || rdot) {
+ PermString l(ln->begin(), ldot ? ldot : ln->end());
+ PermString r(rn->begin(), rdot ? rdot : rn->end());
+ int diff = glyphcompare(&l, &r);
+ if (diff != 0)
+ return diff;
+ }
+
+ int lorder = glyph_order[*ln];
+ int rorder = glyph_order[*rn];
+ if (lorder >= 0 && rorder >= 0)
+ return lorder - rorder;
+ else if (lorder >= 0)
+ return -1;
+ else if (rorder >= 0)
+ return 1;
+ else
+ return click_strcmp(*ln, *rn);
+}
+}
+
+static bool
+glyph_matches(const String& glyph_name, const String* pattern_begin, const String* pattern_end)
+{
+ if (pattern_begin >= pattern_end)
+ return true;
+ for (; pattern_begin < pattern_end; pattern_begin++)
+ if (glob_match(glyph_name, *pattern_begin))
+ return true;
+ return false;
+}
+
+int
+main(int argc, char *argv[])
+{
+ PsresDatabase *psres = new PsresDatabase;
+ psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false);
+
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr));
+ const char *output_file = 0;
+ Vector<String> glyph_patterns;
+ bool smoke = false;
+ Vector<Type1Font *> fonts;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case GLYPH_OPT: {
+ const char* s = clp->vstr, *end = s + strlen(s);
+ while (s < end) {
+ while (s < end && isspace((unsigned char) *s))
+ s++;
+ const char* word = s;
+ while (s < end && !isspace((unsigned char) *s))
+ s++;
+ if (word < s)
+ glyph_patterns.push_back(String(word, s - word));
+ }
+ break;
+ }
+
+ case SMOKE_OPT:
+ smoke = !clp->negated;
+ break;
+
+ case OUTPUT_OPT:
+ if (output_file)
+ errh->fatal("output file already specified");
+ output_file = clp->vstr;
+ break;
+
+ case VERSION_OPT:
+ printf("t1testpage (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 1999-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case Clp_NotOption:
+ fonts.push_back(do_file(clp->vstr, psres, errh));
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ if (!fonts.size())
+ fonts.push_back(do_file(0, psres, errh));
+
+ FILE *outf;
+ if (!output_file || strcmp(output_file, "-") == 0)
+ outf = stdout;
+ else {
+ outf = fopen(output_file, "w");
+ if (!outf)
+ errh->fatal("%s: %s", output_file, strerror(errno));
+ }
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(outf), _O_BINARY);
+#endif
+
+ //font->undo_synthetic();
+
+ // Prepare glyph order table
+ int gindex = 0;
+ char buf[7] = "Asmall";
+ for (int c = 0; c < 26; c++) {
+ buf[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[c];
+ glyph_order.insert(PermString(buf[0]), gindex++);
+ glyph_order.insert(PermString("abcdefghijklmnopqrstuvwxyz"[c]), gindex++);
+ glyph_order.insert(PermString(buf), gindex++);
+ }
+ glyph_order.insert("parenleft", gindex++);
+ glyph_order.insert("period", gindex++);
+ glyph_order.insert("comma", gindex++);
+ glyph_order.insert("hyphen", gindex++);
+ glyph_order.insert("ampersand", gindex++);
+ glyph_order.insert("semicolon", gindex++);
+ glyph_order.insert("exclamation", gindex++);
+ glyph_order.insert("question", gindex++);
+ glyph_order.insert("parenright", gindex++);
+ glyph_order.insert("zero", gindex++);
+ glyph_order.insert("one", gindex++);
+ glyph_order.insert("two", gindex++);
+ glyph_order.insert("three", gindex++);
+ glyph_order.insert("four", gindex++);
+ glyph_order.insert("five", gindex++);
+ glyph_order.insert("six", gindex++);
+ glyph_order.insert("seven", gindex++);
+ glyph_order.insert("eight", gindex++);
+ glyph_order.insert("nine", gindex++);
+ glyph_order.insert("zerooldstyle", gindex++);
+ glyph_order.insert("oneoldstyle", gindex++);
+ glyph_order.insert("twooldstyle", gindex++);
+ glyph_order.insert("threeoldstyle", gindex++);
+ glyph_order.insert("fouroldstyle", gindex++);
+ glyph_order.insert("fiveoldstyle", gindex++);
+ glyph_order.insert("sixoldstyle", gindex++);
+ glyph_order.insert("sevenoldstyle", gindex++);
+ glyph_order.insert("eightoldstyle", gindex++);
+ glyph_order.insert("nineoldstyle", gindex++);
+ glyph_order.insert(".notdef", gindex++);
+ glyph_order.insert("space", gindex++);
+
+ // Get glyph names.
+ HashMap<PermString, int> glyph_hash(0);
+ for (Vector<Type1Font *>::iterator it = fonts.begin(); it != fonts.end();
+ ++it)
+ for (int i = 0; i < (*it)->nglyphs(); i++) {
+ if (glyph_matches((*it)->glyph_name(i),
+ glyph_patterns.begin(), glyph_patterns.end()))
+ glyph_hash.insert((*it)->glyph_name(i), 1);
+ }
+
+ Vector<PermString> glyph_names;
+ for (HashMap<PermString, int>::iterator it = glyph_hash.begin();
+ it != glyph_hash.end(); ++it)
+ glyph_names.push_back(it.key());
+ if (glyph_names.size() == 0)
+ errh->fatal("no glyphs to print");
+ qsort(glyph_names.begin(), glyph_names.size(), sizeof(PermString), glyphcompare);
+
+ // outputs
+ Testpager *tp;
+ if (smoke)
+ tp = new SmokeTestpager(outf);
+ else
+ tp = new GridTestpager(outf);
+
+ tp->prolog(fonts);
+ for (Vector<Type1Font *>::iterator it = fonts.begin(); it != fonts.end();
+ ++it)
+ tp->font(*it, glyph_names);
+ tp->epilog();
+
+ delete tp;
+ exit(0);
+}
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist-g2u.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist-g2u.txt
new file mode 100644
index 00000000000..2340809a4de
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist-g2u.txt
@@ -0,0 +1,1188 @@
+# lcdf-typetools texglyphlist-g2u.txt, Version 2.95
+# Contents: Overrides to glyphlist.txt and texglyphlist.txt used to
+# generate glyphtounicode.tex, which maps glyphs to searchable Unicode
+# code points.
+# --
+# -- Map common ligatures to their components.
+# --
+ff;0066 0066
+ffi;0066 0066 0069
+ffl;0066 0066 006C
+fi;0066 0069
+fl;0066 006C
+longst;017F 0074
+st;0073 0074
+# --
+# -- texglyphlist.txt overrides /heart, /diamond, /phi, and /phi1 to their
+# -- more typical meanings in encoding files meant for TeX: /heart and
+# -- /diamond are outline, not solid; /phi is straight; /phi1 is loopy. These
+# -- overrides are not appropriate for glyphtounicode.tex, which can apply to
+# -- any font. Newer fonts apply the AGL glyph shapes to these names. But we
+# -- can provide font-specific overrides for fonts commonly used with TeX.
+# --
+diamond;2666
+heart;2665
+phi;03C6
+phi1;03D5
+tfm:lmmi5/phi;03D5
+tfm:lmmi5/phi1;03C6
+tfm:lmmi6/phi;03D5
+tfm:lmmi6/phi1;03C6
+tfm:lmmi7/phi;03D5
+tfm:lmmi7/phi1;03C6
+tfm:lmmi8/phi;03D5
+tfm:lmmi8/phi1;03C6
+tfm:lmmi9/phi;03D5
+tfm:lmmi9/phi1;03C6
+tfm:lmmi10/phi;03D5
+tfm:lmmi10/phi1;03C6
+tfm:lmmi12/phi;03D5
+tfm:lmmi12/phi1;03C6
+tfm:lmmib5/phi;03D5
+tfm:lmmib5/phi1;03C6
+tfm:lmmib7/phi;03D5
+tfm:lmmib7/phi1;03C6
+tfm:lmmib10/phi;03D5
+tfm:lmmib10/phi1;03C6
+tfm:lmbsy5/diamond;2662
+tfm:lmbsy5/heart;2661
+tfm:lmbsy7/diamond;2662
+tfm:lmbsy7/heart;2661
+tfm:lmbsy10/diamond;2662
+tfm:lmbsy10/heart;2661
+tfm:lmsy5/diamond;2662
+tfm:lmsy5/heart;2661
+tfm:lmsy6/diamond;2662
+tfm:lmsy6/heart;2661
+tfm:lmsy7/diamond;2662
+tfm:lmsy7/heart;2661
+tfm:lmsy8/diamond;2662
+tfm:lmsy8/heart;2661
+tfm:lmsy9/diamond;2662
+tfm:lmsy9/heart;2661
+tfm:lmsy10/diamond;2662
+tfm:lmsy10/heart;2661
+tfm:cmbsy10/diamond;2662
+tfm:cmbsy10/heart;2661
+tfm:cmbsy5/diamond;2662
+tfm:cmbsy5/heart;2661
+tfm:cmbsy6/diamond;2662
+tfm:cmbsy6/heart;2661
+tfm:cmbsy7/diamond;2662
+tfm:cmbsy7/heart;2661
+tfm:cmbsy8/diamond;2662
+tfm:cmbsy8/heart;2661
+tfm:cmbsy9/diamond;2662
+tfm:cmbsy9/heart;2661
+tfm:cmmi10/phi1;03C6
+tfm:cmmi10/phi;03D5
+tfm:cmmi12/phi1;03C6
+tfm:cmmi12/phi;03D5
+tfm:cmmi5/phi1;03C6
+tfm:cmmi5/phi;03D5
+tfm:cmmi6/phi1;03C6
+tfm:cmmi6/phi;03D5
+tfm:cmmi7/phi1;03C6
+tfm:cmmi7/phi;03D5
+tfm:cmmi8/phi1;03C6
+tfm:cmmi8/phi;03D5
+tfm:cmmi9/phi1;03C6
+tfm:cmmi9/phi;03D5
+tfm:cmmib10/phi1;03C6
+tfm:cmmib10/phi;03D5
+tfm:cmmib5/phi1;03C6
+tfm:cmmib5/phi;03D5
+tfm:cmmib6/phi1;03C6
+tfm:cmmib6/phi;03D5
+tfm:cmmib7/phi1;03C6
+tfm:cmmib7/phi;03D5
+tfm:cmmib8/phi1;03C6
+tfm:cmmib8/phi;03D5
+tfm:cmmib9/phi1;03C6
+tfm:cmmib9/phi;03D5
+tfm:cmsy10/diamond;2662
+tfm:cmsy10/heart;2661
+tfm:cmsy10/heart;2661
+tfm:cmsy5/heart;2661
+tfm:cmsy6/diamond;2662
+tfm:cmsy6/heart;2661
+tfm:cmsy7/diamond;2662
+tfm:cmsy7/heart;2661
+tfm:cmsy8/diamond;2662
+tfm:cmsy8/heart;2661
+tfm:cmsy9/diamond;2662
+tfm:cmsy9/heart;2661
+tfm:eurb10/phi1;03C6
+tfm:eurb10/phi;03D5
+tfm:eurb5/phi1;03C6
+tfm:eurb5/phi;03D5
+tfm:eurb6/phi1;03C6
+tfm:eurb6/phi;03D5
+tfm:eurb7/phi1;03C6
+tfm:eurb7/phi;03D5
+tfm:eurb8/phi1;03C6
+tfm:eurb8/phi;03D5
+tfm:eurb9/phi1;03C6
+tfm:eurb9/phi;03D5
+tfm:eurm10/phi1;03C6
+tfm:eurm10/phi;03D5
+tfm:eurm5/phi1;03C6
+tfm:eurm5/phi;03D5
+tfm:eurm6/phi1;03C6
+tfm:eurm6/phi;03D5
+tfm:eurm7/phi1;03C6
+tfm:eurm7/phi;03D5
+tfm:eurm8/phi1;03C6
+tfm:eurm8/phi;03D5
+tfm:eurm9/phi1;03C6
+tfm:eurm9/phi;03D5
+tfm:msam10/diamond;2662
+tfm:msam5/diamond;2662
+tfm:msam6/diamond;2662
+tfm:msam7/diamond;2662
+tfm:msam8/diamond;2662
+tfm:msam9/diamond;2662
+tfm:fplmbi/phi1;03C6
+tfm:fplmbi/phi;03D5
+tfm:fplmri/phi1;03C6
+tfm:fplmri/phi;03D5
+tfm:pxbmia/phi1;03C6
+tfm:pxbmia/phi;03D5
+tfm:pxbsy/diamond;2662
+tfm:pxbsy/heart;2661
+tfm:pxbsya/diamond;2662
+tfm:pxmia/phi1;03C6
+tfm:pxmia/phi;03D5
+tfm:pxsy/diamond;2662
+tfm:pxsy/heart;2661
+tfm:pxsya/diamond;2662
+tfm:rpxbmi/phi1;03C6
+tfm:rpxbmi/phi;03D5
+tfm:rpxmi/phi1;03C6
+tfm:rpxmi/phi;03D5
+tfm:rtxbmi/phi1;03C6
+tfm:rtxbmi/phi;03D5
+tfm:rtxmi/phi1;03C6
+tfm:rtxmi/phi;03D5
+tfm:txbmia/phi1;03C6
+tfm:txbmia/phi;03D5
+tfm:txbsy/diamond;2662
+tfm:txbsy/heart;2661
+tfm:txbsya/diamond;2662
+tfm:txmia/phi1;03C6
+tfm:txmia/phi;03D5
+tfm:txsy/diamond;2662
+tfm:txsy/heart;2661
+tfm:txsya/diamond;2662
+# --
+# -- PDF searching works best if we map small capitals to lower case, not
+# -- private use code points as in glyphlist.txt.
+# --
+AEsmall;00E6
+Aacutesmall;00E1
+Acircumflexsmall;00E2
+Acute;00B4
+Acutesmall;00B4
+Adieresissmall;00E4
+Agravesmall;00E0
+Aringsmall;00E5
+Asmall;0061
+Atildesmall;00E3
+Brevesmall;02D8
+Bsmall;0062
+Caron;02C7
+Caronsmall;02C7
+Ccedillasmall;00E7
+Cedillasmall;00B8
+Circumflexsmall;02C6
+Csmall;0063
+Dieresis;00A8
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;00A8
+Dotaccentsmall;02D9
+Dsmall;0064
+Eacutesmall;00E9
+Ecircumflexsmall;00EA
+Edieresissmall;00EB
+Egravesmall;00E8
+Esmall;0065
+Ethsmall;00F0
+Fsmall;0066
+Grave;0060
+Gravesmall;0060
+Gsmall;0067
+Hsmall;0068
+Hungarumlaut;02DD
+Hungarumlautsmall;02DD
+Iacutesmall;00ED
+Icircumflexsmall;00EE
+Idieresissmall;00EF
+Igravesmall;00EC
+Ismall;0069
+Jsmall;006A
+Ksmall;006B
+LL;004C 004C
+Lslashsmall;0142
+Lsmall;006C
+Macron;00AF
+Macronsmall;00AF
+Msmall;006D
+Nsmall;006E
+Ntildesmall;00F1
+OEsmall;0153
+Oacutesmall;00F3
+Ocircumflexsmall;00F4
+Odieresissmall;00F6
+Ogoneksmall;02DB
+Ogravesmall;00F2
+Oslashsmall;00F8
+Osmall;006F
+Otildesmall;00F5
+Psmall;0070
+Qsmall;0071
+Ringsmall;02DA
+Rsmall;0072
+Scaronsmall;0161
+Ssmall;0073
+Thornsmall;00FE
+Tildesmall;02DC
+Tsmall;0074
+Uacutesmall;00FA
+Ucircumflexsmall;00FB
+Udieresissmall;00FC
+Ugravesmall;00F9
+Usmall;0075
+Vsmall;0076
+Wsmall;0077
+Xsmall;0078
+Yacutesmall;00FD
+Ydieresissmall;00FF
+Ysmall;0079
+Zcaronsmall;017E
+Zsmall;007A
+# afii10063;F6C4
+# afii10064;F6C5
+# afii10192;F6C6
+# afii10831;F6C7
+# afii10832;F6C8
+ampersandsmall;0026
+# apple;F8FF
+# arrowhorizex;F8E7
+# arrowvertex;F8E6
+asuperior;0061
+# braceex;F8F4
+# braceleftbt;F8F3
+# braceleftmid;F8F2
+# bracelefttp;F8F1
+# bracerightbt;F8FE
+# bracerightmid;F8FD
+# bracerighttp;F8FC
+# bracketleftbt;F8F0
+# bracketleftex;F8EF
+# bracketlefttp;F8EE
+# bracketrightbt;F8FB
+# bracketrightex;F8FA
+# bracketrighttp;F8F9
+bsuperior;0062
+centinferior;00A2
+centoldstyle;00A2
+centsuperior;00A2
+# commaaccent;F6C3
+commainferior;002C
+commasuperior;002C
+copyrightsans;00A9
+copyrightserif;00A9
+cyrBreve;02D8
+cyrFlex;00A0 0311
+cyrbreve;02D8
+cyrflex;00A0 0311
+dblGrave;00A0 030F
+dblgrave;00A0 030F
+dieresisacute;00A0 0308 0301
+dieresisgrave;00A0 0308 0300
+dollarinferior;0024
+dollaroldstyle;0024
+dollarsuperior;0024
+dotlessj;0237
+dsuperior;0064
+eightoldstyle;0038
+esuperior;0065
+exclamdownsmall;00A1
+exclamsmall;0021
+fiveoldstyle;0035
+fouroldstyle;0034
+hypheninferior;002D
+hyphensuperior;002D
+# integralex;F8F5
+isuperior;0069
+ll;006C 006C
+lsuperior;006C
+# maichattawalowleftthai;F895
+# maichattawalowrightthai;F894
+# maichattawaupperleftthai;F893
+# maieklowleftthai;F88C
+# maieklowrightthai;F88B
+# maiekupperleftthai;F88A
+# maihanakatleftthai;F884
+# maitaikhuleftthai;F889
+# maitholowleftthai;F88F
+# maitholowrightthai;F88E
+# maithoupperleftthai;F88D
+# maitrilowleftthai;F892
+# maitrilowrightthai;F891
+# maitriupperleftthai;F890
+msuperior;006D
+# nikhahitleftthai;F899
+nineoldstyle;0039
+onefitted;0031
+oneoldstyle;0031
+osuperior;006F
+# parenleftbt;F8ED
+# parenleftex;F8EC
+# parenlefttp;F8EB
+# parenrightbt;F8F8
+# parenrightex;F8F7
+# parenrighttp;F8F6
+periodinferior;002E
+periodsuperior;002E
+questiondownsmall;00BF
+questionsmall;003F
+# radicalex;F8E5
+registersans;00AE
+registerserif;00AE
+rsuperior;0072
+rupiah;20A8
+# saraiileftthai;F886
+# saraileftthai;F885
+# saraueeleftthai;F888
+# saraueleftthai;F887
+sevenoldstyle;0037
+sixoldstyle;0036
+ssuperior;0073
+# thanthakhatlowleftthai;F898
+# thanthakhatlowrightthai;F897
+# thanthakhatupperleftthai;F896
+threeoldstyle;0033
+# threequartersemdash;F6DE
+trademarksans;2122
+trademarkserif;2122
+tsuperior;0074
+twooldstyle;0032
+zerooldstyle;0030
+FFsmall;0066 0066
+FFIsmall;0066 0066 0069
+FFLsmall;0066 0066 006C
+FIsmall;0066 0069
+FLsmall;0066 006C
+Germandblssmall;0073 0073
+SSsmall;0073 0073
+# --
+# -- These character names are used in Zapf-Dingbats.
+# -- The encodings differ from Adobe's zdingbat.txt table version 0.2,
+# -- updated 30 March 1999, in that it does not use private use code points.
+# --
+tfm:pzdr/a1;2701
+tfm:pzdr/a2;2702
+tfm:pzdr/a3;2704
+tfm:pzdr/a4;260E
+tfm:pzdr/a5;2706
+tfm:pzdr/a6;271D
+tfm:pzdr/a7;271E
+tfm:pzdr/a8;271F
+tfm:pzdr/a9;2720
+tfm:pzdr/a10;2721
+tfm:pzdr/a11;261B
+tfm:pzdr/a12;261E
+tfm:pzdr/a13;270C
+tfm:pzdr/a14;270D
+tfm:pzdr/a15;270E
+tfm:pzdr/a16;270F
+tfm:pzdr/a17;2711
+tfm:pzdr/a18;2712
+tfm:pzdr/a19;2713
+tfm:pzdr/a20;2714
+tfm:pzdr/a21;2715
+tfm:pzdr/a22;2716
+tfm:pzdr/a23;2717
+tfm:pzdr/a24;2718
+tfm:pzdr/a25;2719
+tfm:pzdr/a26;271A
+tfm:pzdr/a27;271B
+tfm:pzdr/a28;271C
+tfm:pzdr/a29;2722
+tfm:pzdr/a30;2723
+tfm:pzdr/a31;2724
+tfm:pzdr/a32;2725
+tfm:pzdr/a33;2726
+tfm:pzdr/a34;2727
+tfm:pzdr/a35;2605
+tfm:pzdr/a36;2729
+tfm:pzdr/a37;272A
+tfm:pzdr/a38;272B
+tfm:pzdr/a39;272C
+tfm:pzdr/a40;272D
+tfm:pzdr/a41;272E
+tfm:pzdr/a42;272F
+tfm:pzdr/a43;2730
+tfm:pzdr/a44;2731
+tfm:pzdr/a45;2732
+tfm:pzdr/a46;2733
+tfm:pzdr/a47;2734
+tfm:pzdr/a48;2735
+tfm:pzdr/a49;2736
+tfm:pzdr/a50;2737
+tfm:pzdr/a51;2738
+tfm:pzdr/a52;2739
+tfm:pzdr/a53;273A
+tfm:pzdr/a54;273B
+tfm:pzdr/a55;273C
+tfm:pzdr/a56;273D
+tfm:pzdr/a57;273E
+tfm:pzdr/a58;273F
+tfm:pzdr/a59;2740
+tfm:pzdr/a60;2741
+tfm:pzdr/a61;2742
+tfm:pzdr/a62;2743
+tfm:pzdr/a63;2744
+tfm:pzdr/a64;2745
+tfm:pzdr/a65;2746
+tfm:pzdr/a66;2747
+tfm:pzdr/a67;2748
+tfm:pzdr/a68;2749
+tfm:pzdr/a69;274A
+tfm:pzdr/a70;274B
+tfm:pzdr/a71;25CF
+tfm:pzdr/a72;274D
+tfm:pzdr/a73;25A0
+tfm:pzdr/a74;274F
+tfm:pzdr/a75;2751
+tfm:pzdr/a76;25B2
+tfm:pzdr/a77;25BC
+tfm:pzdr/a78;25C6
+tfm:pzdr/a79;2756
+tfm:pzdr/a81;25D7
+tfm:pzdr/a82;2758
+tfm:pzdr/a83;2759
+tfm:pzdr/a84;275A
+tfm:pzdr/a85;276F
+tfm:pzdr/a86;2771
+tfm:pzdr/a87;2772
+tfm:pzdr/a88;2773
+tfm:pzdr/a89;2768
+tfm:pzdr/a90;2769
+tfm:pzdr/a91;276C
+tfm:pzdr/a92;276D
+tfm:pzdr/a93;276A
+tfm:pzdr/a94;276B
+tfm:pzdr/a95;2774
+tfm:pzdr/a96;2775
+tfm:pzdr/a97;275B
+tfm:pzdr/a98;275C
+tfm:pzdr/a99;275D
+tfm:pzdr/a100;275E
+tfm:pzdr/a101;2761
+tfm:pzdr/a102;2762
+tfm:pzdr/a103;2763
+tfm:pzdr/a104;2764
+tfm:pzdr/a105;2710
+tfm:pzdr/a106;2765
+tfm:pzdr/a107;2766
+tfm:pzdr/a108;2767
+tfm:pzdr/a109;2660
+tfm:pzdr/a110;2665
+tfm:pzdr/a111;2666
+tfm:pzdr/a112;2663
+tfm:pzdr/a117;2709
+tfm:pzdr/a118;2708
+tfm:pzdr/a119;2707
+tfm:pzdr/a120;2460
+tfm:pzdr/a121;2461
+tfm:pzdr/a122;2462
+tfm:pzdr/a123;2463
+tfm:pzdr/a124;2464
+tfm:pzdr/a125;2465
+tfm:pzdr/a126;2466
+tfm:pzdr/a127;2467
+tfm:pzdr/a128;2468
+tfm:pzdr/a129;2469
+tfm:pzdr/a130;2776
+tfm:pzdr/a131;2777
+tfm:pzdr/a132;2778
+tfm:pzdr/a133;2779
+tfm:pzdr/a134;277A
+tfm:pzdr/a135;277B
+tfm:pzdr/a136;277C
+tfm:pzdr/a137;277D
+tfm:pzdr/a138;277E
+tfm:pzdr/a139;277F
+tfm:pzdr/a140;2780
+tfm:pzdr/a141;2781
+tfm:pzdr/a142;2782
+tfm:pzdr/a143;2783
+tfm:pzdr/a144;2784
+tfm:pzdr/a145;2785
+tfm:pzdr/a146;2786
+tfm:pzdr/a147;2787
+tfm:pzdr/a148;2788
+tfm:pzdr/a149;2789
+tfm:pzdr/a150;278A
+tfm:pzdr/a151;278B
+tfm:pzdr/a152;278C
+tfm:pzdr/a153;278D
+tfm:pzdr/a154;278E
+tfm:pzdr/a155;278F
+tfm:pzdr/a156;2790
+tfm:pzdr/a157;2791
+tfm:pzdr/a158;2792
+tfm:pzdr/a159;2793
+tfm:pzdr/a160;2794
+tfm:pzdr/a161;2192
+tfm:pzdr/a162;27A3
+tfm:pzdr/a163;2194
+tfm:pzdr/a164;2195
+tfm:pzdr/a165;2799
+tfm:pzdr/a166;279B
+tfm:pzdr/a167;279C
+tfm:pzdr/a168;279D
+tfm:pzdr/a169;279E
+tfm:pzdr/a170;279F
+tfm:pzdr/a171;27A0
+tfm:pzdr/a172;27A1
+tfm:pzdr/a173;27A2
+tfm:pzdr/a174;27A4
+tfm:pzdr/a175;27A5
+tfm:pzdr/a176;27A6
+tfm:pzdr/a177;27A7
+tfm:pzdr/a178;27A8
+tfm:pzdr/a179;27A9
+tfm:pzdr/a180;27AB
+tfm:pzdr/a181;27AD
+tfm:pzdr/a182;27AF
+tfm:pzdr/a183;27B2
+tfm:pzdr/a184;27B3
+tfm:pzdr/a185;27B5
+tfm:pzdr/a186;27B8
+tfm:pzdr/a187;27BA
+tfm:pzdr/a188;27BB
+tfm:pzdr/a189;27BC
+tfm:pzdr/a190;27BD
+tfm:pzdr/a191;27BE
+tfm:pzdr/a192;279A
+tfm:pzdr/a193;27AA
+tfm:pzdr/a194;27B6
+tfm:pzdr/a195;27B9
+tfm:pzdr/a196;2798
+tfm:pzdr/a197;27B4
+tfm:pzdr/a198;27B7
+tfm:pzdr/a199;27AC
+tfm:pzdr/a200;27AE
+tfm:pzdr/a201;27B1
+tfm:pzdr/a202;2703
+tfm:pzdr/a203;2750
+tfm:pzdr/a204;2752
+tfm:pzdr/a205;276E
+tfm:pzdr/a206;2770
+tfm:rpzdr/a1;2701
+tfm:rpzdr/a2;2702
+tfm:rpzdr/a3;2704
+tfm:rpzdr/a4;260E
+tfm:rpzdr/a5;2706
+tfm:rpzdr/a6;271D
+tfm:rpzdr/a7;271E
+tfm:rpzdr/a8;271F
+tfm:rpzdr/a9;2720
+tfm:rpzdr/a10;2721
+tfm:rpzdr/a11;261B
+tfm:rpzdr/a12;261E
+tfm:rpzdr/a13;270C
+tfm:rpzdr/a14;270D
+tfm:rpzdr/a15;270E
+tfm:rpzdr/a16;270F
+tfm:rpzdr/a17;2711
+tfm:rpzdr/a18;2712
+tfm:rpzdr/a19;2713
+tfm:rpzdr/a20;2714
+tfm:rpzdr/a21;2715
+tfm:rpzdr/a22;2716
+tfm:rpzdr/a23;2717
+tfm:rpzdr/a24;2718
+tfm:rpzdr/a25;2719
+tfm:rpzdr/a26;271A
+tfm:rpzdr/a27;271B
+tfm:rpzdr/a28;271C
+tfm:rpzdr/a29;2722
+tfm:rpzdr/a30;2723
+tfm:rpzdr/a31;2724
+tfm:rpzdr/a32;2725
+tfm:rpzdr/a33;2726
+tfm:rpzdr/a34;2727
+tfm:rpzdr/a35;2605
+tfm:rpzdr/a36;2729
+tfm:rpzdr/a37;272A
+tfm:rpzdr/a38;272B
+tfm:rpzdr/a39;272C
+tfm:rpzdr/a40;272D
+tfm:rpzdr/a41;272E
+tfm:rpzdr/a42;272F
+tfm:rpzdr/a43;2730
+tfm:rpzdr/a44;2731
+tfm:rpzdr/a45;2732
+tfm:rpzdr/a46;2733
+tfm:rpzdr/a47;2734
+tfm:rpzdr/a48;2735
+tfm:rpzdr/a49;2736
+tfm:rpzdr/a50;2737
+tfm:rpzdr/a51;2738
+tfm:rpzdr/a52;2739
+tfm:rpzdr/a53;273A
+tfm:rpzdr/a54;273B
+tfm:rpzdr/a55;273C
+tfm:rpzdr/a56;273D
+tfm:rpzdr/a57;273E
+tfm:rpzdr/a58;273F
+tfm:rpzdr/a59;2740
+tfm:rpzdr/a60;2741
+tfm:rpzdr/a61;2742
+tfm:rpzdr/a62;2743
+tfm:rpzdr/a63;2744
+tfm:rpzdr/a64;2745
+tfm:rpzdr/a65;2746
+tfm:rpzdr/a66;2747
+tfm:rpzdr/a67;2748
+tfm:rpzdr/a68;2749
+tfm:rpzdr/a69;274A
+tfm:rpzdr/a70;274B
+tfm:rpzdr/a71;25CF
+tfm:rpzdr/a72;274D
+tfm:rpzdr/a73;25A0
+tfm:rpzdr/a74;274F
+tfm:rpzdr/a75;2751
+tfm:rpzdr/a76;25B2
+tfm:rpzdr/a77;25BC
+tfm:rpzdr/a78;25C6
+tfm:rpzdr/a79;2756
+tfm:rpzdr/a81;25D7
+tfm:rpzdr/a82;2758
+tfm:rpzdr/a83;2759
+tfm:rpzdr/a84;275A
+tfm:rpzdr/a85;276F
+tfm:rpzdr/a86;2771
+tfm:rpzdr/a87;2772
+tfm:rpzdr/a88;2773
+tfm:rpzdr/a89;2768
+tfm:rpzdr/a90;2769
+tfm:rpzdr/a91;276C
+tfm:rpzdr/a92;276D
+tfm:rpzdr/a93;276A
+tfm:rpzdr/a94;276B
+tfm:rpzdr/a95;2774
+tfm:rpzdr/a96;2775
+tfm:rpzdr/a97;275B
+tfm:rpzdr/a98;275C
+tfm:rpzdr/a99;275D
+tfm:rpzdr/a100;275E
+tfm:rpzdr/a101;2761
+tfm:rpzdr/a102;2762
+tfm:rpzdr/a103;2763
+tfm:rpzdr/a104;2764
+tfm:rpzdr/a105;2710
+tfm:rpzdr/a106;2765
+tfm:rpzdr/a107;2766
+tfm:rpzdr/a108;2767
+tfm:rpzdr/a109;2660
+tfm:rpzdr/a110;2665
+tfm:rpzdr/a111;2666
+tfm:rpzdr/a112;2663
+tfm:rpzdr/a117;2709
+tfm:rpzdr/a118;2708
+tfm:rpzdr/a119;2707
+tfm:rpzdr/a120;2460
+tfm:rpzdr/a121;2461
+tfm:rpzdr/a122;2462
+tfm:rpzdr/a123;2463
+tfm:rpzdr/a124;2464
+tfm:rpzdr/a125;2465
+tfm:rpzdr/a126;2466
+tfm:rpzdr/a127;2467
+tfm:rpzdr/a128;2468
+tfm:rpzdr/a129;2469
+tfm:rpzdr/a130;2776
+tfm:rpzdr/a131;2777
+tfm:rpzdr/a132;2778
+tfm:rpzdr/a133;2779
+tfm:rpzdr/a134;277A
+tfm:rpzdr/a135;277B
+tfm:rpzdr/a136;277C
+tfm:rpzdr/a137;277D
+tfm:rpzdr/a138;277E
+tfm:rpzdr/a139;277F
+tfm:rpzdr/a140;2780
+tfm:rpzdr/a141;2781
+tfm:rpzdr/a142;2782
+tfm:rpzdr/a143;2783
+tfm:rpzdr/a144;2784
+tfm:rpzdr/a145;2785
+tfm:rpzdr/a146;2786
+tfm:rpzdr/a147;2787
+tfm:rpzdr/a148;2788
+tfm:rpzdr/a149;2789
+tfm:rpzdr/a150;278A
+tfm:rpzdr/a151;278B
+tfm:rpzdr/a152;278C
+tfm:rpzdr/a153;278D
+tfm:rpzdr/a154;278E
+tfm:rpzdr/a155;278F
+tfm:rpzdr/a156;2790
+tfm:rpzdr/a157;2791
+tfm:rpzdr/a158;2792
+tfm:rpzdr/a159;2793
+tfm:rpzdr/a160;2794
+tfm:rpzdr/a161;2192
+tfm:rpzdr/a162;27A3
+tfm:rpzdr/a163;2194
+tfm:rpzdr/a164;2195
+tfm:rpzdr/a165;2799
+tfm:rpzdr/a166;279B
+tfm:rpzdr/a167;279C
+tfm:rpzdr/a168;279D
+tfm:rpzdr/a169;279E
+tfm:rpzdr/a170;279F
+tfm:rpzdr/a171;27A0
+tfm:rpzdr/a172;27A1
+tfm:rpzdr/a173;27A2
+tfm:rpzdr/a174;27A4
+tfm:rpzdr/a175;27A5
+tfm:rpzdr/a176;27A6
+tfm:rpzdr/a177;27A7
+tfm:rpzdr/a178;27A8
+tfm:rpzdr/a179;27A9
+tfm:rpzdr/a180;27AB
+tfm:rpzdr/a181;27AD
+tfm:rpzdr/a182;27AF
+tfm:rpzdr/a183;27B2
+tfm:rpzdr/a184;27B3
+tfm:rpzdr/a185;27B5
+tfm:rpzdr/a186;27B8
+tfm:rpzdr/a187;27BA
+tfm:rpzdr/a188;27BB
+tfm:rpzdr/a189;27BC
+tfm:rpzdr/a190;27BD
+tfm:rpzdr/a191;27BE
+tfm:rpzdr/a192;279A
+tfm:rpzdr/a193;27AA
+tfm:rpzdr/a194;27B6
+tfm:rpzdr/a195;27B9
+tfm:rpzdr/a196;2798
+tfm:rpzdr/a197;27B4
+tfm:rpzdr/a198;27B7
+tfm:rpzdr/a199;27AC
+tfm:rpzdr/a200;27AE
+tfm:rpzdr/a201;27B1
+tfm:rpzdr/a202;2703
+tfm:rpzdr/a203;2750
+tfm:rpzdr/a204;2752
+tfm:rpzdr/a205;276E
+tfm:rpzdr/a206;2770
+tfm:zd/a1;2701
+tfm:zd/a2;2702
+tfm:zd/a3;2704
+tfm:zd/a4;260E
+tfm:zd/a5;2706
+tfm:zd/a6;271D
+tfm:zd/a7;271E
+tfm:zd/a8;271F
+tfm:zd/a9;2720
+tfm:zd/a10;2721
+tfm:zd/a11;261B
+tfm:zd/a12;261E
+tfm:zd/a13;270C
+tfm:zd/a14;270D
+tfm:zd/a15;270E
+tfm:zd/a16;270F
+tfm:zd/a17;2711
+tfm:zd/a18;2712
+tfm:zd/a19;2713
+tfm:zd/a20;2714
+tfm:zd/a21;2715
+tfm:zd/a22;2716
+tfm:zd/a23;2717
+tfm:zd/a24;2718
+tfm:zd/a25;2719
+tfm:zd/a26;271A
+tfm:zd/a27;271B
+tfm:zd/a28;271C
+tfm:zd/a29;2722
+tfm:zd/a30;2723
+tfm:zd/a31;2724
+tfm:zd/a32;2725
+tfm:zd/a33;2726
+tfm:zd/a34;2727
+tfm:zd/a35;2605
+tfm:zd/a36;2729
+tfm:zd/a37;272A
+tfm:zd/a38;272B
+tfm:zd/a39;272C
+tfm:zd/a40;272D
+tfm:zd/a41;272E
+tfm:zd/a42;272F
+tfm:zd/a43;2730
+tfm:zd/a44;2731
+tfm:zd/a45;2732
+tfm:zd/a46;2733
+tfm:zd/a47;2734
+tfm:zd/a48;2735
+tfm:zd/a49;2736
+tfm:zd/a50;2737
+tfm:zd/a51;2738
+tfm:zd/a52;2739
+tfm:zd/a53;273A
+tfm:zd/a54;273B
+tfm:zd/a55;273C
+tfm:zd/a56;273D
+tfm:zd/a57;273E
+tfm:zd/a58;273F
+tfm:zd/a59;2740
+tfm:zd/a60;2741
+tfm:zd/a61;2742
+tfm:zd/a62;2743
+tfm:zd/a63;2744
+tfm:zd/a64;2745
+tfm:zd/a65;2746
+tfm:zd/a66;2747
+tfm:zd/a67;2748
+tfm:zd/a68;2749
+tfm:zd/a69;274A
+tfm:zd/a70;274B
+tfm:zd/a71;25CF
+tfm:zd/a72;274D
+tfm:zd/a73;25A0
+tfm:zd/a74;274F
+tfm:zd/a75;2751
+tfm:zd/a76;25B2
+tfm:zd/a77;25BC
+tfm:zd/a78;25C6
+tfm:zd/a79;2756
+tfm:zd/a81;25D7
+tfm:zd/a82;2758
+tfm:zd/a83;2759
+tfm:zd/a84;275A
+tfm:zd/a85;276F
+tfm:zd/a86;2771
+tfm:zd/a87;2772
+tfm:zd/a88;2773
+tfm:zd/a89;2768
+tfm:zd/a90;2769
+tfm:zd/a91;276C
+tfm:zd/a92;276D
+tfm:zd/a93;276A
+tfm:zd/a94;276B
+tfm:zd/a95;2774
+tfm:zd/a96;2775
+tfm:zd/a97;275B
+tfm:zd/a98;275C
+tfm:zd/a99;275D
+tfm:zd/a100;275E
+tfm:zd/a101;2761
+tfm:zd/a102;2762
+tfm:zd/a103;2763
+tfm:zd/a104;2764
+tfm:zd/a105;2710
+tfm:zd/a106;2765
+tfm:zd/a107;2766
+tfm:zd/a108;2767
+tfm:zd/a109;2660
+tfm:zd/a110;2665
+tfm:zd/a111;2666
+tfm:zd/a112;2663
+tfm:zd/a117;2709
+tfm:zd/a118;2708
+tfm:zd/a119;2707
+tfm:zd/a120;2460
+tfm:zd/a121;2461
+tfm:zd/a122;2462
+tfm:zd/a123;2463
+tfm:zd/a124;2464
+tfm:zd/a125;2465
+tfm:zd/a126;2466
+tfm:zd/a127;2467
+tfm:zd/a128;2468
+tfm:zd/a129;2469
+tfm:zd/a130;2776
+tfm:zd/a131;2777
+tfm:zd/a132;2778
+tfm:zd/a133;2779
+tfm:zd/a134;277A
+tfm:zd/a135;277B
+tfm:zd/a136;277C
+tfm:zd/a137;277D
+tfm:zd/a138;277E
+tfm:zd/a139;277F
+tfm:zd/a140;2780
+tfm:zd/a141;2781
+tfm:zd/a142;2782
+tfm:zd/a143;2783
+tfm:zd/a144;2784
+tfm:zd/a145;2785
+tfm:zd/a146;2786
+tfm:zd/a147;2787
+tfm:zd/a148;2788
+tfm:zd/a149;2789
+tfm:zd/a150;278A
+tfm:zd/a151;278B
+tfm:zd/a152;278C
+tfm:zd/a153;278D
+tfm:zd/a154;278E
+tfm:zd/a155;278F
+tfm:zd/a156;2790
+tfm:zd/a157;2791
+tfm:zd/a158;2792
+tfm:zd/a159;2793
+tfm:zd/a160;2794
+tfm:zd/a161;2192
+tfm:zd/a162;27A3
+tfm:zd/a163;2194
+tfm:zd/a164;2195
+tfm:zd/a165;2799
+tfm:zd/a166;279B
+tfm:zd/a167;279C
+tfm:zd/a168;279D
+tfm:zd/a169;279E
+tfm:zd/a170;279F
+tfm:zd/a171;27A0
+tfm:zd/a172;27A1
+tfm:zd/a173;27A2
+tfm:zd/a174;27A4
+tfm:zd/a175;27A5
+tfm:zd/a176;27A6
+tfm:zd/a177;27A7
+tfm:zd/a178;27A8
+tfm:zd/a179;27A9
+tfm:zd/a180;27AB
+tfm:zd/a181;27AD
+tfm:zd/a182;27AF
+tfm:zd/a183;27B2
+tfm:zd/a184;27B3
+tfm:zd/a185;27B5
+tfm:zd/a186;27B8
+tfm:zd/a187;27BA
+tfm:zd/a188;27BB
+tfm:zd/a189;27BC
+tfm:zd/a190;27BD
+tfm:zd/a191;27BE
+tfm:zd/a192;279A
+tfm:zd/a193;27AA
+tfm:zd/a194;27B6
+tfm:zd/a195;27B9
+tfm:zd/a196;2798
+tfm:zd/a197;27B4
+tfm:zd/a198;27B7
+tfm:zd/a199;27AC
+tfm:zd/a200;27AE
+tfm:zd/a201;27B1
+tfm:zd/a202;2703
+tfm:zd/a203;2750
+tfm:zd/a204;2752
+tfm:zd/a205;276E
+tfm:zd/a206;2770
+tfm:zpzdr-reversed/a1;2701
+tfm:zpzdr-reversed/a2;2702
+tfm:zpzdr-reversed/a3;2704
+tfm:zpzdr-reversed/a4;260E
+tfm:zpzdr-reversed/a5;2706
+tfm:zpzdr-reversed/a6;271D
+tfm:zpzdr-reversed/a7;271E
+tfm:zpzdr-reversed/a8;271F
+tfm:zpzdr-reversed/a9;2720
+tfm:zpzdr-reversed/a10;2721
+tfm:zpzdr-reversed/a11;261B
+tfm:zpzdr-reversed/a12;261E
+tfm:zpzdr-reversed/a13;270C
+tfm:zpzdr-reversed/a14;270D
+tfm:zpzdr-reversed/a15;270E
+tfm:zpzdr-reversed/a16;270F
+tfm:zpzdr-reversed/a17;2711
+tfm:zpzdr-reversed/a18;2712
+tfm:zpzdr-reversed/a19;2713
+tfm:zpzdr-reversed/a20;2714
+tfm:zpzdr-reversed/a21;2715
+tfm:zpzdr-reversed/a22;2716
+tfm:zpzdr-reversed/a23;2717
+tfm:zpzdr-reversed/a24;2718
+tfm:zpzdr-reversed/a25;2719
+tfm:zpzdr-reversed/a26;271A
+tfm:zpzdr-reversed/a27;271B
+tfm:zpzdr-reversed/a28;271C
+tfm:zpzdr-reversed/a29;2722
+tfm:zpzdr-reversed/a30;2723
+tfm:zpzdr-reversed/a31;2724
+tfm:zpzdr-reversed/a32;2725
+tfm:zpzdr-reversed/a33;2726
+tfm:zpzdr-reversed/a34;2727
+tfm:zpzdr-reversed/a35;2605
+tfm:zpzdr-reversed/a36;2729
+tfm:zpzdr-reversed/a37;272A
+tfm:zpzdr-reversed/a38;272B
+tfm:zpzdr-reversed/a39;272C
+tfm:zpzdr-reversed/a40;272D
+tfm:zpzdr-reversed/a41;272E
+tfm:zpzdr-reversed/a42;272F
+tfm:zpzdr-reversed/a43;2730
+tfm:zpzdr-reversed/a44;2731
+tfm:zpzdr-reversed/a45;2732
+tfm:zpzdr-reversed/a46;2733
+tfm:zpzdr-reversed/a47;2734
+tfm:zpzdr-reversed/a48;2735
+tfm:zpzdr-reversed/a49;2736
+tfm:zpzdr-reversed/a50;2737
+tfm:zpzdr-reversed/a51;2738
+tfm:zpzdr-reversed/a52;2739
+tfm:zpzdr-reversed/a53;273A
+tfm:zpzdr-reversed/a54;273B
+tfm:zpzdr-reversed/a55;273C
+tfm:zpzdr-reversed/a56;273D
+tfm:zpzdr-reversed/a57;273E
+tfm:zpzdr-reversed/a58;273F
+tfm:zpzdr-reversed/a59;2740
+tfm:zpzdr-reversed/a60;2741
+tfm:zpzdr-reversed/a61;2742
+tfm:zpzdr-reversed/a62;2743
+tfm:zpzdr-reversed/a63;2744
+tfm:zpzdr-reversed/a64;2745
+tfm:zpzdr-reversed/a65;2746
+tfm:zpzdr-reversed/a66;2747
+tfm:zpzdr-reversed/a67;2748
+tfm:zpzdr-reversed/a68;2749
+tfm:zpzdr-reversed/a69;274A
+tfm:zpzdr-reversed/a70;274B
+tfm:zpzdr-reversed/a71;25CF
+tfm:zpzdr-reversed/a72;274D
+tfm:zpzdr-reversed/a73;25A0
+tfm:zpzdr-reversed/a74;274F
+tfm:zpzdr-reversed/a75;2751
+tfm:zpzdr-reversed/a76;25B2
+tfm:zpzdr-reversed/a77;25BC
+tfm:zpzdr-reversed/a78;25C6
+tfm:zpzdr-reversed/a79;2756
+tfm:zpzdr-reversed/a81;25D7
+tfm:zpzdr-reversed/a82;2758
+tfm:zpzdr-reversed/a83;2759
+tfm:zpzdr-reversed/a84;275A
+tfm:zpzdr-reversed/a85;276F
+tfm:zpzdr-reversed/a86;2771
+tfm:zpzdr-reversed/a87;2772
+tfm:zpzdr-reversed/a88;2773
+tfm:zpzdr-reversed/a89;2768
+tfm:zpzdr-reversed/a90;2769
+tfm:zpzdr-reversed/a91;276C
+tfm:zpzdr-reversed/a92;276D
+tfm:zpzdr-reversed/a93;276A
+tfm:zpzdr-reversed/a94;276B
+tfm:zpzdr-reversed/a95;2774
+tfm:zpzdr-reversed/a96;2775
+tfm:zpzdr-reversed/a97;275B
+tfm:zpzdr-reversed/a98;275C
+tfm:zpzdr-reversed/a99;275D
+tfm:zpzdr-reversed/a100;275E
+tfm:zpzdr-reversed/a101;2761
+tfm:zpzdr-reversed/a102;2762
+tfm:zpzdr-reversed/a103;2763
+tfm:zpzdr-reversed/a104;2764
+tfm:zpzdr-reversed/a105;2710
+tfm:zpzdr-reversed/a106;2765
+tfm:zpzdr-reversed/a107;2766
+tfm:zpzdr-reversed/a108;2767
+tfm:zpzdr-reversed/a109;2660
+tfm:zpzdr-reversed/a110;2665
+tfm:zpzdr-reversed/a111;2666
+tfm:zpzdr-reversed/a112;2663
+tfm:zpzdr-reversed/a117;2709
+tfm:zpzdr-reversed/a118;2708
+tfm:zpzdr-reversed/a119;2707
+tfm:zpzdr-reversed/a120;2460
+tfm:zpzdr-reversed/a121;2461
+tfm:zpzdr-reversed/a122;2462
+tfm:zpzdr-reversed/a123;2463
+tfm:zpzdr-reversed/a124;2464
+tfm:zpzdr-reversed/a125;2465
+tfm:zpzdr-reversed/a126;2466
+tfm:zpzdr-reversed/a127;2467
+tfm:zpzdr-reversed/a128;2468
+tfm:zpzdr-reversed/a129;2469
+tfm:zpzdr-reversed/a130;2776
+tfm:zpzdr-reversed/a131;2777
+tfm:zpzdr-reversed/a132;2778
+tfm:zpzdr-reversed/a133;2779
+tfm:zpzdr-reversed/a134;277A
+tfm:zpzdr-reversed/a135;277B
+tfm:zpzdr-reversed/a136;277C
+tfm:zpzdr-reversed/a137;277D
+tfm:zpzdr-reversed/a138;277E
+tfm:zpzdr-reversed/a139;277F
+tfm:zpzdr-reversed/a140;2780
+tfm:zpzdr-reversed/a141;2781
+tfm:zpzdr-reversed/a142;2782
+tfm:zpzdr-reversed/a143;2783
+tfm:zpzdr-reversed/a144;2784
+tfm:zpzdr-reversed/a145;2785
+tfm:zpzdr-reversed/a146;2786
+tfm:zpzdr-reversed/a147;2787
+tfm:zpzdr-reversed/a148;2788
+tfm:zpzdr-reversed/a149;2789
+tfm:zpzdr-reversed/a150;278A
+tfm:zpzdr-reversed/a151;278B
+tfm:zpzdr-reversed/a152;278C
+tfm:zpzdr-reversed/a153;278D
+tfm:zpzdr-reversed/a154;278E
+tfm:zpzdr-reversed/a155;278F
+tfm:zpzdr-reversed/a156;2790
+tfm:zpzdr-reversed/a157;2791
+tfm:zpzdr-reversed/a158;2792
+tfm:zpzdr-reversed/a159;2793
+tfm:zpzdr-reversed/a160;2794
+tfm:zpzdr-reversed/a161;2192
+tfm:zpzdr-reversed/a162;27A3
+tfm:zpzdr-reversed/a163;2194
+tfm:zpzdr-reversed/a164;2195
+tfm:zpzdr-reversed/a165;2799
+tfm:zpzdr-reversed/a166;279B
+tfm:zpzdr-reversed/a167;279C
+tfm:zpzdr-reversed/a168;279D
+tfm:zpzdr-reversed/a169;279E
+tfm:zpzdr-reversed/a170;279F
+tfm:zpzdr-reversed/a171;27A0
+tfm:zpzdr-reversed/a172;27A1
+tfm:zpzdr-reversed/a173;27A2
+tfm:zpzdr-reversed/a174;27A4
+tfm:zpzdr-reversed/a175;27A5
+tfm:zpzdr-reversed/a176;27A6
+tfm:zpzdr-reversed/a177;27A7
+tfm:zpzdr-reversed/a178;27A8
+tfm:zpzdr-reversed/a179;27A9
+tfm:zpzdr-reversed/a180;27AB
+tfm:zpzdr-reversed/a181;27AD
+tfm:zpzdr-reversed/a182;27AF
+tfm:zpzdr-reversed/a183;27B2
+tfm:zpzdr-reversed/a184;27B3
+tfm:zpzdr-reversed/a185;27B5
+tfm:zpzdr-reversed/a186;27B8
+tfm:zpzdr-reversed/a187;27BA
+tfm:zpzdr-reversed/a188;27BB
+tfm:zpzdr-reversed/a189;27BC
+tfm:zpzdr-reversed/a190;27BD
+tfm:zpzdr-reversed/a191;27BE
+tfm:zpzdr-reversed/a192;279A
+tfm:zpzdr-reversed/a193;27AA
+tfm:zpzdr-reversed/a194;27B6
+tfm:zpzdr-reversed/a195;27B9
+tfm:zpzdr-reversed/a196;2798
+tfm:zpzdr-reversed/a197;27B4
+tfm:zpzdr-reversed/a198;27B7
+tfm:zpzdr-reversed/a199;27AC
+tfm:zpzdr-reversed/a200;27AE
+tfm:zpzdr-reversed/a201;27B1
+tfm:zpzdr-reversed/a202;2703
+tfm:zpzdr-reversed/a203;2750
+tfm:zpzdr-reversed/a204;2752
+tfm:zpzdr-reversed/a205;276E
+tfm:zpzdr-reversed/a206;2770
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist.txt b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist.txt
new file mode 100644
index 00000000000..b9c5fa9af0f
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/texglyphlist.txt
@@ -0,0 +1,386 @@
+# lcdf-typetools texglyphlist.txt, Version 2.95
+# Contents: Extensions to the Adobe Glyph List for TeX fonts and
+# encodings. We also extend the second field so that it can contain
+# multiple Unicode scalar values, separated by commas, analogous to
+# otftotfm's "% UNICODING" comments.
+###############################################################################
+Delta;2206,0394
+Ifractur;2111
+FFsmall;F766 F766,0066 0066
+FFIsmall;F766 F766 F769,0066 0066 0069
+FFLsmall;F766 F766 F76C,0066 0066 006C
+FIsmall;F766 F769,0066 0069
+FLsmall;F766 F76C,0066 006C
+Germandbls;0053 0053
+Germandblssmall;F773 F773,0073 0073
+Ng;014A
+Omega;2126,03A9
+Rfractur;211C
+SS;0053 0053
+SSsmall;F773 F773,0073 0073
+# altselector: invalid Unicode
+altselector;D802
+angbracketleft;27E8,2329
+angbracketright;27E9,232A
+arrowbothv;2195
+arrowdblbothv;21D5
+arrowleftbothalf;21BD
+arrowlefttophalf;21BC
+arrownortheast;2197
+arrownorthwest;2196
+arrowrightbothalf;21C1
+arrowrighttophalf;21C0
+arrowsoutheast;2198
+arrowsouthwest;2199
+# ascendercompwordmark: taller cwm, invalid Unicode
+ascendercompwordmark;D80A
+asteriskcentered;2217
+bardbl;2225
+# capitalcompwordmark: taller cwm, invalid Unicode
+capitalcompwordmark;D809
+ceilingleft;2308
+ceilingright;2309
+circlecopyrt;20DD,25CB
+circledivide;2298
+circledot;2299
+circleminus;2296
+coproduct;2A3F
+ct;0063 0074
+# cwm: Unicode for ZWNJ, used for secondary replacement from EC.enc
+cwm;200C
+dblbracketleft;27E6
+dblbracketright;27E7
+# U+2662 is WHITE DIAMOND SUIT
+# U+25CA is LOZENGE
+# U+2666 is BLACK DIAMOND SUIT
+diamond;2662,25CA,2666
+diamondmath;22C4
+# U+0237 is the proposed allocation for dotless j as of Unicode 4.0
+# U+1D6A5 is the mathematical italic version approved in Unicode 5.0
+dotlessj;0237,F6BE,1D6A5
+emptyset;2205,F638
+# emptyslot: invalid Unicode; the user explicitly wants this slot empty
+emptyslot;D801
+epsilon1;03F5
+epsiloninv;03F6
+equivasymptotic;224D
+flat;266D
+floorleft;230A
+floorright;230B
+follows;227B
+followsequal;2AB0
+followsorcurly;227D
+greatermuch;226B
+heart;2661,2665
+interrobang;203D
+interrobangdown;2E18
+intersectionsq;2293
+latticetop;22A4
+lessmuch;226A
+longdbls;017F 017F
+longsh;017F 0068
+longsi;017F 0069
+longsl;017F 006C
+longst;FB05,017F 0074
+lscript;2113
+natural;266E
+negationslash;0338
+ng;014B
+owner;220B
+pertenthousand;2031
+# TeX encodings such as 'texmital.enc' disagree with Unicode and the Adobe
+# glyph list; in TeX, the "straight" form of phi takes the name "phi",
+# whereas the more-common "loopy" form of phi, \varphi, takes the name "phi1".
+phi;03D5,03C6
+phi1;03C6
+pi1;03D6
+precedesequal;2AAF
+precedesorcurly;227C
+prime;2032,02B9
+rho1;03F1
+# ringfitted: a ring character centered on the x-width of A, invalid Unicode
+ringfitted;D80D
+sharp;266F
+similarequal;2243
+slurabove;2322
+slurbelow;2323
+st;FB06,0073 0074
+star;22C6
+subsetsqequal;2291
+supersetsqequal;2292
+triangle;25B3
+triangleinv;25BD
+triangleleft;25C1
+triangleright;25B7
+turnstileleft;22A2
+turnstileright;22A3
+# twelveudash: 2/3-em dash; invalid Unicode
+twelveudash;D80C
+unionmulti;228E
+unionsq;2294
+vector;20D7
+# visualspace: Unicode for OPEN BOX, used for secondary replacement from EC.enc
+visualspace;2423
+wreathproduct;2240
+# -- Marco Kuhlmann reported annoying glyph neologisms in fontinst encodings
+# Dbar = Dcroat
+Dbar;0110
+# compwordmark = cwm
+compwordmark;200C
+# dbar = dcroat
+dbar;0111
+# rangedash = endash
+rangedash;2013
+# hyphenchar = hyphen
+hyphenchar;002D
+# punctdash = emdash
+punctdash;2014
+# visiblespace = visualspace
+visiblespace;2423
+# --
+# -- These character names are used in the MSAM fonts
+# --
+Yen;00A5
+# the MSAM10 glyph is more closed than U+21BA
+# the MSAM10 glyph's gap is at the top, while U+27F2 is on the left
+anticlockwise;27F2,21BA
+# XXX arrowaxisleft
+# XXX arrowaxisright
+arrowparrleftright;21C6
+arrowparrrightleft;21C4
+arrowtailleft;21A2
+arrowtailright;21A3
+arrowtripleleft;21DA
+arrowtripleright;21DB
+# XXX axisshort
+between;226C
+# U+2713 is a Zapf dingbat
+check;2713
+circleR;00AE
+# the MSAM10 glyph may be smaller than U+24C8
+circleS;24C8
+circleasterisk;229B
+circleequal;229C
+circlering;229A
+# the MSAM10 glyph is more closed than U+21BB
+# the MSAM10 glyph's gap is at the top, while U+27F3 is on the left
+clockwise;27F3,21BB
+complement;2201
+curlyleft;21AB
+curlyright;21AC
+dblarrowdwn;21CA
+dblarrowheadleft;219E
+dblarrowheadright;21A0
+dblarrowup;21C8
+defines;225C
+# U+2666 is BLACK DIAMOND SUIT
+# U+29EB is BLACK LOZENGE
+diamondsolid;2666,29EB
+difference;224F
+dotplus;2214
+downfall;22CE
+equaldotleftright;2252
+equaldotrightleft;2253
+equalorfollows;22DF
+equalorgreater;2A96
+equalorless;2A95
+equalorprecedes;22DE
+equalsdots;2251
+followsorequal;227F
+forces;22A9
+forcesbar;22AA
+fork;22D4
+frown;2322
+geomequivalent;224E
+greaterdbleqlless;2A8C
+greaterdblequal;2267
+greaterlessequal;22DB
+greaterorapproxeql;2A86
+greaterorequalslant;2A7E
+greaterorsimilar;2273
+harpoondownleft;21C3
+harpoondownright;21C2
+# MSAM probably misnamed this glyph; the right pointing harpoon is above
+# U+21CC has the right pointing harpoon above, like MSAM
+harpoonleftright;21CC
+# MSAM probably misnamed this glyph; the left pointing harpoon is above
+# U+21CB has the left pointing harpoon above, like MSAM
+harpoonrightleft;21CB
+harpoonupleft;21BF
+harpoonupright;21BE
+# U+22BA may be larger than MSAM intercal
+intercal;22BA
+intersectiondbl;22D2
+lessdbleqlgreater;2A8B
+lessdblequal;2266
+lessequalgreater;22DA
+lessorapproxeql;2A85
+lessorequalslant;2A7D
+lessorsimilar;2272
+maltesecross;2720
+measuredangle;2221
+multimap;22B8
+multiopenleft;22CB
+multiopenright;22CC
+nand;22BC
+orunderscore;22BB
+# U+2306 PERSPECTIVE is larger than the MSAM glyph
+perpcorrespond;2A5E,2306
+precedesorequal;227E
+primereverse;2035
+revasymptequal;22CD
+revsimilar;223D
+# U+231D TOP RIGHT CORNER is a quine corner,
+# U+2E23 TOP RIGHT HALF BRACKET is a half bracket.
+# MSAM rightanglene matches the shape of U+231C but the spacing of U+2E23.
+# Similar for other rightangle characters.
+rightanglene;231D,2E23
+rightanglenw;231C,2E22
+rightanglese;231F,2E25
+rightanglesw;231E,2E24
+ringinequal;2256
+# U+22A7 MODELS is shorter than U+22A8 TRUE = satisfies.
+# MSAM satisfies is in between.
+satisfies;22A8
+shiftleft;21B0
+shiftright;21B1
+smile;2323
+sphericalangle;2222
+# U+25A1 WHITE SQUARE
+square;25A1
+squaredot;22A1
+squareimage;228F
+squareminus;229F
+squaremultiply;22A0
+squareoriginal;2290
+squareplus;229E
+# XXX U+25AA BLACK SMALL SQUARE doesn't sit on the baseline
+# XXX squaresmallsolid
+squaresolid;25A0
+# U+21AD LEFT RIGHT WAVE ARROW is not actually a squiggle arrow
+squiggleleftright;21AD
+squiggleright;21DD
+subsetdbl;22D0
+subsetdblequal;2AC5
+supersetdbl;22D1
+supersetdblequal;2AC6
+triangledownsld;25BC
+# U+22B4 NORMAL SUBGROUP OF OR EQUAL TO is sharper than MSAM
+triangleleftequal;22B4,25C1 0332
+triangleleftsld;25C0
+# U+22B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO is sharper than MSAM
+trianglerightequal;22B5,25B7 0332
+trianglerightsld;25B6
+trianglesolid;25B2
+uniondbl;22D3
+uprise;22CF
+# --
+# -- These character names are used in the MSBM fonts
+# --
+# U+1D7CB MATHEMATICAL BOLD SMALL DIGAMMA is the closest match to MSBM,
+# although MSBM Digamma's spelling indicates that a capital was intended
+# U+03DD GREEK SMALL LETTER DIGAMMA for fallback
+Digamma;1D7CB,03DD
+# U+2132 TURNED CAPITAL F is shown as seriffed, MSBM Finv is sans
+Finv;2132
+# U+2141 TURNED SANS-SERIF CAPITAL G is turned, MSBM Gmir is only reversed
+Gmir;2141
+Omegainv;2127
+approxorequal;224A
+archleftdown;21B6
+archrightdown;21B7
+# XXX barshort
+beth;2136
+daleth;2138
+dividemultiply;22C7
+# U+29F9 BIG REVERSE SOLIDUS seems the right size
+downslope;29F9
+equalorsimilar;2242
+follownotdbleqv;2ABA
+follownotslnteql;2AB6
+followornoteqvlnt;22E9
+greaterdot;22D7
+# MSBM misnamed this glyph; should be greaternotdbleqv
+greaternotdblequal;2A8A
+greaternotequal;2A88
+greaterornotdbleql;2269
+# XXX MSBM greaterornotequal has a vertical negation slash, not U+2269 diagonal
+greaterornotequal;2269
+# XXX greaterornotsimilar
+# XXX hatwide
+# XXX hatwider
+integerdivide;2216
+lessdot;22D6
+# MSBM misnamed this glyph; should be lessnotdbleqv
+lessnotdblequal;2A89
+lessnotequal;2A87
+lessornotdbleql;2268
+# XXX MSBM lessornotequal has a vertical negation slash, not U+2268 diagonal
+lessornotequal;2268
+# XXX lessornotsimilar
+multicloseleft;22C9
+multicloseright;22CA
+notapproxequal;2247
+notarrowboth;21AE
+notarrowleft;219A
+notarrowright;219B
+notbar;2224
+notdblarrowboth;21CE
+notdblarrowleft;21CD
+notdblarrowright;21CF
+notexistential;2204
+notfollows;2281
+# U+22E1 DOES NOT SUCCEED OR EQUAL has a curved equal sign, unlike MSBM
+notfollowsoreql;2AB0 0338,22E1
+notforces;22AE
+notforcesextra;22AF
+# Unicode has no precomposed negation of U+2267 GREATER THAN OVER EQUAL TO
+notgreaterdblequal;2267 0338
+notgreaterequal;2271
+notgreaterorslnteql;2A7E 0338
+notlessdblequal;2266 0338
+notlessequal;2270
+notlessorslnteql;2A7D 0338
+# U+22E0 DOES NOT PRECEDE OR EQUAL has a curved equal sign, unlike MSBM
+notprecedesoreql;2AAF 0338,22E0
+notsatisfies;22AD
+# XXX notshortbar
+# XXX notshortparallel
+notsimilar;2241
+notsubseteql;2288
+notsubsetordbleql;2AC5 0338
+# U+228A SUBSET OF WITH NOT EQUAL TO negation slash only touches bar below;
+# MSBM negation slash touches bar and lower part of subset
+notsubsetoreql;228A
+notsuperseteql;2289
+notsupersetordbleql;2AC6 0338
+# U+228A SUPERSET OF WITH NOT EQUAL TO negation slash only touches bar below;
+# MSBM negation slash touches bar and lower part of superset
+notsupersetoreql;228B
+# U+22EC NOT NORMAL SUBGROUP OF OR EQUAL TO is sharper than MSBM
+nottriangeqlleft;22EC,25C1 0332 0338
+# U+22ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL is sharper than MSBM
+nottriangeqlright;22ED,25B7 0332 0338
+# U+22EA NOT NORMAL SUBGROUP OF is sharper than MSBM
+nottriangleleft;22EA,25C1 0338
+# U+22EB DOES NOT CONTAIN AS NORMAL SUBGROUP is sharper than MSBM
+nottriangleright;22EB,25B7 0338
+notturnstile;22AC
+# XXX parallelshort
+planckover2pi;210F
+# U+210F PLANCK CONSTANT OVER TWO PI is shown with diagonal slash, which
+# corresponds to MSBM planckover2pi, but this is a font variant
+planckover2pi1;210F
+precedenotdbleqv;2AB9
+precedenotslnteql;2AB5
+precedeornoteqvlnt;22E8
+subsetnoteql;228A
+subsetornotdbleql;2ACB
+# XXX subsetornoteql
+supersetnoteql;228B
+supersetornotdbleql;2ACC
+# XXX supersetornoteql
+# XXX tildewide
+# XXX tildewider
+# U+29F8 BIG SOLIDUS seems the right size
+upslope;29F8
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.am b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.am
new file mode 100644
index 00000000000..d1c220870e9
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.am
@@ -0,0 +1,14 @@
+## Process this file with automake to produce Makefile.in
+AUTOMAKE_OPTIONS = foreign
+
+bin_PROGRAMS = ttftotype42
+man_MANS = ttftotype42.1
+
+ttftotype42_SOURCES = ttftotype42.cc
+
+ttftotype42_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+
+EXTRA_DIST = ttftotype42.1
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.in b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.in
new file mode 100644
index 00000000000..572395c0389
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/Makefile.in
@@ -0,0 +1,748 @@
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ttftotype42$(EXEEXT)
+subdir = lcdf-typetools-src/ttftotype42
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_cxx_template_objs.m4 \
+ $(top_srcdir)/../../m4/kpse-common.m4 \
+ $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \
+ $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \
+ $(top_srcdir)/../../m4/kpse-warnings.m4 \
+ $(top_srcdir)/../../m4/kpse-win32.m4 \
+ $(top_srcdir)/../../m4/libtool.m4 \
+ $(top_srcdir)/../../m4/ltoptions.m4 \
+ $(top_srcdir)/../../m4/ltsugar.m4 \
+ $(top_srcdir)/../../m4/ltversion.m4 \
+ $(top_srcdir)/../../m4/lt~obsolete.m4 $(top_srcdir)/version.ac \
+ $(top_srcdir)/ac/lcdf-typetools.ac $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/autoconf.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ttftotype42_OBJECTS = ttftotype42.$(OBJEXT)
+ttftotype42_OBJECTS = $(am_ttftotype42_OBJECTS)
+ttftotype42_DEPENDENCIES = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/ttftotype42.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(ttftotype42_SOURCES)
+DIST_SOURCES = $(ttftotype42_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/../../build-aux/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXXLD = @CXXLD@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+KPATHSEA_DEPEND = @KPATHSEA_DEPEND@
+KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@
+KPATHSEA_LIBS = @KPATHSEA_LIBS@
+LCDF_TYPETOOLS_TREE = @LCDF_TYPETOOLS_TREE@
+LCDF_TYPETOOLS_VERSION = @LCDF_TYPETOOLS_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SELECTED_SUBDIRS = @SELECTED_SUBDIRS@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEMPLATE_OBJS = @TEMPLATE_OBJS@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+encdir = @encdir@
+exec_prefix = @exec_prefix@
+glyphlistdir = @glyphlistdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+man_MANS = ttftotype42.1
+ttftotype42_SOURCES = ttftotype42.cc
+ttftotype42_LDADD = ../libefont/libefont.a ../liblcdf/liblcdf.a
+AM_CPPFLAGS = -I$(srcdir)/../include
+CLEANFILES = @TEMPLATE_OBJS@
+EXTRA_DIST = ttftotype42.1
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lcdf-typetools-src/ttftotype42/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lcdf-typetools-src/ttftotype42/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+ttftotype42$(EXEEXT): $(ttftotype42_OBJECTS) $(ttftotype42_DEPENDENCIES) $(EXTRA_ttftotype42_DEPENDENCIES)
+ @rm -f ttftotype42$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ttftotype42_OBJECTS) $(ttftotype42_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttftotype42.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cc.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/ttftotype42.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/ttftotype42.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1 b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1
new file mode 100644
index 00000000000..a212bd1a79c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.1
@@ -0,0 +1,78 @@
+.ds V 2.108
+.de M
+.BR "\\$1" "(\\$2)\\$3"
+..
+.de Sp
+.if n .sp
+.if t .sp 0.4
+..
+.TH TTFTOTYPE42 1 "LCDF Typetools" "Version \*V"
+.SH NAME
+ttftotype42 \- create PostScript Type 42 wrapper of TrueType font
+.SH SYNOPSIS
+.B ttftotype42
+\%[\fIinput\fR [\fIoutput\fR]]
+.SH DESCRIPTION
+.BR Ttftotype42
+converts TrueType or TrueType-flavored OpenType font programs into
+PostScript Type 42 format, which is a wrapper for the TrueType outlines.
+This conversion preserves all outlines and hint information from the
+original TrueType font. The Type 42 wrapper uses glyph names identical to
+those expected by
+.M pdflatex 1
+or
+.M otftotfm 1 ,
+so encoding files suitable for TrueType fonts and
+.B pdflatex
+will also work for the Type 42 fonts and
+.M dvips 1 .
+If the file
+.I output
+is not specified output goes to the standard output.
+If the file
+.I input
+is not specified input comes from the standard input.
+'
+.SH OPTIONS
+.PD 0
+.TP 5
+.BI \-o " file\fR, " \-\-output " file"
+Write output font to
+.IR file
+instead of the standard output.
+'
+.Sp
+.TP 5
+.BR \-q ", " \-\-quiet
+Do not generate any error messages.
+'
+.Sp
+.TP 5
+.BR \-h ", " \-\-help
+Print usage information and exit.
+'
+.Sp
+.TP 5
+.BR \-v ", " \-\-version
+Print the version number and some short non-warranty information and exit.
+.PD
+'
+.SH "SEE ALSO"
+.LP
+.M cfftot1 1 ,
+.M otftotfm 1 ,
+.M pdftex 1 ,
+.M dvips 1
+.LP
+Adobe Technical Note #5012,
+.IR "The Type 42 Font Format Specification"
+.LP
+.IR "OpenType Specification" ,
+Version 1.4
+'
+.SH AUTHOR
+Eddie Kohler (ekohler@gmail.com)
+.PP
+The latest version is available from:
+.br
+http://www.lcdf.org/type/
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc
new file mode 100644
index 00000000000..d1e88706cd1
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/ttftotype42/ttftotype42.cc
@@ -0,0 +1,403 @@
+/* ttftotype42.cc -- driver for translating TrueType fonts to Type 42 fonts
+ *
+ * Copyright (c) 2006-2019 Eddie Kohler
+ *
+ * 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 2 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <efont/t1rw.hh>
+#include <efont/t1font.hh>
+#include <efont/t1item.hh>
+#include <lcdf/clp.h>
+#include <lcdf/error.hh>
+#include <efont/cff.hh>
+#include <efont/otf.hh>
+#include <efont/otfname.hh>
+#include <efont/otfpost.hh>
+#include <efont/otfcmap.hh>
+#include <efont/ttfcs.hh>
+#include <lcdf/md5.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <math.h>
+#ifdef HAVE_CTIME
+# include <time.h>
+#endif
+#if defined(_MSDOS) || defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+#endif
+
+using namespace Efont;
+
+#define VERSION_OPT 301
+#define HELP_OPT 302
+#define QUIET_OPT 303
+#define OUTPUT_OPT 306
+
+const Clp_Option options[] = {
+ { "help", 'h', HELP_OPT, 0, 0 },
+ { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 },
+ { "quiet", 'q', QUIET_OPT, 0, Clp_Negate },
+ { "version", 'v', VERSION_OPT, 0, 0 },
+};
+
+
+static const char *program_name;
+
+
+void
+usage_error(ErrorHandler *errh, const char *error_message, ...)
+{
+ va_list val;
+ va_start(val, error_message);
+ if (!error_message)
+ errh->message("Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]", program_name);
+ else
+ errh->xmessage(ErrorHandler::e_error, error_message, val);
+ errh->message("Type %s --help for more information.", program_name);
+ exit(1);
+}
+
+void
+usage()
+{
+ FileErrorHandler uerrh(stdout);
+ uerrh.message("\
+%<Ttftotype42%> translates a TrueType or TrueType-flavored OpenType font into\n\
+PostScript Type 42 format, which is suitable for inclusion in PostScript\n\
+files. The result is usually written to the standard output.\n\
+\n\
+Usage: %s [OPTIONS] [FONTFILE [OUTPUTFILE]]\n\
+\n\
+Options:\n\
+ -o, --output=FILE Write output to FILE.\n\
+ -q, --quiet Do not generate any error messages.\n\
+ -h, --help Print this message and exit.\n\
+ -v, --version Print version number and exit.\n\
+\n\
+Report bugs to <ekohler@gmail.com>.\n", program_name);
+}
+
+
+// MAIN
+
+// This is the list of tables Adobe recommends be included from the source TTF,
+// plus the 'cmap' table, which helps to make PDF results searchable.
+static const char * const t42_tables[] = {
+ "cmap", "cvt ", "fpgm", "glyf", "head", "hhea", "hmtx",
+ "loca", "maxp", "prep", "vhea", "vmtx", 0
+};
+
+struct NameId {
+ const char *name;
+ int nameid;
+};
+
+static const NameId fontinfo_names[] = {
+ { "version", OpenType::Name::N_VERSION },
+ { "Notice", OpenType::Name::N_TRADEMARK },
+ { "Copyright", OpenType::Name::N_COPYRIGHT },
+ { "FullName", OpenType::Name::N_FULLNAME },
+ { "FamilyName", OpenType::Name::N_FAMILY },
+ { "Weight", OpenType::Name::N_SUBFAMILY },
+ { 0, 0 }
+};
+
+static void
+fprint_sfnts(FILE *f, const String &data, bool glyf, const OpenType::Font &font)
+{
+ if (glyf && data.length() >= 65535) {
+ OpenType::Data head = font.table("head");
+ OpenType::Data loca = font.table("loca");
+ bool loca_long = (head.length() >= 52 && head.u16(50) != 0);
+ int loca_size = (loca_long ? 4 : 2);
+ uint32_t first_offset = 0;
+ for (int i = 1; i * loca_size < loca.length(); i++) {
+ uint32_t next_offset = (loca_long ? loca.u32(4*i) : loca.u16(2*i) * 2);
+ if (next_offset - first_offset >= 65535) {
+ uint32_t prev_offset = (loca_long ? loca.u32(4*i - 4) : loca.u16(2*i - 2) * 2);
+ fprint_sfnts(f, data.substring(first_offset, prev_offset - first_offset), false, font);
+ first_offset = prev_offset;
+ }
+ }
+ fprint_sfnts(f, data.substring(first_offset), false, font);
+ return;
+ } else if (data.length() >= 65535) {
+ for (int offset = 0; offset < data.length(); ) {
+ int next_offset = offset + 65534;
+ if (next_offset > data.length())
+ next_offset = data.length();
+ fprint_sfnts(f, data.substring(offset, next_offset - offset), false, font);
+ offset = next_offset;
+ }
+ return;
+ }
+
+ fputc('<', f);
+ const uint8_t *s = data.udata();
+ for (int i = 0; i < data.length(); i++) {
+ if (i && (i % 38) == 0)
+ fputc('\n', f);
+ fputc("0123456789ABCDEF"[(s[i] >> 4) & 0xF], f);
+ fputc("0123456789ABCDEF"[s[i] & 0xF], f);
+ }
+ if ((data.length() % 38) == 0)
+ fputc('\n', f);
+ fputs("00>\n", f);
+}
+
+static void
+do_file(const char *infn, const char *outfn, ErrorHandler *errh)
+{
+ FILE *f;
+ if (!infn || strcmp(infn, "-") == 0) {
+ f = stdin;
+ infn = "<stdin>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(infn, "rb")))
+ errh->fatal("%s: %s", infn, strerror(errno));
+
+ int c = getc(f);
+ ungetc(c, f);
+
+ if (c == EOF)
+ errh->fatal("%s: empty file", infn);
+
+ StringAccum sa(150000);
+ int amt;
+ do {
+ if (char *x = sa.reserve(32768)) {
+ amt = fread(x, 1, 32768, f);
+ sa.adjust_length(amt);
+ } else
+ amt = 0;
+ } while (amt != 0);
+ if (!feof(f) || ferror(f))
+ errh->error("%s: %s", infn, strerror(errno));
+ if (f != stdin)
+ fclose(f);
+
+ LandmarkErrorHandler cerrh(errh, infn);
+ OpenType::Font otf(sa.take_string(), &cerrh);
+ if (!otf.ok() || !otf.check_checksums(&cerrh))
+ return;
+ if (otf.table("CFF"))
+ cerrh.fatal("CFF-flavored OpenType font not suitable for Type 42");
+
+ OpenType::Name name(otf.table("name"), &cerrh);
+ OpenType::Data head_data = otf.table("head");
+ if (!otf.table("glyf") || head_data.length() <= 52 || !name.ok())
+ cerrh.fatal("font appears to lack required tables");
+
+ // create reduced font
+ Vector<OpenType::Tag> tags;
+ Vector<String> tables;
+ for (const char * const *table = t42_tables; *table; table++)
+ if (String s = otf.table(*table)) {
+ tags.push_back(*table);
+ tables.push_back(s);
+ }
+ OpenType::Font reduced_font = OpenType::Font::make(true, tags, tables);
+
+ // output file
+ if (!outfn || strcmp(outfn, "-") == 0) {
+ f = stdout;
+ outfn = "<stdout>";
+#if defined(_MSDOS) || defined(_WIN32)
+ _setmode(_fileno(f), _O_BINARY);
+#endif
+ } else if (!(f = fopen(outfn, "wb")))
+ errh->fatal("%s: %s", outfn, strerror(errno));
+
+ // fprintf(f, "%%!\n");
+
+ // get glyph names
+ TrueTypeBoundsCharstringProgram ttbprog(&otf);
+ Vector<PermString> gn;
+ ttbprog.glyph_names(gn);
+ OpenType::Post post(otf.table("post"));
+ OpenType::Cmap cmap(otf.table("cmap"));
+ double emunits = head_data.u16(18);
+
+ // font opener
+ fprintf(f, "%%!PS-TrueTypeFont-65536-%u-1\n", head_data.u32(4));
+ if (post.ok())
+ fprintf(f, "%%%%VMusage: %u %u\n", post.mem_type42(false), post.mem_type42(true));
+ fprintf(f, "11 dict begin\n");
+ fprintf(f, "/FontName /%s def\n", name.english_name(OpenType::Name::N_POSTSCRIPT).c_str());
+ fprintf(f, "/FontType 42 def\n");
+ fprintf(f, "/FontMatrix [1 0 0 1 0 0] def\n");
+ fprintf(f, "/FontBBox [%g %g %g %g] readonly def\n",
+ /* head_data.s16(36), head_data.s16(38),
+ head_data.s16(40), head_data.s16(42)); */
+ head_data.s16(36) / emunits, head_data.s16(38) / emunits,
+ head_data.s16(40) / emunits, head_data.s16(42) / emunits);
+ fprintf(f, "/PaintType 0 def\n");
+
+ // XUID (MD5 sum of font data)
+ {
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *) reduced_font.data(), reduced_font.length());
+ unsigned char result[MD5_DIGEST_SIZE + 3];
+ memset(result, 0, sizeof(result));
+ md5_final(result, &md5);
+ fprintf(f, "/XUID [42");
+ for (int i = 0; i < MD5_DIGEST_SIZE; i += 3)
+ fprintf(f, " 16#%X", result[i] + result[i+1]*256 + result[i+2]*256*256);
+ fprintf(f, "] def\n");
+ }
+
+ // FontInfo dictionary
+ fprintf(f, "/FontInfo 10 dict dup begin\n");
+ for (const NameId *n = fontinfo_names; n->name; n++)
+ if (String s = name.english_name(n->nameid)) {
+ fprintf(f, "/%s (", n->name);
+ for (const char *x = s.begin(); x < s.end(); x++)
+ if (*x == '(' || *x == '\\' || *x == ')')
+ fprintf(f, "\\%c", *x);
+ else if (*x == '\n' || (*x >= ' ' && *x <= '~'))
+ fputc(*x, f);
+ else
+ fprintf(f, "\\%03o", (unsigned char) *x);
+ fprintf(f, ") readonly def\n");
+ }
+ if (post.ok()) {
+ fprintf(f, "/isFixedPitch %s def\n", (post.is_fixed_pitch() ? "true" : "false"));
+ fprintf(f, "/ItalicAngle %g def\n", post.italic_angle());
+ fprintf(f, "/UnderlinePosition %g def\n", (post.underline_position() - (post.underline_thickness() / 2)) / emunits);
+ fprintf(f, "/UnderlineThickness %g def\n", post.underline_thickness() / emunits);
+ }
+ fprintf(f, "end readonly def\n");
+
+ // encoding
+ fprintf(f, "/Encoding 256 array\n0 1 255{1 index exch/.notdef put}for\n");
+ for (int i = 0; i < 256; i++)
+ if (OpenType::Glyph g = cmap.map_uni(i))
+ fprintf(f, "dup %d /%s put\n", i, gn[g].c_str());
+ fprintf(f, "readonly def\n");
+
+ // print 'sfnts' array
+ OpenType::Data sfnts = reduced_font.data_string();
+ fprintf(f, "/sfnts[\n");
+ fprint_sfnts(f, sfnts.substring(0, OpenType::Font::HEADER_SIZE + OpenType::Font::TABLE_DIR_ENTRY_SIZE * reduced_font.ntables()), false, reduced_font);
+ for (int i = 0; i < reduced_font.ntables(); i++) {
+ int off = OpenType::Font::HEADER_SIZE + OpenType::Font::TABLE_DIR_ENTRY_SIZE * i;
+ uint32_t offset = sfnts.u32(off + 8);
+ uint32_t length = (sfnts.u32(off + 12) + 3) & ~3;
+ fprint_sfnts(f, sfnts.substring(offset, length), sfnts.u32(off) == 0x676C7966 /*glyf*/, reduced_font);
+ }
+ fprintf(f, "] def\n");
+
+ // print CharStrings data
+ fprintf(f, "/CharStrings %d dict dup begin\n", ttbprog.nglyphs());
+ for (int i = 0; i < gn.size(); i++)
+ fprintf(f, "/%s %d def\n", gn[i].c_str(), i);
+ fprintf(f, "end readonly def\n");
+
+ // complete font
+ fprintf(f, "FontName currentdict end definefont pop\n");
+
+ // fprintf(f, "/%s 100 selectfont 30 30 moveto (Hello! 9) show showpage\n", name.english_name(OpenType::Name::N_POSTSCRIPT).c_str());
+
+ if (f != stdout)
+ fclose(f);
+}
+
+#if 0
+static void check_md5sum() {
+ MD5_CONTEXT md5;
+ md5_init(&md5);
+ md5_update(&md5, (const unsigned char *) "message digest", 14);
+ unsigned char result[MD5_DIGEST_SIZE];
+ md5_final(result, &md5);
+ assert(memcmp(result, "\xF9\x6B\x69\x7D\x7C\xB7\x93\x8D\x52\x5A\x2F\x31\xAA\xF1\x61\xD0", MD5_DIGEST_SIZE) == 0);
+}
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ Clp_Parser *clp =
+ Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
+ program_name = Clp_ProgramName(clp);
+
+ ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr, String(program_name) + ": "));
+ const char *input_file = 0;
+ const char *output_file = 0;
+
+ while (1) {
+ int opt = Clp_Next(clp);
+ switch (opt) {
+
+ case QUIET_OPT:
+ if (clp->negated)
+ errh = ErrorHandler::default_handler();
+ else
+ errh = new SilentErrorHandler;
+ break;
+
+ case VERSION_OPT:
+ printf("ttftotype42 (LCDF typetools) %s\n", VERSION);
+ printf("Copyright (C) 2006-2019 Eddie Kohler\n\
+This is free software; see the source for copying conditions.\n\
+There is NO warranty, not even for merchantability or fitness for a\n\
+particular purpose.\n");
+ exit(0);
+ break;
+
+ case HELP_OPT:
+ usage();
+ exit(0);
+ break;
+
+ case OUTPUT_OPT:
+ output_file:
+ if (output_file)
+ usage_error(errh, "output file specified twice");
+ output_file = clp->vstr;
+ break;
+
+ case Clp_NotOption:
+ if (input_file && output_file)
+ usage_error(errh, "too many arguments");
+ else if (input_file)
+ goto output_file;
+ else
+ input_file = clp->vstr;
+ break;
+
+ case Clp_Done:
+ goto done;
+
+ case Clp_BadOption:
+ usage_error(errh, 0);
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ done:
+ do_file(input_file, output_file, errh);
+
+ return (errh->nerrors() == 0 ? 0 : 1);
+}
diff --git a/Build/source/texk/lcdf-typetools/m4/ac_cxx_template_objs.m4 b/Build/source/texk/lcdf-typetools/m4/ac_cxx_template_objs.m4
new file mode 100644
index 00000000000..823ae58cce6
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/m4/ac_cxx_template_objs.m4
@@ -0,0 +1,69 @@
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_template_objs.html
+dnl
+dnl Adapted for Autoconf 2.63 Peter Breitenlohner <peb@mppmu.mpg.de>
+dnl
+AC_DEFUN([AC_CXX_TEMPLATE_OBJS],
+[AC_CACHE_CHECK(where template objects are stored, ac_cv_cxx_templobjs,
+ [ ac_cv_cxx_templobjs='unknown'
+ if test "$GXX" = yes; then
+ ac_cv_cxx_templobjs='nowhere'
+ else
+ case $CXX in
+ CC|*/CC)
+ cat > conftest.cc <<EOF
+template<class T> class A { public : A () {} };
+template<class T> void f (const A<T>&) {}
+main()
+{ A<double> d;
+ A<int> i;
+ f (d);
+ f (i);
+ return 0;
+}
+EOF
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d Templates.DB ; then
+ rm -fr Templates.DB
+ fi
+ if $CXX $CXXFLAGS -ptr. -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d Templates.DB ; then
+# this should be Sun CC <= 4.2
+ CXXFLAGS="$CXXFLAGS -ptr."
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='Templates.DB/*.o'
+ else
+ ac_cv_cxx_templobjs='Templates.DB/*.lo'
+ fi
+ rm -fr Templates.DB
+ fi
+ fi
+ fi
+ if test "$ac_cv_cxx_templobjs" = 'unknown' ; then
+ if test -d SunWS_cache ; then
+ rm -fr SunWS_cache
+ fi
+ if $CXX $CXXFLAGS -c conftest.cc 1> /dev/null 2>&1; then
+ if test -d SunWS_cache ; then
+# this should be Sun WorkShop C++ compiler 5.x
+# or Sun Forte C++ compiler >= 6.x
+ if test x"$LIBTOOL" = x ; then
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.o'
+ else
+ ac_cv_cxx_templobjs='SunWS_cache/*/*.lo'
+ fi
+ rm -fr SunWS_cache
+ fi
+ fi
+ fi
+ rm -f conftest* ;;
+ esac
+ fi])
+case $ac_cv_cxx_templobjs in
+ unknown|nowhere)
+ TEMPLATE_OBJS="" ;;
+ *)
+ TEMPLATE_OBJS="$ac_cv_cxx_templobjs" ;;
+esac
+AC_SUBST(TEMPLATE_OBJS)])
+
diff --git a/Build/source/texk/lcdf-typetools/tests/Ant.enc b/Build/source/texk/lcdf-typetools/tests/Ant.enc
new file mode 100644
index 00000000000..9329e8f4aeb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Ant.enc
@@ -0,0 +1,54 @@
+% THIS FILE WAS AUTOMATICALLY GENERATED -- DO NOT EDIT
+
+%%AutoEnc_enhg3cvpzae3ek6hy2pgtmt5df
+% Command line follows encoding
+/AutoEnc_enhg3cvpzae3ek6hy2pgtmt5df [
+%00
+ /.notdef /Euro /.notdef /.notdef /fraction /dotaccent /hungarumlaut /ogonek
+ /f_l /.notdef /cwm /f_f /f_i /.notdef /f_f_i /f_f_l
+%10
+ /dotlessi /dotlessj.dup /grave /acute /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+%20
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+%30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+%40
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+%50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /circumflex /underscore
+%60
+ /quoteleft /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+%70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /tilde /dieresis
+%80
+ /Lslash /quotesingle /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+ /.notdef /perthousand /Scaron /guilsinglleft /.notdef /Zcaron /asciicircum /minus
+%90
+ /lslash /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash
+ /.notdef /trademark /scaron /guilsinglright /.notdef /zcaron /asciitilde /Ydieresis
+%A0
+ /uni00A0 /exclamdown /cent /sterling /currency /yen /brokenbar /section
+ /.notdef /copyright /ordfeminine /guillemotleft /logicalnot /uni00AD /registered /.notdef
+%B0
+ /degree /plusminus /two.superior /three.superior /.notdef /uni00B5 /paragraph /periodcentered
+ /.notdef /one.superior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+%C0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /.notdef /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+%D0
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+ /.notdef /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /.notdef
+%E0
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /.notdef /ccedilla
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+%F0
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+ /.notdef /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
+] def
diff --git a/Build/source/texk/lcdf-typetools/tests/Ant.map b/Build/source/texk/lcdf-typetools/tests/Ant.map
new file mode 100644
index 00000000000..8b03202fa71
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Ant.map
@@ -0,0 +1 @@
+Ant AntPolt-Regular "AutoEnc_enhg3cvpzae3ek6hy2pgtmt5df ReEncodeFont" <[a_enhg3c.enc <AntPolt-Regular.pfb
diff --git a/Build/source/texk/lcdf-typetools/tests/Ant.pfb b/Build/source/texk/lcdf-typetools/tests/Ant.pfb
new file mode 100644
index 00000000000..78517ee2533
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Ant.pfb
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/Ant.pl b/Build/source/texk/lcdf-typetools/tests/Ant.pl
new file mode 100644
index 00000000000..a164a0eb3eb
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Ant.pl
@@ -0,0 +1,2014 @@
+(FAMILY TeX-AntPolt-Regular)
+(CODINGSCHEME AutoEnc_enhg3cvpzae3ek6hy2pgtmt5df)
+(DESIGNSIZE R 10.0)
+(DESIGNUNITS R 1000.0)
+(COMMENT DESIGNSIZE (1 em) IS IN POINTS)
+(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/1000)
+(FONTDIMEN
+ (SPACE R 270)
+ (STRETCH R 135)
+ (SHRINK R 90)
+ (EXTRASPACE R 45)
+ (XHEIGHT R 440)
+ (QUAD R 1000)
+ )
+(LIGTABLE
+ (LABEL D 11) (COMMENT f_f)
+ (LIG C l D 15) (COMMENT f_f_l)
+ (LIG C i D 14) (COMMENT f_f_i)
+ (KRN D 42 R 35) (COMMENT asterisk)
+ (KRN D 147 R 26) (COMMENT quotedblleft)
+ (KRN D 148 R 26) (COMMENT quotedblright)
+ (KRN D 96 R 26) (COMMENT quoteleft)
+ (KRN D 39 R 26) (COMMENT quoteright)
+ (STOP)
+
+ (LABEL D 31) (COMMENT Oslash)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL D 32) (COMMENT space)
+ (LIG C l D 144) (COMMENT lslash)
+ (LIG C L D 128) (COMMENT Lslash)
+ (STOP)
+
+ (LABEL D 33) (COMMENT exclam)
+ (LIG D 96 D 161) (COMMENT quoteleft) (COMMENT exclamdown)
+ (STOP)
+
+ (LABEL D 39) (COMMENT quoteright)
+ (LIG D 39 D 148) (COMMENT quoteright) (COMMENT quotedblright)
+ (KRN C A R -52)
+ (KRN D 33 R 91) (COMMENT exclam)
+ (KRN D 63 R 91) (COMMENT question)
+ (KRN D 196 R -52) (COMMENT Adieresis)
+ (KRN D 197 R -52) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 45) (COMMENT hyphen)
+ (LIG D 45 D 150) (COMMENT hyphen) (COMMENT endash)
+ (STOP)
+
+ (LABEL D 63) (COMMENT question)
+ (LIG D 96 D 191) (COMMENT quoteleft) (COMMENT questiondown)
+ (STOP)
+
+ (LABEL C A)
+ (KRN C a R -35)
+ (KRN C b R -35)
+ (KRN C C R -35)
+ (KRN C c R -35)
+ (KRN C d R -35)
+ (KRN C e R -35)
+ (KRN C G R -35)
+ (KRN C J R -43)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C Q R -35)
+ (KRN C q R -35)
+ (KRN D 34 R -113) (COMMENT quotedbl)
+ (KRN D 129 R -113) (COMMENT quotesingle)
+ (KRN C s R -35)
+ (KRN C T R -113)
+ (KRN C t R -43)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C V R -113)
+ (KRN C v R -52)
+ (KRN C W R -113)
+ (KRN C w R -52)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (KRN D 228 R -35) (COMMENT adieresis)
+ (KRN D 229 R -35) (COMMENT aring)
+ (KRN D 199 R -35) (COMMENT Ccedilla)
+ (KRN D 231 R -35) (COMMENT ccedilla)
+ (KRN D 235 R -35) (COMMENT edieresis)
+ (KRN D 214 R -35) (COMMENT Odieresis)
+ (KRN D 246 R -35) (COMMENT odieresis)
+ (KRN D 210 R -35) (COMMENT Ograve)
+ (KRN D 242 R -35) (COMMENT ograve)
+ (KRN D 31 R -35) (COMMENT Oslash)
+ (KRN D 28 R -35) (COMMENT oslash)
+ (KRN D 147 R -113) (COMMENT quotedblleft)
+ (KRN D 148 R -113) (COMMENT quotedblright)
+ (KRN D 96 R -113) (COMMENT quoteleft)
+ (KRN D 39 R -113) (COMMENT quoteright)
+ (KRN D 154 R -35) (COMMENT scaron)
+ (KRN D 219 R -52) (COMMENT Ucircumflex)
+ (KRN D 251 R -43) (COMMENT ucircumflex)
+ (KRN D 220 R -52) (COMMENT Udieresis)
+ (KRN D 252 R -43) (COMMENT udieresis)
+ (KRN D 159 R -113) (COMMENT Ydieresis)
+ (KRN D 255 R -26) (COMMENT ydieresis)
+ (STOP)
+
+ (LABEL C B)
+ (KRN C A R -35)
+ (KRN C V R -35)
+ (KRN C W R -35)
+ (KRN C Y R -35)
+ (KRN D 193 R -35) (COMMENT Aacute)
+ (KRN D 194 R -35) (COMMENT Acircumflex)
+ (KRN D 196 R -35) (COMMENT Adieresis)
+ (KRN D 192 R -35) (COMMENT Agrave)
+ (KRN D 197 R -35) (COMMENT Aring)
+ (KRN D 195 R -35) (COMMENT Atilde)
+ (KRN D 159 R -35) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C C)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 193 R -43) (COMMENT Aacute)
+ (KRN D 194 R -43) (COMMENT Acircumflex)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 192 R -43) (COMMENT Agrave)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 195 R -43) (COMMENT Atilde)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 211 R 26) (COMMENT Oacute)
+ (KRN D 212 R 26) (COMMENT Ocircumflex)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 210 R 26) (COMMENT Ograve)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 213 R 26) (COMMENT Otilde)
+ (KRN D 218 R -26) (COMMENT Uacute)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 217 R -26) (COMMENT Ugrave)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C D)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 193 R -43) (COMMENT Aacute)
+ (KRN D 194 R -43) (COMMENT Acircumflex)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 192 R -43) (COMMENT Agrave)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 195 R -43) (COMMENT Atilde)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 211 R 26) (COMMENT Oacute)
+ (KRN D 212 R 26) (COMMENT Ocircumflex)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 210 R 26) (COMMENT Ograve)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 213 R 26) (COMMENT Otilde)
+ (KRN D 218 R -26) (COMMENT Uacute)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 217 R -26) (COMMENT Ugrave)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C F)
+ (KRN C A R -69)
+ (KRN C a R -35)
+ (KRN C c R -35)
+ (KRN D 44 R -52) (COMMENT comma)
+ (KRN C d R -35)
+ (KRN C e R -35)
+ (KRN C g R -35)
+ (KRN C o R -35)
+ (KRN D 46 R -52) (COMMENT period)
+ (KRN C q R -35)
+ (KRN C s R -35)
+ (KRN D 225 R -26) (COMMENT aacute)
+ (KRN D 226 R -17) (COMMENT acircumflex)
+ (KRN D 196 R -69) (COMMENT Adieresis)
+ (KRN D 228 R -17) (COMMENT adieresis)
+ (KRN D 29 R -35) (COMMENT AE)
+ (KRN D 26 R -35) (COMMENT ae)
+ (KRN D 224 R -17) (COMMENT agrave)
+ (KRN D 197 R -69) (COMMENT Aring)
+ (KRN D 229 R -17) (COMMENT aring)
+ (KRN D 227 R -17) (COMMENT atilde)
+ (KRN D 231 R -35) (COMMENT ccedilla)
+ (KRN D 233 R -26) (COMMENT eacute)
+ (KRN D 234 R -17) (COMMENT ecircumflex)
+ (KRN D 235 R -17) (COMMENT edieresis)
+ (KRN D 232 R -17) (COMMENT egrave)
+ (KRN D 243 R -26) (COMMENT oacute)
+ (KRN D 244 R -17) (COMMENT ocircumflex)
+ (KRN D 246 R -17) (COMMENT odieresis)
+ (KRN D 30 R -35) (COMMENT OE)
+ (KRN D 27 R -35) (COMMENT oe)
+ (KRN D 242 R -17) (COMMENT ograve)
+ (KRN D 28 R -35) (COMMENT oslash)
+ (KRN D 245 R -17) (COMMENT otilde)
+ (KRN D 154 R -17) (COMMENT scaron)
+ (STOP)
+
+ (LABEL C G)
+ (KRN C A R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C Y R -26)
+ (KRN D 193 R -26) (COMMENT Aacute)
+ (KRN D 194 R -26) (COMMENT Acircumflex)
+ (KRN D 196 R -26) (COMMENT Adieresis)
+ (KRN D 192 R -26) (COMMENT Agrave)
+ (KRN D 197 R -26) (COMMENT Aring)
+ (KRN D 195 R -26) (COMMENT Atilde)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C J)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (STOP)
+
+ (LABEL C K)
+ (KRN C C R -69)
+ (KRN C G R -69)
+ (KRN C O R -69)
+ (KRN C V R -35)
+ (KRN C v R -35)
+ (KRN C W R -35)
+ (KRN C w R -35)
+ (KRN C Y R -35)
+ (KRN D 199 R -69) (COMMENT Ccedilla)
+ (KRN D 214 R -69) (COMMENT Odieresis)
+ (KRN D 31 R -69) (COMMENT Oslash)
+ (KRN D 221 R -35) (COMMENT Yacute)
+ (KRN D 159 R -35) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C L)
+ (KRN D 34 R -69) (COMMENT quotedbl)
+ (KRN D 129 R -69) (COMMENT quotesingle)
+ (KRN C T R -69)
+ (KRN C V R -69)
+ (KRN C W R -69)
+ (KRN C Y R -52)
+ (KRN D 147 R -69) (COMMENT quotedblleft)
+ (KRN D 148 R -69) (COMMENT quotedblright)
+ (KRN D 96 R -69) (COMMENT quoteleft)
+ (KRN D 39 R -69) (COMMENT quoteright)
+ (KRN D 221 R -52) (COMMENT Yacute)
+ (KRN D 159 R -52) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C N)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 193 R -43) (COMMENT Aacute)
+ (KRN D 194 R -43) (COMMENT Acircumflex)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 192 R -43) (COMMENT Agrave)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 195 R -43) (COMMENT Atilde)
+ (STOP)
+
+ (LABEL C O)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 193 R -43) (COMMENT Aacute)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 192 R -43) (COMMENT Agrave)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 195 R -43) (COMMENT Atilde)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 211 R 26) (COMMENT Oacute)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 210 R 26) (COMMENT Ograve)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C P)
+ (KRN C A R -69)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 193 R -69) (COMMENT Aacute)
+ (KRN D 196 R -69) (COMMENT Adieresis)
+ (KRN D 197 R -69) (COMMENT Aring)
+ (STOP)
+
+ (LABEL C Q)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 218 R -26) (COMMENT Uacute)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 217 R -26) (COMMENT Ugrave)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C R)
+ (KRN C T R -43)
+ (KRN C V R -43)
+ (KRN C W R -43)
+ (KRN C Y R -43)
+ (KRN D 159 R -43) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C S)
+ (KRN C A R -35)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN D 193 R -35) (COMMENT Aacute)
+ (KRN D 194 R -35) (COMMENT Acircumflex)
+ (KRN D 196 R -35) (COMMENT Adieresis)
+ (KRN D 192 R -35) (COMMENT Agrave)
+ (KRN D 197 R -35) (COMMENT Aring)
+ (KRN D 195 R -35) (COMMENT Atilde)
+ (STOP)
+
+ (LABEL C T)
+ (KRN C A R -69)
+ (KRN C a R -35)
+ (KRN C c R -35)
+ (KRN D 44 R -52) (COMMENT comma)
+ (KRN C d R -35)
+ (KRN C e R -35)
+ (KRN C g R -35)
+ (KRN C o R -35)
+ (KRN D 46 R -52) (COMMENT period)
+ (KRN C q R -35)
+ (KRN C s R -35)
+ (KRN D 193 R -69) (COMMENT Aacute)
+ (KRN D 225 R -26) (COMMENT aacute)
+ (KRN D 194 R -69) (COMMENT Acircumflex)
+ (KRN D 226 R -17) (COMMENT acircumflex)
+ (KRN D 196 R -69) (COMMENT Adieresis)
+ (KRN D 228 R -17) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 192 R -69) (COMMENT Agrave)
+ (KRN D 224 R -17) (COMMENT agrave)
+ (KRN D 197 R -69) (COMMENT Aring)
+ (KRN D 229 R -17) (COMMENT aring)
+ (KRN D 195 R -69) (COMMENT Atilde)
+ (KRN D 227 R -17) (COMMENT atilde)
+ (KRN D 231 R -35) (COMMENT ccedilla)
+ (KRN D 233 R -26) (COMMENT eacute)
+ (KRN D 234 R -17) (COMMENT ecircumflex)
+ (KRN D 235 R -17) (COMMENT edieresis)
+ (KRN D 232 R -17) (COMMENT egrave)
+ (KRN D 243 R -26) (COMMENT oacute)
+ (KRN D 244 R -17) (COMMENT ocircumflex)
+ (KRN D 246 R -17) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -17) (COMMENT ograve)
+ (KRN D 28 R -35) (COMMENT oslash)
+ (KRN D 245 R -17) (COMMENT otilde)
+ (KRN D 154 R -17) (COMMENT scaron)
+ (STOP)
+
+ (LABEL C U)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 193 R -43) (COMMENT Aacute)
+ (KRN D 194 R -43) (COMMENT Acircumflex)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 192 R -43) (COMMENT Agrave)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 195 R -43) (COMMENT Atilde)
+ (STOP)
+
+ (LABEL C V)
+ (KRN C A R -113)
+ (KRN C a R -52)
+ (KRN C c R -52)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN C d R -52)
+ (KRN C e R -52)
+ (KRN C g R -52)
+ (KRN C o R -52)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN C q R -52)
+ (KRN C s R -52)
+ (KRN D 193 R -113) (COMMENT Aacute)
+ (KRN D 225 R -39) (COMMENT aacute)
+ (KRN D 194 R -113) (COMMENT Acircumflex)
+ (KRN D 226 R -26) (COMMENT acircumflex)
+ (KRN D 196 R -113) (COMMENT Adieresis)
+ (KRN D 228 R -26) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 192 R -113) (COMMENT Agrave)
+ (KRN D 224 R -26) (COMMENT agrave)
+ (KRN D 197 R -113) (COMMENT Aring)
+ (KRN D 229 R -26) (COMMENT aring)
+ (KRN D 195 R -113) (COMMENT Atilde)
+ (KRN D 227 R -26) (COMMENT atilde)
+ (KRN D 231 R -52) (COMMENT ccedilla)
+ (KRN D 233 R -39) (COMMENT eacute)
+ (KRN D 234 R -26) (COMMENT ecircumflex)
+ (KRN D 235 R -26) (COMMENT edieresis)
+ (KRN D 232 R -26) (COMMENT egrave)
+ (KRN D 243 R -39) (COMMENT oacute)
+ (KRN D 244 R -26) (COMMENT ocircumflex)
+ (KRN D 246 R -26) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -26) (COMMENT ograve)
+ (KRN D 28 R -52) (COMMENT oslash)
+ (KRN D 245 R -26) (COMMENT otilde)
+ (KRN D 154 R -26) (COMMENT scaron)
+ (STOP)
+
+ (LABEL C W)
+ (KRN C A R -113)
+ (KRN C a R -52)
+ (KRN C c R -52)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN C d R -52)
+ (KRN C e R -52)
+ (KRN C g R -52)
+ (KRN C o R -52)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN C q R -52)
+ (KRN C s R -52)
+ (KRN D 225 R -39) (COMMENT aacute)
+ (KRN D 226 R -26) (COMMENT acircumflex)
+ (KRN D 196 R -113) (COMMENT Adieresis)
+ (KRN D 228 R -26) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 224 R -26) (COMMENT agrave)
+ (KRN D 197 R -113) (COMMENT Aring)
+ (KRN D 229 R -26) (COMMENT aring)
+ (KRN D 227 R -26) (COMMENT atilde)
+ (KRN D 231 R -52) (COMMENT ccedilla)
+ (KRN D 233 R -39) (COMMENT eacute)
+ (KRN D 234 R -26) (COMMENT ecircumflex)
+ (KRN D 235 R -26) (COMMENT edieresis)
+ (KRN D 232 R -26) (COMMENT egrave)
+ (KRN D 243 R -39) (COMMENT oacute)
+ (KRN D 244 R -26) (COMMENT ocircumflex)
+ (KRN D 246 R -26) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -26) (COMMENT ograve)
+ (KRN D 28 R -52) (COMMENT oslash)
+ (KRN D 245 R -26) (COMMENT otilde)
+ (KRN D 154 R -26) (COMMENT scaron)
+ (STOP)
+
+ (LABEL C X)
+ (KRN C C R -69)
+ (KRN C G R -69)
+ (KRN C O R -69)
+ (KRN C V R -35)
+ (KRN C v R -35)
+ (KRN C W R -35)
+ (KRN C w R -35)
+ (KRN C Y R -35)
+ (KRN D 199 R -69) (COMMENT Ccedilla)
+ (KRN D 211 R -69) (COMMENT Oacute)
+ (KRN D 212 R -69) (COMMENT Ocircumflex)
+ (KRN D 214 R -69) (COMMENT Odieresis)
+ (KRN D 210 R -69) (COMMENT Ograve)
+ (KRN D 31 R -69) (COMMENT Oslash)
+ (KRN D 213 R -69) (COMMENT Otilde)
+ (KRN D 159 R -35) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL C Y)
+ (KRN C A R -113)
+ (KRN C a R -52)
+ (KRN C c R -52)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN C d R -52)
+ (KRN C e R -52)
+ (KRN C g R -52)
+ (KRN C o R -52)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN C q R -52)
+ (KRN C s R -52)
+ (KRN D 225 R -39) (COMMENT aacute)
+ (KRN D 226 R -26) (COMMENT acircumflex)
+ (KRN D 196 R -113) (COMMENT Adieresis)
+ (KRN D 228 R -26) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 224 R -26) (COMMENT agrave)
+ (KRN D 197 R -113) (COMMENT Aring)
+ (KRN D 229 R -26) (COMMENT aring)
+ (KRN D 227 R -26) (COMMENT atilde)
+ (KRN D 231 R -52) (COMMENT ccedilla)
+ (KRN D 233 R -39) (COMMENT eacute)
+ (KRN D 234 R -26) (COMMENT ecircumflex)
+ (KRN D 235 R -26) (COMMENT edieresis)
+ (KRN D 232 R -26) (COMMENT egrave)
+ (KRN D 243 R -39) (COMMENT oacute)
+ (KRN D 244 R -26) (COMMENT ocircumflex)
+ (KRN D 246 R -26) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -26) (COMMENT ograve)
+ (KRN D 28 R -52) (COMMENT oslash)
+ (KRN D 245 R -26) (COMMENT otilde)
+ (KRN D 154 R -26) (COMMENT scaron)
+ (STOP)
+
+ (LABEL D 96) (COMMENT quoteleft)
+ (LIG D 96 D 147) (COMMENT quoteleft) (COMMENT quotedblleft)
+ (KRN C A R -52)
+ (KRN D 196 R -52) (COMMENT Adieresis)
+ (KRN D 197 R -52) (COMMENT Aring)
+ (STOP)
+
+ (LABEL C e)
+ (KRN C V R -52)
+ (STOP)
+
+ (LABEL C f)
+ (LIG C f D 11) (COMMENT f_f)
+ (LIG C l D 8) (COMMENT f_l)
+ (LIG C i D 12) (COMMENT f_i)
+ (KRN D 42 R 35) (COMMENT asterisk)
+ (KRN D 147 R 26) (COMMENT quotedblleft)
+ (KRN D 148 R 26) (COMMENT quotedblright)
+ (KRN D 96 R 26) (COMMENT quoteleft)
+ (KRN D 39 R 26) (COMMENT quoteright)
+ (STOP)
+
+ (LABEL C k)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (STOP)
+
+ (LABEL C r)
+ (KRN D 44 R -35) (COMMENT comma)
+ (KRN D 46 R -35) (COMMENT period)
+ (STOP)
+
+ (LABEL C v)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (STOP)
+
+ (LABEL C w)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (STOP)
+
+ (LABEL D 128) (COMMENT Lslash)
+ (KRN D 34 R -69) (COMMENT quotedbl)
+ (KRN D 129 R -69) (COMMENT quotesingle)
+ (KRN C T R -55)
+ (KRN C V R -55)
+ (KRN C W R -55)
+ (KRN C Y R -42)
+ (KRN D 147 R -69) (COMMENT quotedblleft)
+ (KRN D 148 R -69) (COMMENT quotedblright)
+ (KRN D 96 R -69) (COMMENT quoteleft)
+ (KRN D 39 R -69) (COMMENT quoteright)
+ (KRN D 221 R -42) (COMMENT Yacute)
+ (KRN D 159 R -42) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL D 132) (COMMENT quotedblbase)
+ (KRN C T R -52)
+ (KRN C V R -69)
+ (KRN C W R -69)
+ (KRN C Y R -52)
+ (KRN D 159 R -52) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL D 138) (COMMENT Scaron)
+ (KRN C A R -35)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN D 196 R -35) (COMMENT Adieresis)
+ (KRN D 197 R -35) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 147) (COMMENT quotedblleft)
+ (KRN C A R -69)
+ (KRN D 196 R -69) (COMMENT Adieresis)
+ (KRN D 197 R -69) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 148) (COMMENT quotedblright)
+ (KRN C A R -69)
+ (KRN D 196 R -69) (COMMENT Adieresis)
+ (KRN D 197 R -69) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 150) (COMMENT endash)
+ (LIG D 45 D 151) (COMMENT hyphen) (COMMENT emdash)
+ (STOP)
+
+ (LABEL D 159) (COMMENT Ydieresis)
+ (KRN C A R -113)
+ (KRN C a R -52)
+ (KRN C c R -52)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN C d R -52)
+ (KRN C e R -52)
+ (KRN C g R -52)
+ (KRN C o R -52)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN C q R -52)
+ (KRN C s R -52)
+ (KRN D 225 R -39) (COMMENT aacute)
+ (KRN D 226 R -26) (COMMENT acircumflex)
+ (KRN D 196 R -113) (COMMENT Adieresis)
+ (KRN D 228 R -26) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 224 R -26) (COMMENT agrave)
+ (KRN D 197 R -113) (COMMENT Aring)
+ (KRN D 229 R -26) (COMMENT aring)
+ (KRN D 227 R -26) (COMMENT atilde)
+ (KRN D 231 R -52) (COMMENT ccedilla)
+ (KRN D 233 R -39) (COMMENT eacute)
+ (KRN D 234 R -26) (COMMENT ecircumflex)
+ (KRN D 235 R -26) (COMMENT edieresis)
+ (KRN D 232 R -26) (COMMENT egrave)
+ (KRN D 243 R -39) (COMMENT oacute)
+ (KRN D 244 R -26) (COMMENT ocircumflex)
+ (KRN D 246 R -26) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -26) (COMMENT ograve)
+ (KRN D 28 R -52) (COMMENT oslash)
+ (KRN D 245 R -26) (COMMENT otilde)
+ (KRN D 154 R -26) (COMMENT scaron)
+ (STOP)
+
+ (LABEL D 192) (COMMENT Agrave)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (STOP)
+
+ (LABEL D 193) (COMMENT Aacute)
+ (KRN C C R -35)
+ (KRN C c R -35)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C T R -113)
+ (KRN C t R -43)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (STOP)
+
+ (LABEL D 194) (COMMENT Acircumflex)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (STOP)
+
+ (LABEL D 195) (COMMENT Atilde)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (STOP)
+
+ (LABEL D 196) (COMMENT Adieresis)
+ (KRN C a R -35)
+ (KRN C b R -35)
+ (KRN C C R -35)
+ (KRN C c R -35)
+ (KRN C d R -35)
+ (KRN C e R -35)
+ (KRN C G R -35)
+ (KRN C J R -43)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C Q R -35)
+ (KRN C q R -35)
+ (KRN D 34 R -113) (COMMENT quotedbl)
+ (KRN D 129 R -113) (COMMENT quotesingle)
+ (KRN C s R -35)
+ (KRN C T R -113)
+ (KRN C t R -43)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C V R -113)
+ (KRN C v R -52)
+ (KRN C W R -113)
+ (KRN C w R -52)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (KRN D 228 R -35) (COMMENT adieresis)
+ (KRN D 229 R -35) (COMMENT aring)
+ (KRN D 199 R -35) (COMMENT Ccedilla)
+ (KRN D 231 R -35) (COMMENT ccedilla)
+ (KRN D 235 R -35) (COMMENT edieresis)
+ (KRN D 214 R -35) (COMMENT Odieresis)
+ (KRN D 246 R -35) (COMMENT odieresis)
+ (KRN D 31 R -35) (COMMENT Oslash)
+ (KRN D 28 R -35) (COMMENT oslash)
+ (KRN D 147 R -113) (COMMENT quotedblleft)
+ (KRN D 148 R -113) (COMMENT quotedblright)
+ (KRN D 96 R -113) (COMMENT quoteleft)
+ (KRN D 39 R -113) (COMMENT quoteright)
+ (KRN D 154 R -35) (COMMENT scaron)
+ (KRN D 219 R -52) (COMMENT Ucircumflex)
+ (KRN D 251 R -43) (COMMENT ucircumflex)
+ (KRN D 220 R -52) (COMMENT Udieresis)
+ (KRN D 252 R -43) (COMMENT udieresis)
+ (KRN D 159 R -113) (COMMENT Ydieresis)
+ (KRN D 255 R -26) (COMMENT ydieresis)
+ (STOP)
+
+ (LABEL D 197) (COMMENT Aring)
+ (KRN C a R -35)
+ (KRN C b R -35)
+ (KRN C C R -35)
+ (KRN C c R -35)
+ (KRN C d R -35)
+ (KRN C e R -35)
+ (KRN C G R -35)
+ (KRN C J R -43)
+ (KRN C O R -35)
+ (KRN C o R -35)
+ (KRN C Q R -35)
+ (KRN C q R -35)
+ (KRN D 34 R -113) (COMMENT quotedbl)
+ (KRN D 129 R -113) (COMMENT quotesingle)
+ (KRN C s R -35)
+ (KRN C T R -113)
+ (KRN C t R -43)
+ (KRN C U R -52)
+ (KRN C u R -43)
+ (KRN C V R -113)
+ (KRN C v R -52)
+ (KRN C W R -113)
+ (KRN C w R -52)
+ (KRN C Y R -113)
+ (KRN C y R -26)
+ (KRN D 228 R -35) (COMMENT adieresis)
+ (KRN D 229 R -35) (COMMENT aring)
+ (KRN D 199 R -35) (COMMENT Ccedilla)
+ (KRN D 231 R -35) (COMMENT ccedilla)
+ (KRN D 235 R -35) (COMMENT edieresis)
+ (KRN D 214 R -35) (COMMENT Odieresis)
+ (KRN D 246 R -35) (COMMENT odieresis)
+ (KRN D 31 R -35) (COMMENT Oslash)
+ (KRN D 28 R -35) (COMMENT oslash)
+ (KRN D 147 R -113) (COMMENT quotedblleft)
+ (KRN D 148 R -113) (COMMENT quotedblright)
+ (KRN D 96 R -113) (COMMENT quoteleft)
+ (KRN D 39 R -113) (COMMENT quoteright)
+ (KRN D 154 R -35) (COMMENT scaron)
+ (KRN D 219 R -52) (COMMENT Ucircumflex)
+ (KRN D 251 R -43) (COMMENT ucircumflex)
+ (KRN D 220 R -52) (COMMENT Udieresis)
+ (KRN D 252 R -43) (COMMENT udieresis)
+ (KRN D 159 R -113) (COMMENT Ydieresis)
+ (KRN D 255 R -26) (COMMENT ydieresis)
+ (STOP)
+
+ (LABEL D 199) (COMMENT Ccedilla)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL D 209) (COMMENT Ntilde)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 210) (COMMENT Ograve)
+ (KRN C A R -43)
+ (STOP)
+
+ (LABEL D 211) (COMMENT Oacute)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN C O R 26)
+ (STOP)
+
+ (LABEL D 214) (COMMENT Odieresis)
+ (KRN C A R -43)
+ (KRN C C R 26)
+ (KRN D 44 R -26) (COMMENT comma)
+ (KRN C G R 26)
+ (KRN C O R 26)
+ (KRN D 46 R -26) (COMMENT period)
+ (KRN C Q R 26)
+ (KRN C U R -26)
+ (KRN C V R -26)
+ (KRN C W R -26)
+ (KRN C X R -26)
+ (KRN C Y R -26)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (KRN D 199 R 26) (COMMENT Ccedilla)
+ (KRN D 214 R 26) (COMMENT Odieresis)
+ (KRN D 31 R 26) (COMMENT Oslash)
+ (KRN D 219 R -26) (COMMENT Ucircumflex)
+ (KRN D 220 R -26) (COMMENT Udieresis)
+ (KRN D 159 R -26) (COMMENT Ydieresis)
+ (STOP)
+
+ (LABEL D 217) (COMMENT Ugrave)
+ (KRN C A R -43)
+ (STOP)
+
+ (LABEL D 218) (COMMENT Uacute)
+ (KRN C A R -43)
+ (STOP)
+
+ (LABEL D 219) (COMMENT Ucircumflex)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 220) (COMMENT Udieresis)
+ (KRN C A R -43)
+ (KRN D 44 R -43) (COMMENT comma)
+ (KRN D 46 R -43) (COMMENT period)
+ (KRN D 196 R -43) (COMMENT Adieresis)
+ (KRN D 29 R -43) (COMMENT AE)
+ (KRN D 197 R -43) (COMMENT Aring)
+ (STOP)
+
+ (LABEL D 221) (COMMENT Yacute)
+ (KRN C c R -52)
+ (KRN D 225 R -39) (COMMENT aacute)
+ (KRN D 226 R -26) (COMMENT acircumflex)
+ (KRN D 228 R -26) (COMMENT adieresis)
+ (KRN D 29 R -113) (COMMENT AE)
+ (KRN D 26 R -52) (COMMENT ae)
+ (KRN D 224 R -26) (COMMENT agrave)
+ (KRN D 229 R -26) (COMMENT aring)
+ (KRN D 227 R -26) (COMMENT atilde)
+ (KRN D 233 R -39) (COMMENT eacute)
+ (KRN D 234 R -26) (COMMENT ecircumflex)
+ (KRN D 235 R -26) (COMMENT edieresis)
+ (KRN D 232 R -26) (COMMENT egrave)
+ (KRN D 243 R -39) (COMMENT oacute)
+ (KRN D 244 R -26) (COMMENT ocircumflex)
+ (KRN D 246 R -26) (COMMENT odieresis)
+ (KRN D 27 R -52) (COMMENT oe)
+ (KRN D 242 R -26) (COMMENT ograve)
+ (KRN D 245 R -26) (COMMENT otilde)
+ (KRN D 154 R -26) (COMMENT scaron)
+ (STOP)
+ )
+(CHARACTER D 1 (COMMENT Euro)
+ (CHARWD R 552)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER D 4 (COMMENT fraction)
+ (CHARWD R 166)
+ (CHARHT R 724)
+ (CHARDP R 12)
+ (CHARIC R 143)
+ )
+(CHARACTER D 5 (COMMENT dotaccent)
+ (CHARWD R 500)
+ (CHARHT R 642)
+ )
+(CHARACTER D 6 (COMMENT hungarumlaut)
+ (CHARWD R 500)
+ (CHARHT R 664)
+ )
+(CHARACTER D 7 (COMMENT ogonek)
+ (CHARWD R 500)
+ (CHARHT R 6)
+ (CHARDP R 216)
+ )
+(CHARACTER D 8 (COMMENT f_l)
+ (CHARWD R 554)
+ (CHARHT R 712)
+ )
+(CHARACTER D 10 (COMMENT cwm)
+ (CHARWD R 0)
+ )
+(CHARACTER D 11 (COMMENT f_f)
+ (CHARWD R 584)
+ (CHARHT R 712)
+ (CHARIC R 50)
+ )
+(CHARACTER D 12 (COMMENT f_i)
+ (CHARWD R 554)
+ (CHARHT R 712)
+ )
+(CHARACTER D 14 (COMMENT f_f_i)
+ (CHARWD R 846)
+ (CHARHT R 712)
+ )
+(CHARACTER D 15 (COMMENT f_f_l)
+ (CHARWD R 846)
+ (CHARHT R 712)
+ )
+(CHARACTER D 16 (COMMENT dotlessi)
+ (CHARWD R 262)
+ (CHARHT R 452)
+ )
+(CHARACTER D 17 (COMMENT dotlessj.dup)
+ (CHARWD R 262)
+ (CHARHT R 452)
+ (CHARDP R 209)
+ )
+(CHARACTER D 18 (COMMENT grave)
+ (CHARWD R 500)
+ (CHARHT R 664)
+ )
+(CHARACTER D 19 (COMMENT acute)
+ (CHARWD R 500)
+ (CHARHT R 664)
+ )
+(CHARACTER D 20 (COMMENT caron)
+ (CHARWD R 500)
+ (CHARHT R 664)
+ )
+(CHARACTER D 21 (COMMENT breve)
+ (CHARWD R 500)
+ (CHARHT R 656)
+ )
+(CHARACTER D 22 (COMMENT macron)
+ (CHARWD R 500)
+ (CHARHT R 598)
+ )
+(CHARACTER D 23 (COMMENT ring)
+ (CHARWD R 500)
+ (CHARHT R 662)
+ )
+(CHARACTER D 24 (COMMENT cedilla)
+ (CHARWD R 500)
+ (CHARHT R 6)
+ (CHARDP R 216)
+ )
+(CHARACTER D 25 (COMMENT germandbls)
+ (CHARWD R 572)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER D 26 (COMMENT ae)
+ (CHARWD R 702)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER D 27 (COMMENT oe)
+ (CHARWD R 799)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER D 28 (COMMENT oslash)
+ (CHARWD R 494)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER D 29 (COMMENT AE)
+ (CHARWD R 959)
+ (CHARHT R 700)
+ )
+(CHARACTER D 30 (COMMENT OE)
+ (CHARWD R 972)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER D 31 (COMMENT Oslash)
+ (CHARWD R 728)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER D 32 (COMMENT space)
+ (CHARWD R 270)
+ )
+(CHARACTER D 33 (COMMENT exclam)
+ (CHARWD R 218)
+ (CHARHT R 700)
+ (CHARDP R 6)
+ )
+(CHARACTER D 34 (COMMENT quotedbl)
+ (CHARWD R 278)
+ (CHARHT R 700)
+ )
+(CHARACTER D 35 (COMMENT numbersign)
+ (CHARWD R 580)
+ (CHARHT R 637)
+ )
+(CHARACTER D 36 (COMMENT dollar)
+ (CHARWD R 473)
+ (CHARHT R 700)
+ (CHARDP R 80)
+ )
+(CHARACTER D 37 (COMMENT percent)
+ (CHARWD R 722)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER D 38 (COMMENT ampersand)
+ (CHARWD R 728)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER D 39 (COMMENT quoteright)
+ (CHARWD R 204)
+ (CHARHT R 706)
+ )
+(CHARACTER D 40 (COMMENT parenleft)
+ (CHARWD R 268)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 41 (COMMENT parenright)
+ (CHARWD R 268)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 42 (COMMENT asterisk)
+ (CHARWD R 450)
+ (CHARHT R 722)
+ )
+(CHARACTER D 43 (COMMENT plus)
+ (CHARWD R 575)
+ (CHARHT R 486)
+ )
+(CHARACTER D 44 (COMMENT comma)
+ (CHARWD R 204)
+ (CHARHT R 109)
+ (CHARDP R 144)
+ )
+(CHARACTER D 45 (COMMENT hyphen)
+ (CHARWD R 306)
+ (CHARHT R 250)
+ )
+(CHARACTER D 46 (COMMENT period)
+ (CHARWD R 204)
+ (CHARHT R 110)
+ (CHARDP R 6)
+ )
+(CHARACTER D 47 (COMMENT slash)
+ (CHARWD R 302)
+ (CHARHT R 700)
+ (CHARDP R 160)
+ )
+(CHARACTER C 0
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER C 1
+ (CHARWD R 490)
+ (CHARHT R 678)
+ )
+(CHARACTER C 2
+ (CHARWD R 490)
+ (CHARHT R 678)
+ )
+(CHARACTER C 3
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER C 4
+ (CHARWD R 490)
+ (CHARHT R 666)
+ )
+(CHARACTER C 5
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER C 6
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER C 7
+ (CHARWD R 490)
+ (CHARHT R 666)
+ (CHARDP R 8)
+ )
+(CHARACTER C 8
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER C 9
+ (CHARWD R 490)
+ (CHARHT R 678)
+ (CHARDP R 12)
+ )
+(CHARACTER D 58 (COMMENT colon)
+ (CHARWD R 204)
+ (CHARHT R 446)
+ (CHARDP R 6)
+ )
+(CHARACTER D 59 (COMMENT semicolon)
+ (CHARWD R 204)
+ (CHARHT R 446)
+ (CHARDP R 144)
+ )
+(CHARACTER D 60 (COMMENT less)
+ (CHARWD R 562)
+ (CHARHT R 585)
+ (CHARDP R 85)
+ )
+(CHARACTER D 61 (COMMENT equal)
+ (CHARWD R 575)
+ (CHARHT R 366)
+ )
+(CHARACTER D 62 (COMMENT greater)
+ (CHARWD R 562)
+ (CHARHT R 585)
+ (CHARDP R 85)
+ )
+(CHARACTER D 63 (COMMENT question)
+ (CHARWD R 402)
+ (CHARHT R 700)
+ (CHARDP R 6)
+ )
+(CHARACTER D 64 (COMMENT at)
+ (CHARWD R 752)
+ (CHARHT R 700)
+ )
+(CHARACTER C A
+ (CHARWD R 641)
+ (CHARHT R 714)
+ )
+(CHARACTER C B
+ (CHARWD R 578)
+ (CHARHT R 700)
+ )
+(CHARACTER C C
+ (CHARWD R 618)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER C D
+ (CHARWD R 738)
+ (CHARHT R 700)
+ )
+(CHARACTER C E
+ (CHARWD R 560)
+ (CHARHT R 700)
+ )
+(CHARACTER C F
+ (CHARWD R 526)
+ (CHARHT R 700)
+ )
+(CHARACTER C G
+ (CHARWD R 715)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER C H
+ (CHARWD R 748)
+ (CHARHT R 700)
+ )
+(CHARACTER C I
+ (CHARWD R 318)
+ (CHARHT R 700)
+ )
+(CHARACTER C J
+ (CHARWD R 457)
+ (CHARHT R 700)
+ (CHARDP R 14)
+ )
+(CHARACTER C K
+ (CHARWD R 633)
+ (CHARHT R 700)
+ (CHARDP R 7)
+ )
+(CHARACTER C L
+ (CHARWD R 560)
+ (CHARHT R 700)
+ )
+(CHARACTER C M
+ (CHARWD R 816)
+ (CHARHT R 700)
+ )
+(CHARACTER C N
+ (CHARWD R 721)
+ (CHARHT R 700)
+ )
+(CHARACTER C O
+ (CHARWD R 728)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER C P
+ (CHARWD R 548)
+ (CHARHT R 700)
+ )
+(CHARACTER C Q
+ (CHARWD R 728)
+ (CHARHT R 714)
+ (CHARDP R 148)
+ )
+(CHARACTER C R
+ (CHARWD R 591)
+ (CHARHT R 700)
+ (CHARDP R 7)
+ )
+(CHARACTER C S
+ (CHARWD R 515)
+ (CHARHT R 714)
+ (CHARDP R 14)
+ )
+(CHARACTER C T
+ (CHARWD R 668)
+ (CHARHT R 700)
+ )
+(CHARACTER C U
+ (CHARWD R 660)
+ (CHARHT R 700)
+ (CHARDP R 12)
+ )
+(CHARACTER C V
+ (CHARWD R 651)
+ (CHARHT R 700)
+ (CHARDP R 14)
+ )
+(CHARACTER C W
+ (CHARWD R 1010)
+ (CHARHT R 700)
+ (CHARDP R 14)
+ )
+(CHARACTER C X
+ (CHARWD R 660)
+ (CHARHT R 700)
+ )
+(CHARACTER C Y
+ (CHARWD R 651)
+ (CHARHT R 700)
+ )
+(CHARACTER C Z
+ (CHARWD R 610)
+ (CHARHT R 700)
+ )
+(CHARACTER D 91 (COMMENT bracketleft)
+ (CHARWD R 202)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 92 (COMMENT backslash)
+ (CHARWD R 302)
+ (CHARHT R 700)
+ (CHARDP R 120)
+ )
+(CHARACTER D 93 (COMMENT bracketright)
+ (CHARWD R 202)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 94 (COMMENT circumflex)
+ (CHARWD R 500)
+ (CHARHT R 664)
+ )
+(CHARACTER D 95 (COMMENT underscore)
+ (CHARWD R 510)
+ (CHARDP R 120)
+ )
+(CHARACTER D 96 (COMMENT quoteleft)
+ (CHARWD R 204)
+ (CHARHT R 706)
+ )
+(CHARACTER C a
+ (CHARWD R 465)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C b
+ (CHARWD R 543)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER C c
+ (CHARWD R 453)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C d
+ (CHARWD R 543)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER C e
+ (CHARWD R 453)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C f
+ (CHARWD R 292)
+ (CHARHT R 712)
+ (CHARIC R 50)
+ )
+(CHARACTER C g
+ (CHARWD R 487)
+ (CHARHT R 452)
+ (CHARDP R 228)
+ )
+(CHARACTER C h
+ (CHARWD R 548)
+ (CHARHT R 712)
+ )
+(CHARACTER C i
+ (CHARWD R 262)
+ (CHARHT R 642)
+ )
+(CHARACTER C j
+ (CHARWD R 262)
+ (CHARHT R 642)
+ (CHARDP R 209)
+ )
+(CHARACTER C k
+ (CHARWD R 512)
+ (CHARHT R 712)
+ )
+(CHARACTER C l
+ (CHARWD R 262)
+ (CHARHT R 712)
+ )
+(CHARACTER C m
+ (CHARWD R 832)
+ (CHARHT R 452)
+ )
+(CHARACTER C n
+ (CHARWD R 548)
+ (CHARHT R 452)
+ )
+(CHARACTER C o
+ (CHARWD R 503)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C p
+ (CHARWD R 543)
+ (CHARHT R 452)
+ (CHARDP R 223)
+ )
+(CHARACTER C q
+ (CHARWD R 543)
+ (CHARHT R 452)
+ (CHARDP R 223)
+ )
+(CHARACTER C r
+ (CHARWD R 386)
+ (CHARHT R 452)
+ )
+(CHARACTER C s
+ (CHARWD R 394)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C t
+ (CHARWD R 288)
+ (CHARHT R 560)
+ (CHARDP R 12)
+ )
+(CHARACTER C u
+ (CHARWD R 531)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C v
+ (CHARWD R 475)
+ (CHARHT R 440)
+ )
+(CHARACTER C w
+ (CHARWD R 778)
+ (CHARHT R 452)
+ (CHARDP R 12)
+ )
+(CHARACTER C x
+ (CHARWD R 510)
+ (CHARHT R 440)
+ )
+(CHARACTER C y
+ (CHARWD R 497)
+ (CHARHT R 452)
+ (CHARDP R 240)
+ )
+(CHARACTER C z
+ (CHARWD R 400)
+ (CHARHT R 440)
+ )
+(CHARACTER D 123 (COMMENT braceleft)
+ (CHARWD R 292)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 124 (COMMENT bar)
+ (CHARWD R 490)
+ (CHARHT R 721)
+ (CHARDP R 221)
+ )
+(CHARACTER D 125 (COMMENT braceright)
+ (CHARWD R 292)
+ (CHARHT R 750)
+ (CHARDP R 250)
+ )
+(CHARACTER D 126 (COMMENT tilde)
+ (CHARWD R 500)
+ (CHARHT R 636)
+ )
+(CHARACTER D 127 (COMMENT dieresis)
+ (CHARWD R 500)
+ (CHARHT R 636)
+ )
+(CHARACTER D 128 (COMMENT Lslash)
+ (CHARWD R 578)
+ (CHARHT R 700)
+ )
+(CHARACTER D 129 (COMMENT quotesingle)
+ (CHARWD R 142)
+ (CHARHT R 700)
+ )
+(CHARACTER D 130 (COMMENT quotesinglbase)
+ (CHARWD R 204)
+ (CHARHT R 109)
+ (CHARDP R 144)
+ )
+(CHARACTER D 131 (COMMENT florin)
+ (CHARWD R 292)
+ (CHARHT R 712)
+ (CHARIC R 50)
+ )
+(CHARACTER D 132 (COMMENT quotedblbase)
+ (CHARWD R 360)
+ (CHARHT R 109)
+ (CHARDP R 144)
+ )
+(CHARACTER D 133 (COMMENT ellipsis)
+ (CHARWD R 592)
+ (CHARHT R 109)
+ (CHARDP R 6)
+ )
+(CHARACTER D 134 (COMMENT dagger)
+ (CHARWD R 440)
+ (CHARHT R 621)
+ (CHARDP R 216)
+ )
+(CHARACTER D 135 (COMMENT daggerdbl)
+ (CHARWD R 440)
+ (CHARHT R 621)
+ (CHARDP R 181)
+ )
+(CHARACTER D 137 (COMMENT perthousand)
+ (CHARWD R 1109)
+ (CHARHT R 712)
+ (CHARDP R 12)
+ )
+(CHARACTER D 138 (COMMENT Scaron)
+ (CHARWD R 515)
+ (CHARHT R 892)
+ (CHARDP R 14)
+ )
+(CHARACTER D 139 (COMMENT guilsinglleft)
+ (CHARWD R 236)
+ (CHARHT R 440)
+ )
+(CHARACTER D 141 (COMMENT Zcaron)
+ (CHARWD R 610)
+ (CHARHT R 892)
+ )
+(CHARACTER D 142 (COMMENT asciicircum)
+ (CHARWD R 510)
+ (CHARHT R 700)
+ )
+(CHARACTER D 143 (COMMENT minus)
+ (CHARWD R 575)
+ (CHARHT R 279)
+ )
+(CHARACTER D 144 (COMMENT lslash)
+ (CHARWD R 354)
+ (CHARHT R 712)
+ )
+(CHARACTER D 147 (COMMENT quotedblleft)
+ (CHARWD R 360)
+ (CHARHT R 706)
+ )
+(CHARACTER D 148 (COMMENT quotedblright)
+ (CHARWD R 360)
+ (CHARHT R 706)
+ )
+(CHARACTER D 149 (COMMENT bullet)
+ (CHARWD R 500)
+ (CHARHT R 438)
+ )
+(CHARACTER D 150 (COMMENT endash)
+ (CHARWD R 510)
+ (CHARHT R 250)
+ )
+(CHARACTER D 151 (COMMENT emdash)
+ (CHARWD R 764)
+ (CHARHT R 250)
+ )
+(CHARACTER D 153 (COMMENT trademark)
+ (CHARWD R 896)
+ (CHARHT R 700)
+ )
+(CHARACTER D 154 (COMMENT scaron)
+ (CHARWD R 394)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 155 (COMMENT guilsinglright)
+ (CHARWD R 236)
+ (CHARHT R 440)
+ )
+(CHARACTER D 157 (COMMENT zcaron)
+ (CHARWD R 400)
+ (CHARHT R 664)
+ )
+(CHARACTER D 158 (COMMENT asciitilde)
+ (CHARWD R 452)
+ (CHARHT R 290)
+ )
+(CHARACTER D 159 (COMMENT Ydieresis)
+ (CHARWD R 651)
+ (CHARHT R 876)
+ )
+(CHARACTER D 160 (COMMENT uni00A0)
+ (CHARWD R 270)
+ )
+(CHARACTER D 161 (COMMENT exclamdown)
+ (CHARWD R 218)
+ (CHARHT R 446)
+ (CHARDP R 260)
+ )
+(CHARACTER D 162 (COMMENT cent)
+ (CHARWD R 453)
+ (CHARHT R 520)
+ (CHARDP R 80)
+ )
+(CHARACTER D 163 (COMMENT sterling)
+ (CHARWD R 578)
+ (CHARHT R 700)
+ (CHARDP R 57)
+ )
+(CHARACTER D 164 (COMMENT currency)
+ (CHARWD R 604)
+ (CHARHT R 437)
+ )
+(CHARACTER D 165 (COMMENT yen)
+ (CHARWD R 660)
+ (CHARHT R 700)
+ )
+(CHARACTER D 166 (COMMENT brokenbar)
+ (CHARWD R 162)
+ (CHARHT R 700)
+ )
+(CHARACTER D 167 (COMMENT section)
+ (CHARWD R 428)
+ (CHARHT R 666)
+ (CHARDP R 154)
+ )
+(CHARACTER D 169 (COMMENT copyright)
+ (CHARWD R 752)
+ (CHARHT R 700)
+ )
+(CHARACTER D 170 (COMMENT ordfeminine)
+ (CHARWD R 308)
+ (CHARHT R 711)
+ )
+(CHARACTER D 171 (COMMENT guillemotleft)
+ (CHARWD R 383)
+ (CHARHT R 440)
+ )
+(CHARACTER D 172 (COMMENT logicalnot)
+ (CHARWD R 650)
+ (CHARHT R 404)
+ )
+(CHARACTER D 173 (COMMENT uni00AD)
+ (CHARWD R 306)
+ (CHARHT R 250)
+ )
+(CHARACTER D 174 (COMMENT registered)
+ (CHARWD R 752)
+ (CHARHT R 700)
+ )
+(CHARACTER D 176 (COMMENT degree)
+ (CHARWD R 338)
+ (CHARHT R 672)
+ )
+(CHARACTER D 177 (COMMENT plusminus)
+ (CHARWD R 575)
+ (CHARHT R 486)
+ (CHARDP R 58)
+ )
+(CHARACTER D 178 (COMMENT two.superior)
+ (CHARWD R 324)
+ (CHARHT R 791)
+ )
+(CHARACTER D 179 (COMMENT three.superior)
+ (CHARWD R 324)
+ (CHARHT R 791)
+ )
+(CHARACTER D 181 (COMMENT uni00B5)
+ (CHARWD R 510)
+ (CHARHT R 440)
+ (CHARDP R 216)
+ )
+(CHARACTER D 182 (COMMENT paragraph)
+ (CHARWD R 442)
+ (CHARHT R 700)
+ )
+(CHARACTER D 183 (COMMENT periodcentered)
+ (CHARWD R 204)
+ (CHARHT R 320)
+ )
+(CHARACTER D 185 (COMMENT one.superior)
+ (CHARWD R 324)
+ (CHARHT R 791)
+ )
+(CHARACTER D 186 (COMMENT ordmasculine)
+ (CHARWD R 317)
+ (CHARHT R 711)
+ )
+(CHARACTER D 187 (COMMENT guillemotright)
+ (CHARWD R 383)
+ (CHARHT R 440)
+ )
+(CHARACTER D 188 (COMMENT onequarter)
+ (CHARWD R 735)
+ (CHARHT R 724)
+ (CHARDP R 12)
+ )
+(CHARACTER D 189 (COMMENT onehalf)
+ (CHARWD R 735)
+ (CHARHT R 724)
+ (CHARDP R 12)
+ )
+(CHARACTER D 190 (COMMENT threequarters)
+ (CHARWD R 735)
+ (CHARHT R 724)
+ (CHARDP R 12)
+ )
+(CHARACTER D 191 (COMMENT questiondown)
+ (CHARWD R 454)
+ (CHARHT R 446)
+ (CHARDP R 260)
+ )
+(CHARACTER D 192 (COMMENT Agrave)
+ (CHARWD R 641)
+ (CHARHT R 892)
+ )
+(CHARACTER D 193 (COMMENT Aacute)
+ (CHARWD R 641)
+ (CHARHT R 892)
+ )
+(CHARACTER D 194 (COMMENT Acircumflex)
+ (CHARWD R 641)
+ (CHARHT R 892)
+ )
+(CHARACTER D 195 (COMMENT Atilde)
+ (CHARWD R 641)
+ (CHARHT R 876)
+ )
+(CHARACTER D 196 (COMMENT Adieresis)
+ (CHARWD R 641)
+ (CHARHT R 876)
+ )
+(CHARACTER D 197 (COMMENT Aring)
+ (CHARWD R 641)
+ (CHARHT R 902)
+ )
+(CHARACTER D 199 (COMMENT Ccedilla)
+ (CHARWD R 618)
+ (CHARHT R 714)
+ (CHARDP R 216)
+ )
+(CHARACTER D 200 (COMMENT Egrave)
+ (CHARWD R 560)
+ (CHARHT R 892)
+ )
+(CHARACTER D 201 (COMMENT Eacute)
+ (CHARWD R 560)
+ (CHARHT R 892)
+ )
+(CHARACTER D 202 (COMMENT Ecircumflex)
+ (CHARWD R 560)
+ (CHARHT R 892)
+ )
+(CHARACTER D 203 (COMMENT Edieresis)
+ (CHARWD R 560)
+ (CHARHT R 876)
+ )
+(CHARACTER D 204 (COMMENT Igrave)
+ (CHARWD R 318)
+ (CHARHT R 892)
+ )
+(CHARACTER D 205 (COMMENT Iacute)
+ (CHARWD R 318)
+ (CHARHT R 892)
+ )
+(CHARACTER D 206 (COMMENT Icircumflex)
+ (CHARWD R 318)
+ (CHARHT R 892)
+ )
+(CHARACTER D 207 (COMMENT Idieresis)
+ (CHARWD R 318)
+ (CHARHT R 876)
+ )
+(CHARACTER D 208 (COMMENT Eth)
+ (CHARWD R 738)
+ (CHARHT R 700)
+ )
+(CHARACTER D 209 (COMMENT Ntilde)
+ (CHARWD R 721)
+ (CHARHT R 876)
+ )
+(CHARACTER D 210 (COMMENT Ograve)
+ (CHARWD R 728)
+ (CHARHT R 892)
+ (CHARDP R 14)
+ )
+(CHARACTER D 211 (COMMENT Oacute)
+ (CHARWD R 728)
+ (CHARHT R 892)
+ (CHARDP R 14)
+ )
+(CHARACTER D 212 (COMMENT Ocircumflex)
+ (CHARWD R 728)
+ (CHARHT R 892)
+ (CHARDP R 14)
+ )
+(CHARACTER D 213 (COMMENT Otilde)
+ (CHARWD R 728)
+ (CHARHT R 876)
+ (CHARDP R 14)
+ )
+(CHARACTER D 214 (COMMENT Odieresis)
+ (CHARWD R 728)
+ (CHARHT R 876)
+ (CHARDP R 14)
+ )
+(CHARACTER D 215 (COMMENT multiply)
+ (CHARWD R 575)
+ (CHARHT R 486)
+ )
+(CHARACTER D 217 (COMMENT Ugrave)
+ (CHARWD R 660)
+ (CHARHT R 892)
+ (CHARDP R 12)
+ )
+(CHARACTER D 218 (COMMENT Uacute)
+ (CHARWD R 660)
+ (CHARHT R 892)
+ (CHARDP R 12)
+ )
+(CHARACTER D 219 (COMMENT Ucircumflex)
+ (CHARWD R 660)
+ (CHARHT R 892)
+ (CHARDP R 12)
+ )
+(CHARACTER D 220 (COMMENT Udieresis)
+ (CHARWD R 660)
+ (CHARHT R 876)
+ (CHARDP R 12)
+ )
+(CHARACTER D 221 (COMMENT Yacute)
+ (CHARWD R 651)
+ (CHARHT R 892)
+ )
+(CHARACTER D 222 (COMMENT Thorn)
+ (CHARWD R 548)
+ (CHARHT R 700)
+ )
+(CHARACTER D 224 (COMMENT agrave)
+ (CHARWD R 465)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 225 (COMMENT aacute)
+ (CHARWD R 465)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 226 (COMMENT acircumflex)
+ (CHARWD R 465)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 227 (COMMENT atilde)
+ (CHARWD R 465)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 228 (COMMENT adieresis)
+ (CHARWD R 465)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 229 (COMMENT aring)
+ (CHARWD R 465)
+ (CHARHT R 662)
+ (CHARDP R 12)
+ )
+(CHARACTER D 231 (COMMENT ccedilla)
+ (CHARWD R 446)
+ (CHARHT R 452)
+ (CHARDP R 216)
+ )
+(CHARACTER D 232 (COMMENT egrave)
+ (CHARWD R 453)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 233 (COMMENT eacute)
+ (CHARWD R 453)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 234 (COMMENT ecircumflex)
+ (CHARWD R 453)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 235 (COMMENT edieresis)
+ (CHARWD R 453)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 236 (COMMENT igrave)
+ (CHARWD R 262)
+ (CHARHT R 664)
+ )
+(CHARACTER D 237 (COMMENT iacute)
+ (CHARWD R 262)
+ (CHARHT R 664)
+ (CHARIC R 9)
+ )
+(CHARACTER D 238 (COMMENT icircumflex)
+ (CHARWD R 262)
+ (CHARHT R 664)
+ (CHARIC R 19)
+ )
+(CHARACTER D 239 (COMMENT idieresis)
+ (CHARWD R 262)
+ (CHARHT R 636)
+ )
+(CHARACTER D 240 (COMMENT eth)
+ (CHARWD R 494)
+ (CHARHT R 700)
+ (CHARDP R 12)
+ )
+(CHARACTER D 241 (COMMENT ntilde)
+ (CHARWD R 548)
+ (CHARHT R 636)
+ )
+(CHARACTER D 242 (COMMENT ograve)
+ (CHARWD R 503)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 243 (COMMENT oacute)
+ (CHARWD R 503)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 244 (COMMENT ocircumflex)
+ (CHARWD R 503)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 245 (COMMENT otilde)
+ (CHARWD R 503)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 246 (COMMENT odieresis)
+ (CHARWD R 503)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 247 (COMMENT divide)
+ (CHARWD R 575)
+ (CHARHT R 525)
+ )
+(CHARACTER D 249 (COMMENT ugrave)
+ (CHARWD R 531)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 250 (COMMENT uacute)
+ (CHARWD R 531)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 251 (COMMENT ucircumflex)
+ (CHARWD R 531)
+ (CHARHT R 664)
+ (CHARDP R 12)
+ )
+(CHARACTER D 252 (COMMENT udieresis)
+ (CHARWD R 531)
+ (CHARHT R 636)
+ (CHARDP R 12)
+ )
+(CHARACTER D 253 (COMMENT yacute)
+ (CHARWD R 497)
+ (CHARHT R 664)
+ (CHARDP R 240)
+ )
+(CHARACTER D 254 (COMMENT thorn)
+ (CHARWD R 534)
+ (CHARHT R 712)
+ (CHARDP R 216)
+ )
+(CHARACTER D 255 (COMMENT ydieresis)
+ (CHARWD R 497)
+ (CHARHT R 636)
+ (CHARDP R 240)
+ )
diff --git a/Build/source/texk/lcdf-typetools/tests/Fon.post b/Build/source/texk/lcdf-typetools/tests/Fon.post
new file mode 100644
index 00000000000..4a35ff18086
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Fon.post
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/Fon.t42 b/Build/source/texk/lcdf-typetools/tests/Fon.t42
new file mode 100644
index 00000000000..67f897d09b8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/Fon.t42
@@ -0,0 +1,290 @@
+%!PS-TrueTypeFont-65536-65536-1
+%%VMusage: 0 0
+11 dict begin
+/FontName /FonetikaDaniaIwonaeBold def
+/FontType 42 def
+/FontMatrix [1 0 0 1 0 0] def
+/FontBBox [-0.055 -0.25 0.736 0.75] readonly def
+/PaintType 0 def
+/XUID [42 16#A2A74B 16#88F845 16#BE52B5 16#487F27 16#DBDB70 16#2] def
+/FontInfo 10 dict dup begin
+/version (Version 001.000 ) readonly def
+/Copyright (Created by Palle J\303\270rgensen, with FontForge 1.0 \(http://fontforge.sf.net\)
+The License is GUST Font Nosource License. ) readonly def
+/FullName (Fonitika Dania Iwonae Bold) readonly def
+/FamilyName (FonetikaDaniaIwonae) readonly def
+/Weight (Bold) readonly def
+/isFixedPitch false def
+/ItalicAngle 0 def
+/UnderlinePosition -0.125 def
+/UnderlineThickness 0.05 def
+end readonly def
+/Encoding 256 array
+0 1 255{1 index exch/.notdef put}for
+dup 44 /comma put
+dup 46 /period put
+dup 48 /zero put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 73 /I put
+dup 78 /N put
+dup 82 /R put
+dup 83 /S put
+dup 91 /bracketleft put
+dup 93 /bracketright put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 121 /y put
+dup 124 /bar put
+dup 197 /Aring put
+dup 198 /AE put
+dup 216 /Oslash put
+dup 229 /aring put
+dup 230 /ae put
+dup 240 /eth put
+dup 246 /odieresis put
+dup 248 /oslash put
+readonly def
+/sfnts[
+<000100000008008000030000636D6170987C27580000008C000001E263767420002102790000
+027000000004676C7966D5ED745400000274000013B268656164E449F9E70000162800000036
+6868656105F4014F0000166000000024686D74784EA5093100001684000000CA6C6F6361707E
+755300001750000000686D6178700079007B000017B80000002000>
+<00000003000000030000001C00010000000000DC000300010000001C000400C00000002C0020
+0004000C002C002E003000450049004E0053005B005D007000770079007C00C600D800E600F0
+00F600F8014B2019FFFF0000002C002E003000410049004E0052005B005D006100720079007C
+00C500D800E500F000F600F8014B2019FFFFFFD8FFD7FFD6FFC6FFC3FFBFFFBCFFB5FFB4FFB1
+FFB0FFAFFFADFF66FF55FF49FF40FF3BFF3AFEDFDFEA00010000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000010600000100
+3000000000000102000000020000000000000000000000000000000100000000000000000000
+000000000400050006000000000000000000000000000000000708090A0B0000000C00000000
+0D0000000E0F0000000000000010001100000012131415161718191A1B1C1D1E1F2021002223
+242526270028000029000000002B000000000000000000002E00000000000000000000000000
+31000000000000000000000000000000000000002C2D00000000000000000000000000002F32
+0000000000000000000000000000000000000000000300000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000>
+<0021027900>
+<000200210000016E029A00030007002EB101002F3CB2070400ED32B10605DC3CB2030200ED32
+00B103002F3CB2050400ED32B2070601FC3CB2010200ED32331121112521112121014DFED401
+0BFEF5029AFD662102580001006801C7012E02BC00050000010607233637012E1D6D3C3C1C02
+BC886D767F0000010067FF0600AF00640003000017231133AF4848FA015E00010036014000B8
+01C2000F000013140706232227263534373633321716B8240D10281207240D10281207018128
+1207240D10281207240D0002000EFF62011500A20007000F0000250623223736333207362322
+07063332010D227B7B21227C7B7C1821211918212202A0A0A0A07373730000020034FFFE0228
+01EA00290037000025061716173217160F010623262706272627263534373637363332171617
+3637363B0132171607060706073635362726070607141716373601AD1301071E050303010C02
+084912414B5A2915061E603B3D55210302121B02063C06030304421B0F560901485127090136
+382B12E534342E040403053808014D4F01014E2A391E1E89482B4F0507222A05050505693D22
+171730640101B52B215101014F2200030034FFFE02E00299000B003500430000012315233523
+35333533153301061716173217160F0106232627062726272635343736373633321716173637
+363B0132171607060706073635362726070607141716373602E08A208A8A208AFECD1301071E
+050303010C02084912414B5A2915061E603B3D55210302121B02063C06030304421B0F560901
+485127090136382B1201EF8A8A208A8AFED634342E040403053808014D4F01014E2A391E1E89
+482B4F0507222A05050505693D22171730640101B52B215101014F2200030027FFF601E70297
+001F002F003F0000371633323736373627262322070607373637363332171607060706232227
+26270106070623222726373637363332171617060706232227263736373633321716331A5B31
+26130B1A260C134A3009090D2E490A0B68261B131C5F3A4547210804010808250D0D230A0403
+08250D0D230A04B307240E0D240A040308250D0E230904825052283578290E360A0C3C400A02
+543E59844027360C0E02162410061F0C0F2610051F0D0F241006200C0E260F061F0D00020037
+FFF6022D02BC001E002C00000107160702070623222726373633321736270727372623220737
+36333217370326272207060706171633323736022D422520367031406A271C1331B8421B1402
+58206B1329534A0D4A534B2B3C951E3F371D060A1A280D14462E0B0276226299FEFF441E543E
+59EB37672D2D2D3720363C363820FEB5340369172F78290EA42A0002003EFFF601C201CC0016
+001D00003733362726232207373633321716070607062322272637170617163332374AFA1302
+032E48460D454A602218131D5B353E602218137019320506431BEB5A172E253C2B543E598640
+25543E59267D0B0189000002000DFF110125029E000F001F0000170623222726371333030617
+1633323713060706232227263736373633321716B23931370401077671760D0F040614186708
+261010260C05030927100F260C05CB244B1B21022AFDD63A09020E02FC271208210F11281207
+210F0001002BFF5D01CE01CC0023000005060706232227262737161716333237363713362726
+2322070323133307363332171607017F11341B1D372603040A0E1A0403221102024B0A19090B
+252E48705F710F513F39130B091C4D26144806082C3A050135080801612E11063AFEB001C247
+5139232B0001002B0000017801C9000F0000371633323713330323370607062322273D121729
+3742705F711137280B0C0C0C5F0C3F0137FE3E4F460C04070001000CFF10019901CC00330000
+050607062322273716333237343F01062322273716333237363F013627262726373637363332
+1707262322070607061716171607013D17380C0D2E25090D10150E021A1D1E58480D47582818
+0703010B485D1007050F472F344D3C0D3C4D23150602083E66100605696C16052A2C143B0208
+6809243C24220A0A05341E262D1418482A1C243C2423090A2A1B2B35151800010024FF0600CE
+02EE000700001723113315231133CEAAAA6868FA03E83CFC900000010024FF0600CE02EE0007
+00001723353311233533CEAA6868AAFA3C03703C00020039FFF601E801CC000E001B00002123
+370623223736373633321737330726232207060706171633323701897109433A903328761719
+332D03707E1E203A1D070D170B0A2222282B35EBC222071A10400E5E18396D2220280002002B
+FFF601DA02BC000E001B00002506070623222707231333033633320736272623220703163332
+373601CD2B7B1415342A057095703E433A8FAC170B0A22202A3E1D213B1D08E1C91D051F1502
+BCFEDB35EB6D222028FEDD13651800010027FFF6019D01CC001F000037163332373637362726
+23220706073736373633321716070607062322272627331A5B3126130B1A260C134A3009090D
+2E490A0B68261B131C5F3A4547210804825052283578290E360A0C3C400A02543E5984402736
+0C0E00020039FFF6021E02BC000E001B00002123370623223736373633321713330326232207
+060706171633323701897109433A903328761719332D3871B41E203A1D070D170B0A2222282B
+35EBC222071A010AFEC60E5E18396D2220280002003EFFF601C201CC0016001D000025230617
+163332370706232227263736373633321716072736272623220701B6FA1302032E48460D454A
+602218131D5B353E602218137019320506431BD75A172E253C2B543E59864025543E59267D0B
+0189000100330000019802C6001700000126232207060F013307230323132337333736373633
+3217018F1B1E241202011A3A0C3B537053380C381B11341B1E3C31026E163906067D3CFE7A01
+863C7D4D26142C0000020039FF1001E801CC001A00270000050607062322273716333237363F
+0106232237363736333217373307262322070607061716333237017C133F282E4E470A2E3634
+1E080515433A903328761719332D03707E1E203A1D070D170B0A2222283C5D35222A2C144914
+156735EBC222071A10400E5E18396D2220280001002B000001CE02BC00130000212313362726
+2322070323133303363332171607018571450A19090B252E4870957044513F39130B0901452E
+11063AFEB002BCFEBF5139232B000002003BFFF60122029E000F001F00003706232227263713
+330306171633323713060706232227263736373633321716E03931370401074571450D0F0406
+14183608261010260C05030927100F260C051A244B1B210145FEBB3A09020E0217271208210F
+11281207210F0002FFC9FF100127029E000F001F000017060706232227371633323734371333
+370607062322272637363736333217168417380C0D2E25090D10150E0276702B08261010260C
+05030927100F260C05696C16052A2C143B0208022B9B271208210F11281207210F000001002B
+000001F202BC000A00002123270723133303373307019D735B347095705ED44CBDF4F402BCFE
+46C0AB000001003FFFF6013002BC000F000037062322272637133303061716333237E4393137
+0401077B707A0D0F040614181A244B1B21023FFDC13A09020E000001002B0000026B01CC0024
+0000212313362322070607032313362322070607032313330736333217161736373633321716
+07022171450F221F1D02024571450F221720010348705F710F4337320C010128440C0C360905
+08014545291408FEBB014545300304FEAD01C247513B08083D0C024120260001002B000001CE
+01CC001300002123133627262322070323133307363332171607018571450A19090B252E4870
+5F710F513F39130B0901452E11063AFEB001C2475139232B0002003CFFF601C301CC000F0019
+0000250607062322272637363736333217160736232207060706173201B92A8A1A1D8B06020C
+298A1B1D8A06028325413F250101254041E1C32206882B38C322068A2A37AFA50505AB040002
+FFF6FF1A01D601CC000E001B0000250607062322270723133307363332073627262322070316
+3332373601C92B7B1415322D3570907109433A8FAC170B0A22202A3F1E213B1D08E1C91D051A
+F602A82B35EB6D222028FED80E6518000001002B0000017801C9000F00000126232207032313
+330736373633321701661217293742705F711137280B0C0C0C016A0C3FFEC901C24F460C0407
+0001000CFFF6019901CC00250000250607062322273716333237363736272627263736373633
+32170726232207060706171617160170104B323758480D4758281808030C495D1007050F472F
+344D3C0D3C4D23150602093F661006884A2B1D243C24220C0D351D262D1418482A1C243C2423
+090A2B1A2B35150000010044FFF6013602580017000037062322373637132337323736373307
+3307230306173237DE362F3C080105392E0B42270C074420350C36380F161113232D5E141501
+09375E1D20963CFEF74203170001003DFFF601E001C200130000212337062322272637133303
+06171633323713330181710F4F4139130B094571450A19090B24304770475139232B0145FEBB
+2E11063A015000010052000001C401C20006000001032303331B0101C4EB5E29681EAE01C2FE
+3E01C2FEB5014B000001005A0000027601C2000C00000103230B012303331B01331B010276D0
+5C097C5C0F660A8D4A0A8D01C2FE3E010DFEF301C2FECF0131FECF0131000001003DFF1001E0
+01C2001F0000050607062322273716333237363F010623222726371333030617163332371333
+0174153D2328493F0A2630391A0101184C4139130B094571450A19090B252B4B703C64331D2A
+2C14680505734139232B0145FEBB2E11062B015F00010066019000AF02EE0003000013231333
+AE4801480190015E0001002BFF5D01CE01CC0023000005060706232227262737161716333237
+3637133627262322070323133307363332171607017F11341B1D372603040A0E1A0403221102
+024B0A19090B252E48705F710F513F39130B091C4D26144806082C3A050135080801612E1106
+3AFEB001C2475139232B0004002FFFF601CA02B1001C00290039004900002123370623222726
+37363736333217373627262322073736333217160F0137262322070607061716333213060706
+2322272637363736333217160736272623220706070617163332373601896E09443B5A160A09
+1556262C342E030F200F153C420A60544619110D951921202D1E0B050B1F0E12249D0A2D1717
+2E1109050A2E17172E11092E071907091E110502061907091E11052D3746222D6224101B1245
+1F0E222C3846313DBB790F32131535190B022B2F190C2715182F190C2715181D0C031D07081D
+0C031D0700030039FFF601E8028A000F001E002B000001140706232227263534373633321716
+132337062322373637363332173733072623220706070617163332370185240D10281207240D
+10281207047109433A903328761719332D03707E1E203A1D070D170B0A222228024928120724
+0D10281207240DFDA72B35EBC222071A10400E5E18396D2220280004003CFFF601E70297000F
+0019002900390000250607062322272637363736333217160736232207060706173213060706
+2322272637363736333217161706070623222726373637363332171601B92A8A1A1D8B06020C
+298A1B1D8A06028325413F2501012540411408250D0D230A040308250D0D230A04B307240E0D
+240A040308250D0E230904E1C32206882B38C322068A2A37AFA50505AB04022A2410061F0C0F
+2610051F0D0F241006200C0E260F061F0D0000040039FFF601E802B1000E001B002B003B0000
+2123370623223736373633321737330726232207060706171633323713060706232227263736
+3736333217160736272623220706070617163332373601897109433A903328761719332D0370
+7E1E203A1D070D170B0A222228800A2F16172E1108050A2E17172E11082D0717080A1F110402
+061907091E11042B35EBC222071A10400E5E18396D222028020330180C2715182F190C271518
+1C0C041E07071D0C031C080000030031FFF602BE01CC0022002F003600002523061716333237
+0706232227072337062322373637363332173733073633321716072526232207060706171633
+32372536272623220702B2FA1302032E48460D454A291F017109433A903328761719332D0370
+01272860221813FEAD1E203A1D070D170B0A222228012219320506431BD75A172E253C2B1107
+2B35EBC222071A100711543E59A10E5E18396D222028AD7D0B01890000020037FFF6022D02BC
+001E002C00000107160702070623222726373633321736270727372623220737363332173703
+26272207060706171633323736022D422520367031406A271C1331B8421B140258206B132953
+4A0D4A534B2B3C951E3F371D060A1A280D14462E0B0276226299FEFF441E543E59EB37672D2D
+2D3720363C363820FEB5340369172F78290EA42A0004003CFFF601E70297000F001900290039
+0000250607062322272637363736333217160736232207060706173213060706232227263736
+3736333217161706070623222726373637363332171601B92A8A1A1D8B06020C298A1B1D8A06
+028325413F2501012540411408250D0D230A040308250D0D230A04B307240E0D240A04030825
+0D0E230904E1C32206882B38C322068A2A37AFA50505AB04022A2410061F0C0F2610051F0D0F
+241006200C0E260F061F0D000003000BFFC901F401F90015001E002500002506070623222707
+23372637363736333217373307162726232207060706073736370716333201B92A8A1A1D2C20
+2C4B49271A298A1B1D2C1F2C4B49288C09193F25010106038B070191091941E1C322060F3C63
+3C79C322060F3C633D1B1CA505051C15312C05C41C0000000000000000>
+<00010000000100003F7D89BA5F0F3CF5000B03E800000000C1405B8700000000C1405B87FFC9
+FF0602E002EE00010008000200000000000000>
+<0001000002EEFF06005A02C2FFC9FF5402E000010000000000000000000000000000003200>
+<01B0002100000000014D000000EE00680116006700EE00360126000E01EB00340233003401CA
+002701E0003701C6003E0103000D01D6002B013E002B018C000C00F2002400F2002401DE0039
+01DE002B01CA002701DE003901C6003E0103003301DE003901D6002B0100003B00F0FFC901BA
+002B0104003F0272002B01D6002B01CA003C01DAFFF6013E002B018C000C0104004401D6003D
+01820052023B005A01D6003D0116006601D6002B01DE002F01DE003901CA003C01DE003902C2
+003101E0003701CA003C000B000000>
+<0000002B002B002B003C00480064008100D8013E01A001E80219024E028802A502F403050315
+0342037103A403D20403042C046A048E04C304F7050E052C0567058A05B605E5060306400668
+068B069F06BD06F106FE073807A707EB084608A208F6093E099909D700>
+<000100000033004A000400000000000200000001000100000040002E0000000000>
+] def
+/CharStrings 51 dict dup begin
+/.notdef 0 def
+/.null 1 def
+/nonmarkingreturn 2 def
+/quoteright 3 def
+/comma 4 def
+/period 5 def
+/zero 6 def
+/A 7 def
+/B 8 def
+/C 9 def
+/D 10 def
+/E 11 def
+/I 12 def
+/N 13 def
+/R 14 def
+/S 15 def
+/bracketleft 16 def
+/bracketright 17 def
+/a 18 def
+/b 19 def
+/c 20 def
+/d 21 def
+/e 22 def
+/f 23 def
+/g 24 def
+/h 25 def
+/i 26 def
+/j 27 def
+/k 28 def
+/l 29 def
+/m 30 def
+/n 31 def
+/o 32 def
+/p 33 def
+/r 34 def
+/s 35 def
+/t 36 def
+/u 37 def
+/v 38 def
+/w 39 def
+/y 40 def
+/bar 41 def
+/eng 42 def
+/Aring 43 def
+/AE 44 def
+/Oslash 45 def
+/aring 46 def
+/ae 47 def
+/eth 48 def
+/odieresis 49 def
+/oslash 50 def
+end readonly def
+FontName currentdict end definefont pop
diff --git a/Build/source/texk/lcdf-typetools/tests/FonetikaDaniaIwonaeBold.ttf b/Build/source/texk/lcdf-typetools/tests/FonetikaDaniaIwonaeBold.ttf
new file mode 100644
index 00000000000..5c1f4b6ca3b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/FonetikaDaniaIwonaeBold.ttf
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/antpolt-regular.otf b/Build/source/texk/lcdf-typetools/tests/antpolt-regular.otf
new file mode 100644
index 00000000000..6ef78a116d0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/antpolt-regular.otf
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/t1.test b/Build/source/texk/lcdf-typetools/tests/t1.test
new file mode 100755
index 00000000000..1c282ef8ccf
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/t1.test
@@ -0,0 +1,58 @@
+#! /bin/sh -vx
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2012 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+failed=
+
+rm -rf uhv*
+
+$LCDF_TYPETOOLS_TREE/t1dotlessj/t1dotlessj -a $srcdir/tests/uhvrrc8a.pfb uhv_dl.pfa \
+ && diff uhv_dl.pfa $srcdir/tests/uhv_dl.pfa \
+ && echo "t1dotlessj/asc tests OK" \
+ || failed="$failed t1dotlessj/asc"
+
+cat $srcdir/tests/uhvrrc8a.pfb | $LCDF_TYPETOOLS_TREE/t1dotlessj/t1dotlessj -b >uhv_dl.pfb \
+ && cmp -s uhv_dl.pfb $srcdir/tests/uhv_dl.pfb \
+ && echo "t1dotlessj/bin tests OK" \
+ || failed="$failed t1dotlessj/bin"
+
+$LCDF_TYPETOOLS_TREE/t1lint/t1lint uhv_dl.pfa \
+ && echo "t1lint/asc tests OK" \
+ || failed="$failed t1lint/asc"
+
+cat uhv_dl.pfb | $LCDF_TYPETOOLS_TREE/t1lint/t1lint \
+ && echo "t1lint/bin tests OK" \
+ || failed="$failed t1lint/bin"
+
+$LCDF_TYPETOOLS_TREE/t1testpage/t1testpage -o uhv_dl_a.ps uhv_dl.pfa \
+ && diff uhv_dl_a.ps $srcdir/tests/uhv_dl.ps \
+ && echo "t1testpage/asc tests OK" \
+ || failed="$failed t1testpage/asc"
+
+cat uhv_dl.pfb | $LCDF_TYPETOOLS_TREE/t1testpage/t1testpage >uhv_dl_b.ps \
+ && diff uhv_dl_b.ps $srcdir/tests/uhv_dl.ps \
+ && echo "t1testpage/bin tests OK" \
+ || failed="$failed t1testpage/bin"
+
+$LCDF_TYPETOOLS_TREE/t1reencode/t1reencode -e $srcdir/tests/t2c.enc -a $srcdir/tests/uhvrrc8a.pfb uhv_re.tmp \
+ && grep -v 'Created by t1reencode' uhv_re.tmp >uhv_re.pfa \
+ && diff uhv_re.pfa $srcdir/tests/uhv_re.pfa \
+ && echo "t1reencode/asc tests OK" \
+ || failed="$failed t1reencode/asc"
+
+$LCDF_TYPETOOLS_TREE/t1rawafm/t1rawafm -o uhv_re_a.afm uhv_re.pfa \
+ && diff uhv_re_a.afm $srcdir/tests/uhv_re.afm \
+ && echo "t1rawafm/asc tests OK" \
+ || failed="$failed t1rawafm/asc"
+
+cat $srcdir/tests/uhvrrc8a.pfb | $LCDF_TYPETOOLS_TREE/t1reencode/t1reencode -e $srcdir/tests/t2c.enc -b \
+ | $LCDF_TYPETOOLS_TREE/t1rawafm/t1rawafm >uhv_re_b.afm \
+ && diff uhv_re_b.afm $srcdir/tests/uhv_re.afm \
+ && echo "t1reencode+t1rawafm/bin tests OK" \
+ || failed="$failed t1reencode+t1rawafm/bin"
+
+test -z "$failed" && exit 0
+echo "failed tests:$failed"
+exit 1
+
diff --git a/Build/source/texk/lcdf-typetools/tests/t2c.enc b/Build/source/texk/lcdf-typetools/tests/t2c.enc
new file mode 100644
index 00000000000..e55500e63a4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/t2c.enc
@@ -0,0 +1,290 @@
+% This file is generated from `T2Cuni.map' and `glyphlist.txt'
+%
+% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+% LIGKERN f f =: ff ; f i =: fi ; f l =: fl ; ff i =: ffi ; ff l =: ffl ;
+%
+% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+%
+/T2CAdobeEncoding [
+% 0x00
+/grave
+/acute
+/circumflex
+/tilde
+/dieresis
+/hungarumlaut
+/ring
+/caron
+/breve
+/macron
+/dotaccent
+/cedilla
+/ogonek
+/.notdef
+/angleleft
+/angleright
+% 0x10
+/quotedblleft
+/quotedblright
+/cyrflex
+/dblgrave
+/cyrbreve
+/endash
+/emdash
+/.notdef
+/.notdef
+/dotlessi
+/.notdef
+/ff
+/fi
+/fl
+/ffi
+/ffl
+% 0x20
+/.notdef
+/exclam
+/quotedbl
+/numbersign
+/dollar
+/percent
+/ampersand
+/quoteright
+/parenleft
+/parenright
+/asterisk
+/plus
+/comma
+/hyphen
+/period
+/slash
+% 0x30
+/zero
+/one
+/two
+/three
+/four
+/five
+/six
+/seven
+/eight
+/nine
+/colon
+/semicolon
+/less
+/equal
+/greater
+/question
+% 0x40
+/at
+/A
+/B
+/C
+/D
+/E
+/F
+/G
+/H
+/I
+/J
+/K
+/L
+/M
+/N
+/O
+% 0x50
+/P
+/Q
+/R
+/S
+/T
+/U
+/V
+/W
+/X
+/Y
+/Z
+/bracketleft
+/backslash
+/bracketright
+/asciicircum
+/underscore
+% 0x60
+/quoteleft
+/a
+/b
+/c
+/d
+/e
+/f
+/g
+/h
+/i
+/j
+/k
+/l
+/m
+/n
+/o
+% 0x70
+/p
+/q
+/r
+/s
+/t
+/u
+/v
+/w
+/x
+/y
+/z
+/braceleft
+/bar
+/braceright
+/asciitilde
+/hyphen
+% 0x80
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0x90
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/afii10145
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/afii10023
+/afii61352
+/currency
+/section
+% 0xA0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+% 0xB0
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/afii10193
+/.notdef
+/.notdef
+/.notdef
+/afii10846
+/.notdef
+/afii10071
+/quotedblbase
+/guillemotleft
+/guillemotright
+% 0xC0
+/afii10017
+/afii10018
+/afii10019
+/afii10020
+/afii10021
+/afii10022
+/afii10024
+/afii10025
+/afii10026
+/afii10027
+/afii10028
+/afii10029
+/afii10030
+/afii10031
+/afii10032
+/afii10033
+% 0xD0
+/afii10034
+/afii10035
+/afii10036
+/afii10037
+/afii10038
+/afii10039
+/afii10040
+/afii10041
+/afii10042
+/afii10043
+/afii10044
+/afii10045
+/afii10046
+/afii10047
+/afii10048
+/afii10049
+% 0xE0
+/afii10065
+/afii10066
+/afii10067
+/afii10068
+/afii10069
+/afii10070
+/afii10072
+/afii10073
+/afii10074
+/afii10075
+/afii10076
+/afii10077
+/afii10078
+/afii10079
+/afii10080
+/afii10081
+% 0xF0
+/afii10082
+/afii10083
+/afii10084
+/afii10085
+/afii10086
+/afii10087
+/afii10088
+/afii10089
+/afii10090
+/afii10091
+/afii10092
+/afii10093
+/afii10094
+/afii10095
+/afii10096
+/afii10097
+] def
diff --git a/Build/source/texk/lcdf-typetools/tests/texmfhome.otf b/Build/source/texk/lcdf-typetools/tests/texmfhome.otf
new file mode 100644
index 00000000000..d0af1152ff4
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/texmfhome.otf
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/texnansx.enc b/Build/source/texk/lcdf-typetools/tests/texnansx.enc
new file mode 100644
index 00000000000..5eb9183f62d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/texnansx.enc
@@ -0,0 +1,279 @@
+% @psencodingfile{
+% author = "Y&Y, Inc.",
+% version = "1.3",
+% date = "22apr09",
+% filename = "texnansx.enc",
+% email = "tex-fonts@tug.org",
+% codetable = "ISO/ASCII",
+% docstring = "Encoding for fonts in Adobe Type 1 format for use with TeX."
+% }
+% MODIFIED FOR AFM2TFM to avoid repeated encodings, namely these
+% positions have become .notdef:
+%
+% 137/circumflex 141/OE 146/quoteleft 147/quoteright 153/tilde 157/oe
+% 169/dieresis 176/macron 181/acute 185/cedilla 199/AE 217/Oslash
+% 224/germandbls 231/ae 249/oslash
+%
+% 22apr09 document the precise differences from texnansi.
+% 17aug08 change /Uni20AC (wrong capitalization of /Uni) to /Euro for
+% consistency with other encodings. tex-live mail from Vasile Gaburici,
+% 16 Aug 2008 20:44:08.
+%
+/TeXnANSIEncoding [
+/.notdef % 0
+/Euro % /uni20AC 1
+/.notdef % 2
+/.notdef % 3
+/fraction % 4
+/dotaccent % 5
+/hungarumlaut % 6
+/ogonek % 7
+/fl % 8
+/.notdef % /fraction % 9 not used (see 4), backward compatability only
+/cwm % 10 not used, except boundary char internally maybe
+/ff % 11
+/fi % 12
+/.notdef % /fl % 13 not used (see 8), backward compatability only
+/ffi % 14
+/ffl % 15
+/dotlessi % 16
+/dotlessj % 17
+/grave % 18
+/acute % 19
+/caron % 20
+/breve % 21
+/macron % 22
+/ring % 23
+/cedilla % 24
+/germandbls % 25
+/ae % 26
+/oe % 27
+/oslash % 28
+/AE % 29
+/OE % 30
+/Oslash % 31
+/space % 32 % /suppress in TeX text
+/exclam % 33
+/quotedbl % 34 % /quotedblright in TeX text
+/numbersign % 35
+/dollar % 36
+/percent % 37
+/ampersand % 38
+/quoteright % 39 % /quotesingle in ANSI
+/parenleft % 40
+/parenright % 41
+/asterisk % 42
+/plus % 43
+/comma % 44
+/hyphen % 45
+/period % 46
+/slash % 47
+/zero % 48
+/one % 49
+/two % 50
+/three % 51
+/four % 52
+/five % 53
+/six % 54
+/seven % 55
+/eight % 56
+/nine % 57
+/colon % 58
+/semicolon % 59
+/less % 60 % /exclamdown in Tex text
+/equal % 61
+/greater % 62 % /questiondown in TeX text
+/question % 63
+/at % 64
+/A % 65
+/B % 66
+/C % 67
+/D % 68
+/E % 69
+/F % 70
+/G % 71
+/H % 72
+/I % 73
+/J % 74
+/K % 75
+/L % 76
+/M % 77
+/N % 78
+/O % 79
+/P % 80
+/Q % 81
+/R % 82
+/S % 83
+/T % 84
+/U % 85
+/V % 86
+/W % 87
+/X % 88
+/Y % 89
+/Z % 90
+/bracketleft % 91
+/backslash % 92 % /quotedblleft in TeX text
+/bracketright % 93
+/circumflex % 94 % /asciicircum in ASCII
+/underscore % 95 % /dotaccent in TeX text
+/quoteleft % 96 % /grave accent in ANSI
+/a % 97
+/b % 98
+/c % 99
+/d % 100
+/e % 101
+/f % 102
+/g % 103
+/h % 104
+/i % 105
+/j % 106
+/k % 107
+/l % 108
+/m % 109
+/n % 110
+/o % 111
+/p % 112
+/q % 113
+/r % 114
+/s % 115
+/t % 116
+/u % 117
+/v % 118
+/w % 119
+/x % 120
+/y % 121
+/z % 122
+/braceleft % 123 % /endash in TeX text
+/bar % 124 % /emdash in TeX test
+/braceright % 125 % /hungarumlaut in TeX text
+/tilde % 126 % /asciitilde in ASCII
+/dieresis % 127 not used (see 168), use higher up instead
+/Lslash % 128 this position is unfortunate, but now too late to fix
+/quotesingle % 129
+/quotesinglbase % 130
+/florin % 131
+/quotedblbase % 132
+/ellipsis % 133
+/dagger % 134
+/daggerdbl % 135
+/.notdef % /circumflex % 136
+/perthousand % 137
+/Scaron % 138
+/guilsinglleft % 139
+/.notdef % /OE % 140
+/Zcaron % 141
+/asciicircum % 142
+/minus % 143
+/lslash % 144
+/.notdef % /quoteleft % 145
+/.notdef % /quoteright % 146
+/quotedblleft % 147
+/quotedblright % 148
+/bullet % 149
+/endash % 150
+/emdash % 151
+/.notdef % /tilde % 152
+/trademark % 153
+/scaron % 154
+/guilsinglright % 155
+/.notdef % /oe % 156
+/zcaron % 157
+/asciitilde % 158
+/Ydieresis % 159
+/nbspace % 160 % /space (no break space)
+/exclamdown % 161
+/cent % 162
+/sterling % 163
+/currency % 164
+/yen % 165
+/brokenbar % 166
+/section % 167
+/.notdef % /dieresis % 168
+/copyright % 169
+/ordfeminine % 170
+/guillemotleft % 171
+/logicalnot % 172
+/sfthyphen % 173 % /hyphen (hanging hyphen)
+/registered % 174
+/.notdef % /macron % 175
+/degree % 176
+/plusminus % 177
+/twosuperior % 178
+/threesuperior % 179
+/.notdef % /acute % 180
+/mu % 181
+/paragraph % 182
+/periodcentered % 183
+/.notdef % /cedilla % 184
+/onesuperior % 185
+/ordmasculine % 186
+/guillemotright % 187
+/onequarter % 188
+/onehalf % 189
+/threequarters % 190
+/questiondown % 191
+/Agrave % 192
+/Aacute % 193
+/Acircumflex % 194
+/Atilde % 195
+/Adieresis % 196
+/Aring % 197
+/.notdef % /AE % 198
+/Ccedilla % 199
+/Egrave % 200
+/Eacute % 201
+/Ecircumflex % 202
+/Edieresis % 203
+/Igrave % 204
+/Iacute % 205
+/Icircumflex % 206
+/Idieresis % 207
+/Eth % 208
+/Ntilde % 209
+/Ograve % 210
+/Oacute % 211
+/Ocircumflex % 212
+/Otilde % 213
+/Odieresis % 214
+/multiply % 215 % OE in T1
+/.notdef % /Oslash % 216
+/Ugrave % 217
+/Uacute % 218
+/Ucircumflex % 219
+/Udieresis % 220
+/Yacute % 221
+/Thorn % 222
+/.notdef % /germandbls % 223
+/agrave % 224
+/aacute % 225
+/acircumflex % 226
+/atilde % 227
+/adieresis % 228
+/aring % 229
+/.notdef % /ae % 230
+/ccedilla % 231
+/egrave % 232
+/eacute % 233
+/ecircumflex % 234
+/edieresis % 235
+/igrave % 236
+/iacute % 237
+/icircumflex % 238
+/idieresis % 239
+/eth % 240
+/ntilde % 241
+/ograve % 242
+/oacute % 243
+/ocircumflex % 244
+/otilde % 245
+/odieresis % 246
+/divide % 247 % oe in T1
+/.notdef % /oslash % 248
+/ugrave % 249
+/uacute % 250
+/ucircumflex % 251
+/udieresis % 252
+/yacute % 253
+/thorn % 254
+/ydieresis % 255 % germandbls in T1
+] def
diff --git a/Build/source/texk/lcdf-typetools/tests/tfm.test b/Build/source/texk/lcdf-typetools/tests/tfm.test
new file mode 100755
index 00000000000..5053147f25c
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/tfm.test
@@ -0,0 +1,26 @@
+#! /bin/sh -vx
+# Copyright 2017-2018 Karl Berry <tex-live@tug.org>
+# Copyright 2012 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+LC_ALL=C; export LC_ALL; LANGUAGE=C; export LANGUAGE
+
+PATH=$LCDF_TYPETOOLS_TREE/cfftot1:$PATH # May need to run cfftot1, ...
+PATH=$LCDF_TYPETOOLS_TREE/t1dotlessj:$PATH # ... t1dotlessj, ...
+PATH=$LCDF_TYPETOOLS_TREE/ttftotype42:$PATH # ... or ttftotype42.
+export PATH
+TEXMFCNF=$srcdir/../kpathsea; export TEXMFCNF
+ENCFONTS=.:$srcdir/tests; export ENCFONTS
+
+rm -f Ant* a_enhg3c.enc
+
+$LCDF_TYPETOOLS_TREE/otftotfm/otftotfm -e texnansx --glyphlist=$srcdir/$LCDF_TYPETOOLS_TREE/glyphlist.txt \
+ -p -fkern -fliga \
+ $srcdir/tests/antpolt-regular.otf Ant >Ant.map \
+ && sed -e '1d' Ant.pl >Ant.plx \
+ && diff Ant.plx $srcdir/tests/Ant.pl \
+ && diff Ant.map $srcdir/tests/Ant.map \
+ && sed -e '4d;/line:/,/Ant/d' a_enhg3c.enc >Ant.enc \
+ && diff Ant.enc $srcdir/tests/Ant.enc \
+ && cmp -s AntPolt-Regular.pfb $srcdir/tests/Ant.pfb || exit 1
+
diff --git a/Build/source/texk/lcdf-typetools/tests/tmf.info b/Build/source/texk/lcdf-typetools/tests/tmf.info
new file mode 100644
index 00000000000..db7c3c839d3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/tmf.info
@@ -0,0 +1,8 @@
+Family: texmfhome
+Subfamily: Medium
+Full name: texmfhome
+PostScript name: texmfhome
+Version: Version 001.000
+Unique ID: PfaEdit : texmfhome : 17-6-2010
+Copyright: Created by taco with FontForge 2.0 (http://fontforge.sf.net)
+Vendor ID: PfEd
diff --git a/Build/source/texk/lcdf-typetools/tests/tmf.pfa b/Build/source/texk/lcdf-typetools/tests/tmf.pfa
new file mode 100644
index 00000000000..418ec7b2d14
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/tmf.pfa
@@ -0,0 +1,185 @@
+%!PS-AdobeFont-1.0: texmfhome 001.000
+9 dict begin
+/FontName /texmfhome def
+/FontInfo 9 dict dup begin
+/version (001.000) readonly def
+/Notice (Created by taco with FontForge 2.0 \(http://fontforge.sf.net\) ) readonly def
+/FullName (texmfhome) readonly def
+/FamilyName (texmfhome) readonly def
+/Weight (Medium) readonly def
+/isFixedPitch true def
+/ItalicAngle 0 def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/StrokeWidth 0 def
+/FontBBox {17 0 507 611} readonly def
+currentdict end
+currentfile eexec
+8A776DF5437D053715F33367AD5C2F399F490C3C377EA6553EB427BAEE0B924B3EF673E285EC0C
+1078CA61959EC5E35844EC526506107737CF8BD3524F8AE01447B8090C2ABB680C35F02694D64F
+6FF22544B143DCBFFC763A72B7F5A7FE894951127BC7AE53040AC1D7B674A0302BEFDF70DB0319
+09A25FF691116431FDB007803108EAE2623E6E7F050C709A5ED08B482F66EA35D2045D89723406
+201EB465AE6B4E1864EDADC38F3B856CA55D9D49ACCBA4994BA0F8641AAFC5067A22577ACDCA27
+33F31D871C01AB90F1210F85B8158B108FB394C1B91120B926575CA86B910DA8639F189C07913A
+89356275D449956CE2BD1FE3F1C84F2E2CCAD5F1666CB376B897DFB049144434F4AB076F5E4F50
+A3F9BF36CC09B63AF52EC309D069DC90C7D719A2ADB8CC610A7E8397CCC2E7A6B6D3C543A0A344
+78F8343CD3C76B08F89757472AFE860682A8F65BBB0E7C4765F02CF3012B81E600979408843A7A
+E0854A225133A91814B06701F56511B57E0A8AFA1B2798B3C737A21790230DC019E92B14E5FD5D
+C72495C72FF221D9D635C30AE88C314123A21FCDAF0F0B176907F1C15039674CFDDAF16B1D6A74
+B8ABC54092E9211D7E889687061D66B27E3CB7FA9E9261B685B9CF527228D61DD8F4725CC4DC57
+411EB9F6F9E1498FB4C1E400B685C13B66622E5950F476A8922285F9D0CCFD4B483C0E332A260A
+9AD86913E2C2DEFE8CD67CD1423953CA185AD3FA099CC80613300BF3BA6E477363BB91639AB9F0
+694CA2262BA5750846C3A1ED25CDD66C8807285D266DEA1BDDDB8370BDB3B6A4910DB1EC8DC625
+4A97BA8D6BFDCD6E2071C96D6190E8C0DB6188298CEB024B3EBAA9A74D9CE8A8EA92D9DAF4CA90
+B4DDB28C7D1944EEA25ECC87022A5FD729948A03CD2B5A0019BF4402EC79B83E853A0878759061
+63181FBC4BE8B99602E38DBB4E03DFD2F2D770606F3A5B76A7C2763FA9C3FD079780C00837B423
+2C88517094D5AB51848AF3C34EB2F7C19050B31D53F727887B0FE1B832E0FF229E07FCC152E460
+041D64F23423BEC754F1E52A92741B8A5AD31F2B162E3CC9561E255A9F0461D2527DBF4AFD3839
+5223E49CAD02B9245120F07F470F4F5AE51E1591646DE94B2F2A7D280AF0F35CFE7E53D3FF6446
+7647DE7E2F240FABFE3FFB40A32FB3E415E942C3B584F5FB8065CDDDCACE2AAF4B7F51DCEABBDA
+9A5755847C9D5111D9CA2EACD307F8A6110FB11B3F833DBDD4304F5439CA8F27283F5FC496F9EF
+C172F7DCC18B289AEAB1498F11639D4CC2327DDB29546E6C6EFFF0025F9881080019BF440D14F8
+FC2793D53E070C6E39D371EEA5CAF5667BF64E621CBD889B4512EF6F83572113CF4F36C1FD3AE1
+16C51782DA00F2F41A648A292FCE8A2C8ED4B7A425E0C57F51BE6C85AB7F3E304D3556DE0A0233
+C61006B36629547D63AF5562C283A813184AAFA7F2663FD9F42F6610DD65A13179519C514754D1
+AB3173F8B39F363614BC23059A205683157EC5A7A769C453D74144A5B6AB5564F381CC081A6729
+6BE509924B63A68B8F363EB4764F1D59AA052129E689AF3EF7BAFD29B6306F16718BC6616CFCEC
+D3194B2240423D4E633F0307FAA9031F4D08FBAD6F9D146C7784F70F382B7D9941F9FCC41BBD43
+65211B86896276CFC4892C909A976E710B39F97C724731986A22942A31C59E85AAA90C4FE7E100
+A5655B058ADC2393FD9ED4F89E7667A9948BDD8DC757D4FD3B4057A951A992C5EA9C6BE00BFF7F
+959B233997B720D9A948B3FBA57F08BCBBDF7A649080E319A77F230183983BC9C889BB66182216
+9058180CA055A16C673B08005CC07E45E9D72F4D021DE5D04562EA86399A6915182F76C26E17B8
+2D1A6100B76F94216F618D5EC58D87A893684576E17F04F2DA06F41BDBBA4D5F79BDA4364F9F08
+0379CF5C5183F80C26C6FCA3E9814E8C4F559CB8BFE81C0E5F5AE6A051103262FAC49E78C58FDE
+CFBBE0BE6BF429F6657E60BF6FBDFB8D00FDC826F088A15C07023454A96B70462ECCD538F5B437
+CBF49D9F6C59F2EB93397BC6050B8CF0903E039A532139662330A5B56646101AC23A20F3AAFABA
+4A613AD5A12C02A36880A53D2BD3F9FD124161F4B8C9F6E73001C1D7801483056B506DED8D93BD
+D1622A9615BBCD2BA8CD6687B8A3BF6DD7FA99D92FDBB35CBA157247503DB082345863F5E37963
+2885FD78ED8B39106A865738EAB6A67B6EA9D573162DACA78F047BC7438FA9105BA39EAB08B284
+0FCD4EB85F37A7116C5DA1CA2196AAAEAB3ECEDEA68F569C7A625C0772A67E2A89B3743150C098
+8D8FE73CEBFCD7ED36070E82EC526951DB79177EF67A9AEDC097118C92B3F9F0676F77C560B45E
+F3313BA51DBBEDC499EDCCCF0BAA2A526B0FB2AE5E1EC057A30B83601663FC680D33E41C701680
+D57B0B013EC28B6414542CC3AC6E609BEEB349E2F53A53C2573E171F5FFF2E553F2D9268ACAA31
+6B9B65A761A55F0DA083A47DF7C99AE23C4824109918A7A22DB7A79171FBB32984B7DBF1A77807
+A02CABFF32A7EF14C4BE1BCB9FBCCE1F0E68E44ECFC805765DF2580384C3C4CDED04FED9FA1F01
+C462270AF377332A204845432310DC783AA5AC115EC189A164C2B4FDC7D1E487EEA49F86CD5AA4
+C38ECA2602BCD64C338F374131F41409B732DF247A77A9F83FB8446BA1FB5BF4DB5AB557AAB374
+E562E54127B7C5B7929CD04891EBA40FD96D12597683A2D156A96051DE06AA6E79F13BD980DA6D
+39667EE55A2C6C78F6157195ACFE09EDA3D87C312114DF9C70A2B76883D4CB03897961D4C0DF09
+7F04FA8A15418CA2771E1E12472DAEF5EFF7DEFADFA6080456268C09BB0EF5CE80909001986F81
+8A8FA216266064D7BF758767B8139B35A6F00C6A9E2F54C8C391D84FE530CCE208A0049175A541
+5300F896B4E2C77A756D1115F9086AC623820036AACE238F5CBF017CEE907FB046D647F6E50155
+D22769590EF84BF2C1882618D026B68B73A25257EEB3A808BFA24E77D8B4D07208312179394818
+01E1861B93CD09E0784F128E32A00646A47841CC6715C90CB36D047AC69F3B4AE4AE5C26DAC196
+353BF0CB6F6813B033E5C32F195455C973802315D0E46759E07FEFB4FAF32FE1FC0A5D9361C9BE
+0BDCB50B9A8BFD661F0A3E75F9FA21B2322940FA4DDCE6D5920F21D9EAEF63AA47B08A42EF2E4E
+A68843D45228C05ABEA26CFB1AF33080040ABE3B065C01E0C649E4BCEA8AD62A1ADAA034132918
+A061FFF7DE6C752BCAF34E419D77ACAF26BC3F2919DEA27AB020915EB8C46BE1CF7508BC8C1CAE
+1C14C188883E3B67377CAEB8E162449D55A9A379876D772647142D1DEE13E11D7DC045ECC4F168
+A02334C43BB81418A2E17CA497A1C65141D6D521365FB2DCCBE28228F19644EE9F67E9F960A1F9
+AA0EAA062EDE729130FFE7B295FD9F8E6F57F6CF460EF6EECE5327C8189B48093F8967638A0C86
+D30214CBF566F641B655E42D63B9D30A28648DD161F0482025DD2C931653078CD26A12885D996B
+AC2859DCDC2F9CAE177B42E97D13BD892CABCFE8E8D4F6D232153F98620DEAC6D3F7BE4C96F028
+76246D1B3639419B3C54799594E503356091EE21E178E202698D895FFE4BF8287C8CF15657563C
+2C30960CB86F5CB62D5274430B321593BE420810DBE039B3EE21A1EA8A37C1DD1994D495425103
+3FED0BAD746CD0C870453C4192E6FD303D3022F397FD638685A737809ACA52438E903B341AEBFF
+406C77AA6B4FB2F08EBA1BA5A5EA10C6D433159A2EBD6B1AA7BF20A99F8B5E4651FB9F21B0FFCB
+3D0BE87FFF89232583A27E3CC84A3134FA76284B9FE30CEE56EAE924F96B0A7C70B504F587DFB2
+8D6AC9C9F979D0CAF22C5B7B6516CBFFF69AC019C6F0F4BBD51EA30B0D4974ED1482D3EA66D62F
+1076D5F75F7F53F3606B6988757129F6076463B72828188CBABB47154269FA3234D1926EB37733
+59B15D8CF59A1074E5DEB8DFE366EFD47D1AF6916C82772FD76B92900594FDF2B7166F79BB04DE
+05F26C39850D1CBBB3179D0DDB18B37D6B77D23AD6ED16270DBF7228271236A5FCF6CD8A78E52E
+947334C4EDCBB25B62128E715621F2DF61D1ADFC407625D59DCC52620C8EB9D0BFCDB564E82429
+F3CC84C71BC464EE42C1ED01DC59AE38D034DE990727B207F75933EF28DAB01F68A6BD2C25CC7C
+F126E609D1ADB141E6D625D4D628BA8A09ED3573251B95A869376148B68A99031D5DFD4B40807E
+D29AB92C756A20891B716675710D910DF63F19CC3057295F018AC7325D8B91981E647BB8670B91
+C0EEACFD680693C5D8C3E1706263DA4BCD949DFB0A07AADFE51A6B50E0AA502B2751FFA2010002
+8F46ADFD8A6A80C3E5E41A162EA6CDB44223B575FB0D8C9C695907ADFA4816B306C59FC5E16196
+5312E96B6BA5DD892DCEF2EE94A1D390CD7E3861DA2C8CED440EBDEB319B4AB76D0FC0AB90161D
+4B1B1CE43B8BC601D6A68630699841627EC339F63F625863D51D349435E80C0DCCC2E461205071
+431A14DA99A00B8BAEB2CCFC2086DF7F0BDC4651E8560B193DBA1B86AA83FA2D3C2C2D5754D6E4
+3293C5843E4DBDA7884DFA233A13C601B2B64A450AC6E70B4B91166940184D044140BC50CAA8CF
+73969B9C9A6C8FC26DF0811DF73C01CAB53B16EE5BA265F13CB79DEB520830B6AE2CFCC718CE41
+4DC7B5E0DFF71A88BB3CE577D60A36AEE94E721397C6E54BDD9DC038A3EB3B63B71C8767053B99
+C97E4A448187323E051F8E5248489FA24BACE721587B94DFEA86B4B5F65ABF9A4E662F7B03CD3E
+7EF793A2A90AED6580D99609AADE95E55144815B45DD924ED30E7EB53215B932A365FE44FBC618
+5463ED13BA070D158363A98526FAF286C1C9871BFD3D368AEB20AF2864763A694BCC6FB44811B8
+42AC515E59A26542EF3FCFC175B8DF082DC764B6F7D2093E9A93351BFC35E6A9F62292B741E8AE
+DBE80AE98144F431EDC396FF0D2AB8F8CDD7EFBBF18455DF9ADC37D068622304B40C8397DE76D4
+EE6FF8AB2D7743462D195C53910F1C3FC9E836C4C82D98728F1386545F2BD214CAAC32D13D2C9B
+165BD4487FC83F38E75AE8E36EE34090F6492920C576D0FDD09733EAA1913013DBEEDDED60B5A1
+14627FDE3DAECD7A1A34D67DE63DFECF5A035AA70B1FAC886AF8791E98157AE57787803B09519E
+DFCB6E2D708307CE0DDD95A0AC608CE48E02A0ECD0A9C6B9C0775CE1E8F2387C79B6427DB05038
+B16AA88E63757BC5652C7CBBEA222E318FA56675B581E7C11A3F23CDA4F71D4406E6284726E983
+1C6833F3ED481FFDF9D792A2B6FDEC95932EFBECEBA6BDEFFBF865FDF61D974D4986DDBC1022C8
+40FB15F9A95BA9DBAF66687403C833BB631DF3A9E60BC9219406018873A12EFDAD48465D902CD6
+478305D35F7BFE53E66250DC1DEA12A0707A3454ADE1D2643D290F829D8A2B2EFD5A170639C08C
+D8CFF805EFAB7BAF5A0612E562C09C0E1612934E7CE8FB0C4C12384C843C482625CC273433A079
+37F016D0CAE33A36B4A91096DD1F9F042FC47F5454986BD28B7E87C32324CC358B1A24A162D432
+F1537DD8078FB90410D9D1F13F4BE18E3F306F8F1365690F07B2BD93EA6A68BD0D72936F18DE7D
+1BB0ED286CE4D8BC3279ECAB5E3A227BCACAE20413C671D410CE6BA063DC0D6ACE182E7604257D
+C586D685A7A5A46CCAA18CCF57CFC8D7656B0C4BDD143612DFC96BA60A6C431459B3E5EC418E61
+FC20FE469978BBB2D6BB22B845B3F879EA0B2B44262DB0DA0165E5264DC8552C045AF628085485
+C81D38B3378DA16D67F4447E8C4DB7B3EA9C8DA7F5C9CA1F1F08604DEAF6DC45097BFDE482B908
+8C36B41F19D310F8973567E340462A7CEC12BEF849595ECBACFDEAD0161836B13DA00749A39A46
+BFCE6EF77389B2E0CECF09ED97C06AFAD639EFABCDA5595B6023301599D0B7EE08CDD454B0B805
+0516ACD408746ABFD791FD362505FC55C10C7EACA355AFEF41E8D0051454C700EA9191540508E8
+957B493DD03418DB78E423FD4F03C66FA3CBE16EE9084E69AFB32FE7ECBE87CC65AA2E22052BE3
+C658A6AFB06619EF969FD417595F28F3CF9626F7A6A27FDEED7D053281A953ED5BAA79C4B4EFC5
+12695A92F667719FC15439B7838AB89361F29A4BBABEE4DF937DFFA6C052A701542A73F8B68A03
+4D36292790070E3B3EA84C4A089AA5B6B9189B5079EB075D2E3849BB0F2867C7AE0B105AEF7490
+7F4B081EA186901CC4B05C09A4BD122D87DDA8D51DA9F6A6BE27CA2E8088AE1B49BCD1895AE945
+A70612792080DCA5C0C5ADCCF33914BC46A9B3AD888EFF65C5A6D9885BAEC85578A17FE4633FED
+4CC81EECCB2A92B778A376C340E75EC914FCBD449F44B1B796F795AAA22C176847E042A53E0B70
+C5E37C4C2F342B2DA0764842D453FF234294E4C45D57F9A46388514094172FC06D881AD1F8CCFD
+5118B964B46BE783442B7CCB1E808A18F00C7F16F45664CFE02AFEE24B1D142E9F90F40CEB9B4E
+E5CC714B898668913C5E4550B8021222558FEC4C4A9367105A51A1D7658B7DC55F7092A799A3F5
+D5B6CE8A0700C7C7274E3721A230EA3588F9A07060F2E54CBE1B8C631ABBFFA7442C8B3CBD9C0E
+3CDADDECBB0BD8BF0AF53916F43FCE27B082006CA62E7488715E26F785380A0C3D0C3BA2FF01AE
+29E0738963FFA6EBBEA0367788B425D10B030E1E5F39769D3169E347C64B1918F49B9605A8C167
+3AC8854CDA86ABE16671465322DFD521D19EF236CFBD06F5327A86B203CC2D99D15FEED0DAE1A2
+DBE90E7A21555A2B88486E857AF356C8B55ED09932082D2683CC182BCF72898E1870D487943D37
+E3F2FC37B87CD0303156778E5BFDA12DB657D12EF99BAFBC767779D0C30DDB0FA4C0E49AD6B8D1
+6254C0DEA04A909F0AFD7D98D0936CF188577220A543AFB0F87CEE1A4BF0D95A9C74A69AB73F37
+415BDF0B086C7143F55A3530A25090F1CFFC381869D40BBF9D72DCE9F6DE5475C670260A00E049
+6956E73608536E0FAE34B5BF3096B05FE79A749D0010C314202873E706EDBE65827F85FD086074
+E9AA0FBA2D3B389CF69E561A8EA5FAEF9E86EE4A0A05963918FC947F22E2FDEA082B77933A7436
+B3E2665969B98CC9E4E35C1A783E948570CC325B1290DADB9D20DCEC08FB3993F76792791528E2
+B44F8017ACC4CA3A9BEB4A7E923BDBC91E2615EF0DBC8E670FBBA242C0A8D3D07AB79C3DE550B0
+931D392AE295D42F3D7353672C8BD4E7380812CE5CD273851FCE9AB277FFEC0BCD5186ADF73BA7
+7ACCF7113FDBB1CC6181B05CE9C6B61B3B199F7360F21BF89A211B872CB5C3905E1B70FA65DA58
+123B8AE4AF1331C1D74F0D9F3AC5FD02E5C4B15376C1527745F18C358CB3B33C79E443FC45F140
+EAA7B8969976187DF6E2F57435C751A0387A58D24365D36E80B8C14DF0D9B9600F500C50E0D185
+99AF42D72C181BCBE353DBE5D93510800D4C8A2199EC0DAB99D93152F86D17343E1AC3C449D6F2
+C5800FF4AD1F55CFA20F0756E94B53245AA757A209E4B62823877D6AEB29959E694040B00AB128
+9247EC2CFDA6C39E436FF4DB44E2540408A71367C045E1881576C7FDF832E8F8DDDC7295A06026
+042BB4CCC9E51F5780F79933B867A038653630492FA1E1EA67131C8906DDD2287CC70F6FEAE143
+408C83F790FA176B00C518203FC37D2D54977D68F2D94E0BB7BCFFCB37DA6FB0C1A631DF4EC89F
+BA5331463FC00DE6C1BE4E5AD2B2911BC803FA8D2CCD31C461997438FECAA5C200616914BCF166
+9DFFD57FC8883EF7EBC9439D0AD9D2B4EBFC1A9C987D418ACE63BBD3D3BAB4D7558387AB33CC6A
+1687F6DFBF11B969888D791B3FB385B6C34C9E4F304D929D029D81BA770A1D42C9486112FE3D1F
+0A9159FC4C9C3BF9519574C1D4377C4074890F9A1356414F7DB5C2049D86250C94AC353A41351D
+764C670FCE4A9545372F79C542D4FCC1A59785337D47585E38B56F933E1C2F4316DBDB258B3EB8
+0855BDF74CF93D090E66632ED68F031C926757A6BB83C904A2E226E7A8A7C02B2A205430E43343
+ECA5878433066319C17D946F961AF451DFB5E6B87EE4629A38258E68AA0AA2FC1A652FB2FCEE92
+6F7222C6B0FD78D83A3A9714B7EBB60DF406161431D5286ED92E23363EC3C8046513F38ECAF52B
+B3912A6ECFF98593D19DB27CB6BA6834F177183FEE0A647BEE77708467D561603A5D8FB882D974
+ACEE4850B09F3D70DB0E12C681173BAAD74C252FD3FEB16F18A5E65E28DF1A4DF3F7ED97CC9BDF
+96A91BA4C9AF9687ABE9FA92107AADE78E1CEDE3FBE094D8D6E2AF59DDB5272C44329C732A8DA8
+FAB7EC2A9926900B457DE9557E4A3904AB1009984B106C7B9D3940572728A747C110AEFAE2DBEB
+29307A324B12D2E6AC3593F5A0BF8A98AB8495E9B6EE43A0D2425C01FF8D774FC5CFA5AA08BEB6
+79F401F9556643E5FA870EB4487DFC5E72ADD7B316EBCEEAFAE7B47E455AAA901176514463979E
+C25A4F0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
diff --git a/Build/source/texk/lcdf-typetools/tests/tmf.pfb b/Build/source/texk/lcdf-typetools/tests/tmf.pfb
new file mode 100644
index 00000000000..804c5aa483d
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/tmf.pfb
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/tmf.tables b/Build/source/texk/lcdf-typetools/tests/tmf.tables
new file mode 100644
index 00000000000..a11a6699435
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/tmf.tables
@@ -0,0 +1,10 @@
+ 499 CFF
+ 28 FFTM
+ 96 OS/2
+ 322 cmap
+ 54 head
+ 36 hhea
+ 10 hmtx
+ 6 maxp
+ 618 name
+ 32 post
diff --git a/Build/source/texk/lcdf-typetools/tests/ttf.test b/Build/source/texk/lcdf-typetools/tests/ttf.test
new file mode 100755
index 00000000000..a8046474ce3
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/ttf.test
@@ -0,0 +1,48 @@
+#! /bin/sh -vx
+# Copyright 2017 Karl Berry <tex-live@tug.org>
+# Copyright 2012 Peter Breitenlohner <tex-live@tug.org>
+# You may freely use, modify and/or distribute this file.
+
+failed=
+
+rm -rf Fon* tmf.*
+
+$LCDF_TYPETOOLS_TREE/cfftot1/cfftot1 -a $srcdir/tests/texmfhome.otf tmf.pfa \
+ && diff tmf.pfa $srcdir/tests/tmf.pfa \
+ && echo "cfftot1/asc tests OK" \
+ || failed="$failed cfftot1/asc"
+
+cat $srcdir/tests/texmfhome.otf | $LCDF_TYPETOOLS_TREE/cfftot1/cfftot1 -b >tmf.pfb \
+ && cmp -s tmf.pfb $srcdir/tests/tmf.pfb \
+ && echo "cfftot1/bin tests OK" \
+ || failed="$failed cfftot1/bin"
+
+$LCDF_TYPETOOLS_TREE/ttftotype42/ttftotype42 $srcdir/tests/FonetikaDaniaIwonaeBold.ttf Fon_f.t42 \
+ && diff Fon_f.t42 $srcdir/tests/Fon.t42 \
+ && echo "ttftotype42/file tests OK" \
+ || failed="$failed ttftotype42/file"
+
+cat $srcdir/tests/FonetikaDaniaIwonaeBold.ttf | $LCDF_TYPETOOLS_TREE/ttftotype42/ttftotype42 >Fon_t.t42 \
+ && diff Fon_t.t42 $srcdir/tests/Fon.t42 \
+ && echo "ttftotype42/term tests OK" \
+ || failed="$failed ttftotype42/term"
+
+$LCDF_TYPETOOLS_TREE/otfinfo/otfinfo -t $srcdir/tests/texmfhome.otf >tmf.tables \
+ && diff tmf.tables $srcdir/tests/tmf.tables \
+ && echo "otfinfo/t tests OK" \
+ || failed="$failed otfinfo/t"
+
+cat $srcdir/tests/texmfhome.otf | $LCDF_TYPETOOLS_TREE/otfinfo/otfinfo -i >tmf.info \
+ && diff tmf.info $srcdir/tests/tmf.info \
+ && echo "otfinfo/i tests OK" \
+ || failed="$failed otfinfo/i"
+
+cat $srcdir/tests/texmfhome.otf | $LCDF_TYPETOOLS_TREE/otfinfo/otfinfo -T post >Fon.post \
+ && cmp -s Fon.post $srcdir/tests/Fon.post \
+ && echo "otfinfo/T tests OK" \
+ || failed="$failed otfinfo/T"
+
+test -z "$failed" && exit 0
+echo "failed tests:$failed"
+exit 1
+
diff --git a/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfa b/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfa
new file mode 100644
index 00000000000..e3990827bb8
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfa
@@ -0,0 +1,180 @@
+%!PS-AdobeFont-1.0: NimbusSanL-ReguCondLCDFJ 001.005
+%%CreationDate: Wed Aug 3 1994
+% Copyright URW Software, Copyright 1994 by URW
+% URW Software, Copyright 1994 by URW
+9 dict begin
+/XUID [1 5020913 2322999] def
+/FontName /NimbusSanL-ReguCondLCDFJ def
+/FontInfo 10 dict dup begin
+/version (001.005) readonly def
+/Notice (URW Software, Copyright 1994 by URW) readonly def
+/Copyright (Copyright URW Software, Copyright 1994 by URW) readonly def
+/FullName (Nimbus Sans L Regular Condensed) readonly def
+/FamilyName (Nimbus Sans L) readonly def
+/Weight (Regular) readonly def
+/isFixedPitch false def
+/ItalicAngle 0 def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 106 /uni0237 put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/FontBBox {-136 -225 820 944} readonly def
+currentdict end
+currentfile eexec
+8A776DF5437D053715F33367AD5C2F399F4A3C4AA93FCBA250D54A7FA4D42ED633AA72E9BA3524
+9FEB6AB601831178A0690247FFCED3A15C9247FF52A6532CF582CFEB24204AEC140A2201F906F5
+B5CDF776DF1D8C3C1BB0985C38BBA74E00029BEDDF054A05B3B58985E702D2EB02E7FE3316CAC3
+A26DF2A45F5C8EAC11F6A49E79410F4873FBAB97238F123226CBFF6A289FB9E4691F8ED807C137
+C58417798F0381B07CB95AAF0FBF147DD54522894A29759A34CE5A8EF84645EE900D569DC6F224
+ED221522988299C62B184883B76599E2E9B764A8332728F100FBABFF0130700F37057D0803712C
+68D80564AD85A1FB1627D2D8A57A8C4F4E500671382801CCB781A28D3B7F94977D467410DBD713
+B6CEB0739972ADF0655BC62E41028E8F0F4807E7FC46B04028C7426B73282F6A0F1D927C2B967D
+2D1159E84555D3D137FDC7916C501EFC8CB198BB3CCEC4D6238810E0E2242D7ABD704CBAEA0BC5
+14290EFD29D231F461821D89C2A481CC3629806E3A19D4061AF6CE2EEC98258A60A9A0E55D83E8
+ABCDFE0CE041A71B0CE66B3975994FAE1A105004AA95BFF1BB7796E5F88519BE439D1EE3A759C5
+8A7136073557CDE6E98548A21AC4FF7360798932ED54DACF893D00AA2A790E18898C920BB4347D
+E139E09972849C8C3F017BF9C98BBF39E4B59C3F68F496EDA1F0F4F4C4BDF255A8207A0CF88B28
+CF01D7F1CCE8B965CB7896BE352A6809A82369F7732700A1160271223F8CDFE441AE07EC555718
+A960F70649328BEF898BE66153206638BCEE4FE7F3E07FA3A39CD20E6C28FEAC7D7002DF4CCE62
+9E682691663F384998D607D15F493250E0473D322D5DB97F4D7BF20B3941CED9CCDEE293DDDF6B
+92865767EFBA1966BA16D484A0C119164372DA6F102868513FD9CB11BA6C6BDF9C1E514AD17B46
+74F5AA21114444D7740DBD60547F88D7E8590F5957E07D11496D4C1C96B34E6768D54D7C52C5D4
+D7868B0DBDC986BBD0250154B1EDD08FF230B922FF89BEE8843B0591236605D9AC856C8D6B3915
+2C18C2907FFAB83AED18CCD9FE45A1F71FCA2A1FB7C65976D27632CC9EE6971A65B1B5B7F33916
+F98A12B5B3BDC9B4B5DD39F8050D76FB56AEED9EA14F14297A72727DABC7A5EBE5A083F23F6795
+F6A593A6142AECE3B580C53EC0BF54755F144C2CCD2818588DB4DD5318BA92CC1C4CDD60C63D14
+77399DCB5CDDD5735354EB14CC415E02ACFCF2E902B023E947995537191F9B9D36D74DCFCBE394
+BBDE5E90EFCCCD32BF4C33216538556C023A838E13E33DA6140C3E6156D41F3F81E0B5D78814EE
+30414C97A02FBFCD1C7B60E29A730067FD71CC788504AB430C1E976CC8D527B678F4A38901FB93
+CE8AE7BAD1A2ADDAFB8C44B2CEAF0A85D60027E52518A830C493EFB3D31B6E675D5F9A310FB006
+8BBFB86B283AAEB877676A53A748CB6EA95F154477B181EE4934E46DBDAE1776E3E93C84753C66
+5B174C4EED71F1C4D7AB0F89086A90EEA8B658F142CD65FCDDE60020B2B1921F1C4115D13170E7
+0261C3C595A4DC1FFA8F953AA67C194239DA9E1A08A7B20F40E5B5651979A4BC71B2D01DA5D130
+951850CFB5AD02590C2183C728A7C01D11F44B7304F6BA17EF15352DF2B6A622F7A5868AB94932
+33EDA1F509B6EA74912A657F9BADFE398D4BABE03EEF6DBC58530EDAF61CEE533F144C15081459
+7FF69B3A61CD57D6F436E6B7B6D3E1B9D757F9156B21FB72CCBD6EC69B93EFEE5ED2573F8CBABD
+B61C33B9E48CC22A9CCBFFC74EA59FFA76FD0C296C444787B4277ADD90173ECD8E0C304412B790
+A216CEEC12B6D72B02FAEAB9D3EA57334455B108F59AA61F77C989A136A425DD6CFD4C1D2A6A75
+18095A790AA77151503ECDDEC9BD22F6ED8423715CE286AD6B7ADF4F5037B8A4A7203303AE2789
+818FF106F969D161F33521F0750CAB1D39C0D09FF816A14B8503B229D42C9D7B427CAA11D6FCB6
+33ECC8B6DD6E0F306194EF5F9B2DBF688A2A47737E76DA7D21B6A2D2416A400AF197ED24D87AA9
+1EF18711169500D94B54721B7840CEDBC9A918DBD2D8AEEC78FEB009DAF8DBA3ADE2188428C1DC
+054C9E65D0419E31884502F8EFB612D3DAE48E3421D8983D37B040AF882D4220A8BFA250AC9035
+106DFA465D859296CC6F8DD709B253377F29B39031CC4856C8FD28D4424B3AB21635C075E8203E
+3019A0D67B5BBD2BCD4C360152772B2F51C71B96B019E7590FCDB941E74A22F10892A3CFDE8141
+EB8A1C4CFE96B4C782CB91B8C8739F2980FA06F475C4A3EFCAD68F5AF4DFDC65B35E0632F2F8FF
+A59849878724051CCA93179CE730EC8C2F24E085492A3C813F6EE8586DE2B8832C87509E72AB0F
+1BD5A26EFB38FF8440C375B86056CDB5045808EFF61912EE437D7B5EFA48ADF034F286A05A3570
+BADC541BBF5B88CE1175D7DE7A9DA4E141C3F3BF60A83010C6D4609C702B322675017F29A30665
+9A8FF0208BE4A8B7B96EB80CE5479A42C782B2217D81DA983F9A455A506B58F15AB0D314964D00
+ED0ED538057083AB154B58D58D4EC037D3A39C821201615112CBB34167C3429CA124EC4D6E754B
+B9FB2ECC96D17D09EFFB4D1BF4BB9C62B3D73A68292DDF1465EE9869348318EB5B294715BA329D
+B32095070742DD42E4FB006C7271FEB120921F4614BD066CB330A9FB496B10F251D52BB31EB84E
+3FCC717531F39B018DB5C205A2BC3AFBD1C77EEA9C28067510DFFDF61B649620D936C0FD24F9F8
+C5952527DC3921CCEAD46EA871EED5B0D452911F16C8A3B0D2E62CADF57921FCD447FC386E59C8
+579543793AA37970A8A5B0477B6FAAC04E085541562DF5B0AA097466A57065814F556DA5B783F2
+4033D9B15162A29FC08222FEDD4F9E81057D43D6B90EC469803ED25956FD6DF23F2566B0FBB820
+3FCDA6528043CDA025C30761AA0F441078EE07FA2AE09FE4415AA7AC6AB5E4DCBBFB1B64068480
+8191394F1CCEC0729E601BA79DEDD92945201627222175DABCB7EACED142559A463C24BEAD0A2E
+0BA08300ABE43DE05D23553015AC27CB333DD1C27088433505A239C58EA3C4F3D3B20A948B76A1
+8C5A0AADC426F0E689A055BFA6BE077C01472A5CFF750E0AA05616B86B8FFB9601A8EE8870D289
+735A69C5BFF86F89B346E3C3389B9AED4BAE67A511EA56EE9D0D8D30C7F6FA8BE39B170D8FCD64
+76DFE37E950659853E602931E2E4169939C26EED061FC99EA10CF51996248FFDB6631A72A245EB
+D350EB41409A36AB3B4707763CBE06CA44F3684EBB43D89F3623B01EEC3267D0C00BC4DA5901BA
+EDEAA497ABC1088580DDDA47E0BC086C444EBE2F80193F277F4B8EB6A72304586F11DD4AC824AA
+9C9D1BC2595EB2F0775ADAB8304D00AF32D0DD6CAC0F1357BA2D59B2FCCDB7EAC0933BBB7C35DB
+3F39E1E0871718BC05E0AEE12F5D27F923F9F3117263444F659737A50DF65B1C76ACD082C68026
+536EC258A84ECE54C3E02E1B2E4725926308599899BE3B9B5071D09E114D6033464F8D16665403
+D9577D332C6AC6D02B47EF121ADF2FE19109FB5BFE92CCA44637B8050A1E696487723073DCCD43
+82B1EA1E6653F20909D83A319F17C396EEB1A374207EACF51D2A7676C900EC3DB797E7E0306869
+2BCFF3D86E3D20158C30FAC362635666228128807809DCC84335783259DC7995E28944AB930C14
+7872249B185DC1A43523C01102C7E873251D7098CDED4F3786D26B29DEABF491188FB23BAD917F
+B39224DA0FD10F99A847016BDEDCD50B1D1EDC9B1C0A2C7FC8CC193295397AAD70BD895BB4E94F
+EAA0BF00F3F8526C8449E2F65C2573BB69552AE88F495653F9D5B0EB03EB44AAFC368BAA83FA2D
+3C34F0F46416C4E6BF8867C1BD4411C1C49BECD936B917E59D0BEC9D6AF3C82ABEEE9FA690FDF3
+4E165A7CD9F30A5466B6A28280AD6FD3EF242E690969DC6F729E2E688A0500F0AE4B717EE93613
+3439DCD1D23176C0A6684414B1D0ED176EF1855DD7FE13D1295DDE742C9E5DA54C0B6A52567653
+163F234B72EC546284D833C2DD845FF247DD37D2D3EA3B6B4D795A1DDB091454EE93B247AD9BB4
+03268AECEE9D7E1232EEF1A6F53ABAA723D74CCF52BB4FC6481D3ADC8AE99FB485771280C93ECF
+B50B0CD3A93A79E02E745797271033FAE4B9D373280DB75253BA7D81A41C8CB1586DD9DDD8970F
+5194D38FE7DDA7400EA66A18F6189854A97EC238776AF32D10395F565D4612D1656179DD363ACE
+4A12021905880EEB66CE88692C1D6F3C43A81E50EE681E648A35B71CED97BB06EA7978B8A73650
+B0ED46FE5510890908A13FC498EC43C6D7A947475601185907B4790F7D7E5CC8BC3231F21ABB3A
+D26F8F4AB5542E5554F526427C6AFF9FD082C7A8CD1ABA67527EFDBE6525F367EFBBDC0A5B893F
+F5923B674188E7A72587BBF44CE9662385BC70B1304DB7ACF2E133D9A8698969EA5F39ABA98911
+8807D0A0E18205B6AB095774A95C6A786CB2B2AD69A9404C265AE34F411046D04422607120009C
+8283B9D358275C81F09EDEC6FF8B4A8F371A9623AA6A5DA4E2B50AFB7FFA0D187280FC2C9567EA
+52488544F559917307CEAFFE81BF56EEB9E8CA2BA0E6FFC782DBD0C645610733F6CED2ADE0C095
+3AE1ACF2B1B43BCC3228BB05CE7F5BA7F420C7DBCC2CE36675CDB4FE8046AD36F61215D8A4BF11
+92071A89555F4B3F51DEBF412CA686F912B7A47686B04ED7265AB94847DEAB73D8B8237576965D
+93A96B6523A46EE66B7DCC52F32FBA2AED76808DEE1BA93976743CF489B558010891D4940DE54A
+9E6BCB12E5FF3809BCD4FF21585514619C0FB368905CB137E2429286B5DE589E9F0F189384BF43
+DA7CB6E14CEE64A323174D45A28E39FCF70C47ABD594AF3097EE748B2D3AC22FECFD8F60CF6C1C
+C4200CAE237FDD2F82B5671B448548877F1C2D7CE138F21F530278C1D3A9B9AD5D0B0536B13DBB
+C82AA68D6AE5A8BADA382266EE583CA45B98878F038848FBF34CF8C67C2E8A44FE69A42A8D9CF1
+1A9AF7FC3FE11260E4255F91D23F987B17A310F837CB79E7F6EF1CAAE756C049C1E6171EB1A678
+7EF01DE52B63224DBC34935BF05D0E4B1321676682FD97F444DB3D1ABE3BB759BFA7A604752753
+AAEAFEECD9B58FBCA6CE315993E045B7E98096D9B824986F355043DD9E2D086A7EEAA3045FD9DF
+CC6A63DE1221268CF3CD58EF35CEA99B5E4F10F1F4B33969F2DB7D3C60EAFE86C87597EBA6C493
+8A45FE1342025D604A03BF3E81F477453AAEF2EFE207E8CF4621A97B4076962A0CAFD435819829
+3A5E7FA95F7DEEBF4F0ABE105E04456C1303EA8D1F00DDCEAD57637364A2F6237F6D1FA62F3E05
+87309AF20BB7C3E01E9A4B27231D9C522FCAAFD52195FE2451ED4615C27AA5FD15C7755459FB9C
+92CAF38F21B7B5B65547D8AE91A656A1FD2E9F8BF96A2C73E23E70C51A9C4C89BA0C47406A0587
+FF8D5DC26B996A9BE9887BF54D0F7B78267CA1318685A20BD6BE50CDD8FD0326AC4FE95E4A9A1B
+B58185E2A9C85E13F0FDDA8D02007C7B098A75AF1CD56D8A2A2AD1D11AFC1A04FB62C9CFA6ED98
+5154E166D3C566C44E1C219E0B8742E681E808DA7BAA73A51160AFA75FB4A941A3A6BA423D66C6
+F843C18B95C32CFF294DB40F185D831179D86EFE76D9DE99092DFE369B073C58C40C86C98BBF69
+2C35E1376C4F1CCEF7F49A03948982D90C778778C749EB53C5FD8BF2903B96D38CC3A56FA8B8C3
+F5A8643EA7F4949D34C2FF9F0E7EA52D5C8340BB46B9F2CCB8AE8157937EE54D57D5D9681B5619
+6C501E28BFB9FF2D586B396F390507846348CD00EF5A75A663659CCEEDA54C6FA3E9F7190FFFC8
+DF3BD48AF0525DE3B9B9F1FDCB43380D7DE21D59E7C7FCCA63ACF4156EBE8C55705032FA1AB330
+296025FCEF21DF58BBB358A0151066DD4B58E510587F0CA8FCE35334F7D6C0EE0F5AE8E3CE874C
+C39D0A9AF6DA9D7AFCC654B91F6E18D629BE9B79D15F6F03B0F551B9297587749AE3D09185B67D
+C8424E9B540A8BDCC4753D1F71F312D2510D9269376F253966968900D365A681E028DC918B8E94
+66A23D67D21481FD752755C4061268FBC971514EE2DB07F53051E51E0171414523C367A164C92B
+ACC86AF5CFC1DAA5C2F3C6F0F02F9829EABBDA7B7098A9558473328D0BDCEDE6A2CE04D85AAFC9
+AFB0B925A184EE1B8F856D6F2385BA133C05DCBE7E522A27E53705661326D783620E68B3835E7C
+E28FE239461226651A3CC188D735967E8A7772222D6C244B3AB97392DE039231DB150A449135AC
+C180C4A2FA172315D87EA7AE5292CF14A2F1096F2FED71605A24B016B8513CDFABC3C4E42A94F1
+815E85424AD4BA8BA4FA2811E3088B3BDADAC29C34B1F51AE87074E292F1B3CFB528206FCA4E8B
+EF5E88AF2F6E325F0D75AD1EAE3447E37A17C629CB31B282023B419A27B5A2F46D02AD7FFD605F
+9D2004ADAC9DC062EDDE3C2281D356C7D6F50BD61F0F67C6FB519E78B932AF59DFFEF9F302BFA2
+7BF0E4FCB2472CB6B3C7332C3715AECCF754876D4DAB60798249338D037A20DA707907F3829197
+508E878912186A8325FA0DA25D9036A5C56CED2EC5208C520072679745F5F4E8E7DB5F673927EB
+953D9655C9FEFB235DF33C13E309BED2A61F5C57E28D3B5F2A066F5F15EAFC4B11E0B4F509629E
+D10ED694436DC8F24C8594087B89BAD2E543371EBC6BA9C0603DE058CB4D8630D07A1BC1209124
+1B7DF61806665F6F38A4E1CBF1CC0800C06926DFFC8227C96522E86E109163D6B9F2F61A1A64D5
+FBF74E3961C2605A25F067791E296F9214DDF9858568728F5CFDFC54880B4AB560E63C4040C6CD
+24D11557FC050BA06355E14B1FAA6E0D9A9F7B21774FCFCC230D1397C78C97459A04FFCF993226
+5095102E2E82747D3EACD38E630C57DF7DCC2B0B5E8EE46778FFB84AF81CCAA8DF4EA30A8D44AE
+F86066BA1D57C45F2B6EA6D94CF5EBC1DD4A7EEFED6AD42B09E5673CF6FDF672D24A6C0CA1E35D
+0357F3F17DAC6DDEC1F80F4969A25B7BC37E1A0A149D33F1FB032B8EF02C452ACFD5D0B8CB222E
+FB70599D6C0E64E47DBF7D6C8275C252195FA4C32D2478FB0DDCABCF6E1D2D50B61638B3C7E718
+F72C3D8D938AC3313598040C1448E10221994EBBF33BB3CAC3111F1F2F7BC68DA95F9CDAF1CB1C
+D854C76E0C28F7DB54D86458B7C0F69EB8B058032EBA9D88F0CAEFF306954F331BEF7702427D31
+F33E358717D2786B86842B053A47EA42927411CAC1ED8A110D10BACD5870A102BCBF1321057159
+AAC43FA3AE892E49ED10AEB53F9F530B5E11572C157AFFACA2BF2858A657DEDC674992B2594F29
+66192CED86E3050B92433B355094C7C5D869221A28B3936D3DF0BF7446B1F988F8E839548B5995
+B8C8F860335273A94E49606E088C3C97D0C674179F0C4C62969131FEB764F4C533FE29E2958118
+D2691B2AD7DB3B5F808BA54CA7CC4A17F54D043B5881BEA810EAF19A9689813C7551A672E89F99
+61E1F3C31AAA36BB8AFD8A6B3D77C32528033745A2B2E4CB6A21D6AF798A078D2F82BC3F61039E
+9C56BB76F3E7217F0EB14C5D786698ED5CE606AE908AD6B384F252137FEF44E6F71D411AFD945A
+0A0B16144C0CAB091D537A561E09FE06948A2A0E0AED97514BB6160A8887B859FEA6A166F4917B
+353290856E7F3AF953CEE4E3DBFD59C82A6BFA8059E81EDBF75BF62A051B1CAF23FE353228F308
+2E9761E269FC9492C3B01EC0776CC8F4A67A6AC3FF1A95C64DD855C5FC39B34FEFD29E63599B1D
+4961293AF34D8FAC26E5221C0E12B59A1940F17D458922347D1B43E11198E7525EC1C3A75473AA
+823E306C5C8A718DBF68F58EACBB3A0C1597040000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
diff --git a/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfb b/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfb
new file mode 100644
index 00000000000..9ca4d1b59a0
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhv_dl.pfb
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/tests/uhv_dl.ps b/Build/source/texk/lcdf-typetools/tests/uhv_dl.ps
new file mode 100644
index 00000000000..edccda35291
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhv_dl.ps
@@ -0,0 +1,208 @@
+%!PS-Adobe-3.0
+%%LanguageLevel: 2
+%%DocumentMedia: Plain 612 792 white ( )
+%%BeginProlog
+/magicstr 1 string def
+/magicbox { % row col char name encoding magicbox -
+ 5 3 roll 54 mul 36 add exch 54 mul neg 682 add moveto currentpoint
+ .8 setgray 54 0 rlineto 0 54 rlineto -54 0 rlineto closepath stroke
+ 0 setgray moveto
+ gsave /Helvetica 7 selectfont 3 1.5 rmoveto show grestore
+ gsave /Helvetica 7 selectfont 3 45.5 rmoveto show grestore
+ magicstr 0 3 -1 roll put
+ magicstr stringwidth pop 54 sub -2 div 16 rmoveto magicstr show
+} bind def
+%!PS-AdobeFont-1.0: NimbusSanL-ReguCondLCDFJ 001.005
+%%CreationDate: Wed Aug 3 1994
+% Copyright URW Software, Copyright 1994 by URW
+% URW Software, Copyright 1994 by URW
+9 dict begin
+/XUID [1 5020913 2322999] def
+/FontName /NimbusSanL-ReguCondLCDFJ def
+/FontInfo 10 dict dup begin
+/version (001.005) readonly def
+/Notice (URW Software, Copyright 1994 by URW) readonly def
+/Copyright (Copyright URW Software, Copyright 1994 by URW) readonly def
+/FullName (Nimbus Sans L Regular Condensed) readonly def
+/FamilyName (Nimbus Sans L) readonly def
+/Weight (Regular) readonly def
+/isFixedPitch false def
+/ItalicAngle 0 def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 106 /uni0237 put
+readonly def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/FontBBox {-136 -225 820 944} readonly def
+currentdict end
+currentfile eexec
+8A776DF5437D053715F33367AD5C2F399F4A3C4AA93FCBA250D54A7FA4D42ED633AA72E9BA3524
+9FEB6AB601831178A0690247FFCED3A15C9247FF52A6532CF582CFEB24204AEC140A2201F906F5
+B5CDF776DF1D8C3C1BB0985C38BBA74E00029BEDDF054A05B3B58985E702D2EB02E7FE3316CAC3
+A26DF2A45F5C8EAC11F6A49E79410F4873FBAB97238F123226CBFF6A289FB9E4691F8ED807C137
+C58417798F0381B07CB95AAF0FBF147DD54522894A29759A34CE5A8EF84645EE900D569DC6F224
+ED221522988299C62B184883B76599E2E9B764A8332728F100FBABFF0130700F37057D0803712C
+68D80564AD85A1FB1627D2D8A57A8C4F4E500671382801CCB781A28D3B7F94977D467410DBD713
+B6CEB0739972ADF0655BC62E41028E8F0F4807E7FC46B04028C7426B73282F6A0F1D927C2B967D
+2D1159E84555D3D137FDC7916C501EFC8CB198BB3CCEC4D6238810E0E2242D7ABD704CBAEA0BC5
+14290EFD29D231F461821D89C2A481CC3629806E3A19D4061AF6CE2EEC98258A60A9A0E55D83E8
+ABCDFE0CE041A71B0CE66B3975994FAE1A105004AA95BFF1BB7796E5F88519BE439D1EE3A759C5
+8A7136073557CDE6E98548A21AC4FF7360798932ED54DACF893D00AA2A790E18898C920BB4347D
+E139E09972849C8C3F017BF9C98BBF39E4B59C3F68F496EDA1F0F4F4C4BDF255A8207A0CF88B28
+CF01D7F1CCE8B965CB7896BE352A6809A82369F7732700A1160271223F8CDFE441AE07EC555718
+A960F70649328BEF898BE66153206638BCEE4FE7F3E07FA3A39CD20E6C28FEAC7D7002DF4CCE62
+9E682691663F384998D607D15F493250E0473D322D5DB97F4D7BF20B3941CED9CCDEE293DDDF6B
+92865767EFBA1966BA16D484A0C119164372DA6F102868513FD9CB11BA6C6BDF9C1E514AD17B46
+74F5AA21114444D7740DBD60547F88D7E8590F5957E07D11496D4C1C96B34E6768D54D7C52C5D4
+D7868B0DBDC986BBD0250154B1EDD08FF230B922FF89BEE8843B0591236605D9AC856C8D6B3915
+2C18C2907FFAB83AED18CCD9FE45A1F71FCA2A1FB7C65976D27632CC9EE6971A65B1B5B7F33916
+F98A12B5B3BDC9B4B5DD39F8050D76FB56AEED9EA14F14297A72727DABC7A5EBE5A083F23F6795
+F6A593A6142AECE3B580C53EC0BF54755F144C2CCD2818588DB4DD5318BA92CC1C4CDD60C63D14
+77399DCB5CDDD5735354EB14CC415E02ACFCF2E902B023E947995537191F9B9D36D74DCFCBE394
+BBDE5E90EFCCCD32BF4C33216538556C023A838E13E33DA6140C3E6156D41F3F81E0B5D78814EE
+30414C97A02FBFCD1C7B60E29A730067FD71CC788504AB430C1E976CC8D527B678F4A38901FB93
+CE8AE7BAD1A2ADDAFB8C44B2CEAF0A85D60027E52518A830C493EFB3D31B6E675D5F9A310FB006
+8BBFB86B283AAEB877676A53A748CB6EA95F154477B181EE4934E46DBDAE1776E3E93C84753C66
+5B174C4EED71F1C4D7AB0F89086A90EEA8B658F142CD65FCDDE60020B2B1921F1C4115D13170E7
+0261C3C595A4DC1FFA8F953AA67C194239DA9E1A08A7B20F40E5B5651979A4BC71B2D01DA5D130
+951850CFB5AD02590C2183C728A7C01D11F44B7304F6BA17EF15352DF2B6A622F7A5868AB94932
+33EDA1F509B6EA74912A657F9BADFE398D4BABE03EEF6DBC58530EDAF61CEE533F144C15081459
+7FF69B3A61CD57D6F436E6B7B6D3E1B9D757F9156B21FB72CCBD6EC69B93EFEE5ED2573F8CBABD
+B61C33B9E48CC22A9CCBFFC74EA59FFA76FD0C296C444787B4277ADD90173ECD8E0C304412B790
+A216CEEC12B6D72B02FAEAB9D3EA57334455B108F59AA61F77C989A136A425DD6CFD4C1D2A6A75
+18095A790AA77151503ECDDEC9BD22F6ED8423715CE286AD6B7ADF4F5037B8A4A7203303AE2789
+818FF106F969D161F33521F0750CAB1D39C0D09FF816A14B8503B229D42C9D7B427CAA11D6FCB6
+33ECC8B6DD6E0F306194EF5F9B2DBF688A2A47737E76DA7D21B6A2D2416A400AF197ED24D87AA9
+1EF18711169500D94B54721B7840CEDBC9A918DBD2D8AEEC78FEB009DAF8DBA3ADE2188428C1DC
+054C9E65D0419E31884502F8EFB612D3DAE48E3421D8983D37B040AF882D4220A8BFA250AC9035
+106DFA465D859296CC6F8DD709B253377F29B39031CC4856C8FD28D4424B3AB21635C075E8203E
+3019A0D67B5BBD2BCD4C360152772B2F51C71B96B019E7590FCDB941E74A22F10892A3CFDE8141
+EB8A1C4CFE96B4C782CB91B8C8739F2980FA06F475C4A3EFCAD68F5AF4DFDC65B35E0632F2F8FF
+A59849878724051CCA93179CE730EC8C2F24E085492A3C813F6EE8586DE2B8832C87509E72AB0F
+1BD5A26EFB38FF8440C375B86056CDB5045808EFF61912EE437D7B5EFA48ADF034F286A05A3570
+BADC541BBF5B88CE1175D7DE7A9DA4E141C3F3BF60A83010C6D4609C702B322675017F29A30665
+9A8FF0208BE4A8B7B96EB80CE5479A42C782B2217D81DA983F9A455A506B58F15AB0D314964D00
+ED0ED538057083AB154B58D58D4EC037D3A39C821201615112CBB34167C3429CA124EC4D6E754B
+B9FB2ECC96D17D09EFFB4D1BF4BB9C62B3D73A68292DDF1465EE9869348318EB5B294715BA329D
+B32095070742DD42E4FB006C7271FEB120921F4614BD066CB330A9FB496B10F251D52BB31EB84E
+3FCC717531F39B018DB5C205A2BC3AFBD1C77EEA9C28067510DFFDF61B649620D936C0FD24F9F8
+C5952527DC3921CCEAD46EA871EED5B0D452911F16C8A3B0D2E62CADF57921FCD447FC386E59C8
+579543793AA37970A8A5B0477B6FAAC04E085541562DF5B0AA097466A57065814F556DA5B783F2
+4033D9B15162A29FC08222FEDD4F9E81057D43D6B90EC469803ED25956FD6DF23F2566B0FBB820
+3FCDA6528043CDA025C30761AA0F441078EE07FA2AE09FE4415AA7AC6AB5E4DCBBFB1B64068480
+8191394F1CCEC0729E601BA79DEDD92945201627222175DABCB7EACED142559A463C24BEAD0A2E
+0BA08300ABE43DE05D23553015AC27CB333DD1C27088433505A239C58EA3C4F3D3B20A948B76A1
+8C5A0AADC426F0E689A055BFA6BE077C01472A5CFF750E0AA05616B86B8FFB9601A8EE8870D289
+735A69C5BFF86F89B346E3C3389B9AED4BAE67A511EA56EE9D0D8D30C7F6FA8BE39B170D8FCD64
+76DFE37E950659853E602931E2E4169939C26EED061FC99EA10CF51996248FFDB6631A72A245EB
+D350EB41409A36AB3B4707763CBE06CA44F3684EBB43D89F3623B01EEC3267D0C00BC4DA5901BA
+EDEAA497ABC1088580DDDA47E0BC086C444EBE2F80193F277F4B8EB6A72304586F11DD4AC824AA
+9C9D1BC2595EB2F0775ADAB8304D00AF32D0DD6CAC0F1357BA2D59B2FCCDB7EAC0933BBB7C35DB
+3F39E1E0871718BC05E0AEE12F5D27F923F9F3117263444F659737A50DF65B1C76ACD082C68026
+536EC258A84ECE54C3E02E1B2E4725926308599899BE3B9B5071D09E114D6033464F8D16665403
+D9577D332C6AC6D02B47EF121ADF2FE19109FB5BFE92CCA44637B8050A1E696487723073DCCD43
+82B1EA1E6653F20909D83A319F17C396EEB1A374207EACF51D2A7676C900EC3DB797E7E0306869
+2BCFF3D86E3D20158C30FAC362635666228128807809DCC84335783259DC7995E28944AB930C14
+7872249B185DC1A43523C01102C7E873251D7098CDED4F3786D26B29DEABF491188FB23BAD917F
+B39224DA0FD10F99A847016BDEDCD50B1D1EDC9B1C0A2C7FC8CC193295397AAD70BD895BB4E94F
+EAA0BF00F3F8526C8449E2F65C2573BB69552AE88F495653F9D5B0EB03EB44AAFC368BAA83FA2D
+3C34F0F46416C4E6BF8867C1BD4411C1C49BECD936B917E59D0BEC9D6AF3C82ABEEE9FA690FDF3
+4E165A7CD9F30A5466B6A28280AD6FD3EF242E690969DC6F729E2E688A0500F0AE4B717EE93613
+3439DCD1D23176C0A6684414B1D0ED176EF1855DD7FE13D1295DDE742C9E5DA54C0B6A52567653
+163F234B72EC546284D833C2DD845FF247DD37D2D3EA3B6B4D795A1DDB091454EE93B247AD9BB4
+03268AECEE9D7E1232EEF1A6F53ABAA723D74CCF52BB4FC6481D3ADC8AE99FB485771280C93ECF
+B50B0CD3A93A79E02E745797271033FAE4B9D373280DB75253BA7D81A41C8CB1586DD9DDD8970F
+5194D38FE7DDA7400EA66A18F6189854A97EC238776AF32D10395F565D4612D1656179DD363ACE
+4A12021905880EEB66CE88692C1D6F3C43A81E50EE681E648A35B71CED97BB06EA7978B8A73650
+B0ED46FE5510890908A13FC498EC43C6D7A947475601185907B4790F7D7E5CC8BC3231F21ABB3A
+D26F8F4AB5542E5554F526427C6AFF9FD082C7A8CD1ABA67527EFDBE6525F367EFBBDC0A5B893F
+F5923B674188E7A72587BBF44CE9662385BC70B1304DB7ACF2E133D9A8698969EA5F39ABA98911
+8807D0A0E18205B6AB095774A95C6A786CB2B2AD69A9404C265AE34F411046D04422607120009C
+8283B9D358275C81F09EDEC6FF8B4A8F371A9623AA6A5DA4E2B50AFB7FFA0D187280FC2C9567EA
+52488544F559917307CEAFFE81BF56EEB9E8CA2BA0E6FFC782DBD0C645610733F6CED2ADE0C095
+3AE1ACF2B1B43BCC3228BB05CE7F5BA7F420C7DBCC2CE36675CDB4FE8046AD36F61215D8A4BF11
+92071A89555F4B3F51DEBF412CA686F912B7A47686B04ED7265AB94847DEAB73D8B8237576965D
+93A96B6523A46EE66B7DCC52F32FBA2AED76808DEE1BA93976743CF489B558010891D4940DE54A
+9E6BCB12E5FF3809BCD4FF21585514619C0FB368905CB137E2429286B5DE589E9F0F189384BF43
+DA7CB6E14CEE64A323174D45A28E39FCF70C47ABD594AF3097EE748B2D3AC22FECFD8F60CF6C1C
+C4200CAE237FDD2F82B5671B448548877F1C2D7CE138F21F530278C1D3A9B9AD5D0B0536B13DBB
+C82AA68D6AE5A8BADA382266EE583CA45B98878F038848FBF34CF8C67C2E8A44FE69A42A8D9CF1
+1A9AF7FC3FE11260E4255F91D23F987B17A310F837CB79E7F6EF1CAAE756C049C1E6171EB1A678
+7EF01DE52B63224DBC34935BF05D0E4B1321676682FD97F444DB3D1ABE3BB759BFA7A604752753
+AAEAFEECD9B58FBCA6CE315993E045B7E98096D9B824986F355043DD9E2D086A7EEAA3045FD9DF
+CC6A63DE1221268CF3CD58EF35CEA99B5E4F10F1F4B33969F2DB7D3C60EAFE86C87597EBA6C493
+8A45FE1342025D604A03BF3E81F477453AAEF2EFE207E8CF4621A97B4076962A0CAFD435819829
+3A5E7FA95F7DEEBF4F0ABE105E04456C1303EA8D1F00DDCEAD57637364A2F6237F6D1FA62F3E05
+87309AF20BB7C3E01E9A4B27231D9C522FCAAFD52195FE2451ED4615C27AA5FD15C7755459FB9C
+92CAF38F21B7B5B65547D8AE91A656A1FD2E9F8BF96A2C73E23E70C51A9C4C89BA0C47406A0587
+FF8D5DC26B996A9BE9887BF54D0F7B78267CA1318685A20BD6BE50CDD8FD0326AC4FE95E4A9A1B
+B58185E2A9C85E13F0FDDA8D02007C7B098A75AF1CD56D8A2A2AD1D11AFC1A04FB62C9CFA6ED98
+5154E166D3C566C44E1C219E0B8742E681E808DA7BAA73A51160AFA75FB4A941A3A6BA423D66C6
+F843C18B95C32CFF294DB40F185D831179D86EFE76D9DE99092DFE369B073C58C40C86C98BBF69
+2C35E1376C4F1CCEF7F49A03948982D90C778778C749EB53C5FD8BF2903B96D38CC3A56FA8B8C3
+F5A8643EA7F4949D34C2FF9F0E7EA52D5C8340BB46B9F2CCB8AE8157937EE54D57D5D9681B5619
+6C501E28BFB9FF2D586B396F390507846348CD00EF5A75A663659CCEEDA54C6FA3E9F7190FFFC8
+DF3BD48AF0525DE3B9B9F1FDCB43380D7DE21D59E7C7FCCA63ACF4156EBE8C55705032FA1AB330
+296025FCEF21DF58BBB358A0151066DD4B58E510587F0CA8FCE35334F7D6C0EE0F5AE8E3CE874C
+C39D0A9AF6DA9D7AFCC654B91F6E18D629BE9B79D15F6F03B0F551B9297587749AE3D09185B67D
+C8424E9B540A8BDCC4753D1F71F312D2510D9269376F253966968900D365A681E028DC918B8E94
+66A23D67D21481FD752755C4061268FBC971514EE2DB07F53051E51E0171414523C367A164C92B
+ACC86AF5CFC1DAA5C2F3C6F0F02F9829EABBDA7B7098A9558473328D0BDCEDE6A2CE04D85AAFC9
+AFB0B925A184EE1B8F856D6F2385BA133C05DCBE7E522A27E53705661326D783620E68B3835E7C
+E28FE239461226651A3CC188D735967E8A7772222D6C244B3AB97392DE039231DB150A449135AC
+C180C4A2FA172315D87EA7AE5292CF14A2F1096F2FED71605A24B016B8513CDFABC3C4E42A94F1
+815E85424AD4BA8BA4FA2811E3088B3BDADAC29C34B1F51AE87074E292F1B3CFB528206FCA4E8B
+EF5E88AF2F6E325F0D75AD1EAE3447E37A17C629CB31B282023B419A27B5A2F46D02AD7FFD605F
+9D2004ADAC9DC062EDDE3C2281D356C7D6F50BD61F0F67C6FB519E78B932AF59DFFEF9F302BFA2
+7BF0E4FCB2472CB6B3C7332C3715AECCF754876D4DAB60798249338D037A20DA707907F3829197
+508E878912186A8325FA0DA25D9036A5C56CED2EC5208C520072679745F5F4E8E7DB5F673927EB
+953D9655C9FEFB235DF33C13E309BED2A61F5C57E28D3B5F2A066F5F15EAFC4B11E0B4F509629E
+D10ED694436DC8F24C8594087B89BAD2E543371EBC6BA9C0603DE058CB4D8630D07A1BC1209124
+1B7DF61806665F6F38A4E1CBF1CC0800C06926DFFC8227C96522E86E109163D6B9F2F61A1A64D5
+FBF74E3961C2605A25F067791E296F9214DDF9858568728F5CFDFC54880B4AB560E63C4040C6CD
+24D11557FC050BA06355E14B1FAA6E0D9A9F7B21774FCFCC230D1397C78C97459A04FFCF993226
+5095102E2E82747D3EACD38E630C57DF7DCC2B0B5E8EE46778FFB84AF81CCAA8DF4EA30A8D44AE
+F86066BA1D57C45F2B6EA6D94CF5EBC1DD4A7EEFED6AD42B09E5673CF6FDF672D24A6C0CA1E35D
+0357F3F17DAC6DDEC1F80F4969A25B7BC37E1A0A149D33F1FB032B8EF02C452ACFD5D0B8CB222E
+FB70599D6C0E64E47DBF7D6C8275C252195FA4C32D2478FB0DDCABCF6E1D2D50B61638B3C7E718
+F72C3D8D938AC3313598040C1448E10221994EBBF33BB3CAC3111F1F2F7BC68DA95F9CDAF1CB1C
+D854C76E0C28F7DB54D86458B7C0F69EB8B058032EBA9D88F0CAEFF306954F331BEF7702427D31
+F33E358717D2786B86842B053A47EA42927411CAC1ED8A110D10BACD5870A102BCBF1321057159
+AAC43FA3AE892E49ED10AEB53F9F530B5E11572C157AFFACA2BF2858A657DEDC674992B2594F29
+66192CED86E3050B92433B355094C7C5D869221A28B3936D3DF0BF7446B1F988F8E839548B5995
+B8C8F860335273A94E49606E088C3C97D0C674179F0C4C62969131FEB764F4C533FE29E2958118
+D2691B2AD7DB3B5F808BA54CA7CC4A17F54D043B5881BEA810EAF19A9689813C7551A672E89F99
+61E1F3C31AAA36BB8AFD8A6B3D77C32528033745A2B2E4CB6A21D6AF798A078D2F82BC3F61039E
+9C56BB76F3E7217F0EB14C5D786698ED5CE606AE908AD6B384F252137FEF44E6F71D411AFD945A
+0A0B16144C0CAB091D537A561E09FE06948A2A0E0AED97514BB6160A8887B859FEA6A166F4917B
+353290856E7F3AF953CEE4E3DBFD59C82A6BFA8059E81EDBF75BF62A051B1CAF23FE353228F308
+2E9761E269FC9492C3B01EC0776CC8F4A67A6AC3FF1A95C64DD855C5FC39B34FEFD29E63599B1D
+4961293AF34D8FAC26E5221C0E12B59A1940F17D458922347D1B43E11198E7525EC1C3A75473AA
+823E306C5C8A718DBF68F58EACBB3A0C1597040000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndProlog
+%%Page: 1 1
+save
+/NimbusSanL-ReguCondLCDFJ findfont dup length dict begin
+ { 1 index /FID ne {def} {pop pop} ifelse } forall
+ /Encoding [ /.notdef /space /uni0237 ] def
+ currentdict end /X exch definefont pop
+/Helvetica-Bold 16 selectfont 36 742 moveto (NimbusSanL-ReguCondLCDFJ) show
+/X 24 selectfont
+0 0 0 (.notdef) ('\\000') magicbox
+0 1 1 (space) () magicbox
+0 2 2 (uni0237) ('j') magicbox
+showpage restore
+%%EOF
diff --git a/Build/source/texk/lcdf-typetools/tests/uhv_re.afm b/Build/source/texk/lcdf-typetools/tests/uhv_re.afm
new file mode 100644
index 00000000000..03f3ec00056
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhv_re.afm
@@ -0,0 +1,254 @@
+StartFontMetrics 2.0
+Comment Generated by t1rawafm
+Version 001.005
+Notice URW Software, Copyright 1994 by URW
+FullName Nimbus Sans L Regular Condensed_T2CAdobeEncoding Enc
+FamilyName Nimbus Sans L
+Weight Regular
+ItalicAngle 0.0
+IsFixedPitch false
+UnderlinePosition -100
+UnderlineThickness 50
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 78
+StdVW 73
+FontBBox -136 -225 820 944
+FontName NimbusSanL-ReguCondT2CAdobeEncoding
+Characters 231
+StartCharMetrics 231
+C 0 ; WX 273 ; N grave ; B 11 593 173 734 ;
+C 1 ; WX 273 ; N acute ; B 100 593 262 734 ;
+C 2 ; WX 273 ; N circumflex ; B 17 593 256 734 ;
+C 3 ; WX 273 ; N tilde ; B -3 606 276 722 ;
+C 4 ; WX 273 ; N dieresis ; B 33 604 240 706 ;
+C 5 ; WX 273 ; N hungarumlaut ; B 25 593 335 734 ;
+C 6 ; WX 273 ; N ring ; B 61 572 212 756 ;
+C 7 ; WX 273 ; N caron ; B 17 593 256 734 ;
+C 8 ; WX 273 ; N breve ; B 11 595 263 731 ;
+C 9 ; WX 273 ; N macron ; B 8 627 265 684 ;
+C 10 ; WX 273 ; N dotaccent ; B 99 604 174 706 ;
+C 11 ; WX 273 ; N cedilla ; B 37 -225 212 0 ;
+C 12 ; WX 273 ; N ogonek ; B 60 -225 235 0 ;
+C 16 ; WX 273 ; N quotedblleft ; B 31 469 252 725 ;
+C 17 ; WX 273 ; N quotedblright ; B 21 462 242 718 ;
+C 21 ; WX 456 ; N endash ; B 0 240 456 313 ;
+C 22 ; WX 820 ; N emdash ; B 0 240 820 313 ;
+C 25 ; WX 228 ; N dotlessi ; B 78 0 150 523 ;
+C 28 ; WX 410 ; N fi ; B 11 0 356 728 ;
+C 29 ; WX 410 ; N fl ; B 11 0 354 728 ;
+C 33 ; WX 228 ; N exclam ; B 74 0 153 718 ;
+C 34 ; WX 291 ; N quotedbl ; B 57 463 234 718 ;
+C 35 ; WX 456 ; N numbersign ; B 23 0 434 688 ;
+C 36 ; WX 456 ; N dollar ; B 26 -115 426 775 ;
+C 37 ; WX 729 ; N percent ; B 32 -19 697 703 ;
+C 38 ; WX 547 ; N ampersand ; B 36 -15 529 718 ;
+C 39 ; WX 182 ; N quoteright ; B 43 462 129 718 ;
+C 40 ; WX 273 ; N parenleft ; B 56 -207 245 733 ;
+C 41 ; WX 273 ; N parenright ; B 28 -207 217 733 ;
+C 42 ; WX 319 ; N asterisk ; B 32 431 286 718 ;
+C 43 ; WX 479 ; N plus ; B 32 0 447 505 ;
+C 44 ; WX 228 ; N comma ; B 71 -147 157 107 ;
+C 45 ; WX 273 ; N hyphen ; B 36 232 237 322 ;
+C 46 ; WX 228 ; N period ; B 71 0 157 107 ;
+C 47 ; WX 228 ; N slash ; B -14 -19 242 737 ;
+C 48 ; WX 456 ; N zero ; B 30 -19 426 703 ;
+C 49 ; WX 456 ; N one ; B 83 0 294 703 ;
+C 50 ; WX 456 ; N two ; B 21 0 416 703 ;
+C 51 ; WX 456 ; N three ; B 28 -19 428 703 ;
+C 52 ; WX 456 ; N four ; B 20 0 429 703 ;
+C 53 ; WX 456 ; N five ; B 26 -19 421 688 ;
+C 54 ; WX 456 ; N six ; B 31 -19 425 703 ;
+C 55 ; WX 456 ; N seven ; B 30 0 429 688 ;
+C 56 ; WX 456 ; N eight ; B 31 -19 424 703 ;
+C 57 ; WX 456 ; N nine ; B 34 -19 421 703 ;
+C 58 ; WX 228 ; N colon ; B 71 0 157 516 ;
+C 59 ; WX 228 ; N semicolon ; B 71 -147 157 516 ;
+C 60 ; WX 479 ; N less ; B 39 10 440 496 ;
+C 61 ; WX 479 ; N equal ; B 32 115 447 390 ;
+C 62 ; WX 479 ; N greater ; B 39 10 440 496 ;
+C 63 ; WX 456 ; N question ; B 46 0 403 727 ;
+C 64 ; WX 832 ; N at ; B 121 -19 712 737 ;
+C 65 ; WX 547 ; N A ; B 11 0 536 718 ;
+C 66 ; WX 547 ; N B ; B 61 0 514 718 ;
+C 67 ; WX 592 ; N C ; B 36 -19 558 737 ;
+C 68 ; WX 592 ; N D ; B 66 0 553 718 ;
+C 69 ; WX 547 ; N E ; B 71 0 505 718 ;
+C 70 ; WX 501 ; N F ; B 71 0 478 718 ;
+C 71 ; WX 638 ; N G ; B 39 -19 577 737 ;
+C 72 ; WX 592 ; N H ; B 63 0 530 718 ;
+C 73 ; WX 228 ; N I ; B 75 0 154 718 ;
+C 74 ; WX 410 ; N J ; B 14 -19 351 718 ;
+C 75 ; WX 547 ; N K ; B 62 0 544 718 ;
+C 76 ; WX 456 ; N L ; B 62 0 440 718 ;
+C 77 ; WX 683 ; N M ; B 60 0 624 718 ;
+C 78 ; WX 592 ; N N ; B 62 0 530 718 ;
+C 79 ; WX 638 ; N O ; B 32 -19 606 737 ;
+C 80 ; WX 547 ; N P ; B 71 0 510 718 ;
+C 81 ; WX 638 ; N Q ; B 32 -56 606 737 ;
+C 82 ; WX 592 ; N R ; B 72 0 561 718 ;
+C 83 ; WX 547 ; N S ; B 40 -19 508 737 ;
+C 84 ; WX 501 ; N T ; B 11 0 490 718 ;
+C 85 ; WX 592 ; N U ; B 65 -19 528 718 ;
+C 86 ; WX 547 ; N V ; B 16 0 531 718 ;
+C 87 ; WX 774 ; N W ; B 13 0 761 718 ;
+C 88 ; WX 547 ; N X ; B 16 0 531 718 ;
+C 89 ; WX 547 ; N Y ; B 11 0 535 718 ;
+C 90 ; WX 501 ; N Z ; B 19 0 482 718 ;
+C 91 ; WX 228 ; N bracketleft ; B 52 -196 205 722 ;
+C 92 ; WX 228 ; N backslash ; B -14 -19 242 737 ;
+C 93 ; WX 228 ; N bracketright ; B 23 -196 176 722 ;
+C 94 ; WX 385 ; N asciicircum ; B -11 264 396 688 ;
+C 95 ; WX 456 ; N underscore ; B 0 -125 456 -75 ;
+C 96 ; WX 182 ; N quoteleft ; B 53 469 139 725 ;
+C 97 ; WX 456 ; N a ; B 30 -15 435 538 ;
+C 98 ; WX 456 ; N b ; B 48 -15 424 718 ;
+C 99 ; WX 410 ; N c ; B 25 -15 391 538 ;
+C 100 ; WX 456 ; N d ; B 29 -15 409 718 ;
+C 101 ; WX 456 ; N e ; B 33 -15 423 538 ;
+C 102 ; WX 228 ; N f ; B 11 0 215 728 ;
+C 103 ; WX 456 ; N g ; B 33 -220 409 538 ;
+C 104 ; WX 456 ; N h ; B 53 0 403 718 ;
+C 105 ; WX 182 ; N i ; B 55 0 127 718 ;
+C 106 ; WX 182 ; N j ; B -13 -210 127 718 ;
+C 107 ; WX 410 ; N k ; B 55 0 411 718 ;
+C 108 ; WX 182 ; N l ; B 55 0 127 718 ;
+C 109 ; WX 683 ; N m ; B 53 0 631 538 ;
+C 110 ; WX 456 ; N n ; B 53 0 403 538 ;
+C 111 ; WX 456 ; N o ; B 29 -14 427 538 ;
+C 112 ; WX 456 ; N p ; B 48 -207 424 538 ;
+C 113 ; WX 456 ; N q ; B 29 -207 405 538 ;
+C 114 ; WX 273 ; N r ; B 63 0 272 538 ;
+C 115 ; WX 410 ; N s ; B 26 -15 380 538 ;
+C 116 ; WX 228 ; N t ; B 11 -7 211 669 ;
+C 117 ; WX 456 ; N u ; B 56 -15 401 523 ;
+C 118 ; WX 410 ; N v ; B 7 0 403 523 ;
+C 119 ; WX 592 ; N w ; B 11 0 581 523 ;
+C 120 ; WX 410 ; N x ; B 9 0 402 523 ;
+C 121 ; WX 410 ; N y ; B 9 -214 401 523 ;
+C 122 ; WX 410 ; N z ; B 25 0 385 523 ;
+C 123 ; WX 274 ; N braceleft ; B 34 -196 239 722 ;
+C 124 ; WX 213 ; N bar ; B 77 -19 137 737 ;
+C 125 ; WX 274 ; N braceright ; B 34 -196 239 722 ;
+C 126 ; WX 479 ; N asciitilde ; B 50 181 429 322 ;
+C 158 ; WX 456 ; N currency ; B 23 99 433 603 ;
+C 159 ; WX 456 ; N section ; B 35 -191 420 737 ;
+C 189 ; WX 273 ; N quotedblbase ; B 21 -149 242 107 ;
+C 190 ; WX 456 ; N guillemotleft ; B 80 108 376 446 ;
+C 191 ; WX 456 ; N guillemotright ; B 80 108 376 446 ;
+C -1 ; WX 547 ; N Adieresis ; B 11 0 536 901 ;
+C -1 ; WX 547 ; N Aacute ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Agrave ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Acircumflex ; B 11 0 536 929 ;
+C -1 ; WX 547 ; N Atilde ; B 11 0 536 917 ;
+C -1 ; WX 547 ; N Aring ; B 11 0 536 944 ;
+C -1 ; WX 547 ; N Edieresis ; B 71 0 505 901 ;
+C -1 ; WX 547 ; N Eacute ; B 71 0 505 929 ;
+C -1 ; WX 547 ; N Egrave ; B 71 0 505 929 ;
+C -1 ; WX 547 ; N Ecircumflex ; B 71 0 505 929 ;
+C -1 ; WX 228 ; N Idieresis ; B 11 0 218 901 ;
+C -1 ; WX 228 ; N Iacute ; B 75 0 240 903 ;
+C -1 ; WX 228 ; N Igrave ; B -11 0 153 929 ;
+C -1 ; WX 228 ; N Icircumflex ; B -5 0 234 929 ;
+C -1 ; WX 592 ; N Ntilde ; B 62 0 530 917 ;
+C -1 ; WX 638 ; N Odieresis ; B 32 -19 606 901 ;
+C -1 ; WX 638 ; N Oacute ; B 32 -19 606 929 ;
+C -1 ; WX 638 ; N Ograve ; B 32 -19 606 929 ;
+C -1 ; WX 638 ; N Ocircumflex ; B 32 -19 606 929 ;
+C -1 ; WX 638 ; N Otilde ; B 32 -19 606 917 ;
+C -1 ; WX 547 ; N Scaron ; B 40 -19 508 929 ;
+C -1 ; WX 592 ; N Udieresis ; B 65 -19 528 901 ;
+C -1 ; WX 592 ; N Uacute ; B 65 -19 528 929 ;
+C -1 ; WX 592 ; N Ugrave ; B 65 -19 528 929 ;
+C -1 ; WX 592 ; N Ucircumflex ; B 65 -19 528 929 ;
+C -1 ; WX 547 ; N Yacute ; B 11 0 535 929 ;
+C -1 ; WX 501 ; N Zcaron ; B 19 0 482 929 ;
+C -1 ; WX 547 ; N Ydieresis ; B 11 0 535 901 ;
+C -1 ; WX 456 ; N adieresis ; B 30 -15 435 706 ;
+C -1 ; WX 456 ; N aacute ; B 30 -15 435 734 ;
+C -1 ; WX 456 ; N agrave ; B 30 -15 435 734 ;
+C -1 ; WX 456 ; N acircumflex ; B 30 -15 435 734 ;
+C -1 ; WX 456 ; N atilde ; B 30 -15 435 722 ;
+C -1 ; WX 456 ; N aring ; B 30 -15 435 769 ;
+C -1 ; WX 456 ; N edieresis ; B 33 -15 423 706 ;
+C -1 ; WX 456 ; N eacute ; B 33 -15 423 734 ;
+C -1 ; WX 456 ; N egrave ; B 33 -15 423 734 ;
+C -1 ; WX 456 ; N ecircumflex ; B 33 -15 423 734 ;
+C -1 ; WX 228 ; N idieresis ; B 11 0 218 706 ;
+C -1 ; WX 228 ; N iacute ; B 78 0 240 734 ;
+C -1 ; WX 228 ; N igrave ; B -11 0 151 734 ;
+C -1 ; WX 228 ; N icircumflex ; B -5 0 234 734 ;
+C -1 ; WX 456 ; N ntilde ; B 53 0 403 722 ;
+C -1 ; WX 456 ; N odieresis ; B 29 -14 427 706 ;
+C -1 ; WX 456 ; N oacute ; B 29 -14 427 734 ;
+C -1 ; WX 456 ; N ograve ; B 29 -14 427 734 ;
+C -1 ; WX 456 ; N ocircumflex ; B 29 -14 427 734 ;
+C -1 ; WX 456 ; N otilde ; B 29 -14 427 722 ;
+C -1 ; WX 410 ; N scaron ; B 26 -15 380 734 ;
+C -1 ; WX 456 ; N udieresis ; B 56 -15 401 706 ;
+C -1 ; WX 456 ; N uacute ; B 56 -15 401 734 ;
+C -1 ; WX 456 ; N ugrave ; B 56 -15 401 734 ;
+C -1 ; WX 456 ; N ucircumflex ; B 56 -15 401 734 ;
+C -1 ; WX 410 ; N yacute ; B 9 -214 401 734 ;
+C -1 ; WX 410 ; N zcaron ; B 25 0 385 734 ;
+C -1 ; WX 410 ; N ydieresis ; B 9 -214 401 706 ;
+C -1 ; WX 820 ; N AE ; B 7 0 780 718 ;
+C -1 ; WX 820 ; N OE ; B 30 -19 791 737 ;
+C -1 ; WX 638 ; N Oslash ; B 32 -19 607 737 ;
+C -1 ; WX 592 ; N Ccedilla ; B 36 -225 558 737 ;
+C -1 ; WX 592 ; N Eth ; B 0 0 553 718 ;
+C -1 ; WX 456 ; N Lslash ; B -16 0 440 718 ;
+C -1 ; WX 547 ; N Thorn ; B 71 0 510 718 ;
+C -1 ; WX 729 ; N ae ; B 30 -15 695 538 ;
+C -1 ; WX 774 ; N oe ; B 29 -15 740 538 ;
+C -1 ; WX 501 ; N oslash ; B 23 -22 440 545 ;
+C -1 ; WX 501 ; N germandbls ; B 55 -15 468 728 ;
+C -1 ; WX 410 ; N ccedilla ; B 25 -225 391 538 ;
+C -1 ; WX 182 ; N lslash ; B -16 0 198 718 ;
+C -1 ; WX 456 ; N eth ; B 29 -15 428 737 ;
+C -1 ; WX 456 ; N thorn ; B 48 -207 424 718 ;
+C -1 ; WX 456 ; N sterling ; B 27 -16 442 718 ;
+C -1 ; WX 456 ; N cent ; B 42 -115 421 623 ;
+C -1 ; WX 456 ; N florin ; B -9 -207 411 737 ;
+C -1 ; WX 456 ; N yen ; B 2 0 453 688 ;
+C -1 ; WX 273 ; N onesuperior ; B 35 281 182 703 ;
+C -1 ; WX 273 ; N twosuperior ; B 3 280 265 714 ;
+C -1 ; WX 273 ; N threesuperior ; B 4 270 266 714 ;
+C -1 ; WX 228 ; N periodcentered ; B 63 190 166 315 ;
+C -1 ; WX 228 ; N middot ; B 63 190 166 315 ;
+C -1 ; WX 820 ; N ellipsis ; B 94 0 726 107 ;
+C -1 ; WX 273 ; N exclamdown ; B 97 -195 176 523 ;
+C -1 ; WX 501 ; N questiondown ; B 75 -201 432 525 ;
+C -1 ; WX 273 ; N guilsinglright ; B 72 108 201 446 ;
+C -1 ; WX 273 ; N guilsinglleft ; B 72 108 201 446 ;
+C -1 ; WX 273 ; N sfthyphen ; B 36 232 237 322 ;
+C -1 ; WX 456 ; N dagger ; B 35 -159 421 718 ;
+C -1 ; WX 456 ; N daggerdbl ; B 35 -159 421 718 ;
+C -1 ; WX 157 ; N quotesingle ; B 48 463 108 718 ;
+C -1 ; WX 328 ; N degree ; B 44 411 284 703 ;
+C -1 ; WX 479 ; N minus ; B 32 216 447 289 ;
+C -1 ; WX 479 ; N multiply ; B 32 0 447 506 ;
+C -1 ; WX 479 ; N divide ; B 32 -19 447 524 ;
+C -1 ; WX 820 ; N trademark ; B 38 306 740 718 ;
+C -1 ; WX 440 ; N paragraph ; B 15 -173 408 718 ;
+C -1 ; WX 182 ; N quotesinglbase ; B 43 -149 129 107 ;
+C -1 ; WX 303 ; N ordfeminine ; B 20 304 284 737 ;
+C -1 ; WX 299 ; N ordmasculine ; B 20 304 280 737 ;
+C -1 ; WX 479 ; N plusminus ; B 32 0 447 561 ;
+C -1 ; WX 684 ; N onehalf ; B 35 -19 634 703 ;
+C -1 ; WX 684 ; N onequarter ; B 60 -19 620 703 ;
+C -1 ; WX 684 ; N threequarters ; B 37 -19 664 714 ;
+C -1 ; WX 137 ; N fraction ; B -136 -19 273 703 ;
+C -1 ; WX 820 ; N perthousand ; B 6 -19 815 703 ;
+C -1 ; WX 604 ; N copyright ; B -11 -19 617 737 ;
+C -1 ; WX 604 ; N registered ; B -11 -19 617 737 ;
+C -1 ; WX 228 ; N space ; B 0 0 0 0 ;
+C -1 ; WX 228 ; N nbspace ; B 0 0 0 0 ;
+C -1 ; WX 287 ; N bullet ; B 15 202 273 517 ;
+C -1 ; WX 479 ; N logicalnot ; B 32 108 447 390 ;
+C -1 ; WX 213 ; N brokenbar ; B 77 -19 137 737 ;
+C -1 ; WX 456 ; N mu ; B 56 -207 401 523 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/Build/source/texk/lcdf-typetools/tests/uhv_re.pfa b/Build/source/texk/lcdf-typetools/tests/uhv_re.pfa
new file mode 100644
index 00000000000..c728c2a1c4b
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhv_re.pfa
@@ -0,0 +1,901 @@
+%!PS-AdobeFont-1.0: NimbusSanL-ReguCond 001.005
+%%CreationDate: Wed Aug 3 1994
+% Copyright URW Software, Copyright 1994 by URW
+% URW Software, Copyright 1994 by URW
+%% T1reencode is free software. See <http://www.lcdf.org/type/>.
+11 dict begin
+/FontInfo 10 dict dup begin
+/version (001.005) readonly def
+/Notice (URW Software, Copyright 1994 by URW) readonly def
+/Copyright (Copyright URW Software, Copyright 1994 by URW) readonly def
+/FullName (Nimbus Sans L Regular Condensed_T2CAdobeEncoding Enc) readonly def
+/FamilyName (Nimbus Sans L) readonly def
+/Weight (Regular) readonly def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -100 def
+/UnderlineThickness 50 def
+end readonly def
+/XUID [1 5020913 2552790 13843793 16426425 3718337 7959197 2293760] def
+/FontName /NimbusSanL-ReguCondT2CAdobeEncoding def
+/PaintType 0 def
+/FontBBox {-136 -225 820 944} readonly def
+/FontType 1 def
+/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /grave put
+dup 1 /acute put
+dup 2 /circumflex put
+dup 3 /tilde put
+dup 4 /dieresis put
+dup 5 /hungarumlaut put
+dup 6 /ring put
+dup 7 /caron put
+dup 8 /breve put
+dup 9 /macron put
+dup 10 /dotaccent put
+dup 11 /cedilla put
+dup 12 /ogonek put
+dup 14 /angleleft put
+dup 15 /angleright put
+dup 16 /quotedblleft put
+dup 17 /quotedblright put
+dup 18 /cyrflex put
+dup 19 /dblgrave put
+dup 20 /cyrbreve put
+dup 21 /endash put
+dup 22 /emdash put
+dup 25 /dotlessi put
+dup 27 /ff put
+dup 28 /fi put
+dup 29 /fl put
+dup 30 /ffi put
+dup 31 /ffl put
+dup 33 /exclam put
+dup 34 /quotedbl put
+dup 35 /numbersign put
+dup 36 /dollar put
+dup 37 /percent put
+dup 38 /ampersand put
+dup 39 /quoteright put
+dup 40 /parenleft put
+dup 41 /parenright put
+dup 42 /asterisk put
+dup 43 /plus put
+dup 44 /comma put
+dup 45 /hyphen put
+dup 46 /period put
+dup 47 /slash put
+dup 48 /zero put
+dup 49 /one put
+dup 50 /two put
+dup 51 /three put
+dup 52 /four put
+dup 53 /five put
+dup 54 /six put
+dup 55 /seven put
+dup 56 /eight put
+dup 57 /nine put
+dup 58 /colon put
+dup 59 /semicolon put
+dup 60 /less put
+dup 61 /equal put
+dup 62 /greater put
+dup 63 /question put
+dup 64 /at put
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 70 /F put
+dup 71 /G put
+dup 72 /H put
+dup 73 /I put
+dup 74 /J put
+dup 75 /K put
+dup 76 /L put
+dup 77 /M put
+dup 78 /N put
+dup 79 /O put
+dup 80 /P put
+dup 81 /Q put
+dup 82 /R put
+dup 83 /S put
+dup 84 /T put
+dup 85 /U put
+dup 86 /V put
+dup 87 /W put
+dup 88 /X put
+dup 89 /Y put
+dup 90 /Z put
+dup 91 /bracketleft put
+dup 92 /backslash put
+dup 93 /bracketright put
+dup 94 /asciicircum put
+dup 95 /underscore put
+dup 96 /quoteleft put
+dup 97 /a put
+dup 98 /b put
+dup 99 /c put
+dup 100 /d put
+dup 101 /e put
+dup 102 /f put
+dup 103 /g put
+dup 104 /h put
+dup 105 /i put
+dup 106 /j put
+dup 107 /k put
+dup 108 /l put
+dup 109 /m put
+dup 110 /n put
+dup 111 /o put
+dup 112 /p put
+dup 113 /q put
+dup 114 /r put
+dup 115 /s put
+dup 116 /t put
+dup 117 /u put
+dup 118 /v put
+dup 119 /w put
+dup 120 /x put
+dup 121 /y put
+dup 122 /z put
+dup 123 /braceleft put
+dup 124 /bar put
+dup 125 /braceright put
+dup 126 /asciitilde put
+dup 127 /hyphen put
+dup 150 /afii10145 put
+dup 156 /afii10023 put
+dup 157 /afii61352 put
+dup 158 /currency put
+dup 159 /section put
+dup 182 /afii10193 put
+dup 186 /afii10846 put
+dup 188 /afii10071 put
+dup 189 /quotedblbase put
+dup 190 /guillemotleft put
+dup 191 /guillemotright put
+dup 192 /afii10017 put
+dup 193 /afii10018 put
+dup 194 /afii10019 put
+dup 195 /afii10020 put
+dup 196 /afii10021 put
+dup 197 /afii10022 put
+dup 198 /afii10024 put
+dup 199 /afii10025 put
+dup 200 /afii10026 put
+dup 201 /afii10027 put
+dup 202 /afii10028 put
+dup 203 /afii10029 put
+dup 204 /afii10030 put
+dup 205 /afii10031 put
+dup 206 /afii10032 put
+dup 207 /afii10033 put
+dup 208 /afii10034 put
+dup 209 /afii10035 put
+dup 210 /afii10036 put
+dup 211 /afii10037 put
+dup 212 /afii10038 put
+dup 213 /afii10039 put
+dup 214 /afii10040 put
+dup 215 /afii10041 put
+dup 216 /afii10042 put
+dup 217 /afii10043 put
+dup 218 /afii10044 put
+dup 219 /afii10045 put
+dup 220 /afii10046 put
+dup 221 /afii10047 put
+dup 222 /afii10048 put
+dup 223 /afii10049 put
+dup 224 /afii10065 put
+dup 225 /afii10066 put
+dup 226 /afii10067 put
+dup 227 /afii10068 put
+dup 228 /afii10069 put
+dup 229 /afii10070 put
+dup 230 /afii10072 put
+dup 231 /afii10073 put
+dup 232 /afii10074 put
+dup 233 /afii10075 put
+dup 234 /afii10076 put
+dup 235 /afii10077 put
+dup 236 /afii10078 put
+dup 237 /afii10079 put
+dup 238 /afii10080 put
+dup 239 /afii10081 put
+dup 240 /afii10082 put
+dup 241 /afii10083 put
+dup 242 /afii10084 put
+dup 243 /afii10085 put
+dup 244 /afii10086 put
+dup 245 /afii10087 put
+dup 246 /afii10088 put
+dup 247 /afii10089 put
+dup 248 /afii10090 put
+dup 249 /afii10091 put
+dup 250 /afii10092 put
+dup 251 /afii10093 put
+dup 252 /afii10094 put
+dup 253 /afii10095 put
+dup 254 /afii10096 put
+dup 255 /afii10097 put
+readonly def
+%/UniqueID 5020913 def
+currentdict end
+currentfile eexec
+8A776DF5437D053715F33367AD5C2F399F4A3FF62A0B04E82D8B2B3129A2D94C7258D26C332618
+F779811EFC1D3D3AB02536EE4A92FF127539FF8455AE9134B9E14338C9759A08FE695F2CC43E73
+D6F64F8BFD9DA10ACABA4512E1CFD3807AD18E8BA5ED2C9F5EA8241B128A8EFE0CE041D06EB102
+DC2468B2728E69F2EDF084EA67DB23EEA2237E3437C1A30FD9148411119F00772297ECA2C9242B
+9B16CC8362FFEC5103D95D1CE64EB8A6D26326DCABAD6EB67FF9CFBAC864E8E69920EC1F8A0C80
+F960B1628072A35F541CD03660EA32BC80231A1502D931515940235964389EBF353B55BA8BFDFF
+1DBED1185F46B8D08D8109743F6374137E0ECB096DBBD52F5F76EA14324732041C7EF90686F91C
+0265E252E778873A5C6463C98C8685736A368DEBDED7A53C4F471D55E592DF4944CECD9D58B2AB
+987CFEC520C3DA3688E06626D829D808992C9639864E1C1C1A781B9BC262F0118DD3256846FC67
+FF9B4D61A957F0FA47C3B8C844408C1957FF0EA33CAF062CDC572A1AE06FE6C03BD745B08FCE35
+0E1DEF72B145CF69EA554A7879C7375992DA64C7AA2518D984336FD28238D4D3D18D83551C5EFD
+1354DC5FE1C17800082C38EEDAAB0B182529694C57CC8CDD97B3BFAE6A04037E6C17C63E22625D
+CC1DE0FA4E53ADF8652EB58D08093F7028CE2A5F8A08E743FD342CB8D9AE11D2C73AE9505E3FD3
+6302C2B3B2401009E9A501882B5CD80FD12A508489D9F9EDC38F69726B4E1A223C2A5D283D04C5
+FC885FE55BDCA67790129DFF3DF9348FAC84DEAAD2AF6FDE945FA70275AB10FF33E2E5979052D5
+BB2375B8A895B9A38DC5EE96313063DE00DF60D5353D434F774636A9FFF31264A9F33F451AA260
+D8814D8D0AF9D58C2C05CED6BA29801B04D418CC268A996AE3CD407CF55D95CB86557434082BA3
+4B031A15A3B01E3BBE9196428BBD0C58E6DBF1441D2C0CD755EC8B4E070E305CA8C05898686E59
+2150F3FF10FBFADCBB587FD9DF73E86C0A34C5B87DDE3846BEE1C88E7CB9BF23D0A9900EF022C9
+5BEE407E64C60B1BA96DD7A7FCB3C21A4A3456AD2DA23E3C07C05F5B0B60DD6119D858E8966921
+51624AC4192929EDE4BE53A5A195DC0C6C3BC7A8B6E4E27EC9CE8CCF381A425988CCCB3AE7B47C
+75CE05C293DF0411EE8F0A4E9099C24E6E98BF53E7E3094ED1DC944FBA25BC27B4A9E38FC7EEAE
+0D92B8CDF30CA7A54D37059BD2BB016786BCD3A049201A3900A74C5D5127C02C4D84CA7CDA4998
+FBD636E8E80626EAFDDE9081916416A25685D4C723CB3B985442E287F034805FF4F4D115579DE0
+CC45B3E713DD69949D61F4522E9FB8EDE4CF8B3A8C271BB7DF77721E72541A0BE5DD9D57684284
+ED1924042C7DC87E6B8B65CABB0BE1852F5835DDAD4A444DEA6BAAF360AA60875475F4C5D7FB1C
+539DB35AF55AD17A4AD907DED12510CFC96D718C9E791C36CEE74F5C1302197F9F95D72A65F33B
+AE3889DE2420B3E3A28D735C59BBD20B3596D3C5720B93A3E935AA652C0B70E655FCE2A9A26CB9
+826CF9D4504C5BF429DD5A2EFDC3EA043702CAB57B9DC5BF9831F86E8620A1DBC98AA9EB784534
+D3E9CA3F5AFD8F3024F3D8C69DB194030EDF6D422042E63BE84EAA60FFC2EE9EDEF46B33520D61
+0B432F0107E5999E8DBD1FCB20446987CEA1944FB89C57280D0F05B24866BE32C0B817A866AC9E
+FBF6A6E720A938F5774FFEBCE0A319FB410F1FB095C2F2F772B9BA195B0F5957BD3B18556087D7
+52B3E4605B81B6BE387BAD1B3AEF0CFA7DD1FF26176EFBDC4AEA160F30F006AA61152CE88441C8
+F53D6071CAB17379BD4014EAD85D6E7D1FD1E1AB35834E914915376A127D87C0A5C4790DF18AE8
+DE50106FF1EC54033394AC3B0032D6CF19AD2181D6D5F5CF689544A82D323604BD9F35A475A417
+0B011701815CEE9018765F47F68F126C87B8D5D7C986B6C56E0CDB2DC3F0F6517C9C418DA0915E
+CD245C1F860C6CFDEBC08F620DAB1C824E4A4E81527F6BEB4CCDA9D43835A12F424499373B1524
+4E34F01A8F3E17FA83D956CF068911EFD0CFB29AA376B984192FA321C96B32DF48ED0085B8BF72
+9B4B746748E2949006474B0D562584D0CF3CCF83795AD9FC2853ADB945EE86DE717473AB8FF8D3
+F43372160E71C50DD21993E7B054F31FB6DA5B2FB5917CDE4233587AAAEFB379C7B77014262EC5
+E6192F3C79B2DEAF6AC043B02CA8FEF643E56D5F3FDB37464D62F20B23A5BE7CC7A1CDFAE9467A
+87F64B3248679D577BD8E0D6A709EF1E9E5C5A8CE0E93D45BF7F3448BDFF59C3991CCE32CC8748
+B240428832B7F084787FD6F808766C760085F06217AD8CA80C36E4673267B824B722ECB3C7D589
+B1CA0D09649D1DD383BE2942320C0FEC10032BF30B0E620BAE0FBCAF1A7D47083C93E891FC663F
+9B2361F6EC1BEAFBCFDD6CE0837FEAA3D0AB44A5531C61328C3A456AD61FFB0D81C7B8F67EE6A3
+B2815208711ED945E18B4BBCED695318992A4F794D9232AAA0B75434E59690EC85B6F0E99FA842
+3A31321CB720BB2C5A1C967666B5EA77D05D1547586057151E3D414A2ACBC0849424FB01045EF1
+F9BCE363057D4D92AECAFA6BCB9525C64DC3A052D9AD33F2925757D3FD361873A28E804673BA07
+604609110A3209EF82CCC1C2C782164FBA84819CCDE8CF8FF1E99D5CDCD3DADAA8DCE582630222
+0B18AFE97EE3DA8004C6FCC4C66DC34C99EF928ED2F026D10B213D6C151EE604604BC4A0A97D3B
+7E8CD1CBEDE0CBCF1AC4B24358CFB5FD67019F58E487767E9EB04D61062BA5099C8A058F33D90B
+FFBD2D6CD8DDC5CA410219525E9A18D7EBD7ACD5B620C90EA9AAD1CD73018F1DB8499694F7EDFE
+BBD558DBD65C3291903992D4367BE302F479FDF5509C9DCA17F461FCFD95E0E2A54A2856791B34
+9EC4076E4CF713510205469804E8602231BCE241DA6E4E5BEE16C0E56B2711938D605AAC06AD3D
+EEBC6B4FDF37FC4C6C7EAA4ECA9E96FAB2DDD749480B53B920424EA7F5CD9AC21D2B6007099C99
+02475E6CE9C732262C30BFC67D25A52AB9D3DEEC9129B1D55B0090A639F4D808F5477ECB58CEF4
+049428C0FE7677606954A9AAA9107C634BF2BEB34B051A1079F3FBA009F08605A3523FDA0FAD5B
+D595859E07AF8899B15063066CC08EC9F141E924205F569730EC13B26E6EA154CA8E535AF7DE10
+188BC531A1E670FD2D2605351A9B37B048CC5044D989BCAECB85E82B0A56973E51B882C137C4C5
+347F360780EE965675DB1FEA0085C0A04187F4D555951736F0A19D30B3AFF83C13AF40E46F02F5
+7FBED9B3482548F53AC507D2EB6EBD2BC01221F7E1FDC2437CFCA9F2D5BFD0073C61262008D38C
+9441E636CBC5AC1AA3CA6182DCD980B4C19CD32D765D280086DC2F11DF9F876539D7F0ED8FBDBA
+63C29C3A672873F6CF95F901CD7DA38FAAC43EFCB6CEAC5E7EADF0CD32C3477C6632BEFE3A661E
+E61CA7424D972E95B21C7EE640EBCF67D4A10D8B0F60C9BE082494F73F5C2262E3FCC8D23546C5
+9FB9C93F939FFC5263B6A6025DF1589DA9180169A94CC461D1A7679F4887B52A559569A0122B88
+BEBEB462DFEE4836C38AB10211C00CAB352F8AC1164626E8C0E014323EAF3522B627ACEBE11657
+3F3B0E5BF06D0F86AD72B1620CC16BCBF8E6854D2A1985F09548CC9A7812ED8195495B80BFBDE5
+755BC00415757FC99E100791B6056EA7E06DD28D3D36095DEE6D200535DC536B4EED1C64D62E79
+6AB87D226F5A682139F85FD44F45D747692BFDD1BEAC8BB139E6FCABA356F58CAF474C4E35E3CA
+1FCBEF057DEFE3B80D652F356910A7D912D58FB29732811950130437BAEEB5116CCB19F5CE99E2
+51B04E45CFFB06873B4666C4CD8712E5D5238A30CFCFBBF0C1C465D0522D84A89D6014EE2E9FFB
+5FD3E793AE57AF6C3AED437E6A4480E4C472727523B5B88FE01EDB904CD04BDD20F1AB4E92D57A
+A8AA4D61F19C1C2F3ECF5A1194DFB7C62E858B45A4DACE7DC3CD18379B90E9FD4D59F28CFE907B
+F054277C41C28075A972ED162DC30EDDBB288EA85E15E79DA145A47733F0656773AA2A5F075D57
+D8F96BD2AEFF513FB161FDCEDE6EC6E117CE27CFB25E72365F282422B7C80EBFCD13335BFA551C
+7AA8F633A8E0129935C31A215496F3248D55AD7163D6D9B782384FE4957C7542BC10E7F9CF2FE4
+F5DDF853C0EAE7BD440A759F69D60EF7062A1BFC0DC7B8213D06DF774E0A127D3D849193A6B19E
+DC49A660527E4D887AFA0963BA6AD59D100E37DC48FF2AFF328A8E8E537444EB00F80CF79EEE03
+CF3D9FA9F2D87F0FF3EABCD681246D5BD0A3FAEED6FBEDCC43893291BD0430918A994BBB4A7A28
+53892BE9E1F0182040C3E1AE738EDEF1375818D85E00D626CC47D247CC92FF707C955750A56E24
+7ADBD9A6BD665496C24A4D6C86F05088BD364B6FF4EF3CEAA8FEF4C2CF83F39A20A5C76CA998B1
+F660EE780BFE92FDDFF01DC1A3FE0884B7EB9D5E9139B40C9E3BD4B9EE8AE3784E113CFDF97442
+865E8E126671E1209638FA5A60BC3719653EDC3CAC57B8F1F331FE17B52B8D4A0BA65202BC770F
+D40658178F3A0251C3988123F88C2854066CB05849777FF435A74FE221974698D9573D963E72ED
+9079834A996F5E9012352C93F8DB09970296D14DD447BED6510B225CBC584160893D523EB78739
+2C92F2282FBD398422F52D24E12643CFFAC71DE2160403ECB24BF40712464EEA52BAC4411A2A35
+A4581AB3426B888F777CAEABEAA1DAF42271B2DCA94840CA27299D0378585712E1E8108E295017
+B376071BAD7B187CE519B5402A19464CB4DC953DEFC2222CA45282FC98ADD44640348F2B1E0620
+679FE1E6BA4E70CB6EE944C5EE7644A5B7667130B227430CF55057B05CF0A1849C7B78410581CA
+F9848D14F5C60236E7CD7344DE2F9977B43D1B260B2FDC354A3ADB591EAEBEAE3918638A7A9178
+D12F421F27464F1713E66B8FD1E066FB45F29E0001866B5EDD0305502489B24AE5C7D95BCF7733
+C8EC7213307B78378F6A458F698E20C51E2684199E653648323088F89CA37760EB59D590B5D576
+CDFD6C9B3E98788FF2044EDCDCAEADEDEAE8FD846035CA2CD000E9BE45CBF924941391819066BE
+37FD1DB54D80EE209CC66F76350A951CBE47CC7499A6E2C94BD8F6B16BB95C79E0E29C578948CA
+7987EFD698405574AF2C61E04E8B49FBA3C2072D491D12A43EBA069CFA2C9917F00EF62272B67A
+56AE10A9864C6B0F32865F0E9ED4FC26425B1CCB1FF2FDBD14B53D5408099DD810D93D90DC382B
+271C13BBF9F8D05A5AA406400383B9BAF01315D2F53A866C95D455702CF8467DEDB41EE13C10CE
+461085D9DF5AC20881826A306E1DFDB6C3A0237F672D582FA224EB57F66B55D454480D223AB149
+1C319EC22482817D4677D759AA89358DB022D88D3FB37A6C2E7350ADFB75462745D9E5E3A12E32
+BA31E409C2835B77624B250F783E877E632A639E1FD66B020C5A86277FBA9418D70A47888B75EA
+9FAECA66192930CE11FDF85027FA57C0BDA3244FE4D108DA2252CF5F412674AE2AF2ECD1CF672A
+E03FC22615F73817C4C576C14B5734929785833F1F712FC633016FAB69B243B4A90FF47EF7C6E6
+8E2E18EBBB32137D1B4A8F90B59B2486E3981516AFFBBC84D20CB779951CC9EE1418A0FFBFEB4E
+6E0473CAD3F3FE409EDBAB64F2749FAB513205F0A84149A8F7130B58931FC45BF90D73FAC395CF
+E2EC175A491609EBDD1F7E2A2A45299C1422AE724EFDC9D2726DF2C1E1D2DD3482E65F2CDB8FA5
+3FE1DF2310AABC6D4746E0A7F926FE27DCEAA6812287979059A2FDC8E25B0AA70C75C28A7336FC
+489C50D8D3F9C1EC7CA4249E88B67A19039DF7DB2C4C5B32C7BD683654DD202FAEE17D5F90056A
+E238AE29B23A4A845136EBF0783540DF9FE7C7425C3C9506054A5911CEB8696DC29F72B038A82F
+59FDD0DA6EA4493739DA653E039F1AB18B99AA740300CC2654A3F30B510AE5F39A73ACDC8B4A63
+513400D385CD3BAEB0AA59D7AFAE4A2886F5EE7C5F85FF0F9AF5A1E173349FDB82E523BE6E6ADD
+BC411E6EA111C06D8448EB462D9975951B82A1AAA35F86CD08BDD7C5C6F77AB0433E5A59647092
+77237732DDC1190AF61B7273CBB70860BF304F643C6EB7D17F7F4048EF98505A0A8E3EEE44C3C8
+55C7995CE7D29711B655EFC1D0B3D0257B07C5C3F9C64E940C876EBA5F099A475D569C82D02423
+9D2B81BFCB53D2F703EF1B1D99A92FA4AC33BAB41070423AA2163245564FF76F05A99C92D2DB79
+1ADE0D58B50937201EB350D84B73B8B78639682E6EFFBE4DE6A0B5083ACA0DFFAF62D9DF36FA1C
+2418992B3061D71E2CA9E48DF380D3D8236E616F73B0C524D7C89733D7A97C0FE4D035A50D0FA2
+EAE0C2119F4FEA0439BAB334503F9F4AD872C715EDCB1254473F5FF20087406E3652324E9C37FE
+CC26324BACB8D287AACA6EBEF110CAB8928AD2D3BBF522C7180032EEA74CC0CD3429BCBF631D61
+036AF2A021FCB5252F56989F4B398FD87BC2FED9189B02342164BD0FEAB5B2AC9D388F49EAE956
+F9812F3D1F7BA81BDD91D4B88BC6F4D49FBF9D01B564B5FC6694DEBFDDB9792B207CED6E30AC81
+F9DEDAFDC13B4207219A41D5CC2AC38BAE02E9270DCADEDC84E87DCA66B84699C15D3972B2FB08
+417E3A019F9BF0E9B31093D89813C44CF95888F37293E68108B122674C6AEA3F95D00B096DCF90
+22E2ADE59460C435361B9E624F943CD982B5E5EDF65D845302F716DECFF91CC1B3E1D0C22CAA7B
+C9EF0AA007DD372C8D7BAAEF3885D2B6E447A751622525F754C7CF84E39CE3B141289AAEB178CA
+687A59E229CC89255D8E477E6169355E7DB85DB9DD3217537F7F723DB71C7082654869E37E18B6
+0C5E387D3B9D157C656DA4C017EBF96D173F0004B2BAE0C1F913CAB9E67492C574C35F93269D83
+D318AF65DBD63A8A12476536996D29B4A70557FB77168C28BD3BDCACE2D5D3F4BFB06092AC2C72
+201F9BF2742F7B29D1C7A2217A1444DD567919B88AF2B1CFD04E1F92DCBAD4CD87BBE26175FF75
+E703812D9491A77D5F7D0B60DCE3633FD159C855C4CCC6BE6D54961AC58BE8ABF8F02C2D847365
+CB1C3E339DE7E44B4EEDAB9B29B3BE9EF0D5FF3C37B3E656F9F3D53D87804A0641547F952AE97D
+D78841D54768747E2A5C9D237D526C339E04836A947F007D0139DC8A32BCFEBFDB16D75AFE6992
+14F45E972A0188273D70F7AE355C2A57257329D734601424814F2BCF083E7C52D5C7E5F78A72F3
+4A64763FDFB4A7490917C9199521DA6B008825445FB7AAEE8186BAB66C138BE3BDA2BE402C5FEE
+76AA26666BE886B331512F54A07BE35B8B410143F5DC7A8D6BBBA68E94139A3CB5FA2E584F2106
+6327922289B1839B46719AD15B81CB7ADF3FF9FEA39D7FE050C86E0D8DD38A52F34923E7C6495D
+795519FAE3D9B4141D2534B0E1378923E26F43E730D9D3D0462F063323494329E7F9345B2B0D78
+9408CBED950586CC31F7C8D64951AA5CFA497E5760A5AD17F8BA2B2095B90D45EA2262FF51B57C
+4E9D118444273E23255DEB3D39C8E6D404422EC449E379567069E9C9B7C0656B85559D7D3FB739
+C5FA03B1B61B1ED7148B9DBEAF8DFABDFD8C51941B644D69538C4EEBA4B6DC37ACF9B2CA711565
+A2DC875E0D7375B95EC14F9F1A18B3CE204270CCE76467E3D2673848294887261846808EBF6C2D
+3AAD2F46EAEA4A33B0EECF57F0F10430C50E907C72052513A1C17CD92669B62D191561E5A2E320
+8E0DAB95919FDFCCEF0A928C3ED794D9212D9EA02F6C2264246FC9FA8E7B1F559461AA54B54EC9
+30925D82E944114CE454186605D495AE1344726B311E9FDAD71AC7212D241286BDA1EA6C1C9514
+09B0E69BB7A0E60BE1A90AB9B612496DA5FEC323E08D97F0278C356C482522975BC6A60E77A37D
+5DF1AE6FB84A6DC1B2450D42BD399CA27410F20BD462F7E493F07602CF8AAFA7F60FD2E571B76E
+627AC2A9170334E427E897A23F70AF28F9389D57B4D5F9FD416ADE36EA52D48DB6445A99DE978B
+0D7D8FB7C2E77329D3069BCF1128EFC766B45BE761841AF5E460F93015F8F7D4BCCF3638857C25
+3B32356A178D9EA595E3A663542C2E9343FF9A295E5E09A714F9ADF0BD1D8133976243C9B988E0
+5B8B9AD1176592428A291824982D97D74DCEA11B229BCFE8851AA373EE168285C8D0DE9507E97E
+FDFB7A992C736CC6A369680233B5FEED8CB98B9D8ED744BEE85F2CE3934893BE49182AC7C468AE
+A016332252171B30132CB709E940233CDFEBA68C46B8A633E82EABFF88FCC591F381708E6975ED
+145598D93064D975906ED50D31CA6D27699E31F5115E7854523E2DBE10C9CBEB655A8DC253451E
+A126D18661BEFA2DD3A85105C9AFC36137C2137DE0D7989EDE455E402FD23247F6803C3DC832E3
+55BF20CAF97BC9BC71AD3A4D6862F0EEA282746DCC9F3A33FF6C77CE97F920D8860D1656643F02
+77CF4EDA370F066579161D6EA21F225F83C46669A8D8AB83101E90A5EED0AA43FB629F97C08C59
+E92D1E0B627D220C89DF8C7471DB49604240DC92E2CF8880A9D1B1B7DD42DFB8A8A34D060296E9
+2438D94C9A0DA68BDCAA68B56E57C6BD029C1FD1E51080228E2C3016C92CAD9474769337102E8F
+5FE7FE5D7AD099C3DE3140C46A7199C7510F9BD682B8CE240C8A5848022B136183432D749F1047
+95114861476A8EED63F5281ED9CE9C66B4DA7213D57D8E78EE6ADB8154B42C58F384DC27B11B33
+8A9B8C31887D0A4C231FE009050FBB8D0FC6072DD60E8E4085439BE5FF343B69F77A375A6DC516
+B8924CB71AC037AECD69CDA9BCEA13908EFCD0860DF231DD695C638A7B6712E9276B14C5440F3D
+D5A24DA0CAD3A079C60649618BE2D9C20CC12726E74BFC41F53B01AE338566E89483345B40DF0F
+BA3CE446FC3616B0E630AFDA8B00E1410AA59FCB4DA0746F5CDAFB6F9575E3E50759184F7FD88B
+3162A88C2066E255AF31114B3B3A6D4E542924F4BF5B4F3426491E482EECD99F193A3A64291189
+86781FD9F068B3CD80B50E8015C2B2EC1AF75DA3AC2A2BF8AB40CF9C30FCDDCC723A92C5D8E7B0
+BA6947F50B3A93FF5A9AA5FB8B87BF658EDC786857B9053B03ABBDA91AD361B5F0E0EA0C4DB496
+7A7EC2F082CB4CFAAEB7CAABDE84F4D237CF216C043BA9C0D798DD34FAB24DCA5CB189CE619B87
+78B4E07497DA38E13F2E5B773DC3E558E37CFA0F21C1058E8C66894FC363685E19C472AEF35500
+0CA307E8DA03B2DA7EE772562F0C9B1B0E0CAC4900EEB789AC03CA093B867020A0D25E5E8DEC5A
+A6CE89C42E81D07489D1CA76D765E25D6C79CEC1FBB379D033079367C0699DE5E038AABE015BC3
+0E226B6C27192E1E0B905C962BA2A7823543B30F5E9BB69562E82863F6C00136CBA2A21A343495
+7D494B7FAFF5351C78E086FDE13BE885069B6F405B0524A05FF4A1B9F2B6346FF9DDD523FE710F
+F61D76F34393FB029963BBAB206480AF1F6DA7DC14581EC747E56B775D1B3E7D0C13512B17EBB1
+79163088E6A9D3D9030124AE1F0C03465EC70EB6499EEDCCF98CFCEBCEA3E00072D3FC3B3755CB
+42EE075B94EF9D879BB2E5DFEC6FC9F368FC0042FAA6AB46840BC95DAA39628981D190A07B7A5B
+08F4536ADF922BE760F64560F50B891F3EE6E60D918BA871F38B6DFEAC28757F90EC65401DCDFC
+4BF636ED0C0F6C802EDB640C3C81392CF26F6DF07199C0A6745CCF19920D0587A8CC4B2CA846EF
+DAF3EE5A95D75C9D830842D7D30370C611998ACB0444D2DC05CB749DEC79FBBA92A2796576FE01
+90061CAFBA62D534F42D6A55F8A6FEC575C47CFA7186191EC8ECEB2F8BED68C8FDAF61670E9938
+36E4771AF3DA8C6ABA85783FC7E4A3B1A3A1A2D4E090C44449A797FD5E9BEC84602658E7F92BA0
+11A14094FF9A979F405FAAA05DF40DD01416A06EB673698586538205DDB5A12229A949A1850D67
+7F0DCDA96622FBBB1475EC41C9E6F2D411CEA0AE2AC6EAE817493D08599AFB28638D5724DB7D8B
+2793914B835F9A04FE2B6A1BE2F7ADADF3654EF09ED3CF5A916576E58BC101BB145C5ED7516FE1
+B86D47954316804614DFF2D5D04BBF772750C9F555F693F6B6846823CB6FE8B88B5AB77A2FB55F
+6E4F84509D755A5D767C5ADD2039E4DC748DAF271377FA7A0BE6F978011726EDF163E4197779BF
+277691B39896318A73A09EE8C413E18A2B01929ACC7E1FA027FFC22A5FE30AEE67CFC3C3A922CB
+4BB9C9A4571E2FBB8FF622C8E99AA1B0922CE1B2C0EE14A35A9DCC920A5FC0D620E053A5956C6B
+77CEB4E4700810576035630566715C2A253B6D5DD3E7CA546E98C2C3A80DC5E3CEACD48BCD0A1B
+D1FDA8FBA2B83727EE140A4461F4A629CEDC343350B9BA3E137D44541F9CA66DB956F8E6715CCB
+25ADA57600D753A9E486B916E5FD62863D9D9EF07CCD344BBFEA43F10F04BA1F811CD774AE033F
+A56118C8D43EE34A6DA31C3D30681A1387AD17F5D861CB6DD7B32B1C5C5BC66504CC1614E41B23
+F58C044F2BC4E8EDCCFA95C2ECEA63496BE00FAAA681E2AA07F3B02D43A8BD673B4178D6338DA7
+27B3BEDA3878361AFD55DFDD816A1FFD78BE5780849F13BE58CC190AE43451297C504624AAE17C
+6E0F0B5FFA08D8044C96672F063086F784277D54F0F332F87401373886FF9B5EF7EA2760D75655
+2D3AAFC7D54B06B92072E7167F77A5B9A35386812DD23C42F085787B14F60D064D9CB0089C91D6
+A134F96B2D85D15BA37E0DB0A9DE2DC1FA18598254927E231F8D58935B74A3C071F676163BA9BD
+22299DA9DC600CF94E98C2C366469D72D6D072DE38D9BFBFC094C2ED15998364B3ACBE362644C9
+EA4B9A4830BB6AE0E0D10657D37CB8D47CD3F02581A8F82CAEF30F74D98444B473D2912D41FE75
+A291D20F3E1F16237E99EB1579FE624B1AED5AA20113C24F9B2E31EA836A7E20ABFF81329A79CB
+D704C59C71AAF26E6D76FA4F523036D9224D04D717AE899B9AF5487BB8A4599737576CE9CC7437
+0F490E335BCB7BF0D0DA706A530FC88A87435D769AB84F24F517ED326030FC372DB5C1506AB8C1
+A9954E52154A256327783B61CB438D4B01C9E2357E25C2ADE3E7EA49AABA75AEEE50E99060FD65
+B7C4FFB81A6F4896870490AC2018C8765E0260BD852635C015069E18F0DA611045BD9EBEC8F1EA
+FA9B8AE554CA6C791097D8ECD1DB564D73EFC635858E1E8CDE134870D041615681AD0DE841A325
+B76A5CBFD07AFBC9394BA9319D8847C8AF55B9B542BDB09BC5A6BF0C4208E94C7BFCF201AB5A36
+1D3FB9BC4652517D3373AB3F15F7488C0E67B4D3F1E0DCEC8EFF0CBD5A7C2D8903846A72FDD2E2
+B35615F01D9CCD067F04CA21C640B04A51FC667F7D4674BAF7C1B52A067A88E934AB0AE515A2A0
+CFA144143CA34673483FF5854C71F4FFE138B8FD510E3768147F88E89FE4DC50CE5970E735F0FE
+E5F90D5AA9E8C08822243E60FFB37EF6213D02CBE99C25D02AA7AB55FE4C3FB77DAF9FEA0211DC
+FB47CB4FAE580AF6FE140A6AE50E4864DB001EBDE6E725585D2B21DD3966F2CE596167763D1385
+EB244634E34386435C61E14463042B74C72430C349E0C64CE5CF05346F714F4283C92A31ED854E
+B3493AA0FC8573DBBFADF0E55B584CA8BD74966B52EFC923B7828659DCDD7D5FFECB834D0F1579
+70EB8A74A53744BDE6C1234E00C4A3E0A6B87159888C6918EBB51D8C20377EA97CF5472401174F
+FE76273D0A94C865930801CEB1687954FAC07C715551C207AD6934CB7B78D899B69F576C5302B1
+4F53E3DD250A3B74F2D99B48E8F29169E0E9A0CCFDA3D04BB2CF77CF0FE3595C8AA1BA225F83C5
+C59D67F1EC7718E78EC3C154D8E7E75AA69B5BFF8192A3D4825DC8EA7B32DCEB16A0EF91466498
+DF0767C20AA59E84AB3C6EDA3A7CB67611DB78C9856D188067E36ED4F3FBB4680191BE2E29F1EF
+53509E0DB0167996CC6E6B1C79CF8C24B5A79A2A9019B0F50F683B2FBF406ECE11502306079C56
+EB493F51F447652005984DB264DCEADEC7EC5518A72587195D19E534E029B35C057C4A16BCD860
+63F4997A6CF20AC79B6145C92480F90C5A5DA23FFB51CCB5F3F364BDF01554AF7B66229FD49466
+30ED14770D2B772E1A9EA3D000AA5DC07343C220FB3E57BF52A015DFA5E3B70832DC311CDC73A9
+B8789B0D020ECC73823282130F34C975B1EBD2E982960DE384086E55758874706381E06CABC255
+FEA04884B43DBCA66DC862F7FF5FE9DB12E17F3F30E20C488A75985B62641D36002B9F10B97DD3
+98A7D3A42D0D06F3B2F1E6A5248ACCA1EBBA0099653B6B76A31C0027F970D98F9C82E6DD2B90E2
+201CD306671AE128BB3EA5BFCB9E6C93F62E5E348A9420A0E301F5A1FA1D59C37887A65FD129EB
+F6780EC8C350525A4516F8E7B7797D44610D6472DA9A1E641EAC906A5EF0F91FA155F150C70FAB
+4BEF1C44AAFE9020F11AF0EA1EB17593FCEB19DD7742FD69615075DAE57769042EA9ACE067104A
+948A8AEEEB9BB0D05404F65DCCF7991FE4EFF0125D56310B1DC96FA0AE11052874628AFE2F0F56
+D348B5BD0F1459B3A5CF0746117F7A46FA318FC93A67F897AEF6412E3DD1D77E1082B17752A88C
+7F320A7085378A1C97ECA99ACAD52D972A9543B280E8B7B48ECA10C31A6EAB3908E32F93DE40DB
+EBCFB6D79CF3AACD1496866F36A9976C0A0F10AEDC608CBA7018CCD04C09E6EC50B444E7BE8F20
+291E8B5ECE9F253293022A2B234F9CC18CF70284FFB7B3B41FDB548A76BF3EA06E7825BEDC188A
+C57CC66228D0F9478322215E9F9137344296559BDB85E1E7507533B88E7B1FF389A5B3FEF16FED
+9B530C6643FB5C42E4E77C10D577A07EEF5191B9AC2F2B5D58186E361D5AEC69851B55F03405AD
+C53B413ED1BC18342B605C972A2E32A1E5BA96A160E8071470D637D76C3E3EF65E3F55778D58E2
+B8F5831A6AC1F5591D6155A0C99F15DD1C191E73DEF6394B99EFBC357CB2D2674DDFE552C7F367
+AC1A02C88518AE998F12C22A52F519D53BA8D0DB877800CB0257A8D61122776E6A138C624B3767
+3109543A7277A734114801E7BC5E2DADAB450F6B8CC6A4BA049E543597A99D8DC0817DE9816A41
+6126AD32ED7B1D4E8C9A8F632562FEEF27ED2AE88735DBF65744637EF765FD1332BBEE90833315
+63BF90AD83FD368631B87C317981CE591EA2580529BA1552C4C9CF3BCAF87B1865E2E3FBAD3BBC
+8CD732E7E9DC435D6882AEA8ACE86656AE556C493F84316857E36AF878D1B31138E776A0E6B0BC
+F0115B22E541D7E831E8A75D272F98AAFD6140F028EFA9B74D24AE8F8EB78D4A0438B594DA68AF
+5FE9FCF3AF6C629162F054E9DAC669CBE95409CABEE04AD8219512A093B226C97E14B31227B338
+5DCE17F4851845337BD53C17D4A05917266A3A8A1D7EA0B714324B97CCBDE06E3D947889179ADF
+668E5A818C3E67E197C52CB92E657BED3FAA6DC23497B4537B6B795B734EEC868437B04DA08203
+4C222DE20285979C4568B180153B2F21F098A899469A330E01710B1313AEDB59F4B6CC8D036A49
+7AA3CB58D0CB0F3B84EF96117D1843061EBE271DB80A1971A34DA62A20E889EF0B0D51117733FD
+687B484345DC5B52E13D2482B861C4CE1513740C56EC3267BBDC69585F4505D56D08CFFD886CC4
+076763E36D40F57ED0A59B457092A07CBF1BD05B6887CC61A6E88B4B31A68902DD51621680185A
+906643C4CD5656A08295869AA5387A90B1586F02657B72A8298630263CD1B2910996ACC9D8C6F1
+203440D09337D583DCE4F484154912CEE6243A95E97C252D233534F4ACCF940669EB0459407320
+DE3F6BC3FE3D2EDFA04494EB590AA8FC25CDFE6F73B5A83A0609C7521AEC7F35935736415FDAB5
+5C7765DDE12A4233AE507EF60681644C10B383F9B842DE2913037AD91C43CD75D9A48792974E09
+C2413E9C519BD01A3ED99189553F6F6DADC1DE7873B5B2836F4764656944DB5F4002C3557DA890
+6082CB1B2C5494E4D6C9B4E062754B55C758D3D804BB1A274D6C6B50FFE7048A9429D0C2EB5C17
+A239A66210D663454FEC69D596F8D700E718250A1A1CA74FA445AE729850A86165E65B4B10EFBB
+34C5584518A9AB5938648898082BC2FAEE626E7D6779828C671BED553C6EF5FDF43CE2F63D044E
+8AAEE91E1C8A47AF2E2FB79ADC7AF9A1EDC3B6AE71AF805CA4CE843374C46A26F5E0F91D0B2F1D
+32CF1EB7C95091D79701A817EB251CDB56EA847F8171FFD73783D0C7C6535EB759B17AD84B0C41
+4D41BBBAE343306DFFEC2DEE68234130129D4637AF7B797B53ABA05461DA4024859A10B42CFDAE
+6CAF3550AD84F7D87F82771B88A0D7B231035F21A83F68A48DCFEE0EE53DF4B191E5A30E3E4B39
+BA3D212C29187E3520E50E444D026DBFFCB2C3DF4E23A07F6C0E13450F599AD4848BDCD85BFD0A
+A35947F0DBA5420F9A903F2619280626BBBD715F578AE5A7283D4BCFBB97CA04C48A4AE7C3BC5F
+4F52E8B6DC77408848ADBA787F3F76F6138AC7B430553ED32ACB1B1CC28EC90DB1CC9D7BBA703A
+1E047EB00BD8EBEBF2FEB5B61A6D1A86B4093FFD3C0EE41D46D6C824E9AC1BC95FCFBF725A249B
+C5AA9A5D4B1B8931E7EBD4C4503C97B79E1B7577F6B1328F18DD4A11C8BD927F3E840E0D9D6ADF
+38C30F5423BED048CF3FC205F8AC536494AB03DCDE85D262EEC61685C1CA9913F3BC9B50F5103B
+904958E74CD385527CDABEC674B135424F72E8041B2BD5D9998B094FFAD2FAF64C4605B909021E
+7720C1A97D528C0B1CA7C209EA4F31AB69B2D960FC17734BAEE80F2971A143737D515EC73259E2
+70122C8E624DE037CF538491135084AE16A347EB6CDE0558823854A9BB7FC862CE2995C7619143
+FB05D220027E6ED9237997927209B06B56C3A12DF8754CE26C2073F19307BA64B42E64228D18DB
+72B79483DE686EC877DC28701DA0490A170141ED88BFC09A6D2608A76C07B705C7A344F9121E2A
+A53ECDAF2E96A59504622CA76737327D6051BF979218851BD68AFC734FA47AD4B5B5737DE8B555
+A46DDB495E18397A5999A6BE11B4D3EB832B87B1E2DE71F302FC21FBF0354FFBC4E14001D5C7FB
+829A07DD469573C6C3BA770039FEBCB79FD3C8A3E9AE32A242376536EAC505E1446F5FA06B67A6
+5DE03CFC1C68D8DDCA3FA90B6F298060E5A72510D754E6E8471006EEDC81BB1537F507A8A08AC2
+84ACF48773386A092FCC335E275ABD920A0E46C5BE2ED36B735FB7428BA5E60D7A431860EC33AE
+E2D39EB734BD7F6F58B6A1CD41D9C0CF1F6D13313FE44742EDB101B2FFEB1BC120CF5F4780184C
+6B7EDAD584BC92F1DFD2AC79835B7660970F66F2061390443C6C5E4329D34BD5604C7AC04AB404
+DDE5DD1EE6F0C862742F9A5F88025AA7BE6A1DAB0D7F74FF67FFEF4A7C5DF08C2A9EC21D2AD33C
+ABEBBCE463656A8AB038E967788494B59B22BBE07A8EE5EB5C6F48E911168D9202D721436EA54B
+DA89A2AB4E360EA5A3DDA0180E8333769BF901861D7B74AFEBBE92DB48F5FC2BFDB492E4BD8847
+F3C7E39F86DD91CC4C4F4C07F6C8B9165A1BE24B1735D307562AEDC895B0BA816AC3DE4EB6F0BD
+111D4024AE597FED386EE680768E3EE12711AA1AFD8D75C6A5A6E34EC116229E2E87D10BE4A1B5
+D53A4D2F8DC83D75138A571F618FC44E1B0554DB5BC11EAAD1697FAF5703F015A210D918B6C7AD
+DBD2BEE0FC7009E777BCFEA522D34CD7622A648B5FF910C7D611EF254667AC3201CA13A49270AF
+61E440213E242E5B6ECCEF6780855DFC04B07E62722360586C534E22929D8632C4BD13F15EB73B
+DF11D14EA140613ECC158FA516A75A7AFCDFD5EDCB6C88A4648A8FF47E6D94A4A7426EADEEDA9A
+D5D7C2EA6C6A6B6092068183459B1E9CA7A2BB27359D600A404A92161FEFB087E2DC9D0DE1CE53
+492AFB7B4B06A1A30E922D90AF51299409ABCCF6961416F90375CC3ACA42DC7C041FC54DE8A3BB
+1763740535B375A2434FEF066DAA839E171A83BAB34AC87698183159793E36D51ADCF1C85CF17D
+E282B5B606298468742D19B3F4823042D8455DF37191DDEC7D03D9B4C1440A3F707BCC00A03393
+083FF4CFDEA52DCEFCF40C85EF38BEB3844B319014F63440721CC769ED61FC2BBAF998FF391B7B
+6F562910BBCE6823FDAC5ED961740D317B373FC6B85930AD260D4DA2E221BD185AA4BA2D3BA0D1
+2A2B1B821DEBE8FC78AD9C7279E56471CFEB591D3C4E77E4AC2BDB47FF01CE718CB56F97133D33
+B86022C15275D0C8CCF82BF90DD23A2956BAA6E8CA65B6DDEDB949DD467A53CE440081AC56D530
+81BF87608885D8F393D96C3D2F7D694AD80E5B5C115F971328320AFF62CAB890098349653B6F57
+9A6DDBBF356D9B2C6372B965244BFF90DF16803393B5E062AEA9F239AEB3F9069077FD2F1F8FB9
+D2BC50E79E3E7C52547F6A3CF266C1789B78E38C6CC83090AB1C674CC7F1E6E30679B95E8B1BC7
+79FF76F05799699AC0EB968C072BC66DC78AE50ED3518AF32E5C3204111A041B1B4DDEA3301ADE
+EE21F7E807ECC3562EE580D6997C77C58D5A009A27D7191B779FFB25357D6BD492619051B02589
+538DF1E3980B4376908AFBF7EF2A4FE994DAA9CA64C0783C3B72EB01785EA638BEA84D20C6CC38
+E31E394B73818CF83E02352EB4E1BCECFE49EB23FAF78C1EB855DA02598640477034C5731918E2
+F70C608E6487B3DD51363E08B7B54F9F1F421AF0BCCD87B83EFE8B63CC9BDA85F9776656557EB4
+3BC0DE9F80D0E2C57514B41AAD9E100C22BC5C421CF66EC819179E3591DD4C29841719CF417F12
+DB131173A1F9B9F0FF7AF282BACEB19D20F896508FBCF4AC97BA41656B1F7694EEFA05DE215212
+78C4636381D7604E0AF5E21956571DB30074BFFB42F60A3D98EB3E924C092535C916D0A729B86D
+92AB4645471E3D1EB499347D281BC7279ADC3311762C80A8A652217D7D4EDF6E122547B3B8A766
+0198FD1E6D25C223905B8162D076CD1A3CB00BDD837272905653F6A699EAABBB54F82FCFD0BCFE
+D77D5A514D1B12666FB270FFDC706B2EB21DB35D46E856403AB5E1972BF7F981F4E5DF503E225D
+BD59C01C6F862FBA243FBB7AF76C2367A9F4EA8A63E20E845D4DBE50102F3ECEA72195D2F1BD6D
+8D646A2132D4AC410A4F92947B05E32B2B21523731E69459CD81525F392C477942573A4C293BBE
+150FEB08A81BEB33DB6D779B654150041D9586574AFBCFEC7798950F7D4123D577F49E538EF46D
+3DC8C4527837DB940A9590C88B32FC6A35A1836C3E8B13CA39976907DA7FA829BA79C4AD6B57C7
+0092A268EFE8CB588B4A4486990981035AAE9C4A9DEBB7B3B0C67EEA459841B684EA3A5A3EFDDD
+B2F71E7C398FFD64582861FDF18BDCB42FF64E38E861AFED894C46D53224A239268479552A5D4F
+AD51E0F968495E10F1D5A68C1002E7C6E1BF98AA00092D2C04FCED78A110571EFC5D708DD8D506
+8F7977E3C974D62B6E2E9573138FFE9B66DB3951509B9CC7FA2AE82C09D25E99618FC27579EE7F
+F7BC639858D70511005BD11E55B42B6D4AED6E419FB7983977BF26DDB7D614719D409CD258B2EA
+50E342C18A2BA1B6F637A82DACF858742DAE0080690D4EBFF7FDD4D274DF0C1D4C49B16773DDC6
+79766A1FEB0371774B068837D853F3F4EA4976564D21A46683BF1BFE4E58A831F51F8CE57D3585
+9464649D4D7BE75394DF7A383F3AA2872FD2A2E76C948D4FF999BB480853BAF07E37431EA850A6
+3286BCF58E594B3805DDC82804F6E31EF557FDFA2AEE2013094D5630BA862E3609CD425495FC25
+9328A2445A81F36918F7C9ACED41A1A80B5ECF9E153BAD5FCE52E2016BE1FC932543EF831324A9
+35D5C9CB2921A43979AF1FD7EE064E9FB7A58E5D9252A0A976308D50D5CBBC96D888519793E6F4
+CFA1A7BC155937CA2A96BB4F0E4BAB6AE14C911BC2FB985D031CB2B907986EB6CE3F2E988ECB54
+400B0064D2FA549AD4D2996BC118BE86281FF3655D328670680D32D2C238E9E5F207B58C6B83C1
+FE6768B7A2A4917107F7516F2F61D5F0E5FD8350AB88D8032B2DFED91D04ACDE197A7FDD1D96D7
+F0EC30D5E1110FDC89D197778A7B1E8F291923D5C6A9F3B664F72274C0871A3823EDA8E2FBACB8
+D30E14015002E9B99C80A5E0712D4DCC9B2AA8079105D51AE75992C765F9A8590961909962A95F
+F9169CA0E858676FAAF5EF160682BB4D43B34FE4BA7C53B5A670EE5169534FE4A254550DE257C1
+E5D37D9BD147A2D7C01F0DEEC0A96D655E71214672AB8AE5BB16F8FA6EAD54577C214E30D9D1B8
+A94E7C189A947680748FE661768B20D9C33AD85384E3A8CFF7B0353B625355D84FEBBF3EFD95E8
+4C93C8DA1D3A57FFA9D3496C2C53DF225C0772ADA930D2C0BCA3D1B558411D8DB4F00AD68BC508
+0028D066E730C3DA50C82D391BA228211C06AAD962A8AF12AF1F4BF50F50DA15627D8A64FA8E5A
+4247433ABFA2A9282DA520112CCB46C1A45F9AC3D22567553AF30A282BC96F288EE71C107DD938
+82785B04E8BAD801177B0EFA57E368BDE511692F65A1414321A3E0BF72481CFF1680F0AF2B03C4
+5D2BBE261D700FBEADE5A23C751014185DE96466A678275F5F310D0A316F8FC1FC9D2522C64A41
+4648D64D2F35795530EEE6FF17F1DB11ACF1306DB24E88BA708C5E840543357C7998C611D2675E
+3AE71453F95760F38C40D97EB7B69E7CEF6BB535E548C2178EB9D88CF93478FADD2EA43E9464CC
+7814655375106117193A896D1B3602CF35C8E419430ED2E30B07361E238FC4B5244692539D3075
+CC6BF5482A79BA1E9FC86446EF313AE910CF60A7C2C51AAD53E21FCCE13F2A8F2C80D3C3158521
+43770C33841EA40AB8DECD8628B2A52C30ABA07CF07313B2B7C94DBA4B23E8477664781F772C28
+7851925A1DFE45D6877C22320C3F0094354709E1B1233B4065F3EA39A9F09919D1BF1CD37B688C
+B2FF958198FB207843A19B570EC3ECD75AB01F24E47F0CF0D94D87FB33DB8D57FBE4789AE8699F
+0EE9F27F0FB2D338D1811E3358E32302597BFF0F12D77C6161586D7E0F3A2188F83AFCA129227D
+18D6C4334BD48B52A4664F86703CD5E0693FB6AF02EBDF3F4257E7E6C2D091E019437621B47970
+F72C598B7171260A64B8BC63E99B7F7C0E0383D0E06ACD64557DA74B423C6EC0CD35B115898ACE
+C66FE295037330C40F779CFD3849717041043058C0D4693B9120BCC42030EED9D903BEE7591576
+2106C92542720F5FEC065B43980CB3573B020AADCFFC5DF653C2A77065610EDFDB7EDC3A4C6C35
+79A0FE2F0A962798A10530D515D85F39C733DEAB8DB7C5148808C5C51F34A13BC10976ED77FC22
+3B3E7945CEEEB0F286984F4E7F132CD2352674425959F118C4D8CB9089DE5CC2DDB69793B041DB
+6269BA66D08DCFE402F7CE6F60429232110F36668729822D6CA93817EDEAB4F611CBCE85D8DC02
+6D61C96A70259D738241FDD1CEF267852962275FAB164453AB30FDEAEA9D3096542555A04553B6
+40576E786DAEB066F14DAC4828F193C03409C7DC78E6C9058CA4994F6AD3FD0AF67CF1D798AA12
+B5B71114459D8A1E82F5B266E5FAECC224CF3DFCEF76CCAF24897777AC7EE2CFA0FD3A6C1B550C
+5AAF132A27B8099C8B0E7D1E13A2D8DBCFE093F2E0236E7AFDA104E3F643D808A8985919188C42
+79147C22C26BB9D32B729F05AAB76C4327BB42D868C445399DA321ED9CEA65A2ED652F5FFA5A47
+4ED0AB269E80D45F45CB345548F1853D8D61590337782181173BDD31E9D71D4A58AB4CE4E844F7
+6BCF783B934F4358A7989B0BF7127894B8F155BA31D586FFC4B0714B8887D6ADF80C755BB8F93E
+65F4BCCC7098F425F3DFB9F4859A3A6BC8E571F5F25AAB7D4579108E129E21FA6DF0D3075DF8CB
+DFBA76F4EEFB69EBC64A0E183CC87BA98F5A41859EFE1D206A8F6057931811BED78FE753A7AD9B
+2AFA306311472E778D711D0554AA2022A9F69166582F5B016A2165860A35FE877EE3FD5E528C7A
+023D543F8FEAEAD885CB894554369577BB57755CC627A0C9345E5A69AE5FABD13E221881101450
+E9CAB71F3FCA9DB59A32719B116B3A2BA129C01889943D8E893E49EDE1DC7C5F87B6E2A4F4C041
+06FEF6C860F6A43D83BA0CEAE8B93D1D2D4C7BA09A18255B04350BE3CC7A59C10E53DC260C84B2
+F981E4C44E87A5A8F252036285697ACD7959EB2CFE6CBEA7050B42E4DA801806691E97F3F1BFDD
+2A4B17EAA1C2A4FF4CA0AD5E4F3E5B579CD67229F252733BAB5B2F62F74D1AD05F45B1B41225A8
+1172E9BDA7EEA81A80DE0C48005FE837EE8BE4720077F1A207A3FD1B9398931A072E389AAEA068
+E1A214BAE8EBDB9FA5FF0FF7A96909B68461ED200156E59BE32815A32FE6CF1931CC31019775B3
+5A4F5C6B2121B81137CE14A52C8AC18AB5303754F2565384CA74BBA49A39D273E269BDD2C7164F
+042CF18094225321B6506489D8ABD68955AC32452B2D7976FDA668651CDCB6BDE900BBF3E87AB2
+8DBDE7177EAE3865A9567C19E0CC614CEDC327B746C04254A94494AD78ED6DA26677F8A0E70880
+8750689EED2CEAB8214765CAD629C514173D82B2EB0AA673E250E68EA6D8AD640A25BF742A7456
+BF8EFA2AFE142F22E96C1F904BB7153AB261C6E4FE55574BBFC95A0BFEFE906F52025C06DAB62F
+ABF2C8796B24DCA62728A0FD5982B91ABD80D421527EC232B86B80F9786F16A6FA15EC4E7ACA40
+FE0AD25E10D961F067B41CB3443E0AB5F73DB39CD3186414FC72762ABFC3985948B8BC7711FFA2
+40901B58F4C869320A430E1D68F10B8D2D8FC3C2D5D12529AF7B8D5C3E501427AF5BEFE3E8C02D
+9A5EB4A3960DD0C7BB36A0D7120B62390093E49E707AA7411CA9CABB3B4EB49FA7007ADF22A552
+7201BB8260622FAB015E016223FA59F5B3610EB075236ACB344764E223BFACE353032F45526FF0
+5C051E3AA283D1F1857C3D1A50BCFE49BE1F83C6C91F433059E7D9ECBF5A649CA18F97FBAE3534
+7782629653A668DC86DE2033261E3D701B4D324FC1023A6A3E35DD0DD33938B72D5B75C6309749
+D4468B73405563EAAC98F4BF055A524058940B1D09A1603AA6F40FA5C5D98351F5341C57A14AF8
+EA6EBEB17D34C090BEAD2A4FAEA9039D8DDDFB26676B1FD2E35A02DD1298F7C3661F545CEEB0AB
+CD9D4EB60707F4B7C3161EB13F649FB118AE135988598A509CC4595555BFCD320CA0294186873C
+53272CD5472A6BD4158EA0602BBEE13AD5DABFE374B80749FAD51E962AD4A0A5BC563056B5D055
+C416008CC22C8735BCD8406B1503DA330CBB62DFE9417674EE52320EEEB5D277D7A10C7D0FE624
+5EC17EEA4F47BB5D78BD0A0177D7AC005C1CB45F13CED23AF3BEDE97DA7EFD8F0A504A76DCBC86
+C03F8530ABD68993F4945A7C7006151A9F05A92915EDC7021D9340EC694603B33679F697186AD0
+6E9068EC4518F848653BF3FCA0B4B462DECD3AA8462BE335CA9BC02E99326B4A8E691E8329AF81
+507A0227905AE3F482F8A6BC92E5EFD23C8BD5E54D5BF01F436D7E229E408AF757C02B10483CA9
+2D27541D61D1F975FF37A8362B984F2C47143546E5B3D99956A825F820DFD1913E779B60F6AF63
+CFFEE206A8EE4D6F90A5980D3B394BBD789C42517FEE14C1A0B9B8D883C3540EB9A59FF2D53BE9
+F84249A5450581AFD2AFCA927CE4DAE3EAF1D21B321E5F9D845A8538AC19E73C2D7B998C561ABE
+01BCEAFD166C8E649230B92FF215BC072EC36BC2EDCF59A93C8E20667B4CCCF7858E196B2F1D15
+5CB85EADABA6BB5DAE835D38BE3B2CB362C91BC91C1D418F06C5C83BE1137FB629ED65A5673EF6
+D0D111CD2FBCF60BF0ECC804EB20502085BA99044C4B8C28C797819A69DD4CA5DE1A81F6A00526
+8025D22C28A3E29FC18E871604985BD477DAD38E566CB9528D804516AB308BF06EE3B2472DC013
+D88627029473563CC865D417C00F2F0169C39B4DB3D90C092ED090DAFB8D0582E70F742F608861
+2F139418F8AFBCE3688C83C173E651DC27029DA6C2DD8EE199E7F0BAC48FE66EE0028AC4C4C18F
+5E111678402678707DE91A0CB50F15B77BA1869966AB23C993BAE7243F96127B5285504CA6DC0E
+536DF06A96180B92F0F1BE14BC816617AA7415ECB963C4964C72023D1D35967E0631E2EAF1E4FB
+75BAFAD7F30E5FE1A9A8BFA4F2126929F49F9DF7B42370AE3B7F4102FD48490240333ABC9318EA
+EAD6647AB3987E2595BD0C10F521E535BC254E5379AB49F9FD83DC32556184A4865F514F0A4FDF
+D206894AE3B4D31E16F63B4C14FE8064BE8338D8AE123EF9BC64B0BCED20108AC6D70EE59212D7
+FA5FDE1F97CA4670BD623C92BFA5F03D934D16F642F1417A5CC20ACDF1DB8812F03EE20E2FC563
+8ACEB462FCE79E1157671CD9413E6955B7EF61D8766E2B040829AC4CE58BE5EADF080B11710AC6
+BBFD764C456C0CEF4232A99B0DF0B9A451321F91EC4A4C39BDC4678903DAC833F4E21A9CDE857F
+5B1514DED5D94660D5D5DDBAB6116D53BF50D62DBA84BFC08C58135C7A8B8C8348E3905985E6EB
+492F23A45F6073AFF72F34A3837F075A17D4D3B68F789C5B3C2F07FDEB0F06D2ED7A476597AD1A
+859692B9F1B81E9B5E811EA87D587330F027EAF401964369F07EAA8AB6993527FA92A0D321845E
+D818D12EFEEA61A877CB0FBCCCF41500F9FC68071EAB9324B20CED4C74D557CEFB1DE37F26DED9
+083B036D0B96A0B07142D4283FCF63A392F9AA4624C8E40D0008E6EE523A79CA2266DC5996650A
+E44EE0C843E2E8FB8A9C1AD69B12914F33A1EC9CA631A0C15757D257E17EC7E463A0884C38BC9C
+EF76BC8B3900E438E18AA2A5A50FA89D019CCAB1695EEBD62810D7539DA66FE556747A21872610
+8D17D4B43DDF4F734AE3A3C840B3B6CDA736C080D382256FA54FCEC31A17FCAF7BC12AB051A65E
+A250FBAA8D251409136DAB0AC433D91F570A80C8C58370FBF63BBEAE2BCA72C280F9E9E4494E05
+77F45694BA1E0F7CFB510DE9D6E1E0AE6A900E644CDABF499EFF0EC0F65D3AA4509BFC866C7788
+0C70147753E076B797B31769C65B53D74AFB3D38DA15A10388DD5A848C39184A54697E997F86F0
+BBA545C34D240C747B7FE1B37FD97E92826C116D56F10FB92105E68E4246775341D84CEB6DE34C
+02DA1A20D684590B44103C1A6989323D129D1A51A2EC98621975FEDFD5E190880F5F0F68DC12FE
+1DEB8B8AE8DF2C4807FA5B65ED92296F808D8D9008D9403EAEF135253D56E0CA33CF7974203D0B
+F3A3C7921F47923EFD0D6076BC93C0D2FA5EE9DFFE3B660DA1262CA8C3C98D909718EB2D1A1821
+B0D4647D1F4C188FF79E9E16EE3F8EE8CCA2F9F2A58520E71629E5E027EA837EDAF9DBBFDFA822
+120B13B0A0AAB59CCF125040EE43AC2F29B7D414EE47FB53AC5223A2AA40C8C9EF067F8D40466B
+E9B73968C0DC26FB3BAE743DACE0B8CA7D88108C7A3A5D80162A3A93D06DB24A64C45636F8B299
+AAB5FFB252E8C2C4854845921E0A22EA5786978C8CFDDB4C45594D7BB2D510C56991279473E0C4
+9E5066BDCA09D98CFD2B40A40FD3AAE16886CC0030E1C308CB0B3EEFFFD92BC90A39C3D3427E73
+E2EB5974FFED2079706A40F0BCD6C390FB4FF4B0331E70B770016E6336CAD071C9577C18C3706E
+97C9019BCDCE23B6F295DD09ABABFF5069D64B7FE8380736B9767336F3DDF61B55412219855D57
+658BF0302EF809CF1D3AD68095BC391A1EA365EA28D5D6D61A44B367962E6577E77B6926C417F8
+E8F76EE89F9686C9CEDA3068A417FA8F90C54DBCDBC382A6CFDF923E37986169D078BCB11FFB4C
+CD9E45022A81934C4735AF57277B3478B6C8F676C0824C46849B539C9D3460EF967EC434FC8A35
+B79A94AE68250596F653096F75B308A2FACBBC2157150A7F6A86D52E1D31638C631908693C4D08
+5523A9C685C9C467DCDCA13185F8EB81EF37096DC7ADA8138420CEC0BE60396FE22E584B1197B3
+632C1B01B163FF586D0430D5A0C590CA7BB521FB3B05AC5C3E6D130BF4087E3A7EB76470CC8E24
+D2325D9F9087C04230D464EC742037DE6C54FADA454ABE28B9FAEFCF5BD74B30BDA9C2833BBFBD
+8C6DCDC0479BCEAF8697E8FB14EA81DAB6B87BA3D89BE0DE3B574F8CE23B18E58FFAEA08F08696
+A69C3FC79581F49BA5CA0CC228C3DE74BDEF328C7EE9ABC6688C42B174D8AB7DA088BB99A03341
+A1487CADB86624B48811B20CCD0982DD0B0192E7B40C1F3F3558865C48CA33712457CA452D842F
+5A21FA58FDF4BB9F3032E4B941C664F7A2785D039C1DD9A67337758B75F5ECCDF5AD13AFA671F4
+FCB18C3AA8E3EB3B2154DAD5542641B0652A382120A4B5EC6D73D95219FD0E7E973154DFDDEB72
+D97D43DE5921E62CAFCF12EA9A3A26C5A6A506F054D5030F865E3E1FDE6959E1F17EB5BE3161A5
+0B491E5DE3179C705A452929A608562C2AD3E04208444D69734EB63F86A23FEFFC008826B3F277
+9744A5E220C54663AF8B15B0ACA6B61F7E15B9AD101D6E444F05E20891198C385F1FBEA22A5C87
+B2A7C9F1FB6FEB8C732A21C1FE13884282130125C9A436CB9D86A3A53D6D922E5D54C8528E8AF5
+F836E643782B1360C303F735B2353CD93E0B924C274F7E0AE62511FD1FA67429855F3533A29400
+2AB0B10D45D233D2F4A7CDA1519D7302E4209B3C2AF8761389DDEC69419FE8EF2049DD33D75017
+399FA7BCBFF8DF10A6DE8CDB5F7866FBE9D5059EC0F50DD5048CB049B97CF3ED3BCF4A57D1DE7A
+C87B744F8D823CC2D140216F501BB29EB3FE9CB43E287D09EA8448D964F228BE3A2A5B65FB98B3
+D5490243A5377CC1668D127A59D1C0F04E7F4FC1026FA9A2C02A140E3C2B986558A8153B5AC783
+21FFE3A1F6F087A283D58DCC83DF287376D5F96FDA04CD053C610C0DE90F597032212E98A7E53C
+BE5ABF0ACEBFD2076A5080FF1D5712F2035E22D8575A4178330E93949C611474221CA4D8221886
+4561A6F0555F290C65E72CEABB0E7D680B29DCEAF0D19AF0695D73C2CD9A14C53968F52F571B2E
+AFB715F7F49E62D933794B7DF7986EFBF23FB1FBBB796990F6209991C1711C776BDEA4DA2B3D31
+322519D82B541C856702C2F07370A130536231B7BBBA0E4F8DD050469B687A1A95EFC8A3188E02
+834CC1283C2E08ED3275D0F2D6FF432945A61B10E9F2002B653E9A8D6890F4E2E9F033072EC34F
+0D08DF4EDA8A7E68699F3238FA4ED1C2A79767376011468FF1D3A47631FA650E96F3651D38A6E5
+2DAE01FA1E0163DDE3740886171B92B69E5A46090BA00E130005334351E57CA0BBE8072167D5E8
+07D2814090AB1A7C37958AB5745243B1138DEAD9E8DF94E800AE8DC00810E43066514C07B90380
+860144BEE44F34E8A75A95B523B2D9724F12AD267312DDC113131ED3FA088F7E08D828FF48E50F
+14BC4BE5E203763412A11A8C2D0AE9D1AF457BA4838ED958C2C7E3566CE43659F07942DD79B853
+ACAE63C294AEF5EFA938715C7520A5A1257580837A2189DDA84462027E995BD798C2F359BA84C8
+CF26BC6ED0E501B46B92BFB72A54D13F865318A387415558C959D2E5B6B6358D73201FAF94699D
+EB452BC41F84A14A2B104C6153FD459550E996C16CC8D608C7D31D280B4DBDCAA4F0FCFB640102
+4FA1FAD06F61C5DD9C0DDFF09EAFAA8DBE62B967704FF1884A8D167DFE026BB414ABA771FE49F8
+9EFB220586C4F6D1DC91D2E11AEF151F68A9A1CE45EA9D502CA7C498BD4296D98F12C1D44A4280
+4BA103077AC45D283A88660F5B2855CAA974A16C3A5559CC8E6B210EF5292EEF76A5BB2229C8B0
+D4A9DF09F347E519F45CE1306C40D8F7E1E5C0E4DAA18CAD888D6E8E337270944EFA860DDFCD6E
+4AF1498AD3117FF2E4585CAE02092F99DE77180C34B52D30B0AA4A92D8DFAA72275AA69399B3FF
+DF31199B30CEB932537667676FC402EC37E8179DC7EAC98DC8423EFB3F3ACF30512FDDC8530783
+5466B302C962789C65AF0E278A8535069F09A4FB950E1B5471A07BB9ADDCE479D10DDC15F58B3D
+29F23C60FD1319394B199D2C9919A668D83B462FC0BD10624C44B2BE451B47AF5AE66DF1DEE648
+0F42D642548F25932EB6A47E325EEE333B54D9925ED2ACCF319258BD22684E8E6E5243B7D0FD11
+B81BD02950A78AB7829DFF6CB31FA26E2A4A8382873A83CE556EB4FB97C440D5D49AD9F95C4C10
+F5A6E5326B34761D2299C9617A62CA7D0215D94BE19D1E1C77F1BDD38A1F135F25CF896F18916A
+6CF891C0260BCFC579453C4C26EBDE619BE97B73FB50FBD4C221431A515E3DDA4E3BF80740920F
+A58FC61E503D83C1735E28C8E5B1E29983867F13255F5E82159CEECA9AD1A901D6705C0B2502C3
+7EAB1450203748C7AC54A8778D6D87D4A57531CFD67DD5A41B668CDBB46D1735C882BF1433F938
+E2F2AC9239FB79506A275950FEA6D8B28036A5DD4B772C4D1D00122111D82E34F1E2F4B8E4DC7E
+A8116BFE939FB924F1A064F54747314ACDCFED284030FB2B4B5B80C7AFDCF63F1E02A930484BF4
+45407CD7033114B78F4464E4EACFDB463A328CE81D55AC19C690B4A01C13090BCD9CA9153F5DB1
+C53D23A1F2ED756EE1A9BD064840CA2F1C84AB5DF377373C97F3F16C5FA35F57A2421A4097A360
+CADC760651BB7D68F047EAB47269FAE869229C1090FE48AAE6E06DD96C87B1BAE4A173D5A2AFD0
+FD9CD73385D9CB51BC2036A4F40F1745684C1EBA4CF80B3FFBE773350D5EC759B0A4F1E58853E0
+3DB7FA5A50CCEF0A26AEFDD8B0CD6D0B4463389108E68080B746B1760B3A228489546FEDDCDEBF
+A579F565AA5AF94158B8E0BABC45F84F8A51F0BD8EC1AD329B69A19D737DCF0E9A615A945E6ADB
+0C8D23AF44B4BA1A17109788EB046B3CB1DDDCAE862456B1F9057BC08D286CA604765BAD26D3B4
+ECF7B6596D449E52490C2C2C79F24489715BD865A48988CA249D60FEDDCD86D6A488C3BD63DCE2
+0D5E37E6C29F9CFC7C62489948749CCD84F20F540080315923095E79D4F35A95396D3E6F364F7A
+83A42B00AA8918FFD623802F7BE71D0E4D0DF4EB49F4B7A9BF8ECCCAB90754E4E1FDB4C187F64A
+FA8CCC762E0F699974626FADD85E774D6DFD92CA9890F1D1A9DB6A1BF4647920BCF5BD83B2EB3B
+CB16D69F4CA279570A6CDDB06229004B4A5688C9484D144F327B61270C9F37048BBC1A0EA9C43D
+902A02A71A523CDA7876006090FB32B4FFA2FF741A5A8344CA79E65D242CBD7953ADA946672F13
+8FD6A42A80B2BE25805B07411F34CBD9939723A1FCF9D2BA73E278546301FAF08D6A4E15A0AB21
+650E485316468042550ED97390763B73CEB56C557D2BAA6389BCBA728A2DB8328ECB60B51A16A8
+1A45960C0B396A5A9EC69ADC7A267F2A55E8B05E9742E28B9D33219EF0D7FA2B13981A220E4CD7
+3AEE557631FCAA673E323BE5D63D09F93FB079F364E8DFCD34CBB073198E1370BE398B2783A210
+75A9C512E2E8812C39C5A2F4F6345A28C13E0CAC8DB00214427E0E59945CB648EC7B3CD8BBBEB3
+3024DAB75866FE26CD37A62F07BC8FCE74076177D517E721896AF3248DB633EA0DF7B42BAF9550
+E1FC8EDC7FFB3BDC4EC209094D54BC5ABD832D8A8D6D35123450EC928FE8BB6E62886E826B1E34
+FE1B3FC3A9B4A184CF47CE7B13D36057C42732EA8F1B805C012EC18A542F1855CCDF3DA9CFC7C3
+CE8AD49B830C73647C187BFD9BD9C19E9800F1F063D4113C2718494696035020B53996AFD62DBF
+C90A145098496D688F5A6A7C31E0345EDB25665463439D7D15C52EFA5ADDF66F6E83E81FD841E2
+72EE934C1B0B12E0AD50B433B3A9926B2374F897EAB9DD3AA637C87A1B4699D58D1CDAF109A881
+72395DBCDD1EB3C98F7C7A2567EE373E34ECA7955A3625B775D5DA827A425A272B90F6864B176A
+E297116D134883D8FC8D1D426C6958CED69EF58A217C870B4C9A5FA271AAAF232E4B37D76958B9
+1BA75D70CC557835048778CA3EF3B26255733A3503F60462E60407143B5C837588551F0A9E0D43
+4BC1A75ED36225C6A6023D6E01921ACD3C80D7F0EF2FE12D210EA9CA67F435AF53DA4F89DA3E31
+25E54219C4216C70B2A82D0A2748023DDD83021A4D46CD9E4065233031E33C28AB116236386575
+D402D6EEE0045C4F6736621EB29167B0AF724419B8C988456CCC88E5E0B52221E82C3ABD5EC685
+C665F364F712E914122629FFD39BA7BEAB41427C017BA6BCDBBD61075BD7016C40CFD2027C16F3
+A693228E8AB25D4E354779810B802CE959D76FBAFBDB8DABB97E4D5E27B9001E6ADAAB860EDB9E
+2F57F3D8FD4F20248E3C382F58714C3DD03550E9D96C596AF6840624CA37C0A56D9F96711B6508
+CF0D63B4DEB13F196D4E8355F1B46D68999731A8847C247286DF46C1AAE634BDD77A5D62B914E3
+18A463E20484A3219BE81A6DE5B8E58973D4DB3E6212739A383689D828CB83129E5EBDD19953B2
+5715DD63A14FE70B1B44625E5DB819AA83F6C0A2C37376A5613F490AC382099341DF9A8DA674EA
+6BD3BB2742190D7BCE38B476D4CAA093A069FD24652D0FD705E5319CE02B7795FF9352343A3B58
+4667744685C37F6544958575EAA75C6489DE45B985491328C9364C36269BE548A8C5C139DAEE40
+E607F65672B3FF735CFF990327587C55DD2193895D73BE0728F32D3D4203872470CD3D0F907586
+8D9838FDCF570A288B351C7AE33259808F2484A42365FBA8127A530A5BADC430BB84FD61322F1F
+B69E5CF80CD79693AB6D07BC6F3374CDF907C01D18FF6848A634ED584A66952BE2A0C09E1BD241
+636479CE4665527D51BEF49C1AD23B144D3D3A5018DDB4C237E8C2FDE6B64C866C76C2E06817C3
+0BE29C61C6512E1E59A02DCD607919D6F0B2D672449DEF953CA52825FC21B7F8292FA8433A7F73
+2BC333B635C81BDC2B454EB6A067F946C2209F9081B59AF825B0596D392CFBDC70B46BED6B45B4
+F3CB9551C770417FF4C5916618D17A6E8D362CB0CA0832F5C0FBA202F39972B2DD9EE708DAA646
+2953C4781B9EC8DC3FFAE55FAB9BD2EC94D84F73079A45BF3CB2506CE23CBE4674FAAFCD89BE6C
+65104B2BC60D687071B0608261597F70A0BB35ED937F8DB3BB1A7E0F6D8881F5B5E64729408A97
+08144693E2E68819A5F06002DF183A55FFED1149BEB06FBB7B7413A5DAD9DFF25B84B7FCE54B2E
+C4E0F6D44E63FF51765C8C886F45432112F3937D6C620E5BAE9D1A690959E54BE34D4FC3526099
+D1EFA0A6DB3F1BBEDDDC054FB4B2F11B601CB43E821FCFE6415D21032C1BFA35E5C7AD401AA628
+BD4147D0EB7EC9BD7E8ED1CD3CE085E2DCF35123A7ACDC2F480420B888415DEF745C6CF3C8EF70
+219B1776EA6E1DE091CF9294E325853DDB99F6F2DD3FB451B828A1946A11B4AEC60AA0067D415B
+01AA38E37013632ABC02DD4A7C1F1A6624E67E5E822E48CBC24114FAEDCC9135C58F8FC3FD31F3
+12D6E2E4E3D9D133A03C924085B778520163CC7B619370323A089E62A7DFD661C694993FECCDED
+F261F9F42AE8B81B83ED5627C2766040B15E2A29FBCD57C708AF106FDE487C90E62AEE4892D581
+A8266F4B00F020001C3907D7E2E0C019272C6D34DFBA9CDA49CF2ED412A365B6E86D6344C355A9
+5D8BCD32D54B22AECB5F4AA3386106DFE3E98C597A8D8696052BA719CE8661FA354ECFEE639550
+1D3EF450704C4B6403E37F18912938D8237A72D9F809E07C7AB3534B55E29357B9A2BB4A95870D
+015B2233245F8C7BCA4CE4FB1F112A4CE92564200136550E6A62748419F33CEECAC381CD0EED4C
+DE24ED2E095AACADDF5426EA8F7052693BB233A73E5FD55EBE9C212A1AF24D04752145CA890D89
+4DA8EF13BCEEDDA796179613EC34DF2A5C9EC2E6732364FD2A2F84D0A47E8CA1D615D242631E46
+BBEBB34693F2F5AAB03B9A2C92E748DC9FC9ECF2FDC8456496876FBDC4FD6EFEFC8DB4E96715BD
+1339571198DE48E541AD1F080A993C3C7487B713A8F741319FB25488221D47DB3F06EC72D46682
+F3D45B30BAA90E79B775660C900016168F6FF0EC0E2E1C04728A6F262802FED82ECECEF5B5D363
+B2DACE82537EE3BEA924FF50E7AF46B48ACE21A2D997BC738952FB50C9E8113FC62A47CFD980C8
+E84FC90F2672BBE891FCA392A12F68E50EB4D452ABE4ED8C1918BEEDB380026F89F98A54E37585
+9C4B1DAF86E3EE30F2572D98DCB45124265A1FE3EBD2A31D8FFDA93260384F4A51C61B1F9C526E
+97CC8F013F34BC5647E0C38280C48FCD03CCA57AD0B77C912575F79F94677664F9300F6D9D24FA
+57C0BDA3244FE481F912CE434C67704BEF6862C6D5B9B261A42F28DD8B14BD1B31ACFDB6C10E6D
+16809E5741962D31B65CDEEB93CDF35DB69E9124E163A6FBC3077C2C4460C5E12C84989D53EB4A
+FA7C15332836B837FB479171F67EB0CAE81B5F00046C432B44A6E26D75DA2662DE2534E9E53A1F
+E54984DB13604366883DB192134315D439C87CD202062E9D5015C96DFBA8B575B0F694FDACC331
+B996665AB8D0968EBE59C9C85D4B6452C5CCEAF8CAE3E5702F0AC1EC5C8F086F234A89BA3D8A87
+AD1640D7AED32A610FE0E9E112B8F62325DFB3968FC4FCA25F7C10969113B613EBF9E1BB715B11
+1138836BE5CF911D1572CE6AF8820866148B54E14041BE8BDD70D34858DD7AAF8A60C8535364BF
+60F2ACBD85FAA524EFA76F2DDFC2C0D88439269A8B13AAD60FF2451C5D792CAB89DC298EF429E2
+60EF2B7A7BB873886E9D19D6575886B97EBDCB3ACF92DFE2A759C4982BB896E5D9D42ECE7BBBF0
+C81A633AF86C8AFE612FE33B7623ED35A9488016DC83F66833256DED114D34BFFF5197A3B45842
+7710D75815D71E935A1C04AE3BD5A31E39CA805250CBC211DBE6108974DCD630D9CDA6652083A0
+8849FE43980D8D763B4E47293003BCC8850385CF2E16065299157D7AB8D589F95EB920B49C6938
+C82A7A6F99D80E14D8E02C1DAD0932D3434B5386363063DD5560C5E1887DECA4F5964FCC8B2619
+762C1B0A7686B1C68DDF221E29CBAD600CB69CEB7B2B1A29999F304B1200B4DD9944A7B13E2590
+33404D237575F969A739F71DEBB828671CC95C760140AB5FAB1DF5535A26098B22C86E02A3D36D
+CD1D710562385A85D68003DC714852373A4E39604F29692586C034941159605869100FB8FE2D04
+943120B7B76E26A8A19303A2A720826DB7809F4DAFD350F4ED9D57467FFE5680EA8E81812F3BBF
+A2557B9AF43EC5F030588392775E9FF92745134D10CC82AB5782706A85965EBE00783DF8C4E471
+0C6BB2083BF6D92383D114E95758DBBAB20B332AA0968C050E2FEF569F0772BE69F55E778069CE
+79AB1FE1DC588C61A82251E8BDE904956D566ED49A54337D373B3228A4A9A6BC7585137502330E
+557DCA031CD1EAAFB04D46246C61C6E5280649DC2E14267DCA971F3048D65E8CC7E90A62B6AFBE
+BF7F2767EF7E2EB5AC954D1C88070195DAD24FBBC6BCAA7BE6D6C88D08B1898B6CABC01F5F358F
+2BA39BF4E40603D04AA5CAEC5BA1F6C36A5EC05053C954242F83879F1308B7EC6843EE977E8F4E
+D89D1850CAE9379564AA7B2645AFB18C16C25E43865E17257ACC2A916A7A29F2823B9A1E5F9815
+5B2CD0C303924CC25E324B43B983C66367E42D048E451E05833FCA1835F37FFF39D2B7D68D8C79
+DDA0AB0DD02D5E252775300DDF7F463E009DA930C5B35ABB5B2C0825CD41404046968E5928D631
+26D581E9393BC89F7D2FA289A8CF036AF97BDB026B23FB866D819204590E0859FD05D0560EFEFA
+2B46D445D4D435721CFB9B08B1D743D418EFAA96FC5EB6CA66ECF85E0FB515E35A127ACE03C235
+5D5A12B6CE9392773A3C4A7C725D3DCCCCDA9CEF7C0D43D2E568D7471AD16F9AEA075609087FEC
+CB710052F4C0FC15D90FD4B157451011FBD0E7F5219CA9C586B593ECD8BF1BC5CA6F5B0E8FC7B3
+24E516BE6FF0405F500D45CEFBBB0A72A5CDBEDB7069C3ACF43E577DBBAABF787D427C4753858E
+AF11F2E4CF54A9445F0BD781E2DF0FEBAD210EFA8641E94BB9973DBD3D5FA9E3D14FB55702576D
+30A131D0DC7F5518110EE78E01EC0679439D393D6C96D06DE21A033AA1BB60F1716AFDE3F72B30
+1DB2A6EF5F0978B398CFFB44444B5428518363D8FA536EA55C9BF79D3AF34A209A6482CA6B4B6E
+8D81D36B53778D47C3A8D229821947B6D7C1400C3EE6FC726C2262353B7C1481938EF28DCF5F76
+5D994CBB72EAA65E35476D86667EFF35E2B88D59747C2C330BBC339FE3F03B90DF8E572EC73500
+90D40D76C1DA3D7BF1A37AA73A7B7ADD6D275C9E910115FDAAA1911CB8466DE224E07077D0A022
+3EB7A839BE44FA118217092A3FEE0B9BB623B66124203536CBA47AA3A865E4361BE80A7FA4DBA6
+0912A9F5E603CDD7FC331F59BF27E291EA1C169019FE4CBC219198317DF46B188E906B106C9DDA
+A367C74398D6440EF50F702201C0BD23F6C01BD9B43F0811BFFAC5A3C14544F068343D9BDD39A3
+EF5BF43F0139C1CCED0ABD641B00E382427188BEA59594F1A9C59D1A04EC693E60A9D7654D7FD5
+3A8B65D15103117F33F6F18B409B0DF129BF2DA8592EE386D6BEA725ED9A44065536A9896B42FB
+D527BEE9B16ECD00EA00C5564C57D3FBADB8C221B99A83B3C9525931B40FBA37253B4FAF9BDD46
+65D782CBE74138178DC68A0081AE38FB70DDE1E205429D9E2B419EDD81709D1555FBB215684A51
+BB3DB9F08EDD3146F069085155B5777F23340193745DEF7B3DE2A35680E05F07F832AD9C0A4598
+A55CAFAF0ABD1719C22BA06CDBAB2445442DBB3648F7645076FAF8DF53C9BCFF69C0872E829B50
+F9C953D567120E000F8418EFEF3C199FC7D530B2884B5634F87CDE82E46CA66F5A215F44ECCC44
+85271144AAD85F7D14DF0C14BB472341B814B8DDE80D46151B1AD56C879DCC65A57EA8A15D7703
+6FBC9A67BFA81181CCB02F69147BFD65EB2C53521E40939B68ADE7080B2059E709FBB73ED99C00
+A3F430F1D5E046B19757CD45F59C9D6FF117511129C2EB526FC41299A20B78D9C625E7A61BE199
+48D066D52CCE4A7E04CEE4F8633C48BAB8DDD605A1D472C5DC59233BE942CFF744581E0D96F812
+63DC54ADDE1DC06679FF0D8EF5A8ADC89619EC8FF273F22DCB79673FC1DD0490DEA3D627FDEBEF
+686B242BB7641FBF0A6EEF2158424A4F2CAA2CA842457ED90265DDEA68ACA37DF65309BCE5D47B
+AF4E4796CFBDEFF4DE11ABF268F400DFF85F94C7C4FCA63E3916DFBABEE8ECDAEB1A2CC8765E02
+492B202D921D0828533B4A011BD76FF8489964073B1E153236449C4691556CEA6BFFBD509CF63B
+B9A45C25425B18718F9D19475942183D32360227306BB63DDF2348237FF65BCBA3E5F5D6E63157
+D55C7CE9B6B364045ED751DBAFA6F4CEB81C8B042B271C516ED34EAAD5DE53530E3C84D31C00B6
+9194FE247A1CC2A7400C2A1547E10A818A7D9E642CBA34672B785214D39ACDEF57F65009B3B6B7
+C0CC45DF732874F6D5878EBCDA9527500AA396C3C6BF02B3A6A44BDB99BECFA75E6410E4836F54
+A79CC880B005E243C9536086563CDB7BE27F5EF2C98DA2C8BC073D00617574DB6A55738F4F75CC
+4178B60BD604D90CE5687B5C665F2EC1E4270C96C60D23DF86E34A1024C18ADAFF3446E5DDEDCC
+D3274FC57D2ABB3E77FC89105C7063E9A2B73CCE6CF6A566CDE4CFFE30934DF726DE5C9C71335C
+4458369AFC3A85F8343A4A95D15F9EE79355CBC2960AD990BE454990CD51AD6B9CBC542F60DCC5
+8AACA357744005594AE91D63E8DB5FEC4273FB3295FCA089A57FF5E5B6A386D9110F9A12C55CA1
+8ED38D962B5487EBFABB8B3F84AC82A094675731FAF0CF81FC329A90D74B5443F716241D90AE43
+85877655980782097AA01639D51E1E8D6EBF5DB7FCB6081B9F315F66A0C2BCFF3EA35C450ED911
+E89E021CA023213253E672387C56ACE512DFB7D942BC03F10A028215E3470B4B433388955409D2
+93C5D09CAD44342551BEF6BA3351A5801359C682B8CD5F375C07105669122D86E83BFD5D1E3035
+7F6BF160513871950A265DE83CC1A9E70C60185E2058D32198678229AAB3ED641A48ED761ABD13
+3664B82C86B1D9199913F7A141157AD4888F6FDC030A84398BD3EB1798CB9C98546E9B247E280C
+C4A86B8A52BFC33F113CFEBD114027C294FBB8FA63EC4708372028E07FC8BA2DDBC4B713A39D65
+A0C2C1E00F7E68AE3C0752106BFDE83C51F6EDCF2412B0A938BAABAA3A65848283893756DEAAF9
+E0BE4FB5FE474D994C1A66014DD0FED90BA8001268FD87612549BDEB9C89B952F61112EA8B5F75
+14D810A100825C62AA5706D772C87D4B5263FF9A6E6BBDFF1C06635C34C89D3853567CAE87F784
+72384D9901FCAFDD94F16889344F121AFEB571D9C1BFCC714B98FCFE19BF851B2FFA159A726607
+B5803CB705BCFA9ED3CF2B73CE527683ED7CAF3F1A4F9B31C51FC569080AED7B824E489DCBF24E
+5146AD35C5B3A99045B93103510287175F7CF02052EC73C6BA8A7D0187E2B1CB361E6CBFDDF894
+35ABB3BBEAA60A6A428EE0811BF0406CE1E72F7255998A9BB23D42180423BC9779F641CAF9541F
+1A7B291C1AB2EB138F6C0239010E1AEA43D3EAE6F80AC698D4E7C1A6DE606252A72C233985F6B6
+89A469B0B2D9652586EFCC7E1D008E9DA1034E99D90E0BBD77795D0E7A7A5346C3451417DEB2FD
+C5A5F2B3558975C6C213C9F61C1FD5A30BE894185D37474A2C16187A45FDAFD2CBE4574E54B2FB
+1AECC04783067487DA0CBA39935A150FA333DD4BB0EA7050B57FCA416DD4CA1CB3E5938659CF80
+9A5BFD4A7C2EFD7834A6EF13C7A1D24353FB378A6DDE916F06560F575643FEC5AF8A39E7043317
+C322FF30051BACB8A3B81D1FE45BC8CA76A9C75AF67F8EBE4731E9F92E9EE4F2FC2764F52DC679
+F7E41F2BA1D44042BCCDE3352052A90025BD12F72BB6BD8FA671D4F616D0A12E06D9556B51E846
+14D8068D3313E48F7A5C869E2077A648472C1C83B095601B400274F9FF080B5F50E41A0E3D8A43
+633C31C2924A436FB5095FC38F0365C1C12D5D6C0E2658D01C207838583EC2CD413CC9ACB0A29A
+26A0A145679363CBEC2EDBA55061ADBA688E27C15A5F2E02F2191D70A61186DCEDA9CC9AD49E50
+A5F87B5BF42C160FBA5BEC989CB389ABCC6D3FAF0CDA873C979694A60D92FA061E47DCFC77266A
+D57AD5C13AD7388AB7258EC43ED293D02C857EBD8734E60C09927EFCD0D7645A6DBEFEB4702CED
+FECFB1F6AC60D986AE88BEDE84CB8FB34B844881C3FDF5391A66B171CC486469BBFD11003A5B6D
+3BD979976FC9F28EBB3DDD1FA11FFEE828191E00FC88110DD15CE7856DAF3CAC9C28651042EC1B
+2EFAE309F2F9501FCB173DFAF6B3374B05D410CDCB9B922D547A70B521E4311A5D18B99D5956A8
+3F45B5011CF94DA3D438650D14388206AA25A74FF837FB62A3FDDEF5FE605A633AB31CE549E78A
+88BE7913502E562FB73B0C99B3FB8D6642B99C720C6AE9412B92469D4BC8FF30DFC990EE4565A6
+225F775D986E5934B8EC02D3EFD92B56C3AA4FCEA1A9EF9EA69BEBA985CFEE14856941669DAA45
+612E5849B2126BA4A510139607E092C2CD8E0B19EAB8165BC1104AF67922AD95AA92DE63CBAB3A
+980DB1606EA30F139059B463CCD4AF0A0BB436D0FCA3C73E9099FAA7C646242612E1519C563BB9
+14B7A10A1EFA6FBAB8F2CB45B8EBABC22E6540B76684D7308EA7BBD6FE2564EE9C2AEFCFFE0F75
+25BD8A3506135F5C0865BD1F0952F26C364524C88D6E649177F84FD61110F178D59AA036A64AD3
+CE9C7D83CE66106E32856DD62F7F82DC8D578BF33213F7A70637760AABA819479132F06479AFBB
+1004BA1568E59F915329C7217AC60C101A73F0D12A6AC9E8B36D7E68F1F75E55D28ACD1783C81D
+5A35FE276EBB494F87E51DDFBEAF65EB7B28077AFF83C86038251F6DF9C265D3FF4E61A0C62051
+4CD5008E9BD19C95385EA512C341053AECA3FB273427699086BB41DCE2100E5CB13BE744767564
+611202F27E531C78B0E176ACA47C71AC3FE4AFCB3E4D4E84B2D6A10B4A242D68A424F6E980D51F
+9A9BB8833B0D91A874F95BE8DF4CE9169F8FCB6E0FE14E31F16BBB3D974661C956710D440CCEE8
+BACB2A1CE47B0007171AC6681EDCF7FC3990ED6FBCE65CDE14D54BF4AF85D70032AB6119B01D32
+D90E1407523877FA2D780912DC97A01D56F4C025B7BC2E872157E85A5E58AEDC569F06EDB8F821
+831FA0520CAE97AB99031DCF2A4601DAB17CDF9F5169BD38E92F02D2EB2E2ECE37FE1C58FA3811
+A68346966D59437C10F28C43BE9546E3193F18EE3410BDBA68175A87A894910029A9F6E0723596
+E1AA2457684B853B5A0BBBC063CCA9F425B0DCBC0D86AA21988A0EBD306B7C8A4C7E5DE43A898C
+95D6F5BDD6DD23F81C9268431B4D465932DEF9CF37BCFBC05B07DDA75087377A5132904DC12F2D
+B322E15E3A2A9305E3B4C81A5A523A57F95DBE48FE4DA1BBF630401164F38B8FC237D3BF7B5CE9
+55389B0F7501BDFDE99763EB3965EE6C792130411B7BD7DEA605DE4F376D3F130877D0337CDF0A
+807588683D85B7548606E78C3C1F3EDEBB2C1755DA24C64792E3B82D46A1CDF34FE0E8E3810C8F
+9460570BBCFC4F98D42A0B048C8E0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
diff --git a/Build/source/texk/lcdf-typetools/tests/uhvrrc8a.pfb b/Build/source/texk/lcdf-typetools/tests/uhvrrc8a.pfb
new file mode 100644
index 00000000000..09b04db7613
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/tests/uhvrrc8a.pfb
Binary files differ
diff --git a/Build/source/texk/lcdf-typetools/version.ac b/Build/source/texk/lcdf-typetools/version.ac
new file mode 100644
index 00000000000..bc82b32931e
--- /dev/null
+++ b/Build/source/texk/lcdf-typetools/version.ac
@@ -0,0 +1,11 @@
+dnl
+dnl Copyright (C) 2011-2015 Peter Breitenlohner <tex-live@tug.org>
+dnl
+dnl This file is free software; the copyright holder
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl --------------------------------------------------------
+dnl
+dnl m4-include this file to define the current lcdf-typetools version
+m4_define([lcdf_typetools_version], [2.108])