[otlLib] choose most compact contextual lookup format (#3439)

* [otlLib] chose most compact contextual lookup format

Fixes https://github.com/fonttools/fonttools/issues/2934
This commit is contained in:
Cosimo Lupo 2024-02-05 16:59:29 +00:00 committed by GitHub
parent 1e989abec4
commit 96054e8152
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 530 additions and 339 deletions

View File

@ -6,6 +6,7 @@ from fontTools.ttLib.tables import otTables as ot
from fontTools.ttLib.tables.otBase import (
ValueRecord,
valueRecordFormatDict,
OTLOffsetOverflowError,
OTTableWriter,
CountReference,
)
@ -350,16 +351,14 @@ class ChainContextualBuilder(LookupBuilder):
return [x for x in ruleset if len(x.rules) > 0]
def getCompiledSize_(self, subtables):
size = 0
for st in subtables:
w = OTTableWriter()
w["LookupType"] = CountReference(
{"LookupType": st.LookupType}, "LookupType"
)
# We need to make a copy here because compiling
# modifies the subtable (finalizing formats etc.)
copy.deepcopy(st).compile(w, self.font)
size += len(w.getAllData())
if not subtables:
return 0
# We need to make a copy here because compiling
# modifies the subtable (finalizing formats etc.)
table = self.buildLookup_(copy.deepcopy(subtables))
w = OTTableWriter()
table.compile(w, self.font)
size = len(w.getAllData())
return size
def build(self):
@ -414,7 +413,7 @@ class ChainContextualBuilder(LookupBuilder):
if candidates[i]:
try:
self.getCompiledSize_(candidates[i])
except Exception as e:
except OTLOffsetOverflowError as e:
log.warning(
"Contextual format %i at %s overflowed (%s)"
% (i, str(self.location), e)

View File

@ -62,9 +62,11 @@
<Lookup index="1">
<LookupType value="5"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
<ContextSubst index="0" Format="2">
<Coverage>
<!-- SubTableCount=3 -->
<ContextSubst index="0" Format="3">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Coverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
@ -92,91 +94,160 @@
<Glyph value="y"/>
<Glyph value="z"/>
</Coverage>
<ClassDef>
<ClassDef glyph="A" class="3"/>
<ClassDef glyph="B" class="3"/>
<ClassDef glyph="C" class="3"/>
<ClassDef glyph="D" class="3"/>
<ClassDef glyph="E" class="3"/>
<ClassDef glyph="F" class="3"/>
<ClassDef glyph="G" class="3"/>
<ClassDef glyph="H" class="3"/>
<ClassDef glyph="I" class="2"/>
<ClassDef glyph="J" class="2"/>
<ClassDef glyph="K" class="2"/>
<ClassDef glyph="L" class="2"/>
<ClassDef glyph="M" class="2"/>
<ClassDef glyph="N" class="2"/>
<ClassDef glyph="O" class="2"/>
<ClassDef glyph="P" class="2"/>
<ClassDef glyph="Q" class="2"/>
<ClassDef glyph="R" class="2"/>
<ClassDef glyph="S" class="2"/>
<ClassDef glyph="T" class="2"/>
<ClassDef glyph="U" class="2"/>
<ClassDef glyph="V" class="2"/>
<ClassDef glyph="W" class="2"/>
<ClassDef glyph="X" class="2"/>
<ClassDef glyph="Y" class="2"/>
<ClassDef glyph="Z" class="2"/>
<ClassDef glyph="a" class="1"/>
<ClassDef glyph="b" class="1"/>
<ClassDef glyph="c" class="1"/>
<ClassDef glyph="d" class="1"/>
<ClassDef glyph="e" class="1"/>
<ClassDef glyph="f" class="1"/>
<ClassDef glyph="g" class="1"/>
<ClassDef glyph="h" class="1"/>
<ClassDef glyph="i" class="1"/>
<ClassDef glyph="j" class="1"/>
<ClassDef glyph="k" class="1"/>
<ClassDef glyph="l" class="1"/>
<ClassDef glyph="m" class="1"/>
<ClassDef glyph="n" class="1"/>
<ClassDef glyph="o" class="1"/>
<ClassDef glyph="p" class="1"/>
<ClassDef glyph="q" class="1"/>
<ClassDef glyph="r" class="1"/>
<ClassDef glyph="s" class="1"/>
<ClassDef glyph="t" class="1"/>
<ClassDef glyph="u" class="1"/>
<ClassDef glyph="v" class="1"/>
<ClassDef glyph="w" class="1"/>
<ClassDef glyph="x" class="1"/>
<ClassDef glyph="y" class="1"/>
<ClassDef glyph="z" class="1"/>
</ClassDef>
<!-- SubClassSetCount=4 -->
<SubClassSet index="0">
<!-- SubClassRuleCount=0 -->
</SubClassSet>
<SubClassSet index="1">
<!-- SubClassRuleCount=3 -->
<SubClassRule index="0">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Class index="0" value="3"/>
<Class index="1" value="2"/>
</SubClassRule>
<SubClassRule index="1">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Class index="0" value="3"/>
<Class index="1" value="2"/>
</SubClassRule>
<SubClassRule index="2">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Class index="0" value="2"/>
<Class index="1" value="3"/>
</SubClassRule>
</SubClassSet>
<SubClassSet index="2">
<!-- SubClassRuleCount=0 -->
</SubClassSet>
<SubClassSet index="3">
<!-- SubClassRuleCount=0 -->
</SubClassSet>
<Coverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</Coverage>
<Coverage index="2">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</Coverage>
</ContextSubst>
<ContextSubst index="1" Format="3">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Coverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</Coverage>
<Coverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</Coverage>
<Coverage index="2">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</Coverage>
</ContextSubst>
<ContextSubst index="2" Format="3">
<!-- GlyphCount=3 -->
<!-- SubstCount=0 -->
<Coverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</Coverage>
<Coverage index="1">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</Coverage>
<Coverage index="2">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</Coverage>
</ContextSubst>
</Lookup>
<Lookup index="2">

View File

@ -72,9 +72,41 @@
<Lookup index="1">
<LookupType value="6"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
<ChainContextSubst index="0" Format="2">
<Coverage>
<!-- SubTableCount=3 -->
<ChainContextSubst index="0" Format="3">
<!-- BacktrackGlyphCount=2 -->
<BacktrackCoverage index="0">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</BacktrackCoverage>
<BacktrackCoverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</BacktrackCoverage>
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
@ -101,134 +133,227 @@
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</Coverage>
<BacktrackClassDef>
<ClassDef glyph="A" class="2"/>
<ClassDef glyph="B" class="2"/>
<ClassDef glyph="C" class="2"/>
<ClassDef glyph="D" class="2"/>
<ClassDef glyph="E" class="2"/>
<ClassDef glyph="F" class="2"/>
<ClassDef glyph="G" class="2"/>
<ClassDef glyph="H" class="2"/>
<ClassDef glyph="I" class="1"/>
<ClassDef glyph="J" class="1"/>
<ClassDef glyph="K" class="1"/>
<ClassDef glyph="L" class="1"/>
<ClassDef glyph="M" class="1"/>
<ClassDef glyph="N" class="1"/>
<ClassDef glyph="O" class="1"/>
<ClassDef glyph="P" class="1"/>
<ClassDef glyph="Q" class="1"/>
<ClassDef glyph="R" class="1"/>
<ClassDef glyph="S" class="1"/>
<ClassDef glyph="T" class="1"/>
<ClassDef glyph="U" class="1"/>
<ClassDef glyph="V" class="1"/>
<ClassDef glyph="W" class="1"/>
<ClassDef glyph="X" class="1"/>
<ClassDef glyph="Y" class="1"/>
<ClassDef glyph="Z" class="1"/>
</BacktrackClassDef>
<InputClassDef>
<ClassDef glyph="A" class="3"/>
<ClassDef glyph="B" class="3"/>
<ClassDef glyph="C" class="3"/>
<ClassDef glyph="D" class="3"/>
<ClassDef glyph="E" class="3"/>
<ClassDef glyph="F" class="3"/>
<ClassDef glyph="G" class="3"/>
<ClassDef glyph="H" class="3"/>
<ClassDef glyph="I" class="2"/>
<ClassDef glyph="J" class="2"/>
<ClassDef glyph="K" class="2"/>
<ClassDef glyph="L" class="2"/>
<ClassDef glyph="M" class="2"/>
<ClassDef glyph="N" class="2"/>
<ClassDef glyph="O" class="2"/>
<ClassDef glyph="P" class="2"/>
<ClassDef glyph="Q" class="2"/>
<ClassDef glyph="R" class="2"/>
<ClassDef glyph="S" class="2"/>
<ClassDef glyph="T" class="2"/>
<ClassDef glyph="U" class="2"/>
<ClassDef glyph="V" class="2"/>
<ClassDef glyph="W" class="2"/>
<ClassDef glyph="X" class="2"/>
<ClassDef glyph="Y" class="2"/>
<ClassDef glyph="Z" class="2"/>
<ClassDef glyph="a" class="1"/>
<ClassDef glyph="b" class="1"/>
<ClassDef glyph="c" class="1"/>
<ClassDef glyph="d" class="1"/>
<ClassDef glyph="e" class="1"/>
<ClassDef glyph="f" class="1"/>
<ClassDef glyph="g" class="1"/>
<ClassDef glyph="h" class="1"/>
<ClassDef glyph="i" class="1"/>
<ClassDef glyph="j" class="1"/>
<ClassDef glyph="k" class="1"/>
<ClassDef glyph="l" class="1"/>
<ClassDef glyph="m" class="1"/>
<ClassDef glyph="n" class="1"/>
<ClassDef glyph="o" class="1"/>
<ClassDef glyph="p" class="1"/>
<ClassDef glyph="q" class="1"/>
<ClassDef glyph="r" class="1"/>
<ClassDef glyph="s" class="1"/>
<ClassDef glyph="t" class="1"/>
<ClassDef glyph="u" class="1"/>
<ClassDef glyph="v" class="1"/>
<ClassDef glyph="w" class="1"/>
<ClassDef glyph="x" class="1"/>
<ClassDef glyph="y" class="1"/>
<ClassDef glyph="z" class="1"/>
</InputClassDef>
<LookAheadClassDef>
</LookAheadClassDef>
<!-- ChainSubClassSetCount=4 -->
<ChainSubClassSet index="0">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
<ChainSubClassSet index="1">
<!-- ChainSubClassRuleCount=3 -->
<ChainSubClassRule index="0">
<!-- BacktrackGlyphCount=2 -->
<Backtrack index="0" value="1"/>
<Backtrack index="1" value="2"/>
<!-- InputGlyphCount=3 -->
<Input index="0" value="3"/>
<Input index="1" value="2"/>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainSubClassRule>
<ChainSubClassRule index="1">
<!-- BacktrackGlyphCount=2 -->
<Backtrack index="0" value="2"/>
<Backtrack index="1" value="1"/>
<!-- InputGlyphCount=3 -->
<Input index="0" value="3"/>
<Input index="1" value="2"/>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainSubClassRule>
<ChainSubClassRule index="2">
<!-- BacktrackGlyphCount=2 -->
<Backtrack index="0" value="1"/>
<Backtrack index="1" value="2"/>
<!-- InputGlyphCount=3 -->
<Input index="0" value="2"/>
<Input index="1" value="3"/>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainSubClassRule>
</ChainSubClassSet>
<ChainSubClassSet index="2">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
<ChainSubClassSet index="3">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</InputCoverage>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainContextSubst>
<ChainContextSubst index="1" Format="3">
<!-- BacktrackGlyphCount=2 -->
<BacktrackCoverage index="0">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</BacktrackCoverage>
<BacktrackCoverage index="1">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</BacktrackCoverage>
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</InputCoverage>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainContextSubst>
<ChainContextSubst index="2" Format="3">
<!-- BacktrackGlyphCount=2 -->
<BacktrackCoverage index="0">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</BacktrackCoverage>
<BacktrackCoverage index="1">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</BacktrackCoverage>
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="I"/>
<Glyph value="J"/>
<Glyph value="K"/>
<Glyph value="L"/>
<Glyph value="M"/>
<Glyph value="N"/>
<Glyph value="O"/>
<Glyph value="P"/>
<Glyph value="Q"/>
<Glyph value="R"/>
<Glyph value="S"/>
<Glyph value="T"/>
<Glyph value="U"/>
<Glyph value="V"/>
<Glyph value="W"/>
<Glyph value="X"/>
<Glyph value="Y"/>
<Glyph value="Z"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="A"/>
<Glyph value="B"/>
<Glyph value="C"/>
<Glyph value="D"/>
<Glyph value="E"/>
<Glyph value="F"/>
<Glyph value="G"/>
<Glyph value="H"/>
</InputCoverage>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainContextSubst>
</Lookup>
<Lookup index="2">

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="true" ttLibVersion="3.0">
<ttFont>
<GSUB>
<Version value="0x00010000"/>
@ -32,115 +32,111 @@
<Lookup index="0">
<LookupType value="6"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
<ChainContextSubst index="0" Format="2">
<Coverage>
<!-- SubTableCount=3 -->
<ChainContextSubst index="0" Format="3">
<!-- BacktrackGlyphCount=1 -->
<BacktrackCoverage index="0">
<Glyph value="a"/>
</Coverage>
<BacktrackClassDef>
<ClassDef glyph="a" class="1"/>
<ClassDef glyph="b" class="1"/>
<ClassDef glyph="c" class="1"/>
<ClassDef glyph="d" class="1"/>
<ClassDef glyph="e" class="1"/>
<ClassDef glyph="f" class="1"/>
<ClassDef glyph="g" class="1"/>
<ClassDef glyph="h" class="1"/>
<ClassDef glyph="i" class="1"/>
<ClassDef glyph="j" class="1"/>
<ClassDef glyph="k" class="1"/>
<ClassDef glyph="l" class="1"/>
<ClassDef glyph="m" class="1"/>
<ClassDef glyph="n" class="1"/>
<ClassDef glyph="o" class="1"/>
<ClassDef glyph="p" class="1"/>
<ClassDef glyph="q" class="1"/>
<ClassDef glyph="r" class="1"/>
<ClassDef glyph="s" class="1"/>
<ClassDef glyph="t" class="1"/>
<ClassDef glyph="u" class="1"/>
<ClassDef glyph="v" class="1"/>
<ClassDef glyph="w" class="1"/>
<ClassDef glyph="x" class="1"/>
<ClassDef glyph="y" class="1"/>
<ClassDef glyph="z" class="1"/>
</BacktrackClassDef>
<InputClassDef>
<ClassDef glyph="a" class="1"/>
<ClassDef glyph="d" class="2"/>
<ClassDef glyph="n" class="3"/>
</InputClassDef>
<LookAheadClassDef>
<ClassDef glyph="a" class="1"/>
<ClassDef glyph="b" class="1"/>
<ClassDef glyph="c" class="1"/>
<ClassDef glyph="d" class="1"/>
<ClassDef glyph="e" class="1"/>
<ClassDef glyph="f" class="1"/>
<ClassDef glyph="g" class="1"/>
<ClassDef glyph="h" class="1"/>
<ClassDef glyph="i" class="1"/>
<ClassDef glyph="j" class="1"/>
<ClassDef glyph="k" class="1"/>
<ClassDef glyph="l" class="1"/>
<ClassDef glyph="m" class="1"/>
<ClassDef glyph="n" class="1"/>
<ClassDef glyph="o" class="1"/>
<ClassDef glyph="p" class="1"/>
<ClassDef glyph="q" class="1"/>
<ClassDef glyph="r" class="1"/>
<ClassDef glyph="s" class="1"/>
<ClassDef glyph="t" class="1"/>
<ClassDef glyph="u" class="1"/>
<ClassDef glyph="v" class="1"/>
<ClassDef glyph="w" class="1"/>
<ClassDef glyph="x" class="1"/>
<ClassDef glyph="y" class="1"/>
<ClassDef glyph="z" class="1"/>
</LookAheadClassDef>
<!-- ChainSubClassSetCount=4 -->
<ChainSubClassSet index="0">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
<ChainSubClassSet index="1">
<!-- ChainSubClassRuleCount=3 -->
<ChainSubClassRule index="0">
<!-- BacktrackGlyphCount=1 -->
<Backtrack index="0" value="1"/>
<!-- InputGlyphCount=3 -->
<Input index="0" value="3"/>
<Input index="1" value="2"/>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainSubClassRule>
<ChainSubClassRule index="1">
<!-- BacktrackGlyphCount=0 -->
<!-- InputGlyphCount=3 -->
<Input index="0" value="3"/>
<Input index="1" value="2"/>
<!-- LookAheadGlyphCount=1 -->
<LookAhead index="0" value="1"/>
<!-- SubstCount=0 -->
</ChainSubClassRule>
<ChainSubClassRule index="2">
<!-- BacktrackGlyphCount=0 -->
<!-- InputGlyphCount=3 -->
<Input index="0" value="3"/>
<Input index="1" value="2"/>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=1 -->
<SubstLookupRecord index="0">
<SequenceIndex value="0"/>
<LookupListIndex value="1"/>
</SubstLookupRecord>
</ChainSubClassRule>
</ChainSubClassSet>
<ChainSubClassSet index="2">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
<ChainSubClassSet index="3">
<!-- ChainSubClassRuleCount=0 -->
</ChainSubClassSet>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</BacktrackCoverage>
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="n"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="d"/>
</InputCoverage>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=0 -->
</ChainContextSubst>
<ChainContextSubst index="1" Format="3">
<!-- BacktrackGlyphCount=0 -->
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="n"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="d"/>
</InputCoverage>
<!-- LookAheadGlyphCount=1 -->
<LookAheadCoverage index="0">
<Glyph value="a"/>
<Glyph value="b"/>
<Glyph value="c"/>
<Glyph value="d"/>
<Glyph value="e"/>
<Glyph value="f"/>
<Glyph value="g"/>
<Glyph value="h"/>
<Glyph value="i"/>
<Glyph value="j"/>
<Glyph value="k"/>
<Glyph value="l"/>
<Glyph value="m"/>
<Glyph value="n"/>
<Glyph value="o"/>
<Glyph value="p"/>
<Glyph value="q"/>
<Glyph value="r"/>
<Glyph value="s"/>
<Glyph value="t"/>
<Glyph value="u"/>
<Glyph value="v"/>
<Glyph value="w"/>
<Glyph value="x"/>
<Glyph value="y"/>
<Glyph value="z"/>
</LookAheadCoverage>
<!-- SubstCount=0 -->
</ChainContextSubst>
<ChainContextSubst index="2" Format="3">
<!-- BacktrackGlyphCount=0 -->
<!-- InputGlyphCount=3 -->
<InputCoverage index="0">
<Glyph value="a"/>
</InputCoverage>
<InputCoverage index="1">
<Glyph value="n"/>
</InputCoverage>
<InputCoverage index="2">
<Glyph value="d"/>
</InputCoverage>
<!-- LookAheadGlyphCount=0 -->
<!-- SubstCount=1 -->
<SubstLookupRecord index="0">
<SequenceIndex value="0"/>
<LookupListIndex value="1"/>
</SubstLookupRecord>
</ChainContextSubst>
</Lookup>
<Lookup index="1">