[HarfBuzz] harfbuzz: Branch 'master' - 24 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Nov 13 12:36:54 PST 2012


 TODO                                                                                   |    2 
 src/Makefile.am                                                                        |    2 
 src/hb-ft.cc                                                                           |    2 
 src/hb-ot-head-table.hh                                                                |    2 
 src/hb-ot-layout-common-private.hh                                                     |    6 
 src/hb-ot-map-private.hh                                                               |   17 
 src/hb-ot-map.cc                                                                       |   51 
 src/hb-ot-shape-complex-arabic.cc                                                      |    2 
 src/hb-ot-shape-complex-indic-machine.hh                                               | 1126 +++++-----
 src/hb-ot-shape-complex-indic-machine.rl                                               |    3 
 src/hb-ot-shape-complex-indic-private.hh                                               |   19 
 src/hb-ot-shape-complex-indic.cc                                                       |  135 -
 src/hb-ot-shape-complex-misc.cc                                                        |  133 +
 src/hb-ot-shape-complex-private.hh                                                     |   60 
 src/hb-ot-shape-normalize-private.hh                                                   |    6 
 src/hb-ot-shape-normalize.cc                                                           |  278 --
 src/hb-ot-shape-private.hh                                                             |    4 
 src/hb-ot-shape.cc                                                                     |    7 
 src/hb-ot-tag.cc                                                                       |    2 
 test/api/test-ot-tag.c                                                                 |    1 
 test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST  |    1 
 test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt |   34 
 util/options.cc                                                                        |   15 
 23 files changed, 1051 insertions(+), 857 deletions(-)

New commits:
commit 0736915b8ed789a209205fec762997af3a8af89c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Nov 13 12:35:35 2012 -0800

    [Indic] Decompose Sinhala split matras the way old HarfBuzz / Pango did
    
    Had to do some refactoring to make this happen...
    
    Under uniscribe bug compatibility mode, we still plit them
    Uniscrie-style, but Jonathan and I convinced ourselves that there is no
    harm doing this the Unicode way.  This change makes that happen, and
    unbreaks free Sinhala fonts.

diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index 697e54e..cba7933 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -348,6 +348,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
   data_destroy_arabic,
   NULL, /* preprocess_text_arabic */
   NULL, /* normalization_preference */
+  NULL, /* decompose */
+  NULL, /* compose */
   setup_masks_arabic,
   true, /* zero_width_attached_marks */
 };
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 60fe3fb..a948d52 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -1268,11 +1268,81 @@ final_reordering (const hb_ot_shape_plan_t *plan,
 
 
 static hb_ot_shape_normalization_mode_t
-normalization_preference_indic (const hb_ot_shape_plan_t *plan)
+normalization_preference_indic (const hb_segment_properties_t *props)
 {
   return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT;
 }
 
+static hb_bool_t
+decompose_indic (hb_unicode_funcs_t *unicode,
+		 hb_codepoint_t  ab,
+		 hb_codepoint_t *a,
+		 hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /* Don't decompose these. */
+    case 0x0931  : return false;
+    case 0x0B94  : return false;
+
+
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+    case 0x0F77  : *a = 0x0FB2; *b= 0x0F81; return true;
+    case 0x0F79  : *a = 0x0FB3; *b= 0x0F81; return true;
+    case 0x17BE  : *a = 0x17C1; *b= 0x17BE; return true;
+    case 0x17BF  : *a = 0x17C1; *b= 0x17BF; return true;
+    case 0x17C0  : *a = 0x17C1; *b= 0x17C0; return true;
+    case 0x17C4  : *a = 0x17C1; *b= 0x17C4; return true;
+    case 0x17C5  : *a = 0x17C1; *b= 0x17C5; return true;
+    case 0x1925  : *a = 0x1920; *b= 0x1923; return true;
+    case 0x1926  : *a = 0x1920; *b= 0x1924; return true;
+    case 0x1B3C  : *a = 0x1B42; *b= 0x1B3C; return true;
+    case 0x1112E  : *a = 0x11127; *b= 0x11131; return true;
+    case 0x1112F  : *a = 0x11127; *b= 0x11132; return true;
+#if 0
+    /* This one has no decomposition in Unicode, but needs no decomposition either. */
+    /* case 0x0AC9  : return false; */
+    case 0x0B57  : *a = no decomp, -> RIGHT; return true;
+    case 0x1C29  : *a = no decomp, -> LEFT; return true;
+    case 0xA9C0  : *a = no decomp, -> RIGHT; return true;
+    case 0x111BF  : *a = no decomp, -> ABOVE; return true;
+#endif
+  }
+
+  if (indic_options ().uniscribe_bug_compatible)
+  switch (ab)
+  {
+    /* These Sinhala ones have Unicode decompositions, but Uniscribe
+     * decomposes them "Khmer-style". */
+    case 0x0DDA  : *a = 0x0DD9; *b= 0x0DDA; return true;
+    case 0x0DDC  : *a = 0x0DD9; *b= 0x0DDC; return true;
+    case 0x0DDD  : *a = 0x0DD9; *b= 0x0DDD; return true;
+    case 0x0DDE  : *a = 0x0DD9; *b= 0x0DDE; return true;
+  }
+
+  return unicode->decompose (ab, a, b);
+}
+
+static hb_bool_t
+compose_indic (hb_unicode_funcs_t *unicode,
+	       hb_codepoint_t  a,
+	       hb_codepoint_t  b,
+	       hb_codepoint_t *ab)
+{
+  /* Avoid recomposing split matras. */
+  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (unicode->general_category (a)))
+    return false;
+
+  /* Composition-exclusion exceptions that we want to recompose. */
+  if (a == 0x09AF && b == 0x09BC) { *ab = 0x09DF; return true; }
+
+  return unicode->compose (a, b, ab);
+}
+
+
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
 {
   "indic",
@@ -1282,6 +1352,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
   data_destroy_indic,
   NULL, /* preprocess_text */
   normalization_preference_indic,
+  decompose_indic,
+  compose_indic,
   setup_masks_indic,
   false, /* zero_width_attached_marks */
 };
diff --git a/src/hb-ot-shape-complex-misc.cc b/src/hb-ot-shape-complex-misc.cc
index 13bc22b..a65de2f 100644
--- a/src/hb-ot-shape-complex-misc.cc
+++ b/src/hb-ot-shape-complex-misc.cc
@@ -72,9 +72,9 @@ collect_features_default (hb_ot_shape_planner_t *plan)
 }
 
 static hb_ot_shape_normalization_mode_t
-normalization_preference_default (const hb_ot_shape_plan_t *plan)
+normalization_preference_default (const hb_segment_properties_t *props)
 {
-  switch ((hb_tag_t) plan->props.script)
+  switch ((hb_tag_t) props->script)
   {
     /* Unicode-1.1 additions */
     case HB_SCRIPT_HANGUL:
@@ -83,6 +83,131 @@ normalization_preference_default (const hb_ot_shape_plan_t *plan)
   return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
 }
 
+static hb_bool_t
+compose_default (hb_unicode_funcs_t *unicode,
+		 hb_codepoint_t  a,
+		 hb_codepoint_t  b,
+		 hb_codepoint_t *ab)
+{
+  /* Hebrew presentation-form shaping.
+   * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 */
+  // Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA;
+  // note that some letters do not have a dagesh presForm encoded
+  static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = {
+    0xFB30, // ALEF
+    0xFB31, // BET
+    0xFB32, // GIMEL
+    0xFB33, // DALET
+    0xFB34, // HE
+    0xFB35, // VAV
+    0xFB36, // ZAYIN
+    0, // HET
+    0xFB38, // TET
+    0xFB39, // YOD
+    0xFB3A, // FINAL KAF
+    0xFB3B, // KAF
+    0xFB3C, // LAMED
+    0, // FINAL MEM
+    0xFB3E, // MEM
+    0, // FINAL NUN
+    0xFB40, // NUN
+    0xFB41, // SAMEKH
+    0, // AYIN
+    0xFB43, // FINAL PE
+    0xFB44, // PE
+    0, // FINAL TSADI
+    0xFB46, // TSADI
+    0xFB47, // QOF
+    0xFB48, // RESH
+    0xFB49, // SHIN
+    0xFB4A // TAV
+  };
+
+  hb_bool_t found = unicode->compose (a, b, ab);
+
+  if (!found && (b & ~0x7F) == 0x0580) {
+      // special-case Hebrew presentation forms that are excluded from
+      // standard normalization, but wanted for old fonts
+      switch (b) {
+      case 0x05B4: // HIRIQ
+	  if (a == 0x05D9) { // YOD
+	      *ab = 0xFB1D;
+	      found = true;
+	  }
+	  break;
+      case 0x05B7: // patah
+	  if (a == 0x05F2) { // YIDDISH YOD YOD
+	      *ab = 0xFB1F;
+	      found = true;
+	  } else if (a == 0x05D0) { // ALEF
+	      *ab = 0xFB2E;
+	      found = true;
+	  }
+	  break;
+      case 0x05B8: // QAMATS
+	  if (a == 0x05D0) { // ALEF
+	      *ab = 0xFB2F;
+	      found = true;
+	  }
+	  break;
+      case 0x05B9: // HOLAM
+	  if (a == 0x05D5) { // VAV
+	      *ab = 0xFB4B;
+	      found = true;
+	  }
+	  break;
+      case 0x05BC: // DAGESH
+	  if (a >= 0x05D0 && a <= 0x05EA) {
+	      *ab = sDageshForms[a - 0x05D0];
+	      found = (*ab != 0);
+	  } else if (a == 0xFB2A) { // SHIN WITH SHIN DOT
+	      *ab = 0xFB2C;
+	      found = true;
+	  } else if (a == 0xFB2B) { // SHIN WITH SIN DOT
+	      *ab = 0xFB2D;
+	      found = true;
+	  }
+	  break;
+      case 0x05BF: // RAFE
+	  switch (a) {
+	  case 0x05D1: // BET
+	      *ab = 0xFB4C;
+	      found = true;
+	      break;
+	  case 0x05DB: // KAF
+	      *ab = 0xFB4D;
+	      found = true;
+	      break;
+	  case 0x05E4: // PE
+	      *ab = 0xFB4E;
+	      found = true;
+	      break;
+	  }
+	  break;
+      case 0x05C1: // SHIN DOT
+	  if (a == 0x05E9) { // SHIN
+	      *ab = 0xFB2A;
+	      found = true;
+	  } else if (a == 0xFB49) { // SHIN WITH DAGESH
+	      *ab = 0xFB2C;
+	      found = true;
+	  }
+	  break;
+      case 0x05C2: // SIN DOT
+	  if (a == 0x05E9) { // SHIN
+	      *ab = 0xFB2B;
+	      found = true;
+	  } else if (a == 0xFB49) { // SHIN WITH DAGESH
+	      *ab = 0xFB2D;
+	      found = true;
+	  }
+	  break;
+      }
+  }
+
+  return found;
+}
+
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
 {
   "default",
@@ -92,6 +217,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
   NULL, /* data_destroy */
   NULL, /* preprocess_text */
   normalization_preference_default,
+  NULL, /* decompose */
+  compose_default,
   NULL, /* setup_masks */
   true, /* zero_width_attached_marks */
 };
@@ -203,6 +330,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
   NULL, /* data_destroy */
   preprocess_text_thai,
   NULL, /* normalization_preference */
+  NULL, /* decompose */
+  NULL, /* compose */
   NULL, /* setup_masks */
   true, /* zero_width_attached_marks */
 };
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index a45b0f4..477a250 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -56,6 +56,7 @@ struct hb_ot_complex_shaper_t
   /* collect_features()
    * Called during shape_plan().
    * Shapers should use plan->map to add their features and callbacks.
+   * May be NULL.
    */
   void (*collect_features) (hb_ot_shape_planner_t *plan);
 
@@ -63,6 +64,7 @@ struct hb_ot_complex_shaper_t
    * Called during shape_plan().
    * Shapers should use plan->map to override features and add callbacks after
    * common features are added.
+   * May be NULL.
    */
   void (*override_features) (hb_ot_shape_planner_t *plan);
 
@@ -78,13 +80,15 @@ struct hb_ot_complex_shaper_t
    * Called when the shape_plan is being destroyed.
    * plan->data is passed here for destruction.
    * If NULL is returned, means a plan failure.
-   * May be NULL. */
+   * May be NULL.
+   */
   void (*data_destroy) (void *data);
 
 
   /* preprocess_text()
    * Called during shape().
    * Shapers can use to modify text before shaping starts.
+   * May be NULL.
    */
   void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
 			   hb_buffer_t              *buffer,
@@ -93,14 +97,34 @@ struct hb_ot_complex_shaper_t
 
   /* normalization_preference()
    * Called during shape().
+   * May be NULL.
    */
   hb_ot_shape_normalization_mode_t
-  (*normalization_preference) (const hb_ot_shape_plan_t *plan);
+  (*normalization_preference) (const hb_segment_properties_t *props);
+
+  /* decompose()
+   * Called during shape()'s normalization.
+   * May be NULL.
+   */
+  hb_bool_t (*decompose) (hb_unicode_funcs_t *unicode,
+			  hb_codepoint_t  ab,
+			  hb_codepoint_t *a,
+			  hb_codepoint_t *b);
+
+  /* compose()
+   * Called during shape()'s normalization.
+   * May be NULL.
+   */
+  hb_bool_t (*compose) (hb_unicode_funcs_t *unicode,
+			hb_codepoint_t  a,
+			hb_codepoint_t  b,
+			hb_codepoint_t *ab);
 
   /* setup_masks()
    * Called during shape().
    * Shapers should use map to get feature masks and set on buffer.
    * Shapers may NOT modify characters.
+   * May be NULL.
    */
   void (*setup_masks) (const hb_ot_shape_plan_t *plan,
 		       hb_buffer_t              *buffer,
diff --git a/src/hb-ot-shape-normalize-private.hh b/src/hb-ot-shape-normalize-private.hh
index c5fcbea..4b77699 100644
--- a/src/hb-ot-shape-normalize-private.hh
+++ b/src/hb-ot-shape-normalize-private.hh
@@ -35,6 +35,8 @@
 /* buffer var allocations, used during the normalization process */
 #define glyph_index()	var1.u32
 
+struct hb_ot_complex_shaper_t;
+
 enum hb_ot_shape_normalization_mode_t {
   HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED,
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* never composes base-to-base */
@@ -44,8 +46,8 @@ enum hb_ot_shape_normalization_mode_t {
   HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS
 };
 
-HB_INTERNAL void _hb_ot_shape_normalize (hb_font_t *font,
+HB_INTERNAL void _hb_ot_shape_normalize (const hb_ot_complex_shaper_t *shaper,
 					 hb_buffer_t *buffer,
-					 hb_ot_shape_normalization_mode_t mode);
+					 hb_font_t *font);
 
 #endif /* HB_OT_SHAPE_NORMALIZE_PRIVATE_HH */
diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc
index 18a3f3f..df15f7d 100644
--- a/src/hb-ot-shape-normalize.cc
+++ b/src/hb-ot-shape-normalize.cc
@@ -25,6 +25,7 @@
  */
 
 #include "hb-ot-shape-normalize-private.hh"
+#include "hb-ot-shape-complex-private.hh"
 #include "hb-ot-shape-private.hh"
 
 
@@ -82,180 +83,23 @@
  */
 
 static hb_bool_t
-decompose_func (hb_unicode_funcs_t *unicode,
-		hb_codepoint_t  ab,
-		hb_codepoint_t *a,
-		hb_codepoint_t *b)
+decompose_unicode (hb_unicode_funcs_t *unicode,
+		   hb_codepoint_t  ab,
+		   hb_codepoint_t *a,
+		   hb_codepoint_t *b)
 {
-  /* XXX FIXME, move these to complex shapers and propagage to normalizer.*/
-  switch (ab) {
-    case 0x0AC9  : return false;
-
-    case 0x0931  : return false;
-    case 0x0B94  : return false;
-
-    /* These ones have Unicode decompositions, but we do it
-     * this way to be close to what Uniscribe does. */
-    case 0x0DDA  : *a = 0x0DD9; *b= 0x0DDA; return true;
-    case 0x0DDC  : *a = 0x0DD9; *b= 0x0DDC; return true;
-    case 0x0DDD  : *a = 0x0DD9; *b= 0x0DDD; return true;
-    case 0x0DDE  : *a = 0x0DD9; *b= 0x0DDE; return true;
-
-    case 0x0F77  : *a = 0x0FB2; *b= 0x0F81; return true;
-    case 0x0F79  : *a = 0x0FB3; *b= 0x0F81; return true;
-    case 0x17BE  : *a = 0x17C1; *b= 0x17BE; return true;
-    case 0x17BF  : *a = 0x17C1; *b= 0x17BF; return true;
-    case 0x17C0  : *a = 0x17C1; *b= 0x17C0; return true;
-    case 0x17C4  : *a = 0x17C1; *b= 0x17C4; return true;
-    case 0x17C5  : *a = 0x17C1; *b= 0x17C5; return true;
-    case 0x1925  : *a = 0x1920; *b= 0x1923; return true;
-    case 0x1926  : *a = 0x1920; *b= 0x1924; return true;
-    case 0x1B3C  : *a = 0x1B42; *b= 0x1B3C; return true;
-    case 0x1112E  : *a = 0x11127; *b= 0x11131; return true;
-    case 0x1112F  : *a = 0x11127; *b= 0x11132; return true;
-#if 0
-    case 0x0B57  : *a = 0xno decomp, -> RIGHT; return true;
-    case 0x1C29  : *a = 0xno decomp, -> LEFT; return true;
-    case 0xA9C0  : *a = 0xno decomp, -> RIGHT; return true;
-    case 0x111BF  : *a = 0xno decomp, -> ABOVE; return true;
-#endif
-  }
   return unicode->decompose (ab, a, b);
 }
 
 static hb_bool_t
-compose_func (hb_unicode_funcs_t *unicode,
-	      hb_codepoint_t  a,
-	      hb_codepoint_t  b,
-	      hb_codepoint_t *ab)
+compose_unicode (hb_unicode_funcs_t *unicode,
+		 hb_codepoint_t  a,
+		 hb_codepoint_t  b,
+		 hb_codepoint_t *ab)
 {
-  /* XXX, this belongs to indic normalizer. */
-  if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (unicode->general_category (a)))
-    return false;
-  /* XXX, add composition-exclusion exceptions to Indic shaper. */
-  if (a == 0x09AF && b == 0x09BC) { *ab = 0x09DF; return true; }
-
-  /* XXX, these belong to the hebew / default shaper. */
-  /* Hebrew presentation-form shaping.
-   * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 */
-  // Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA;
-  // note that some letters do not have a dagesh presForm encoded
-  static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = {
-    0xFB30, // ALEF
-    0xFB31, // BET
-    0xFB32, // GIMEL
-    0xFB33, // DALET
-    0xFB34, // HE
-    0xFB35, // VAV
-    0xFB36, // ZAYIN
-    0, // HET
-    0xFB38, // TET
-    0xFB39, // YOD
-    0xFB3A, // FINAL KAF
-    0xFB3B, // KAF
-    0xFB3C, // LAMED
-    0, // FINAL MEM
-    0xFB3E, // MEM
-    0, // FINAL NUN
-    0xFB40, // NUN
-    0xFB41, // SAMEKH
-    0, // AYIN
-    0xFB43, // FINAL PE
-    0xFB44, // PE
-    0, // FINAL TSADI
-    0xFB46, // TSADI
-    0xFB47, // QOF
-    0xFB48, // RESH
-    0xFB49, // SHIN
-    0xFB4A // TAV
-  };
-
-  hb_bool_t found = unicode->compose (a, b, ab);
-
-  if (!found && (b & ~0x7F) == 0x0580) {
-      // special-case Hebrew presentation forms that are excluded from
-      // standard normalization, but wanted for old fonts
-      switch (b) {
-      case 0x05B4: // HIRIQ
-	  if (a == 0x05D9) { // YOD
-	      *ab = 0xFB1D;
-	      found = true;
-	  }
-	  break;
-      case 0x05B7: // patah
-	  if (a == 0x05F2) { // YIDDISH YOD YOD
-	      *ab = 0xFB1F;
-	      found = true;
-	  } else if (a == 0x05D0) { // ALEF
-	      *ab = 0xFB2E;
-	      found = true;
-	  }
-	  break;
-      case 0x05B8: // QAMATS
-	  if (a == 0x05D0) { // ALEF
-	      *ab = 0xFB2F;
-	      found = true;
-	  }
-	  break;
-      case 0x05B9: // HOLAM
-	  if (a == 0x05D5) { // VAV
-	      *ab = 0xFB4B;
-	      found = true;
-	  }
-	  break;
-      case 0x05BC: // DAGESH
-	  if (a >= 0x05D0 && a <= 0x05EA) {
-	      *ab = sDageshForms[a - 0x05D0];
-	      found = (*ab != 0);
-	  } else if (a == 0xFB2A) { // SHIN WITH SHIN DOT
-	      *ab = 0xFB2C;
-	      found = true;
-	  } else if (a == 0xFB2B) { // SHIN WITH SIN DOT
-	      *ab = 0xFB2D;
-	      found = true;
-	  }
-	  break;
-      case 0x05BF: // RAFE
-	  switch (a) {
-	  case 0x05D1: // BET
-	      *ab = 0xFB4C;
-	      found = true;
-	      break;
-	  case 0x05DB: // KAF
-	      *ab = 0xFB4D;
-	      found = true;
-	      break;
-	  case 0x05E4: // PE
-	      *ab = 0xFB4E;
-	      found = true;
-	      break;
-	  }
-	  break;
-      case 0x05C1: // SHIN DOT
-	  if (a == 0x05E9) { // SHIN
-	      *ab = 0xFB2A;
-	      found = true;
-	  } else if (a == 0xFB49) { // SHIN WITH DAGESH
-	      *ab = 0xFB2C;
-	      found = true;
-	  }
-	  break;
-      case 0x05C2: // SIN DOT
-	  if (a == 0x05E9) { // SHIN
-	      *ab = 0xFB2B;
-	      found = true;
-	  } else if (a == 0xFB49) { // SHIN WITH DAGESH
-	      *ab = 0xFB2D;
-	      found = true;
-	  }
-	  break;
-      }
-  }
-
-  return found;
+  return unicode->compose (a, b, ab);
 }
 
-
 static inline void
 set_glyph (hb_glyph_info_t &info, hb_font_t *font)
 {
@@ -283,40 +127,54 @@ skip_char (hb_buffer_t *buffer)
   buffer->skip_glyph ();
 }
 
+struct normalize_context_t
+{
+  hb_buffer_t *buffer;
+  hb_font_t *font;
+  hb_bool_t (*decompose) (hb_unicode_funcs_t *unicode,
+			  hb_codepoint_t  ab,
+			  hb_codepoint_t *a,
+			  hb_codepoint_t *b);
+  hb_bool_t (*compose) (hb_unicode_funcs_t *unicode,
+			hb_codepoint_t  a,
+			hb_codepoint_t  b,
+			hb_codepoint_t *ab);
+};
+
 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */
 static inline unsigned int
-decompose (hb_font_t *font, hb_buffer_t *buffer, bool shortest, hb_codepoint_t ab)
+decompose (const normalize_context_t *c, bool shortest, hb_codepoint_t ab)
 {
   hb_codepoint_t a, b, a_glyph, b_glyph;
 
-  if (!decompose_func (buffer->unicode, ab, &a, &b) ||
-      (b && !font->get_glyph (b, 0, &b_glyph)))
+  if (!c->decompose (c->buffer->unicode, ab, &a, &b) ||
+      (b && !c->font->get_glyph (b, 0, &b_glyph)))
     return 0;
 
-  bool has_a = font->get_glyph (a, 0, &a_glyph);
+  bool has_a = c->font->get_glyph (a, 0, &a_glyph);
   if (shortest && has_a) {
     /* Output a and b */
-    output_char (buffer, a, a_glyph);
+    output_char (c->buffer, a, a_glyph);
     if (likely (b)) {
-      output_char (buffer, b, b_glyph);
+      output_char (c->buffer, b, b_glyph);
       return 2;
     }
     return 1;
   }
 
   unsigned int ret;
-  if ((ret = decompose (font, buffer, shortest, a))) {
+  if ((ret = decompose (c, shortest, a))) {
     if (b) {
-      output_char (buffer, b, b_glyph);
+      output_char (c->buffer, b, b_glyph);
       return ret + 1;
     }
     return ret;
   }
 
   if (has_a) {
-    output_char (buffer, a, a_glyph);
+    output_char (c->buffer, a, a_glyph);
     if (likely (b)) {
-      output_char (buffer, b, b_glyph);
+      output_char (c->buffer, b, b_glyph);
       return 2;
     }
     return 1;
@@ -327,41 +185,42 @@ decompose (hb_font_t *font, hb_buffer_t *buffer, bool shortest, hb_codepoint_t a
 
 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */
 static inline bool
-decompose_compatibility (hb_font_t *font, hb_buffer_t *buffer, hb_codepoint_t u)
+decompose_compatibility (const normalize_context_t *c, hb_codepoint_t u)
 {
   unsigned int len, i;
   hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
   hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN];
 
-  len = buffer->unicode->decompose_compatibility (u, decomposed);
+  len = c->buffer->unicode->decompose_compatibility (u, decomposed);
   if (!len)
     return 0;
 
   for (i = 0; i < len; i++)
-    if (!font->get_glyph (decomposed[i], 0, &glyphs[i]))
+    if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i]))
       return 0;
 
   for (i = 0; i < len; i++)
-    output_char (buffer, decomposed[i], glyphs[i]);
+    output_char (c->buffer, decomposed[i], glyphs[i]);
 
   return len;
 }
 
 /* Returns true if recomposition may be benefitial. */
 static inline bool
-decompose_current_character (hb_font_t *font, hb_buffer_t *buffer, bool shortest)
+decompose_current_character (const normalize_context_t *c, bool shortest)
 {
+  hb_buffer_t * const buffer = c->buffer;
   hb_codepoint_t glyph;
   unsigned int len = 1;
 
   /* Kind of a cute waterfall here... */
-  if (shortest && font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+  if (shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
     next_char (buffer, glyph);
-  else if ((len = decompose (font, buffer, shortest, buffer->cur().codepoint)))
+  else if ((len = decompose (c, shortest, buffer->cur().codepoint)))
     skip_char (buffer);
-  else if (!shortest && font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+  else if (!shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
     next_char (buffer, glyph);
-  else if ((len = decompose_compatibility (font, buffer, buffer->cur().codepoint)))
+  else if ((len = decompose_compatibility (c, buffer->cur().codepoint)))
     skip_char (buffer);
   else
     next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
@@ -374,49 +233,51 @@ decompose_current_character (hb_font_t *font, hb_buffer_t *buffer, bool shortest
 }
 
 static inline void
-handle_variation_selector_cluster (hb_font_t *font, hb_buffer_t *buffer, unsigned int end)
+handle_variation_selector_cluster (const normalize_context_t *c, unsigned int end)
 {
+  hb_buffer_t * const buffer = c->buffer;
   for (; buffer->idx < end - 1;) {
     if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
       /* The next two lines are some ugly lines... But work. */
-      font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index());
+      c->font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index());
       buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
     } else {
-      set_glyph (buffer->cur(), font);
+      set_glyph (buffer->cur(), c->font);
       buffer->next_glyph ();
     }
   }
   if (likely (buffer->idx < end)) {
-    set_glyph (buffer->cur(), font);
+    set_glyph (buffer->cur(), c->font);
     buffer->next_glyph ();
   }
 }
 
 /* Returns true if recomposition may be benefitial. */
 static inline bool
-decompose_multi_char_cluster (hb_font_t *font, hb_buffer_t *buffer, unsigned int end)
+decompose_multi_char_cluster (const normalize_context_t *c, unsigned int end)
 {
+  hb_buffer_t * const buffer = c->buffer;
   /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
   for (unsigned int i = buffer->idx; i < end; i++)
     if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
-      handle_variation_selector_cluster (font, buffer, end);
+      handle_variation_selector_cluster (c, end);
       return false;
     }
 
   while (buffer->idx < end)
-    decompose_current_character (font, buffer, false);
+    decompose_current_character (c, false);
   /* We can be smarter here and only return true if there are at least two ccc!=0 marks.
    * But does not matter. */
   return true;
 }
 
 static inline bool
-decompose_cluster (hb_font_t *font, hb_buffer_t *buffer, bool short_circuit, unsigned int end)
+decompose_cluster (const normalize_context_t *c, bool short_circuit, unsigned int end)
 {
-  if (likely (buffer->idx + 1 == end))
-    return decompose_current_character (font, buffer, short_circuit);
+  if (likely (c->buffer->idx + 1 == end))
+    return decompose_current_character (c, short_circuit);
   else
-    return decompose_multi_char_cluster (font, buffer, end);
+    return decompose_multi_char_cluster (c, end);
 }
 
 
@@ -431,9 +292,20 @@ compare_combining_class (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb)
 
 
 void
-_hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
-			hb_ot_shape_normalization_mode_t mode)
+_hb_ot_shape_normalize (const hb_ot_complex_shaper_t *shaper,
+			hb_buffer_t *buffer,
+			hb_font_t *font)
 {
+  hb_ot_shape_normalization_mode_t mode = shaper->normalization_preference ?
+					  shaper->normalization_preference (&buffer->props) :
+					  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT;
+  const normalize_context_t c = {
+    buffer,
+    font,
+    shaper->decompose ? shaper->decompose : decompose_unicode,
+    shaper->compose ? shaper->compose : compose_unicode
+  };
+
   bool short_circuit = mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED &&
 		       mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT;
   bool can_use_recompose = false;
@@ -457,7 +329,7 @@ _hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
       if (buffer->cur().cluster != buffer->info[end].cluster)
         break;
 
-    can_use_recompose = decompose_cluster (font, buffer, short_circuit, end) || can_use_recompose;
+    can_use_recompose = decompose_cluster (&c, short_circuit, end) || can_use_recompose;
   }
   buffer->swap_buffers ();
 
@@ -517,10 +389,10 @@ _hb_ot_shape_normalize (hb_font_t *font, hb_buffer_t *buffer,
 	(starter == buffer->out_len - 1 ||
 	 _hb_glyph_info_get_modified_combining_class (&buffer->prev()) < _hb_glyph_info_get_modified_combining_class (&buffer->cur())) &&
 	/* And compose. */
-	compose_func (buffer->unicode,
-		      buffer->out_info[starter].codepoint,
-		      buffer->cur().codepoint,
-		      &composed) &&
+	c.compose (buffer->unicode,
+		   buffer->out_info[starter].codepoint,
+		   buffer->cur().codepoint,
+		   &composed) &&
 	/* And the font has glyph for the composite. */
 	font->get_glyph (composed, 0, &glyph))
     {
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index d168ae7..26ec4db 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -362,10 +362,7 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c)
 
   HB_BUFFER_ALLOCATE_VAR (c->buffer, glyph_index);
 
-  _hb_ot_shape_normalize (c->font, c->buffer,
-			  c->plan->shaper->normalization_preference ?
-			  c->plan->shaper->normalization_preference (c->plan) :
-			  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT);
+  _hb_ot_shape_normalize (c->plan->shaper, c->buffer, c->font);
 
   hb_ot_shape_setup_masks (c);
 
commit c8149ca85ed97112778590bc9f090f3ee0254100
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Nov 13 11:07:20 2012 -0800

    [hb-shape] Adjust postioning output format
    
    1. If there is any offset (x or y), print out both x and y offsets.
    
    2. Always print out the advance in the major direction of the buffer.
    Ie. even for zero-advance glyphs, print a "+0".  This is more intuitive.

diff --git a/util/options.cc b/util/options.cc
index 9dbc2b1..1f626b6 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -616,6 +616,7 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
   unsigned int num_glyphs = hb_buffer_get_length (buffer);
   hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
   hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, NULL);
+  hb_direction_t direction = hb_buffer_get_direction (buffer);
 
   g_string_append_c (gs, '[');
   for (unsigned int i = 0; i < num_glyphs; i++)
@@ -637,14 +638,14 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer,
     }
 
     if (show_positions && (pos->x_offset || pos->y_offset)) {
-      g_string_append_c (gs, '@');
-      if (pos->x_offset) g_string_append_printf (gs, "%d", pos->x_offset);
-      if (pos->y_offset) g_string_append_printf (gs, ",%d", pos->y_offset);
+      g_string_append_printf (gs, "@%d,%d", pos->x_offset, pos->y_offset);
     }
-    if (show_positions && (pos->x_advance || pos->y_advance)) {
+    if (show_positions) {
       g_string_append_c (gs, '+');
-      if (pos->x_advance) g_string_append_printf (gs, "%d", pos->x_advance);
-      if (pos->y_advance) g_string_append_printf (gs, ",%d", pos->y_advance);
+      if (HB_DIRECTION_IS_HORIZONTAL (direction) || pos->x_advance)
+	g_string_append_printf (gs, "%d", pos->x_advance);
+      if (HB_DIRECTION_IS_VERTICAL (direction) || pos->y_advance)
+	g_string_append_printf (gs, ",%d", pos->y_advance);
     }
 
     info++;
commit 6fd5335622087e87739684f581aa9f88635ff970
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:42:18 2012 -0800

    [Indic] Update auto-generated Indic machine to reflect previous commit

diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh
index 53f22e3..1c0e7f2 100644
--- a/src/hb-ot-shape-complex-indic-machine.hh
+++ b/src/hb-ot-shape-complex-indic-machine.hh
@@ -52,44 +52,44 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = {
 	7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 
 	6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 
 	4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u, 
-	3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 
-	3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 
-	3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 
-	3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 
+	3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 
+	3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 
+	3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 
+	3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 
 	5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
 	4u, 14u, 6u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-	1u, 16u, 3u, 14u, 3u, 14u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 
-	3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 
-	3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 
-	5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 
+	1u, 16u, 3u, 14u, 3u, 14u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 
+	3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 
+	3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 
+	5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 
 	3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
 	4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u, 
 	3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 
-	3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 
-	3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
-	8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u, 3u, 9u, 8u, 9u, 3u, 9u, 
+	3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 
+	3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 
+	8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 
 	3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
 	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 1u, 16u, 
 	3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 
 	3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 14u, 4u, 14u, 3u, 14u, 
-	3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 
-	3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 14u, 
-	3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 13u, 
+	3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 
+	3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 
+	3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 
 	3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
 	3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
 	6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
 	1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
 	3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 
-	1u, 16u, 3u, 14u, 1u, 16u, 0
+	1u, 16u, 3u, 17u, 1u, 16u, 0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
@@ -111,44 +111,44 @@ static const char _indic_syllable_machine_key_spans[] = {
 	1, 1, 1, 1, 4, 1, 1, 4, 
 	1, 1, 4, 1, 1, 11, 11, 11, 
 	11, 11, 11, 11, 11, 11, 11, 16, 
-	12, 12, 11, 16, 12, 12, 11, 16, 
-	12, 12, 11, 16, 12, 12, 11, 16, 
-	12, 12, 11, 10, 7, 5, 1, 1, 
-	11, 7, 2, 7, 11, 12, 12, 11, 
+	15, 12, 11, 16, 15, 12, 11, 16, 
+	15, 12, 11, 16, 15, 12, 11, 16, 
+	15, 12, 11, 10, 7, 5, 1, 1, 
+	15, 7, 2, 7, 11, 12, 12, 11, 
 	10, 12, 11, 10, 12, 11, 10, 12, 
 	11, 9, 12, 11, 16, 12, 12, 16, 
 	16, 16, 16, 16, 12, 12, 16, 16, 
 	16, 16, 16, 12, 12, 16, 16, 16, 
 	16, 16, 12, 12, 16, 16, 16, 16, 
-	16, 12, 12, 12, 12, 11, 16, 12, 
-	12, 11, 16, 12, 12, 11, 16, 12, 
-	12, 11, 16, 12, 12, 11, 10, 7, 
-	5, 1, 1, 11, 7, 2, 7, 11, 
+	16, 12, 12, 12, 12, 11, 16, 15, 
+	12, 11, 16, 15, 12, 11, 16, 15, 
+	12, 11, 16, 15, 12, 11, 10, 7, 
+	5, 1, 1, 15, 7, 2, 7, 11, 
 	12, 12, 11, 10, 12, 11, 10, 12, 
 	11, 10, 12, 11, 9, 12, 16, 12, 
 	12, 16, 16, 16, 16, 16, 12, 12, 
 	16, 16, 16, 16, 16, 12, 12, 16, 
 	16, 16, 16, 16, 12, 12, 16, 16, 
 	16, 16, 11, 16, 12, 12, 11, 16, 
-	12, 12, 11, 16, 12, 12, 11, 16, 
-	12, 12, 11, 16, 12, 12, 11, 10, 
-	7, 5, 1, 1, 11, 7, 2, 7, 
+	15, 12, 11, 16, 15, 12, 11, 16, 
+	15, 12, 11, 16, 15, 12, 11, 10, 
+	7, 5, 1, 1, 15, 7, 2, 7, 
 	11, 12, 12, 11, 10, 12, 11, 10, 
 	12, 11, 10, 12, 11, 9, 12, 16, 
 	12, 12, 16, 16, 16, 16, 16, 12, 
 	12, 16, 16, 16, 16, 16, 12, 12, 
 	16, 16, 16, 16, 16, 12, 12, 16, 
 	16, 16, 16, 16, 11, 12, 11, 12, 
-	12, 11, 16, 12, 12, 11, 16, 12, 
-	12, 11, 16, 12, 12, 11, 16, 12, 
-	12, 11, 10, 7, 5, 1, 1, 11, 
+	12, 11, 16, 15, 12, 11, 16, 15, 
+	12, 11, 16, 15, 12, 11, 16, 15, 
+	12, 11, 10, 7, 5, 1, 1, 15, 
 	7, 2, 7, 11, 12, 12, 11, 10, 
 	12, 11, 10, 12, 11, 10, 12, 11, 
 	9, 12, 16, 12, 12, 16, 16, 16, 
 	16, 16, 12, 12, 16, 16, 16, 16, 
 	16, 12, 12, 16, 16, 16, 16, 16, 
 	12, 12, 16, 16, 16, 16, 16, 12, 
-	16, 12, 16
+	16, 15, 16
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
@@ -170,44 +170,44 @@ static const short _indic_syllable_machine_index_offsets[] = {
 	681, 683, 685, 687, 689, 694, 696, 698, 
 	703, 705, 707, 712, 714, 716, 728, 740, 
 	752, 764, 776, 788, 800, 812, 824, 836, 
-	853, 866, 879, 891, 908, 921, 934, 946, 
-	963, 976, 989, 1001, 1018, 1031, 1044, 1056, 
-	1073, 1086, 1099, 1111, 1122, 1130, 1136, 1138, 
-	1140, 1152, 1160, 1163, 1171, 1183, 1196, 1209, 
-	1221, 1232, 1245, 1257, 1268, 1281, 1293, 1304, 
-	1317, 1329, 1339, 1352, 1364, 1381, 1394, 1407, 
-	1424, 1441, 1458, 1475, 1492, 1505, 1518, 1535, 
-	1552, 1569, 1586, 1603, 1616, 1629, 1646, 1663, 
-	1680, 1697, 1714, 1727, 1740, 1757, 1774, 1791, 
-	1808, 1825, 1838, 1851, 1864, 1877, 1889, 1906, 
-	1919, 1932, 1944, 1961, 1974, 1987, 1999, 2016, 
-	2029, 2042, 2054, 2071, 2084, 2097, 2109, 2120, 
-	2128, 2134, 2136, 2138, 2150, 2158, 2161, 2169, 
-	2181, 2194, 2207, 2219, 2230, 2243, 2255, 2266, 
-	2279, 2291, 2302, 2315, 2327, 2337, 2350, 2367, 
-	2380, 2393, 2410, 2427, 2444, 2461, 2478, 2491, 
-	2504, 2521, 2538, 2555, 2572, 2589, 2602, 2615, 
-	2632, 2649, 2666, 2683, 2700, 2713, 2726, 2743, 
-	2760, 2777, 2794, 2806, 2823, 2836, 2849, 2861, 
-	2878, 2891, 2904, 2916, 2933, 2946, 2959, 2971, 
-	2988, 3001, 3014, 3026, 3043, 3056, 3069, 3081, 
-	3092, 3100, 3106, 3108, 3110, 3122, 3130, 3133, 
-	3141, 3153, 3166, 3179, 3191, 3202, 3215, 3227, 
-	3238, 3251, 3263, 3274, 3287, 3299, 3309, 3322, 
-	3339, 3352, 3365, 3382, 3399, 3416, 3433, 3450, 
-	3463, 3476, 3493, 3510, 3527, 3544, 3561, 3574, 
-	3587, 3604, 3621, 3638, 3655, 3672, 3685, 3698, 
-	3715, 3732, 3749, 3766, 3783, 3795, 3808, 3820, 
-	3833, 3846, 3858, 3875, 3888, 3901, 3913, 3930, 
-	3943, 3956, 3968, 3985, 3998, 4011, 4023, 4040, 
-	4053, 4066, 4078, 4089, 4097, 4103, 4105, 4107, 
-	4119, 4127, 4130, 4138, 4150, 4163, 4176, 4188, 
-	4199, 4212, 4224, 4235, 4248, 4260, 4271, 4284, 
-	4296, 4306, 4319, 4336, 4349, 4362, 4379, 4396, 
-	4413, 4430, 4447, 4460, 4473, 4490, 4507, 4524, 
-	4541, 4558, 4571, 4584, 4601, 4618, 4635, 4652, 
-	4669, 4682, 4695, 4712, 4729, 4746, 4763, 4780, 
-	4793, 4810, 4823
+	853, 869, 882, 894, 911, 927, 940, 952, 
+	969, 985, 998, 1010, 1027, 1043, 1056, 1068, 
+	1085, 1101, 1114, 1126, 1137, 1145, 1151, 1153, 
+	1155, 1171, 1179, 1182, 1190, 1202, 1215, 1228, 
+	1240, 1251, 1264, 1276, 1287, 1300, 1312, 1323, 
+	1336, 1348, 1358, 1371, 1383, 1400, 1413, 1426, 
+	1443, 1460, 1477, 1494, 1511, 1524, 1537, 1554, 
+	1571, 1588, 1605, 1622, 1635, 1648, 1665, 1682, 
+	1699, 1716, 1733, 1746, 1759, 1776, 1793, 1810, 
+	1827, 1844, 1857, 1870, 1883, 1896, 1908, 1925, 
+	1941, 1954, 1966, 1983, 1999, 2012, 2024, 2041, 
+	2057, 2070, 2082, 2099, 2115, 2128, 2140, 2151, 
+	2159, 2165, 2167, 2169, 2185, 2193, 2196, 2204, 
+	2216, 2229, 2242, 2254, 2265, 2278, 2290, 2301, 
+	2314, 2326, 2337, 2350, 2362, 2372, 2385, 2402, 
+	2415, 2428, 2445, 2462, 2479, 2496, 2513, 2526, 
+	2539, 2556, 2573, 2590, 2607, 2624, 2637, 2650, 
+	2667, 2684, 2701, 2718, 2735, 2748, 2761, 2778, 
+	2795, 2812, 2829, 2841, 2858, 2871, 2884, 2896, 
+	2913, 2929, 2942, 2954, 2971, 2987, 3000, 3012, 
+	3029, 3045, 3058, 3070, 3087, 3103, 3116, 3128, 
+	3139, 3147, 3153, 3155, 3157, 3173, 3181, 3184, 
+	3192, 3204, 3217, 3230, 3242, 3253, 3266, 3278, 
+	3289, 3302, 3314, 3325, 3338, 3350, 3360, 3373, 
+	3390, 3403, 3416, 3433, 3450, 3467, 3484, 3501, 
+	3514, 3527, 3544, 3561, 3578, 3595, 3612, 3625, 
+	3638, 3655, 3672, 3689, 3706, 3723, 3736, 3749, 
+	3766, 3783, 3800, 3817, 3834, 3846, 3859, 3871, 
+	3884, 3897, 3909, 3926, 3942, 3955, 3967, 3984, 
+	4000, 4013, 4025, 4042, 4058, 4071, 4083, 4100, 
+	4116, 4129, 4141, 4152, 4160, 4166, 4168, 4170, 
+	4186, 4194, 4197, 4205, 4217, 4230, 4243, 4255, 
+	4266, 4279, 4291, 4302, 4315, 4327, 4338, 4351, 
+	4363, 4373, 4386, 4403, 4416, 4429, 4446, 4463, 
+	4480, 4497, 4514, 4527, 4540, 4557, 4574, 4591, 
+	4608, 4625, 4638, 4651, 4668, 4685, 4702, 4719, 
+	4736, 4749, 4762, 4779, 4796, 4813, 4830, 4847, 
+	4860, 4877, 4893
 };
 
 static const short _indic_syllable_machine_indicies[] = {
@@ -319,504 +319,512 @@ static const short _indic_syllable_machine_indicies[] = {
 	157, 158, 81, 159, 160, 152, 161, 161, 
 	162, 163, 164, 165, 152, 167, 168, 169, 
 	170, 5, 171, 172, 173, 166, 166, 37, 
-	174, 166, 175, 168, 176, 176, 5, 171, 
-	172, 173, 166, 166, 166, 174, 166, 168, 
-	176, 176, 5, 171, 172, 173, 166, 166, 
-	166, 174, 166, 177, 166, 166, 166, 18, 
-	178, 166, 171, 172, 166, 166, 166, 166, 
-	179, 166, 177, 166, 180, 181, 182, 183, 
-	5, 171, 172, 173, 166, 166, 35, 184, 
-	166, 185, 181, 186, 186, 5, 171, 172, 
-	173, 166, 166, 166, 184, 166, 181, 186, 
-	186, 5, 171, 172, 173, 166, 166, 166, 
-	184, 166, 187, 166, 166, 166, 18, 188, 
+	174, 166, 166, 153, 166, 175, 168, 176, 
+	176, 5, 171, 172, 173, 166, 166, 166, 
+	174, 166, 168, 176, 176, 5, 171, 172, 
+	173, 166, 166, 166, 174, 166, 177, 166, 
+	166, 166, 18, 178, 166, 171, 172, 166, 
+	166, 166, 166, 179, 166, 177, 166, 180, 
+	181, 182, 183, 5, 171, 172, 173, 166, 
+	166, 35, 184, 166, 166, 177, 166, 185, 
+	181, 186, 186, 5, 171, 172, 173, 166, 
+	166, 166, 184, 166, 181, 186, 186, 5, 
+	171, 172, 173, 166, 166, 166, 184, 166, 
+	187, 166, 166, 166, 18, 188, 166, 171, 
+	172, 166, 166, 166, 166, 179, 166, 187, 
+	166, 189, 190, 191, 192, 5, 171, 172, 
+	173, 166, 166, 33, 193, 166, 166, 187, 
+	166, 194, 190, 195, 195, 5, 171, 172, 
+	173, 166, 166, 166, 193, 166, 190, 195, 
+	195, 5, 171, 172, 173, 166, 166, 166, 
+	193, 166, 196, 166, 166, 166, 18, 197, 
 	166, 171, 172, 166, 166, 166, 166, 179, 
-	166, 187, 166, 189, 190, 191, 192, 5, 
-	171, 172, 173, 166, 166, 33, 193, 166, 
-	194, 190, 195, 195, 5, 171, 172, 173, 
-	166, 166, 166, 193, 166, 190, 195, 195, 
-	5, 171, 172, 173, 166, 166, 166, 193, 
-	166, 196, 166, 166, 166, 18, 197, 166, 
-	171, 172, 166, 166, 166, 166, 179, 166, 
-	196, 166, 198, 199, 200, 201, 5, 171, 
-	172, 173, 166, 166, 31, 202, 166, 203, 
-	199, 204, 204, 5, 171, 172, 173, 166, 
-	166, 166, 202, 166, 199, 204, 204, 5, 
+	166, 196, 166, 198, 199, 200, 201, 5, 
+	171, 172, 173, 166, 166, 31, 202, 166, 
+	166, 196, 166, 203, 199, 204, 204, 5, 
 	171, 172, 173, 166, 166, 166, 202, 166, 
-	205, 166, 166, 166, 18, 206, 166, 171, 
-	172, 166, 166, 166, 166, 179, 166, 205, 
-	166, 207, 208, 209, 210, 5, 171, 172, 
-	173, 166, 166, 29, 211, 166, 212, 208, 
-	213, 213, 5, 171, 172, 173, 166, 166, 
-	166, 211, 166, 208, 213, 213, 5, 171, 
-	172, 173, 166, 166, 166, 211, 166, 18, 
-	214, 166, 171, 172, 166, 166, 166, 166, 
-	179, 166, 171, 172, 166, 166, 166, 166, 
-	179, 166, 215, 166, 166, 166, 172, 166, 
-	172, 166, 216, 166, 217, 166, 218, 219, 
-	166, 171, 172, 166, 166, 166, 3, 166, 
-	2, 166, 166, 166, 166, 171, 172, 166, 
-	171, 172, 166, 217, 166, 166, 166, 166, 
-	171, 172, 166, 217, 166, 218, 166, 166, 
-	171, 172, 166, 166, 166, 3, 166, 18, 
-	166, 220, 220, 5, 171, 172, 166, 166, 
-	166, 166, 179, 166, 221, 27, 222, 223, 
-	8, 171, 172, 166, 166, 166, 166, 179, 
-	166, 27, 222, 223, 8, 171, 172, 166, 
-	166, 166, 166, 179, 166, 222, 222, 8, 
+	199, 204, 204, 5, 171, 172, 173, 166, 
+	166, 166, 202, 166, 205, 166, 166, 166, 
+	18, 206, 166, 171, 172, 166, 166, 166, 
+	166, 179, 166, 205, 166, 207, 208, 209, 
+	210, 5, 171, 172, 173, 166, 166, 29, 
+	211, 166, 166, 205, 166, 212, 208, 213, 
+	213, 5, 171, 172, 173, 166, 166, 166, 
+	211, 166, 208, 213, 213, 5, 171, 172, 
+	173, 166, 166, 166, 211, 166, 18, 214, 
+	166, 171, 172, 166, 166, 166, 166, 179, 
+	166, 171, 172, 166, 166, 166, 166, 179, 
+	166, 215, 166, 166, 166, 172, 166, 172, 
+	166, 216, 166, 217, 166, 218, 219, 166, 
+	171, 172, 166, 166, 166, 3, 166, 166, 
+	166, 1, 166, 2, 166, 166, 166, 166, 
+	171, 172, 166, 171, 172, 166, 217, 166, 
+	166, 166, 166, 171, 172, 166, 217, 166, 
+	218, 166, 166, 171, 172, 166, 166, 166, 
+	3, 166, 18, 166, 220, 220, 5, 171, 
+	172, 166, 166, 166, 166, 179, 166, 221, 
+	27, 222, 223, 8, 171, 172, 166, 166, 
+	166, 166, 179, 166, 27, 222, 223, 8, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	224, 24, 225, 226, 11, 171, 172, 166, 
-	166, 166, 166, 179, 166, 24, 225, 226, 
-	11, 171, 172, 166, 166, 166, 166, 179, 
-	166, 225, 225, 11, 171, 172, 166, 166, 
-	166, 166, 179, 166, 227, 21, 228, 229, 
-	14, 171, 172, 166, 166, 166, 166, 179, 
-	166, 21, 228, 229, 14, 171, 172, 166, 
-	166, 166, 166, 179, 166, 228, 228, 14, 
+	222, 222, 8, 171, 172, 166, 166, 166, 
+	166, 179, 166, 224, 24, 225, 226, 11, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	230, 18, 166, 231, 166, 171, 172, 166, 
-	166, 166, 166, 179, 166, 18, 166, 231, 
-	166, 171, 172, 166, 166, 166, 166, 179, 
-	166, 232, 166, 171, 172, 166, 166, 166, 
-	166, 179, 166, 18, 166, 166, 166, 166, 
+	24, 225, 226, 11, 171, 172, 166, 166, 
+	166, 166, 179, 166, 225, 225, 11, 171, 
+	172, 166, 166, 166, 166, 179, 166, 227, 
+	21, 228, 229, 14, 171, 172, 166, 166, 
+	166, 166, 179, 166, 21, 228, 229, 14, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	208, 213, 213, 5, 171, 172, 166, 166, 
-	166, 166, 211, 166, 1, 2, 166, 166, 
-	18, 214, 166, 171, 172, 166, 166, 166, 
-	166, 179, 166, 1, 166, 207, 208, 213, 
-	213, 5, 171, 172, 173, 166, 166, 166, 
-	211, 166, 207, 208, 209, 213, 5, 171, 
-	172, 173, 166, 166, 29, 211, 166, 205, 
-	166, 233, 166, 220, 220, 5, 171, 172, 
-	166, 166, 166, 166, 179, 166, 205, 166, 
-	205, 166, 166, 166, 166, 166, 166, 171, 
-	172, 166, 166, 166, 166, 179, 166, 205, 
-	166, 205, 166, 166, 166, 166, 234, 166, 
+	228, 228, 14, 171, 172, 166, 166, 166, 
+	166, 179, 166, 230, 18, 166, 231, 166, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	205, 166, 205, 166, 233, 166, 166, 166, 
-	166, 171, 172, 166, 166, 166, 166, 179, 
-	166, 205, 166, 205, 2, 166, 166, 18, 
-	206, 166, 171, 172, 166, 166, 166, 166, 
-	179, 166, 205, 166, 198, 199, 204, 204, 
-	5, 171, 172, 173, 166, 166, 166, 202, 
-	166, 198, 199, 200, 204, 5, 171, 172, 
-	173, 166, 166, 31, 202, 166, 196, 166, 
-	235, 166, 220, 220, 5, 171, 172, 166, 
-	166, 166, 166, 179, 166, 196, 166, 196, 
-	166, 166, 166, 166, 166, 166, 171, 172, 
-	166, 166, 166, 166, 179, 166, 196, 166, 
-	196, 166, 166, 166, 166, 236, 166, 171, 
-	172, 166, 166, 166, 166, 179, 166, 196, 
-	166, 196, 166, 235, 166, 166, 166, 166, 
+	18, 166, 231, 166, 171, 172, 166, 166, 
+	166, 166, 179, 166, 232, 166, 171, 172, 
+	166, 166, 166, 166, 179, 166, 18, 166, 
+	166, 166, 166, 171, 172, 166, 166, 166, 
+	166, 179, 166, 208, 213, 213, 5, 171, 
+	172, 166, 166, 166, 166, 211, 166, 1, 
+	2, 166, 166, 18, 214, 166, 171, 172, 
+	166, 166, 166, 166, 179, 166, 1, 166, 
+	207, 208, 213, 213, 5, 171, 172, 173, 
+	166, 166, 166, 211, 166, 207, 208, 209, 
+	213, 5, 171, 172, 173, 166, 166, 29, 
+	211, 166, 205, 166, 233, 166, 220, 220, 
+	5, 171, 172, 166, 166, 166, 166, 179, 
+	166, 205, 166, 205, 166, 166, 166, 166, 
+	166, 166, 171, 172, 166, 166, 166, 166, 
+	179, 166, 205, 166, 205, 166, 166, 166, 
+	166, 234, 166, 171, 172, 166, 166, 166, 
+	166, 179, 166, 205, 166, 205, 166, 233, 
+	166, 166, 166, 166, 171, 172, 166, 166, 
+	166, 166, 179, 166, 205, 166, 205, 2, 
+	166, 166, 18, 206, 166, 171, 172, 166, 
+	166, 166, 166, 179, 166, 205, 166, 198, 
+	199, 204, 204, 5, 171, 172, 173, 166, 
+	166, 166, 202, 166, 198, 199, 200, 204, 
+	5, 171, 172, 173, 166, 166, 31, 202, 
+	166, 196, 166, 235, 166, 220, 220, 5, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	196, 166, 196, 2, 166, 166, 18, 197, 
+	196, 166, 196, 166, 166, 166, 166, 166, 
 	166, 171, 172, 166, 166, 166, 166, 179, 
-	166, 196, 166, 189, 190, 195, 195, 5, 
-	171, 172, 173, 166, 166, 166, 193, 166, 
-	189, 190, 191, 195, 5, 171, 172, 173, 
-	166, 166, 33, 193, 166, 187, 166, 237, 
-	166, 220, 220, 5, 171, 172, 166, 166, 
-	166, 166, 179, 166, 187, 166, 187, 166, 
-	166, 166, 166, 166, 166, 171, 172, 166, 
-	166, 166, 166, 179, 166, 187, 166, 187, 
-	166, 166, 166, 166, 238, 166, 171, 172, 
-	166, 166, 166, 166, 179, 166, 187, 166, 
-	187, 166, 237, 166, 166, 166, 166, 171, 
+	166, 196, 166, 196, 166, 166, 166, 166, 
+	236, 166, 171, 172, 166, 166, 166, 166, 
+	179, 166, 196, 166, 196, 166, 235, 166, 
+	166, 166, 166, 171, 172, 166, 166, 166, 
+	166, 179, 166, 196, 166, 196, 2, 166, 
+	166, 18, 197, 166, 171, 172, 166, 166, 
+	166, 166, 179, 166, 196, 166, 189, 190, 
+	195, 195, 5, 171, 172, 173, 166, 166, 
+	166, 193, 166, 189, 190, 191, 195, 5, 
+	171, 172, 173, 166, 166, 33, 193, 166, 
+	187, 166, 237, 166, 220, 220, 5, 171, 
 	172, 166, 166, 166, 166, 179, 166, 187, 
-	166, 187, 2, 166, 166, 18, 188, 166, 
+	166, 187, 166, 166, 166, 166, 166, 166, 
 	171, 172, 166, 166, 166, 166, 179, 166, 
-	187, 166, 180, 181, 186, 186, 5, 171, 
-	172, 173, 166, 166, 166, 184, 166, 180, 
-	181, 182, 186, 5, 171, 172, 173, 166, 
-	166, 35, 184, 166, 177, 166, 239, 166, 
-	220, 220, 5, 171, 172, 166, 166, 166, 
-	166, 179, 166, 177, 166, 177, 166, 166, 
-	166, 166, 166, 166, 171, 172, 166, 166, 
-	166, 166, 179, 166, 177, 166, 177, 166, 
-	166, 166, 166, 240, 166, 171, 172, 166, 
-	166, 166, 166, 179, 166, 177, 166, 177, 
-	166, 239, 166, 166, 166, 166, 171, 172, 
+	187, 166, 187, 166, 166, 166, 166, 238, 
+	166, 171, 172, 166, 166, 166, 166, 179, 
+	166, 187, 166, 187, 166, 237, 166, 166, 
+	166, 166, 171, 172, 166, 166, 166, 166, 
+	179, 166, 187, 166, 187, 2, 166, 166, 
+	18, 188, 166, 171, 172, 166, 166, 166, 
+	166, 179, 166, 187, 166, 180, 181, 186, 
+	186, 5, 171, 172, 173, 166, 166, 166, 
+	184, 166, 180, 181, 182, 186, 5, 171, 
+	172, 173, 166, 166, 35, 184, 166, 177, 
+	166, 239, 166, 220, 220, 5, 171, 172, 
 	166, 166, 166, 166, 179, 166, 177, 166, 
-	177, 2, 166, 166, 18, 178, 166, 171, 
+	177, 166, 166, 166, 166, 166, 166, 171, 
 	172, 166, 166, 166, 166, 179, 166, 177, 
-	166, 167, 168, 176, 176, 5, 171, 172, 
-	173, 166, 166, 166, 174, 166, 167, 168, 
-	169, 176, 5, 171, 172, 173, 166, 166, 
-	37, 174, 166, 242, 243, 244, 245, 43, 
-	246, 247, 241, 241, 241, 75, 248, 241, 
-	249, 243, 250, 245, 43, 246, 247, 241, 
-	241, 241, 241, 248, 241, 243, 250, 245, 
-	43, 246, 247, 241, 241, 241, 241, 248, 
-	241, 251, 241, 241, 241, 56, 252, 241, 
-	246, 247, 241, 241, 241, 241, 253, 241, 
-	251, 241, 254, 255, 256, 257, 43, 246, 
-	247, 241, 241, 241, 73, 258, 241, 259, 
-	255, 260, 260, 43, 246, 247, 241, 241, 
-	241, 241, 258, 241, 255, 260, 260, 43, 
-	246, 247, 241, 241, 241, 241, 258, 241, 
-	261, 241, 241, 241, 56, 262, 241, 246, 
-	247, 241, 241, 241, 241, 253, 241, 261, 
-	241, 263, 264, 265, 266, 43, 246, 247, 
-	241, 241, 241, 71, 267, 241, 268, 264, 
-	269, 269, 43, 246, 247, 241, 241, 241, 
-	241, 267, 241, 264, 269, 269, 43, 246, 
-	247, 241, 241, 241, 241, 267, 241, 270, 
-	241, 241, 241, 56, 271, 241, 246, 247, 
-	241, 241, 241, 241, 253, 241, 270, 241, 
-	272, 273, 274, 275, 43, 246, 247, 241, 
-	241, 241, 69, 276, 241, 277, 273, 278, 
+	166, 177, 166, 166, 166, 166, 240, 166, 
+	171, 172, 166, 166, 166, 166, 179, 166, 
+	177, 166, 177, 166, 239, 166, 166, 166, 
+	166, 171, 172, 166, 166, 166, 166, 179, 
+	166, 177, 166, 177, 2, 166, 166, 18, 
+	178, 166, 171, 172, 166, 166, 166, 166, 
+	179, 166, 177, 166, 167, 168, 176, 176, 
+	5, 171, 172, 173, 166, 166, 166, 174, 
+	166, 167, 168, 169, 176, 5, 171, 172, 
+	173, 166, 166, 37, 174, 166, 242, 243, 
+	244, 245, 43, 246, 247, 241, 241, 241, 
+	75, 248, 241, 249, 243, 250, 245, 43, 
+	246, 247, 241, 241, 241, 241, 248, 241, 
+	243, 250, 245, 43, 246, 247, 241, 241, 
+	241, 241, 248, 241, 251, 241, 241, 241, 
+	56, 252, 241, 246, 247, 241, 241, 241, 
+	241, 253, 241, 251, 241, 254, 255, 256, 
+	257, 43, 246, 247, 241, 241, 241, 73, 
+	258, 241, 241, 251, 241, 259, 255, 260, 
+	260, 43, 246, 247, 241, 241, 241, 241, 
+	258, 241, 255, 260, 260, 43, 246, 247, 
+	241, 241, 241, 241, 258, 241, 261, 241, 
+	241, 241, 56, 262, 241, 246, 247, 241, 
+	241, 241, 241, 253, 241, 261, 241, 263, 
+	264, 265, 266, 43, 246, 247, 241, 241, 
+	241, 71, 267, 241, 241, 261, 241, 268, 
+	264, 269, 269, 43, 246, 247, 241, 241, 
+	241, 241, 267, 241, 264, 269, 269, 43, 
+	246, 247, 241, 241, 241, 241, 267, 241, 
+	270, 241, 241, 241, 56, 271, 241, 246, 
+	247, 241, 241, 241, 241, 253, 241, 270, 
+	241, 272, 273, 274, 275, 43, 246, 247, 
+	241, 241, 241, 69, 276, 241, 241, 270, 
+	241, 277, 273, 278, 278, 43, 246, 247, 
+	241, 241, 241, 241, 276, 241, 273, 278, 
 	278, 43, 246, 247, 241, 241, 241, 241, 
-	276, 241, 273, 278, 278, 43, 246, 247, 
-	241, 241, 241, 241, 276, 241, 279, 241, 
-	241, 241, 56, 280, 241, 246, 247, 241, 
-	241, 241, 241, 253, 241, 279, 241, 281, 
-	282, 283, 284, 43, 246, 247, 241, 241, 
-	241, 67, 285, 241, 286, 282, 287, 287, 
-	43, 246, 247, 241, 241, 241, 241, 285, 
-	241, 282, 287, 287, 43, 246, 247, 241, 
-	241, 241, 241, 285, 241, 56, 288, 241, 
-	246, 247, 241, 241, 241, 241, 253, 241, 
-	246, 247, 241, 241, 241, 241, 253, 241, 
-	289, 241, 241, 241, 247, 241, 247, 241, 
-	290, 241, 291, 241, 292, 293, 241, 246, 
-	247, 241, 241, 241, 41, 241, 40, 241, 
-	241, 241, 241, 246, 247, 241, 246, 247, 
-	241, 291, 241, 241, 241, 241, 246, 247, 
-	241, 291, 241, 292, 241, 241, 246, 247, 
-	241, 241, 241, 41, 241, 56, 241, 294, 
-	294, 43, 246, 247, 241, 241, 241, 241, 
-	253, 241, 295, 65, 296, 297, 46, 246, 
-	247, 241, 241, 241, 241, 253, 241, 65, 
-	296, 297, 46, 246, 247, 241, 241, 241, 
-	241, 253, 241, 296, 296, 46, 246, 247, 
-	241, 241, 241, 241, 253, 241, 298, 62, 
-	299, 300, 49, 246, 247, 241, 241, 241, 
-	241, 253, 241, 62, 299, 300, 49, 246, 
-	247, 241, 241, 241, 241, 253, 241, 299, 
-	299, 49, 246, 247, 241, 241, 241, 241, 
-	253, 241, 301, 59, 302, 303, 52, 246, 
-	247, 241, 241, 241, 241, 253, 241, 59, 
-	302, 303, 52, 246, 247, 241, 241, 241, 
-	241, 253, 241, 302, 302, 52, 246, 247, 
-	241, 241, 241, 241, 253, 241, 304, 56, 
-	241, 305, 241, 246, 247, 241, 241, 241, 
-	241, 253, 241, 56, 241, 305, 241, 246, 
-	247, 241, 241, 241, 241, 253, 241, 306, 
+	276, 241, 279, 241, 241, 241, 56, 280, 
 	241, 246, 247, 241, 241, 241, 241, 253, 
-	241, 56, 241, 241, 241, 241, 246, 247, 
-	241, 241, 241, 241, 253, 241, 39, 40, 
-	241, 241, 56, 288, 241, 246, 247, 241, 
-	241, 241, 241, 253, 241, 39, 241, 281, 
+	241, 279, 241, 281, 282, 283, 284, 43, 
+	246, 247, 241, 241, 241, 67, 285, 241, 
+	241, 279, 241, 286, 282, 287, 287, 43, 
+	246, 247, 241, 241, 241, 241, 285, 241, 
 	282, 287, 287, 43, 246, 247, 241, 241, 
-	241, 241, 285, 241, 281, 282, 283, 287, 
-	43, 246, 247, 241, 241, 241, 67, 285, 
-	241, 279, 241, 307, 241, 294, 294, 43, 
-	246, 247, 241, 241, 241, 241, 253, 241, 
-	279, 241, 279, 241, 241, 241, 241, 241, 
+	241, 241, 285, 241, 56, 288, 241, 246, 
+	247, 241, 241, 241, 241, 253, 241, 246, 
+	247, 241, 241, 241, 241, 253, 241, 289, 
+	241, 241, 241, 247, 241, 247, 241, 290, 
+	241, 291, 241, 292, 293, 241, 246, 247, 
+	241, 241, 241, 41, 241, 241, 241, 39, 
+	241, 40, 241, 241, 241, 241, 246, 247, 
+	241, 246, 247, 241, 291, 241, 241, 241, 
+	241, 246, 247, 241, 291, 241, 292, 241, 
+	241, 246, 247, 241, 241, 241, 41, 241, 
+	56, 241, 294, 294, 43, 246, 247, 241, 
+	241, 241, 241, 253, 241, 295, 65, 296, 
+	297, 46, 246, 247, 241, 241, 241, 241, 
+	253, 241, 65, 296, 297, 46, 246, 247, 
+	241, 241, 241, 241, 253, 241, 296, 296, 
+	46, 246, 247, 241, 241, 241, 241, 253, 
+	241, 298, 62, 299, 300, 49, 246, 247, 
+	241, 241, 241, 241, 253, 241, 62, 299, 
+	300, 49, 246, 247, 241, 241, 241, 241, 
+	253, 241, 299, 299, 49, 246, 247, 241, 
+	241, 241, 241, 253, 241, 301, 59, 302, 
+	303, 52, 246, 247, 241, 241, 241, 241, 
+	253, 241, 59, 302, 303, 52, 246, 247, 
+	241, 241, 241, 241, 253, 241, 302, 302, 
+	52, 246, 247, 241, 241, 241, 241, 253, 
+	241, 304, 56, 241, 305, 241, 246, 247, 
+	241, 241, 241, 241, 253, 241, 56, 241, 
+	305, 241, 246, 247, 241, 241, 241, 241, 
+	253, 241, 306, 241, 246, 247, 241, 241, 
+	241, 241, 253, 241, 56, 241, 241, 241, 
 	241, 246, 247, 241, 241, 241, 241, 253, 
-	241, 279, 241, 279, 241, 241, 241, 241, 
-	308, 241, 246, 247, 241, 241, 241, 241, 
-	253, 241, 279, 241, 279, 241, 307, 241, 
-	241, 241, 241, 246, 247, 241, 241, 241, 
-	241, 253, 241, 279, 241, 279, 40, 241, 
-	241, 56, 280, 241, 246, 247, 241, 241, 
-	241, 241, 253, 241, 279, 241, 272, 273, 
-	278, 278, 43, 246, 247, 241, 241, 241, 
-	241, 276, 241, 272, 273, 274, 278, 43, 
-	246, 247, 241, 241, 241, 69, 276, 241, 
-	270, 241, 309, 241, 294, 294, 43, 246, 
-	247, 241, 241, 241, 241, 253, 241, 270, 
-	241, 270, 241, 241, 241, 241, 241, 241, 
+	241, 39, 40, 241, 241, 56, 288, 241, 
 	246, 247, 241, 241, 241, 241, 253, 241, 
-	270, 241, 270, 241, 241, 241, 241, 310, 
-	241, 246, 247, 241, 241, 241, 241, 253, 
-	241, 270, 241, 270, 241, 309, 241, 241, 
+	39, 241, 281, 282, 287, 287, 43, 246, 
+	247, 241, 241, 241, 241, 285, 241, 281, 
+	282, 283, 287, 43, 246, 247, 241, 241, 
+	241, 67, 285, 241, 279, 241, 307, 241, 
+	294, 294, 43, 246, 247, 241, 241, 241, 
+	241, 253, 241, 279, 241, 279, 241, 241, 
+	241, 241, 241, 241, 246, 247, 241, 241, 
+	241, 241, 253, 241, 279, 241, 279, 241, 
+	241, 241, 241, 308, 241, 246, 247, 241, 
+	241, 241, 241, 253, 241, 279, 241, 279, 
+	241, 307, 241, 241, 241, 241, 246, 247, 
+	241, 241, 241, 241, 253, 241, 279, 241, 
+	279, 40, 241, 241, 56, 280, 241, 246, 
+	247, 241, 241, 241, 241, 253, 241, 279, 
+	241, 272, 273, 278, 278, 43, 246, 247, 
+	241, 241, 241, 241, 276, 241, 272, 273, 
+	274, 278, 43, 246, 247, 241, 241, 241, 
+	69, 276, 241, 270, 241, 309, 241, 294, 
+	294, 43, 246, 247, 241, 241, 241, 241, 
+	253, 241, 270, 241, 270, 241, 241, 241, 
+	241, 241, 241, 246, 247, 241, 241, 241, 
+	241, 253, 241, 270, 241, 270, 241, 241, 
+	241, 241, 310, 241, 246, 247, 241, 241, 
+	241, 241, 253, 241, 270, 241, 270, 241, 
+	309, 241, 241, 241, 241, 246, 247, 241, 
+	241, 241, 241, 253, 241, 270, 241, 270, 
+	40, 241, 241, 56, 271, 241, 246, 247, 
+	241, 241, 241, 241, 253, 241, 270, 241, 
+	263, 264, 269, 269, 43, 246, 247, 241, 
+	241, 241, 241, 267, 241, 263, 264, 265, 
+	269, 43, 246, 247, 241, 241, 241, 71, 
+	267, 241, 261, 241, 311, 241, 294, 294, 
+	43, 246, 247, 241, 241, 241, 241, 253, 
+	241, 261, 241, 261, 241, 241, 241, 241, 
 	241, 241, 246, 247, 241, 241, 241, 241, 
-	253, 241, 270, 241, 270, 40, 241, 241, 
-	56, 271, 241, 246, 247, 241, 241, 241, 
-	241, 253, 241, 270, 241, 263, 264, 269, 
-	269, 43, 246, 247, 241, 241, 241, 241, 
-	267, 241, 263, 264, 265, 269, 43, 246, 
-	247, 241, 241, 241, 71, 267, 241, 261, 
-	241, 311, 241, 294, 294, 43, 246, 247, 
-	241, 241, 241, 241, 253, 241, 261, 241, 
-	261, 241, 241, 241, 241, 241, 241, 246, 
-	247, 241, 241, 241, 241, 253, 241, 261, 
-	241, 261, 241, 241, 241, 241, 312, 241, 
+	253, 241, 261, 241, 261, 241, 241, 241, 
+	241, 312, 241, 246, 247, 241, 241, 241, 
+	241, 253, 241, 261, 241, 261, 241, 311, 
+	241, 241, 241, 241, 246, 247, 241, 241, 
+	241, 241, 253, 241, 261, 241, 261, 40, 
+	241, 241, 56, 262, 241, 246, 247, 241, 
+	241, 241, 241, 253, 241, 261, 241, 254, 
+	255, 260, 260, 43, 246, 247, 241, 241, 
+	241, 241, 258, 241, 254, 255, 256, 260, 
+	43, 246, 247, 241, 241, 241, 73, 258, 
+	241, 251, 241, 313, 241, 294, 294, 43, 
 	246, 247, 241, 241, 241, 241, 253, 241, 
-	261, 241, 261, 241, 311, 241, 241, 241, 
+	251, 241, 251, 241, 241, 241, 241, 241, 
 	241, 246, 247, 241, 241, 241, 241, 253, 
-	241, 261, 241, 261, 40, 241, 241, 56, 
-	262, 241, 246, 247, 241, 241, 241, 241, 
-	253, 241, 261, 241, 254, 255, 260, 260, 
-	43, 246, 247, 241, 241, 241, 241, 258, 
-	241, 254, 255, 256, 260, 43, 246, 247, 
-	241, 241, 241, 73, 258, 241, 251, 241, 
-	313, 241, 294, 294, 43, 246, 247, 241, 
-	241, 241, 241, 253, 241, 251, 241, 251, 
-	241, 241, 241, 241, 241, 241, 246, 247, 
-	241, 241, 241, 241, 253, 241, 251, 241, 
-	251, 241, 241, 241, 241, 314, 241, 246, 
-	247, 241, 241, 241, 241, 253, 241, 251, 
-	241, 251, 241, 313, 241, 241, 241, 241, 
+	241, 251, 241, 251, 241, 241, 241, 241, 
+	314, 241, 246, 247, 241, 241, 241, 241, 
+	253, 241, 251, 241, 251, 241, 313, 241, 
+	241, 241, 241, 246, 247, 241, 241, 241, 
+	241, 253, 241, 251, 241, 74, 42, 42, 
+	43, 241, 241, 241, 241, 241, 241, 74, 
+	241, 251, 40, 241, 241, 56, 252, 241, 
 	246, 247, 241, 241, 241, 241, 253, 241, 
-	251, 241, 74, 42, 42, 43, 241, 241, 
-	241, 241, 241, 241, 74, 241, 251, 40, 
-	241, 241, 56, 252, 241, 246, 247, 241, 
-	241, 241, 241, 253, 241, 251, 241, 242, 
-	243, 250, 245, 43, 246, 247, 241, 241, 
-	241, 241, 248, 241, 316, 156, 317, 317, 
-	81, 159, 160, 315, 315, 315, 315, 163, 
-	315, 156, 317, 317, 81, 159, 160, 315, 
-	315, 315, 315, 163, 315, 318, 315, 315, 
-	315, 95, 319, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 318, 315, 321, 322, 
-	323, 324, 81, 159, 160, 315, 315, 315, 
-	112, 325, 315, 326, 322, 327, 327, 81, 
-	159, 160, 315, 315, 315, 315, 325, 315, 
-	322, 327, 327, 81, 159, 160, 315, 315, 
-	315, 315, 325, 315, 328, 315, 315, 315, 
-	95, 329, 315, 159, 160, 315, 315, 315, 
-	315, 320, 315, 328, 315, 330, 331, 332, 
-	333, 81, 159, 160, 315, 315, 315, 110, 
-	334, 315, 335, 331, 336, 336, 81, 159, 
-	160, 315, 315, 315, 315, 334, 315, 331, 
-	336, 336, 81, 159, 160, 315, 315, 315, 
-	315, 334, 315, 337, 315, 315, 315, 95, 
-	338, 315, 159, 160, 315, 315, 315, 315, 
-	320, 315, 337, 315, 339, 340, 341, 342, 
-	81, 159, 160, 315, 315, 315, 108, 343, 
-	315, 344, 340, 345, 345, 81, 159, 160, 
-	315, 315, 315, 315, 343, 315, 340, 345, 
-	345, 81, 159, 160, 315, 315, 315, 315, 
-	343, 315, 346, 315, 315, 315, 95, 347, 
-	315, 159, 160, 315, 315, 315, 315, 320, 
-	315, 346, 315, 348, 349, 350, 351, 81, 
-	159, 160, 315, 315, 315, 106, 352, 315, 
-	353, 349, 354, 354, 81, 159, 160, 315, 
-	315, 315, 315, 352, 315, 349, 354, 354, 
-	81, 159, 160, 315, 315, 315, 315, 352, 
-	315, 95, 355, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 356, 315, 315, 315, 
-	160, 315, 160, 315, 357, 315, 358, 315, 
-	359, 360, 315, 159, 160, 315, 315, 315, 
-	79, 315, 78, 315, 315, 315, 315, 159, 
-	160, 315, 159, 160, 315, 358, 315, 315, 
-	315, 315, 159, 160, 315, 358, 315, 359, 
-	315, 315, 159, 160, 315, 315, 315, 79, 
-	315, 95, 315, 361, 361, 81, 159, 160, 
-	315, 315, 315, 315, 320, 315, 362, 104, 
-	363, 364, 85, 159, 160, 315, 315, 315, 
-	315, 320, 315, 104, 363, 364, 85, 159, 
-	160, 315, 315, 315, 315, 320, 315, 363, 
-	363, 85, 159, 160, 315, 315, 315, 315, 
-	320, 315, 365, 101, 366, 367, 88, 159, 
-	160, 315, 315, 315, 315, 320, 315, 101, 
-	366, 367, 88, 159, 160, 315, 315, 315, 
-	315, 320, 315, 366, 366, 88, 159, 160, 
-	315, 315, 315, 315, 320, 315, 368, 98, 
-	369, 370, 91, 159, 160, 315, 315, 315, 
-	315, 320, 315, 98, 369, 370, 91, 159, 
-	160, 315, 315, 315, 315, 320, 315, 369, 
-	369, 91, 159, 160, 315, 315, 315, 315, 
-	320, 315, 371, 95, 315, 372, 315, 159, 
-	160, 315, 315, 315, 315, 320, 315, 95, 
-	315, 372, 315, 159, 160, 315, 315, 315, 
-	315, 320, 315, 373, 315, 159, 160, 315, 
-	315, 315, 315, 320, 315, 95, 315, 315, 
-	315, 315, 159, 160, 315, 315, 315, 315, 
-	320, 315, 77, 78, 315, 315, 95, 355, 
+	251, 241, 242, 243, 250, 245, 43, 246, 
+	247, 241, 241, 241, 241, 248, 241, 316, 
+	156, 317, 317, 81, 159, 160, 315, 315, 
+	315, 315, 163, 315, 156, 317, 317, 81, 
+	159, 160, 315, 315, 315, 315, 163, 315, 
+	318, 315, 315, 315, 95, 319, 315, 159, 
+	160, 315, 315, 315, 315, 320, 315, 318, 
+	315, 321, 322, 323, 324, 81, 159, 160, 
+	315, 315, 315, 112, 325, 315, 315, 318, 
+	315, 326, 322, 327, 327, 81, 159, 160, 
+	315, 315, 315, 315, 325, 315, 322, 327, 
+	327, 81, 159, 160, 315, 315, 315, 315, 
+	325, 315, 328, 315, 315, 315, 95, 329, 
 	315, 159, 160, 315, 315, 315, 315, 320, 
-	315, 77, 315, 348, 349, 354, 354, 81, 
+	315, 328, 315, 330, 331, 332, 333, 81, 
+	159, 160, 315, 315, 315, 110, 334, 315, 
+	315, 328, 315, 335, 331, 336, 336, 81, 
+	159, 160, 315, 315, 315, 315, 334, 315, 
+	331, 336, 336, 81, 159, 160, 315, 315, 
+	315, 315, 334, 315, 337, 315, 315, 315, 
+	95, 338, 315, 159, 160, 315, 315, 315, 
+	315, 320, 315, 337, 315, 339, 340, 341, 
+	342, 81, 159, 160, 315, 315, 315, 108, 
+	343, 315, 315, 337, 315, 344, 340, 345, 
+	345, 81, 159, 160, 315, 315, 315, 315, 
+	343, 315, 340, 345, 345, 81, 159, 160, 
+	315, 315, 315, 315, 343, 315, 346, 315, 
+	315, 315, 95, 347, 315, 159, 160, 315, 
+	315, 315, 315, 320, 315, 346, 315, 348, 
+	349, 350, 351, 81, 159, 160, 315, 315, 
+	315, 106, 352, 315, 315, 346, 315, 353, 
+	349, 354, 354, 81, 159, 160, 315, 315, 
+	315, 315, 352, 315, 349, 354, 354, 81, 
 	159, 160, 315, 315, 315, 315, 352, 315, 
-	348, 349, 350, 354, 81, 159, 160, 315, 
-	315, 315, 106, 352, 315, 346, 315, 374, 
-	315, 361, 361, 81, 159, 160, 315, 315, 
-	315, 315, 320, 315, 346, 315, 346, 315, 
-	315, 315, 315, 315, 315, 159, 160, 315, 
-	315, 315, 315, 320, 315, 346, 315, 346, 
-	315, 315, 315, 315, 375, 315, 159, 160, 
-	315, 315, 315, 315, 320, 315, 346, 315, 
-	346, 315, 374, 315, 315, 315, 315, 159, 
+	95, 355, 315, 159, 160, 315, 315, 315, 
+	315, 320, 315, 159, 160, 315, 315, 315, 
+	315, 320, 315, 356, 315, 315, 315, 160, 
+	315, 160, 315, 357, 315, 358, 315, 359, 
+	360, 315, 159, 160, 315, 315, 315, 79, 
+	315, 315, 315, 77, 315, 78, 315, 315, 
+	315, 315, 159, 160, 315, 159, 160, 315, 
+	358, 315, 315, 315, 315, 159, 160, 315, 
+	358, 315, 359, 315, 315, 159, 160, 315, 
+	315, 315, 79, 315, 95, 315, 361, 361, 
+	81, 159, 160, 315, 315, 315, 315, 320, 
+	315, 362, 104, 363, 364, 85, 159, 160, 
+	315, 315, 315, 315, 320, 315, 104, 363, 
+	364, 85, 159, 160, 315, 315, 315, 315, 
+	320, 315, 363, 363, 85, 159, 160, 315, 
+	315, 315, 315, 320, 315, 365, 101, 366, 
+	367, 88, 159, 160, 315, 315, 315, 315, 
+	320, 315, 101, 366, 367, 88, 159, 160, 
+	315, 315, 315, 315, 320, 315, 366, 366, 
+	88, 159, 160, 315, 315, 315, 315, 320, 
+	315, 368, 98, 369, 370, 91, 159, 160, 
+	315, 315, 315, 315, 320, 315, 98, 369, 
+	370, 91, 159, 160, 315, 315, 315, 315, 
+	320, 315, 369, 369, 91, 159, 160, 315, 
+	315, 315, 315, 320, 315, 371, 95, 315, 
+	372, 315, 159, 160, 315, 315, 315, 315, 
+	320, 315, 95, 315, 372, 315, 159, 160, 
+	315, 315, 315, 315, 320, 315, 373, 315, 
+	159, 160, 315, 315, 315, 315, 320, 315, 
+	95, 315, 315, 315, 315, 159, 160, 315, 
+	315, 315, 315, 320, 315, 77, 78, 315, 
+	315, 95, 355, 315, 159, 160, 315, 315, 
+	315, 315, 320, 315, 77, 315, 348, 349, 
+	354, 354, 81, 159, 160, 315, 315, 315, 
+	315, 352, 315, 348, 349, 350, 354, 81, 
+	159, 160, 315, 315, 315, 106, 352, 315, 
+	346, 315, 374, 315, 361, 361, 81, 159, 
 	160, 315, 315, 315, 315, 320, 315, 346, 
-	315, 346, 78, 315, 315, 95, 347, 315, 
+	315, 346, 315, 315, 315, 315, 315, 315, 
 	159, 160, 315, 315, 315, 315, 320, 315, 
-	346, 315, 339, 340, 345, 345, 81, 159, 
-	160, 315, 315, 315, 315, 343, 315, 339, 
-	340, 341, 345, 81, 159, 160, 315, 315, 
-	315, 108, 343, 315, 337, 315, 376, 315, 
-	361, 361, 81, 159, 160, 315, 315, 315, 
-	315, 320, 315, 337, 315, 337, 315, 315, 
-	315, 315, 315, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 337, 315, 337, 315, 
-	315, 315, 315, 377, 315, 159, 160, 315, 
-	315, 315, 315, 320, 315, 337, 315, 337, 
-	315, 376, 315, 315, 315, 315, 159, 160, 
+	346, 315, 346, 315, 315, 315, 315, 375, 
+	315, 159, 160, 315, 315, 315, 315, 320, 
+	315, 346, 315, 346, 315, 374, 315, 315, 
+	315, 315, 159, 160, 315, 315, 315, 315, 
+	320, 315, 346, 315, 346, 78, 315, 315, 
+	95, 347, 315, 159, 160, 315, 315, 315, 
+	315, 320, 315, 346, 315, 339, 340, 345, 
+	345, 81, 159, 160, 315, 315, 315, 315, 
+	343, 315, 339, 340, 341, 345, 81, 159, 
+	160, 315, 315, 315, 108, 343, 315, 337, 
+	315, 376, 315, 361, 361, 81, 159, 160, 
 	315, 315, 315, 315, 320, 315, 337, 315, 
-	337, 78, 315, 315, 95, 338, 315, 159, 
+	337, 315, 315, 315, 315, 315, 315, 159, 
 	160, 315, 315, 315, 315, 320, 315, 337, 
-	315, 330, 331, 336, 336, 81, 159, 160, 
-	315, 315, 315, 315, 334, 315, 330, 331, 
-	332, 336, 81, 159, 160, 315, 315, 315, 
-	110, 334, 315, 328, 315, 378, 315, 361, 
-	361, 81, 159, 160, 315, 315, 315, 315, 
-	320, 315, 328, 315, 328, 315, 315, 315, 
-	315, 315, 315, 159, 160, 315, 315, 315, 
-	315, 320, 315, 328, 315, 328, 315, 315, 
-	315, 315, 379, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 328, 315, 328, 315, 
-	378, 315, 315, 315, 315, 159, 160, 315, 
+	315, 337, 315, 315, 315, 315, 377, 315, 
+	159, 160, 315, 315, 315, 315, 320, 315, 
+	337, 315, 337, 315, 376, 315, 315, 315, 
+	315, 159, 160, 315, 315, 315, 315, 320, 
+	315, 337, 315, 337, 78, 315, 315, 95, 
+	338, 315, 159, 160, 315, 315, 315, 315, 
+	320, 315, 337, 315, 330, 331, 336, 336, 
+	81, 159, 160, 315, 315, 315, 315, 334, 
+	315, 330, 331, 332, 336, 81, 159, 160, 
+	315, 315, 315, 110, 334, 315, 328, 315, 
+	378, 315, 361, 361, 81, 159, 160, 315, 
 	315, 315, 315, 320, 315, 328, 315, 328, 
-	78, 315, 315, 95, 329, 315, 159, 160, 
+	315, 315, 315, 315, 315, 315, 159, 160, 
 	315, 315, 315, 315, 320, 315, 328, 315, 
-	321, 322, 327, 327, 81, 159, 160, 315, 
-	315, 315, 315, 325, 315, 321, 322, 323, 
-	327, 81, 159, 160, 315, 315, 315, 112, 
-	325, 315, 318, 315, 380, 315, 361, 361, 
-	81, 159, 160, 315, 315, 315, 315, 320, 
-	315, 318, 315, 318, 315, 315, 315, 315, 
-	315, 315, 159, 160, 315, 315, 315, 315, 
-	320, 315, 318, 315, 318, 315, 315, 315, 
-	315, 381, 315, 159, 160, 315, 315, 315, 
-	315, 320, 315, 318, 315, 318, 315, 380, 
-	315, 315, 315, 315, 159, 160, 315, 315, 
-	315, 315, 320, 315, 318, 315, 318, 78, 
-	315, 315, 95, 319, 315, 159, 160, 315, 
-	315, 315, 315, 320, 315, 318, 315, 113, 
-	80, 80, 81, 382, 382, 382, 382, 382, 
-	162, 113, 382, 155, 156, 317, 317, 81, 
-	159, 160, 315, 315, 315, 315, 163, 315, 
-	113, 80, 80, 81, 382, 382, 382, 382, 
-	382, 382, 113, 382, 384, 385, 386, 387, 
-	119, 388, 389, 383, 383, 383, 151, 390, 
-	383, 391, 385, 387, 387, 119, 388, 389, 
-	383, 383, 383, 383, 390, 383, 385, 387, 
-	387, 119, 388, 389, 383, 383, 383, 383, 
-	390, 383, 392, 383, 383, 383, 132, 393, 
-	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 392, 383, 395, 396, 397, 398, 119, 
-	388, 389, 383, 383, 383, 149, 399, 383, 
-	400, 396, 401, 401, 119, 388, 389, 383, 
-	383, 383, 383, 399, 383, 396, 401, 401, 
-	119, 388, 389, 383, 383, 383, 383, 399, 
-	383, 402, 383, 383, 383, 132, 403, 383, 
+	328, 315, 315, 315, 315, 379, 315, 159, 
+	160, 315, 315, 315, 315, 320, 315, 328, 
+	315, 328, 315, 378, 315, 315, 315, 315, 
+	159, 160, 315, 315, 315, 315, 320, 315, 
+	328, 315, 328, 78, 315, 315, 95, 329, 
+	315, 159, 160, 315, 315, 315, 315, 320, 
+	315, 328, 315, 321, 322, 327, 327, 81, 
+	159, 160, 315, 315, 315, 315, 325, 315, 
+	321, 322, 323, 327, 81, 159, 160, 315, 
+	315, 315, 112, 325, 315, 318, 315, 380, 
+	315, 361, 361, 81, 159, 160, 315, 315, 
+	315, 315, 320, 315, 318, 315, 318, 315, 
+	315, 315, 315, 315, 315, 159, 160, 315, 
+	315, 315, 315, 320, 315, 318, 315, 318, 
+	315, 315, 315, 315, 381, 315, 159, 160, 
+	315, 315, 315, 315, 320, 315, 318, 315, 
+	318, 315, 380, 315, 315, 315, 315, 159, 
+	160, 315, 315, 315, 315, 320, 315, 318, 
+	315, 318, 78, 315, 315, 95, 319, 315, 
+	159, 160, 315, 315, 315, 315, 320, 315, 
+	318, 315, 113, 80, 80, 81, 382, 382, 
+	382, 382, 382, 162, 113, 382, 155, 156, 
+	317, 317, 81, 159, 160, 315, 315, 315, 
+	315, 163, 315, 113, 80, 80, 81, 382, 
+	382, 382, 382, 382, 382, 113, 382, 384, 
+	385, 386, 387, 119, 388, 389, 383, 383, 
+	383, 151, 390, 383, 391, 385, 387, 387, 
+	119, 388, 389, 383, 383, 383, 383, 390, 
+	383, 385, 387, 387, 119, 388, 389, 383, 
+	383, 383, 383, 390, 383, 392, 383, 383, 
+	383, 132, 393, 383, 388, 389, 383, 383, 
+	383, 383, 394, 383, 392, 383, 395, 396, 
+	397, 398, 119, 388, 389, 383, 383, 383, 
+	149, 399, 383, 383, 392, 383, 400, 396, 
+	401, 401, 119, 388, 389, 383, 383, 383, 
+	383, 399, 383, 396, 401, 401, 119, 388, 
+	389, 383, 383, 383, 383, 399, 383, 402, 
+	383, 383, 383, 132, 403, 383, 388, 389, 
+	383, 383, 383, 383, 394, 383, 402, 383, 
+	404, 405, 406, 407, 119, 388, 389, 383, 
+	383, 383, 147, 408, 383, 383, 402, 383, 
+	409, 405, 410, 410, 119, 388, 389, 383, 
+	383, 383, 383, 408, 383, 405, 410, 410, 
+	119, 388, 389, 383, 383, 383, 383, 408, 
+	383, 411, 383, 383, 383, 132, 412, 383, 
 	388, 389, 383, 383, 383, 383, 394, 383, 
-	402, 383, 404, 405, 406, 407, 119, 388, 
-	389, 383, 383, 383, 147, 408, 383, 409, 
-	405, 410, 410, 119, 388, 389, 383, 383, 
-	383, 383, 408, 383, 405, 410, 410, 119, 
-	388, 389, 383, 383, 383, 383, 408, 383, 
-	411, 383, 383, 383, 132, 412, 383, 388, 
-	389, 383, 383, 383, 383, 394, 383, 411, 
-	383, 413, 414, 415, 416, 119, 388, 389, 
-	383, 383, 383, 145, 417, 383, 418, 414, 
+	411, 383, 413, 414, 415, 416, 119, 388, 
+	389, 383, 383, 383, 145, 417, 383, 383, 
+	411, 383, 418, 414, 419, 419, 119, 388, 
+	389, 383, 383, 383, 383, 417, 383, 414, 
 	419, 419, 119, 388, 389, 383, 383, 383, 
-	383, 417, 383, 414, 419, 419, 119, 388, 
-	389, 383, 383, 383, 383, 417, 383, 420, 
-	383, 383, 383, 132, 421, 383, 388, 389, 
-	383, 383, 383, 383, 394, 383, 420, 383, 
-	422, 423, 424, 425, 119, 388, 389, 383, 
-	383, 383, 143, 426, 383, 427, 423, 428, 
-	428, 119, 388, 389, 383, 383, 383, 383, 
-	426, 383, 423, 428, 428, 119, 388, 389, 
-	383, 383, 383, 383, 426, 383, 132, 429, 
-	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 430, 383, 383, 383, 389, 383, 389, 
-	383, 431, 383, 432, 383, 433, 434, 383, 
-	388, 389, 383, 383, 383, 117, 383, 116, 
-	383, 383, 383, 383, 388, 389, 383, 388, 
-	389, 383, 432, 383, 383, 383, 383, 388, 
-	389, 383, 432, 383, 433, 383, 383, 388, 
-	389, 383, 383, 383, 117, 383, 132, 383, 
-	435, 435, 119, 388, 389, 383, 383, 383, 
-	383, 394, 383, 436, 141, 437, 438, 122, 
-	388, 389, 383, 383, 383, 383, 394, 383, 
-	141, 437, 438, 122, 388, 389, 383, 383, 
-	383, 383, 394, 383, 437, 437, 122, 388, 
-	389, 383, 383, 383, 383, 394, 383, 439, 
-	138, 440, 441, 125, 388, 389, 383, 383, 
-	383, 383, 394, 383, 138, 440, 441, 125, 
+	383, 417, 383, 420, 383, 383, 383, 132, 
+	421, 383, 388, 389, 383, 383, 383, 383, 
+	394, 383, 420, 383, 422, 423, 424, 425, 
+	119, 388, 389, 383, 383, 383, 143, 426, 
+	383, 383, 420, 383, 427, 423, 428, 428, 
+	119, 388, 389, 383, 383, 383, 383, 426, 
+	383, 423, 428, 428, 119, 388, 389, 383, 
+	383, 383, 383, 426, 383, 132, 429, 383, 
 	388, 389, 383, 383, 383, 383, 394, 383, 
-	440, 440, 125, 388, 389, 383, 383, 383, 
-	383, 394, 383, 442, 135, 443, 444, 128, 
 	388, 389, 383, 383, 383, 383, 394, 383, 
-	135, 443, 444, 128, 388, 389, 383, 383, 
-	383, 383, 394, 383, 443, 443, 128, 388, 
-	389, 383, 383, 383, 383, 394, 383, 445, 
-	132, 383, 446, 383, 388, 389, 383, 383, 
-	383, 383, 394, 383, 132, 383, 446, 383, 
-	388, 389, 383, 383, 383, 383, 394, 383, 
-	447, 383, 388, 389, 383, 383, 383, 383, 
-	394, 383, 132, 383, 383, 383, 383, 388, 
-	389, 383, 383, 383, 383, 394, 383, 115, 
-	116, 383, 383, 132, 429, 383, 388, 389, 
-	383, 383, 383, 383, 394, 383, 115, 383, 
-	422, 423, 428, 428, 119, 388, 389, 383, 
-	383, 383, 383, 426, 383, 422, 423, 424, 
-	428, 119, 388, 389, 383, 383, 383, 143, 
-	426, 383, 420, 383, 448, 383, 435, 435, 
-	119, 388, 389, 383, 383, 383, 383, 394, 
-	383, 420, 383, 420, 383, 383, 383, 383, 
+	430, 383, 383, 383, 389, 383, 389, 383, 
+	431, 383, 432, 383, 433, 434, 383, 388, 
+	389, 383, 383, 383, 117, 383, 383, 383, 
+	115, 383, 116, 383, 383, 383, 383, 388, 
+	389, 383, 388, 389, 383, 432, 383, 383, 
+	383, 383, 388, 389, 383, 432, 383, 433, 
+	383, 383, 388, 389, 383, 383, 383, 117, 
+	383, 132, 383, 435, 435, 119, 388, 389, 
+	383, 383, 383, 383, 394, 383, 436, 141, 
+	437, 438, 122, 388, 389, 383, 383, 383, 
+	383, 394, 383, 141, 437, 438, 122, 388, 
+	389, 383, 383, 383, 383, 394, 383, 437, 
+	437, 122, 388, 389, 383, 383, 383, 383, 
+	394, 383, 439, 138, 440, 441, 125, 388, 
+	389, 383, 383, 383, 383, 394, 383, 138, 
+	440, 441, 125, 388, 389, 383, 383, 383, 
+	383, 394, 383, 440, 440, 125, 388, 389, 
+	383, 383, 383, 383, 394, 383, 442, 135, 
+	443, 444, 128, 388, 389, 383, 383, 383, 
+	383, 394, 383, 135, 443, 444, 128, 388, 
+	389, 383, 383, 383, 383, 394, 383, 443, 
+	443, 128, 388, 389, 383, 383, 383, 383, 
+	394, 383, 445, 132, 383, 446, 383, 388, 
+	389, 383, 383, 383, 383, 394, 383, 132, 
+	383, 446, 383, 388, 389, 383, 383, 383, 
+	383, 394, 383, 447, 383, 388, 389, 383, 
+	383, 383, 383, 394, 383, 132, 383, 383, 
 	383, 383, 388, 389, 383, 383, 383, 383, 
-	394, 383, 420, 383, 420, 383, 383, 383, 
-	383, 449, 383, 388, 389, 383, 383, 383, 
-	383, 394, 383, 420, 383, 420, 383, 448, 
-	383, 383, 383, 383, 388, 389, 383, 383, 
-	383, 383, 394, 383, 420, 383, 420, 116, 
-	383, 383, 132, 421, 383, 388, 389, 383, 
-	383, 383, 383, 394, 383, 420, 383, 413, 
-	414, 419, 419, 119, 388, 389, 383, 383, 
-	383, 383, 417, 383, 413, 414, 415, 419, 
-	119, 388, 389, 383, 383, 383, 145, 417, 
-	383, 411, 383, 450, 383, 435, 435, 119, 
-	388, 389, 383, 383, 383, 383, 394, 383, 
-	411, 383, 411, 383, 383, 383, 383, 383, 
+	394, 383, 115, 116, 383, 383, 132, 429, 
 	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 411, 383, 411, 383, 383, 383, 383, 
-	451, 383, 388, 389, 383, 383, 383, 383, 
-	394, 383, 411, 383, 411, 383, 450, 383, 
-	383, 383, 383, 388, 389, 383, 383, 383, 
-	383, 394, 383, 411, 383, 411, 116, 383, 
-	383, 132, 412, 383, 388, 389, 383, 383, 
-	383, 383, 394, 383, 411, 383, 404, 405, 
-	410, 410, 119, 388, 389, 383, 383, 383, 
-	383, 408, 383, 404, 405, 406, 410, 119, 
-	388, 389, 383, 383, 383, 147, 408, 383, 
-	402, 383, 452, 383, 435, 435, 119, 388, 
-	389, 383, 383, 383, 383, 394, 383, 402, 
-	383, 402, 383, 383, 383, 383, 383, 383, 
+	383, 115, 383, 422, 423, 428, 428, 119, 
+	388, 389, 383, 383, 383, 383, 426, 383, 
+	422, 423, 424, 428, 119, 388, 389, 383, 
+	383, 383, 143, 426, 383, 420, 383, 448, 
+	383, 435, 435, 119, 388, 389, 383, 383, 
+	383, 383, 394, 383, 420, 383, 420, 383, 
+	383, 383, 383, 383, 383, 388, 389, 383, 
+	383, 383, 383, 394, 383, 420, 383, 420, 
+	383, 383, 383, 383, 449, 383, 388, 389, 
+	383, 383, 383, 383, 394, 383, 420, 383, 
+	420, 383, 448, 383, 383, 383, 383, 388, 
+	389, 383, 383, 383, 383, 394, 383, 420, 
+	383, 420, 116, 383, 383, 132, 421, 383, 
 	388, 389, 383, 383, 383, 383, 394, 383, 
-	402, 383, 402, 383, 383, 383, 383, 453, 
-	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 402, 383, 402, 383, 452, 383, 383, 
+	420, 383, 413, 414, 419, 419, 119, 388, 
+	389, 383, 383, 383, 383, 417, 383, 413, 
+	414, 415, 419, 119, 388, 389, 383, 383, 
+	383, 145, 417, 383, 411, 383, 450, 383, 
+	435, 435, 119, 388, 389, 383, 383, 383, 
+	383, 394, 383, 411, 383, 411, 383, 383, 
+	383, 383, 383, 383, 388, 389, 383, 383, 
+	383, 383, 394, 383, 411, 383, 411, 383, 
+	383, 383, 383, 451, 383, 388, 389, 383, 
+	383, 383, 383, 394, 383, 411, 383, 411, 
+	383, 450, 383, 383, 383, 383, 388, 389, 
+	383, 383, 383, 383, 394, 383, 411, 383, 
+	411, 116, 383, 383, 132, 412, 383, 388, 
+	389, 383, 383, 383, 383, 394, 383, 411, 
+	383, 404, 405, 410, 410, 119, 388, 389, 
+	383, 383, 383, 383, 408, 383, 404, 405, 
+	406, 410, 119, 388, 389, 383, 383, 383, 
+	147, 408, 383, 402, 383, 452, 383, 435, 
+	435, 119, 388, 389, 383, 383, 383, 383, 
+	394, 383, 402, 383, 402, 383, 383, 383, 
+	383, 383, 383, 388, 389, 383, 383, 383, 
+	383, 394, 383, 402, 383, 402, 383, 383, 
+	383, 383, 453, 383, 388, 389, 383, 383, 
+	383, 383, 394, 383, 402, 383, 402, 383, 
+	452, 383, 383, 383, 383, 388, 389, 383, 
+	383, 383, 383, 394, 383, 402, 383, 402, 
+	116, 383, 383, 132, 403, 383, 388, 389, 
+	383, 383, 383, 383, 394, 383, 402, 383, 
+	395, 396, 401, 401, 119, 388, 389, 383, 
+	383, 383, 383, 399, 383, 395, 396, 397, 
+	401, 119, 388, 389, 383, 383, 383, 149, 
+	399, 383, 392, 383, 454, 383, 435, 435, 
+	119, 388, 389, 383, 383, 383, 383, 394, 
+	383, 392, 383, 392, 383, 383, 383, 383, 
 	383, 383, 388, 389, 383, 383, 383, 383, 
-	394, 383, 402, 383, 402, 116, 383, 383, 
-	132, 403, 383, 388, 389, 383, 383, 383, 
-	383, 394, 383, 402, 383, 395, 396, 401, 
-	401, 119, 388, 389, 383, 383, 383, 383, 
-	399, 383, 395, 396, 397, 401, 119, 388, 
-	389, 383, 383, 383, 149, 399, 383, 392, 
-	383, 454, 383, 435, 435, 119, 388, 389, 
-	383, 383, 383, 383, 394, 383, 392, 383, 
-	392, 383, 383, 383, 383, 383, 383, 388, 
-	389, 383, 383, 383, 383, 394, 383, 392, 
-	383, 392, 383, 383, 383, 383, 455, 383, 
-	388, 389, 383, 383, 383, 383, 394, 383, 
-	392, 383, 392, 383, 454, 383, 383, 383, 
-	383, 388, 389, 383, 383, 383, 383, 394, 
-	383, 392, 383, 392, 116, 383, 383, 132, 
-	393, 383, 388, 389, 383, 383, 383, 383, 
-	394, 383, 392, 383, 384, 385, 387, 387, 
-	119, 388, 389, 383, 383, 383, 383, 390, 
-	383, 153, 154, 382, 382, 382, 382, 382, 
-	382, 382, 382, 161, 161, 382, 382, 382, 
-	153, 382, 167, 456, 169, 170, 5, 171, 
-	172, 173, 166, 166, 37, 174, 166, 177, 
-	154, 166, 166, 18, 178, 166, 171, 172, 
-	166, 161, 161, 166, 179, 166, 177, 166, 
-	0
+	394, 383, 392, 383, 392, 383, 383, 383, 
+	383, 455, 383, 388, 389, 383, 383, 383, 
+	383, 394, 383, 392, 383, 392, 383, 454, 
+	383, 383, 383, 383, 388, 389, 383, 383, 
+	383, 383, 394, 383, 392, 383, 392, 116, 
+	383, 383, 132, 393, 383, 388, 389, 383, 
+	383, 383, 383, 394, 383, 392, 383, 384, 
+	385, 387, 387, 119, 388, 389, 383, 383, 
+	383, 383, 390, 383, 153, 154, 382, 382, 
+	382, 382, 382, 382, 382, 382, 161, 161, 
+	382, 382, 382, 153, 382, 167, 456, 169, 
+	170, 5, 171, 172, 173, 166, 166, 37, 
+	174, 166, 166, 153, 166, 177, 154, 166, 
+	166, 18, 178, 166, 171, 172, 166, 161, 
+	161, 166, 179, 166, 177, 166, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
@@ -1129,7 +1137,7 @@ static const int indic_syllable_machine_en_main = 143;
 
 
 
-#line 90 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 91 "../../src/hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -1149,7 +1157,7 @@ find_syllables (hb_buffer_t *buffer)
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 1153 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1161 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
 	{
 	cs = indic_syllable_machine_start;
 	ts = 0;
@@ -1157,7 +1165,7 @@ find_syllables (hb_buffer_t *buffer)
 	act = 0;
 	}
 
-#line 111 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 112 "../../src/hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -1166,7 +1174,7 @@ find_syllables (hb_buffer_t *buffer)
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 1170 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1178 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
 	{
 	int _slen;
 	int _trans;
@@ -1177,10 +1185,10 @@ find_syllables (hb_buffer_t *buffer)
 _resume:
 	switch ( _indic_syllable_machine_from_state_actions[cs] ) {
 	case 9:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{ts = p;}
 	break;
-#line 1184 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1192 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
 	}
 
 	_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1199,67 +1207,67 @@ _eof_trans:
 
 	switch ( _indic_syllable_machine_trans_actions[_trans] ) {
 	case 2:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{te = p+1;}
 	break;
 	case 13:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (consonant_syllable); }}
 	break;
 	case 15:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (vowel_syllable); }}
 	break;
 	case 20:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (standalone_cluster); }}
 	break;
 	case 17:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
 	case 10:
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p+1;{ found_syllable (non_indic_cluster); }}
 	break;
 	case 12:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (consonant_syllable); }}
 	break;
 	case 14:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (vowel_syllable); }}
 	break;
 	case 19:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (standalone_cluster); }}
 	break;
 	case 16:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
 	case 18:
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{te = p;p--;{ found_syllable (non_indic_cluster); }}
 	break;
 	case 1:
-#line 82 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
 	break;
 	case 3:
-#line 83 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
 	break;
 	case 7:
-#line 84 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
 	break;
 	case 4:
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
 	case 5:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{	switch( act ) {
 	case 4:
 	{{p = ((te))-1;} found_syllable (broken_cluster); }
@@ -1271,27 +1279,27 @@ _eof_trans:
 	}
 	break;
 	case 6:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{te = p+1;}
-#line 85 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{act = 4;}
 	break;
 	case 11:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{te = p+1;}
-#line 86 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-indic-machine.rl"
 	{act = 5;}
 	break;
-#line 1286 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1294 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
 	}
 
 _again:
 	switch ( _indic_syllable_machine_to_state_actions[cs] ) {
 	case 8:
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 1295 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1303 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
 	}
 
 	if ( ++p != pe )
@@ -1307,7 +1315,7 @@ _again:
 
 	}
 
-#line 120 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 121 "../../src/hb-ot-shape-complex-indic-machine.rl"
 
 }
 
commit 9cac1338c4bc3e9034cbfa104291ed0329debefe
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:41:22 2012 -0800

    [Indic] Allow Consonant_Medial's after Consonant's
    
    Mostly affects Myanmar, but also Tai Tham, Javanese, and Cham.  The
    latter three are untested (no fonts!).

diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl
index b745466..a536da5 100644
--- a/src/hb-ot-shape-complex-indic-machine.rl
+++ b/src/hb-ot-shape-complex-indic-machine.rl
@@ -55,8 +55,9 @@ RS   = 13;
 Coeng = 14;
 Repha = 15;
 Ra    = 16;
+CM    = 17;
 
-c = (C | Ra);			# is_consonant
+c = (C | Ra)CM*;		# is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
 z = ZWJ|ZWNJ;			# is_joiner
 h = H | Coeng;			# is_halant_or_coeng
diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index c3c51fe..de7264a 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -63,7 +63,8 @@ enum indic_category_t {
   OT_RS, /* Register Shifter, used in Khmer OT spec */
   OT_Coeng,
   OT_Repha,
-  OT_Ra /* Not explicitly listed in the OT spec, but used in the grammar. */
+  OT_Ra, /* Not explicitly listed in the OT spec, but used in the grammar. */
+  OT_CM
 };
 
 /* Visual positions in a syllable from left to right. */
@@ -103,7 +104,7 @@ enum indic_syllabic_category_t {
   INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD	= OT_C,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL	= OT_C,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER	= OT_C,
-  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	= OT_C,
+  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	= OT_CM,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	= OT_NBSP,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	= OT_C,
   INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA	= OT_Repha,
@@ -285,7 +286,7 @@ is_joiner (const hb_glyph_info_t &info)
  * We treat Vowels and placeholders as if they were consonants.  This is safe because Vowels
  * cannot happen in a consonant syllable.  The plus side however is, we can call the
  * consonant syllable logic from the vowel syllable function and get it all right! */
-#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_DOTTEDCIRCLE))
+#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CM) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_DOTTEDCIRCLE))
 static inline bool
 is_consonant (const hb_glyph_info_t &info)
 {
commit d187099cbab8e75f870a2bc9c23b6a1cf226905e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:38:06 2012 -0800

    [Indic] Categorize Myanmar "tone marks" as nuktas

diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index d44e82b..c3c51fe 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -111,7 +111,7 @@ enum indic_syllabic_category_t {
   INDIC_SYLLABIC_CATEGORY_NUKTA			= OT_N,
   INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER	= OT_RS,
   INDIC_SYLLABIC_CATEGORY_TONE_LETTER		= OT_X,
-  INDIC_SYLLABIC_CATEGORY_TONE_MARK		= OT_X,
+  INDIC_SYLLABIC_CATEGORY_TONE_MARK		= OT_N,
   INDIC_SYLLABIC_CATEGORY_VIRAMA		= OT_H,
   INDIC_SYLLABIC_CATEGORY_VISARGA		= OT_SM,
   INDIC_SYLLABIC_CATEGORY_VOWEL			= OT_V,
commit 8173f23f3f16972c2e8e0a120724533100acfda2
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:37:20 2012 -0800

    [Indic] Add config for Myanmar

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 32b9cf5..60fe3fb 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -123,6 +123,8 @@ static const indic_config_t indic_configs[] =
   {HB_SCRIPT_MALAYALAM,	true, 0x0D4D,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA},
   {HB_SCRIPT_SINHALA,	false,0x0DCA,BASE_POS_FIRST,REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT},
   {HB_SCRIPT_KHMER,	false,0x17D2,BASE_POS_FIRST,REPH_POS_DEFAULT,    REPH_MODE_VIS_REPHA},
+  /* Myanmar does not have the "old_indic" behavior, even though it has a "new" tag. */
+  {HB_SCRIPT_MYANMAR,	false, 0x1039,BASE_POS_LAST, REPH_POS_DEFAULT,    REPH_MODE_EXPLICIT},
 };
 
 
commit 9e92978c8aa3d3cdab4d20c81698c56adbb3dbdd
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:36:10 2012 -0800

    [Indic] Route "new" Myanmar tag through the Indic shaper
    
    Windows 8 adds a Myanmar shaper using the 'mym2' tag.  Route that
    through the Indic shaper.  It's still very broken, but at least this
    does NOT break old-style Myanmar shaping using the generic shaper.

diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index ddad5d2..a45b0f4 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -135,6 +135,8 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-6.0 additions */
     case HB_SCRIPT_MANDAIC:
 
+      /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
+       * This is because we do fallback shaping for Arabic script (and not others). */
       if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
 	  planner->props.script == HB_SCRIPT_ARABIC)
 	return &_hb_ot_complex_shaper_arabic;
@@ -208,12 +210,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_TAI_VIET:
 
 
-    /* May need Indic treatment in the future? */
-
-    /* Unicode-3.0 additions */
-    case HB_SCRIPT_MYANMAR:
-
-
 #endif
 
     /* Unicode-1.1 additions */
@@ -229,6 +225,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-3.0 additions */
     case HB_SCRIPT_KHMER:
+    case HB_SCRIPT_MYANMAR:
     case HB_SCRIPT_SINHALA:
 
     /* Unicode-4.1 additions */
@@ -257,7 +254,10 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_SHARADA:
     case HB_SCRIPT_TAKRI:
 
-      if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT)
+      /* For Myanmar, we only want to use the Indic shaper if the "new" script
+       * tag is found.  For "old" script tag we want to use the default shaper. */
+      if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT &&
+	  planner->map.chosen_script[0] != HB_TAG ('m','y','m','r'))
 	return &_hb_ot_complex_shaper_indic;
       else
 	return &_hb_ot_complex_shaper_default;
commit 5ab3855f8106158ee7e68797e8c35e63e9216e5d
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:27:42 2012 -0800

    Choose shaper based on chosen OT script tag
    
    For Arabic and Indic shapers, if the font doesn't have a script system
    for the script, use default shaper.
    
    Make an exception for Arabic script since we have fallback logic for
    that one.

diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 71c9fc1..11d97e1 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -194,12 +194,16 @@ struct hb_ot_map_builder_t
 
   HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
 
+  public:
+
   hb_face_t *face;
   hb_segment_properties_t props;
 
   hb_tag_t chosen_script[2];
   unsigned int script_index[2], language_index[2];
 
+  private:
+
   unsigned int current_stage[2]; /* GSUB/GPOS */
   hb_prealloced_array_t<feature_info_t,16> feature_infos;
   hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index c3e5ba5..ddad5d2 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -135,7 +135,11 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     /* Unicode-6.0 additions */
     case HB_SCRIPT_MANDAIC:
 
-      return &_hb_ot_complex_shaper_arabic;
+      if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
+	  planner->props.script == HB_SCRIPT_ARABIC)
+	return &_hb_ot_complex_shaper_arabic;
+      else
+	return &_hb_ot_complex_shaper_default;
 
 
     /* Unicode-1.1 additions */
@@ -253,7 +257,10 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
     case HB_SCRIPT_SHARADA:
     case HB_SCRIPT_TAKRI:
 
-      return &_hb_ot_complex_shaper_indic;
+      if (planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT)
+	return &_hb_ot_complex_shaper_indic;
+      else
+	return &_hb_ot_complex_shaper_default;
   }
 }
 
commit 9b37b4c5800b158f61602d2aba8a01349e24d251
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 18:23:38 2012 -0800

    Make planner available to complex shaper choosing logic

diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index e3da44b..c3e5ba5 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -115,9 +115,9 @@ HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS
 
 
 static inline const hb_ot_complex_shaper_t *
-hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
+hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 {
-  switch ((hb_tag_t) props->script)
+  switch ((hb_tag_t) planner->props.script)
   {
     default:
       return &_hb_ot_complex_shaper_default;
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 9a6260a..d168ae7 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -175,7 +175,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan,
 
   hb_ot_shape_planner_t planner (shape_plan);
 
-  planner.shaper = hb_ot_shape_complex_categorize (&shape_plan->props);
+  planner.shaper = hb_ot_shape_complex_categorize (&planner);
 
   hb_ot_shape_collect_features (&planner, &shape_plan->props, user_features, num_user_features);
 
commit 6fddf2d7397411bba8a23ac535e8b851495d3105
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 17:57:24 2012 -0800

    Refactoring ot-map building to make chosen script available earlier

diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 7eb85c8..71c9fc1 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -151,7 +151,8 @@ struct hb_ot_map_builder_t
 {
   public:
 
-  hb_ot_map_builder_t (void) { memset (this, 0, sizeof (*this)); }
+  HB_INTERNAL hb_ot_map_builder_t (hb_face_t *face_,
+				   const hb_segment_properties_t *props_);
 
   HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value, bool global, bool has_fallback = false);
 
@@ -163,9 +164,7 @@ struct hb_ot_map_builder_t
   inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
   { add_pause (1, pause_func); }
 
-  HB_INTERNAL void compile (hb_face_t *face,
-			    const hb_segment_properties_t *props,
-			    struct hb_ot_map_t &m);
+  HB_INTERNAL void compile (struct hb_ot_map_t &m);
 
   inline void finish (void) {
     feature_infos.finish ();
@@ -195,6 +194,12 @@ struct hb_ot_map_builder_t
 
   HB_INTERNAL void add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func);
 
+  hb_face_t *face;
+  hb_segment_properties_t props;
+
+  hb_tag_t chosen_script[2];
+  unsigned int script_index[2], language_index[2];
+
   unsigned int current_stage[2]; /* GSUB/GPOS */
   hb_prealloced_array_t<feature_info_t,16> feature_infos;
   hb_prealloced_array_t<pause_info_t, 1> pauses[2]; /* GSUB/GPOS */
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index f290c98..046fa97 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -59,6 +59,30 @@ hb_ot_map_t::add_lookups (hb_face_t    *face,
   } while (len == ARRAY_LENGTH (lookup_indices));
 }
 
+hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
+					  const hb_segment_properties_t *props_)
+{
+  memset (this, 0, sizeof (*this));
+
+  face = face_;
+  props = *props_;
+
+
+  /* Fetch script/language indices for GSUB/GPOS.  We need these later to skip
+   * features not available in either table and not waste precious bits for them. */
+
+  hb_tag_t script_tags[3] = {HB_TAG_NONE, HB_TAG_NONE, HB_TAG_NONE};
+  hb_tag_t language_tag;
+
+  hb_ot_tags_from_script (props.script, &script_tags[0], &script_tags[1]);
+  language_tag = hb_ot_tag_from_language (props.language);
+
+  for (unsigned int table_index = 0; table_index < 2; table_index++) {
+    hb_tag_t table_tag = table_tags[table_index];
+    hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
+    hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
+  }
+}
 
 void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool global, bool has_fallback)
 {
@@ -133,33 +157,16 @@ void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::paus
 }
 
 void
-hb_ot_map_builder_t::compile (hb_face_t *face,
-			      const hb_segment_properties_t *props,
-			      hb_ot_map_t &m)
+hb_ot_map_builder_t::compile (hb_ot_map_t &m)
 {
- m.global_mask = 1;
+  m.global_mask = 1;
+
+  for (unsigned int table_index = 0; table_index < 2; table_index++)
+    m.chosen_script[table_index] = chosen_script[table_index];
 
   if (!feature_infos.len)
     return;
 
-
-  /* Fetch script/language indices for GSUB/GPOS.  We need these later to skip
-   * features not available in either table and not waste precious bits for them. */
-
-  hb_tag_t script_tags[3] = {HB_TAG_NONE};
-  hb_tag_t language_tag;
-
-  hb_ot_tags_from_script (props->script, &script_tags[0], &script_tags[1]);
-  language_tag = hb_ot_tag_from_language (props->language);
-
-  unsigned int script_index[2], language_index[2];
-  for (unsigned int table_index = 0; table_index < 2; table_index++) {
-    hb_tag_t table_tag = table_tags[table_index];
-    hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &m.chosen_script[table_index]);
-    hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
-  }
-
-
   /* Sort features and merge duplicates */
   {
     feature_infos.sort ();
diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh
index ae01215..76bf3ee 100644
--- a/src/hb-ot-shape-private.hh
+++ b/src/hb-ot-shape-private.hh
@@ -65,14 +65,14 @@ struct hb_ot_shape_planner_t
 			 face (master_plan->face),
 			 props (master_plan->props),
 			 shaper (NULL),
-			 map () {}
+			 map (face, &props) {}
   ~hb_ot_shape_planner_t (void) { map.finish (); }
 
   inline void compile (hb_ot_shape_plan_t &plan)
   {
     plan.props = props;
     plan.shaper = shaper;
-    map.compile (face, &props, plan.map);
+    map.compile (plan.map);
   }
 
   private:
commit f17ed8116e7b6429af3fa60bb43d5f4fac66eae3
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 17:48:26 2012 -0800

    Minor TODO

diff --git a/TODO b/TODO
index 226b540..9f8ae3a 100644
--- a/TODO
+++ b/TODO
@@ -27,6 +27,8 @@ General fixes:
 API issues to fix before 1.0:
 ============================
 
+- API to accept a list of languages.
+
 - Add default font_funcs / Unicode funcs API and to utils.
 
 - Add init_func to font_funcs.  Adjust ft.
commit de796a6fb98f4deda276caa82266b7c830978e0b
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 17:27:51 2012 -0800

    Add "new" Myanmar OT Script tag
    
    Windows 8 added support for Myanmar shaping using the "mym2" script tag,
    even though Windows never supported the old "mymr" tag.

diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc
index f24baf7..0004a75 100644
--- a/src/hb-ot-tag.cc
+++ b/src/hb-ot-tag.cc
@@ -93,6 +93,7 @@ hb_ot_new_tag_from_script (hb_script_t script)
     case HB_SCRIPT_ORIYA:		return HB_TAG('o','r','y','2');
     case HB_SCRIPT_TAMIL:		return HB_TAG('t','m','l','2');
     case HB_SCRIPT_TELUGU:		return HB_TAG('t','e','l','2');
+    case HB_SCRIPT_MYANMAR:		return HB_TAG('m','y','m','2');
   }
 
   return HB_OT_TAG_DEFAULT_SCRIPT;
@@ -111,6 +112,7 @@ hb_ot_new_tag_to_script (hb_tag_t tag)
     case HB_TAG('o','r','y','2'):	return HB_SCRIPT_ORIYA;
     case HB_TAG('t','m','l','2'):	return HB_SCRIPT_TAMIL;
     case HB_TAG('t','e','l','2'):	return HB_SCRIPT_TELUGU;
+    case HB_TAG('m','y','m','2'):	return HB_SCRIPT_MYANMAR;
   }
 
   return HB_SCRIPT_UNKNOWN;
diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c
index 81b6678..79e2bbf 100644
--- a/test/api/test-ot-tag.c
+++ b/test/api/test-ot-tag.c
@@ -132,6 +132,7 @@ test_ot_tag_script_indic (void)
   test_indic_tags ("ory2", "orya", HB_SCRIPT_ORIYA);
   test_indic_tags ("tml2", "taml", HB_SCRIPT_TAMIL);
   test_indic_tags ("tel2", "telu", HB_SCRIPT_TELUGU);
+  test_indic_tags ("mym2", "mymr", HB_SCRIPT_MYANMAR);
 }
 
 
commit 27f52dc3f6bbb97594a44f27b180aed73d9e5608
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 16:54:03 2012 -0800

    Add Myanmar tests from UTN#11

diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
index 29cfb2f..7f461ee 100644
--- a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/MANIFEST
@@ -1 +1,2 @@
 misc.txt
+utn11.txt
diff --git a/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt
new file mode 100644
index 0000000..d5cea7c
--- /dev/null
+++ b/test/shaping/texts/in-tree/shaper-indic/south-east-asian/script-myanmar/misc/utn11.txt
@@ -0,0 +1,34 @@
+စာ
+ခါ
+သိက္ခာ
+သဒ္ဓါ
+ညို
+ထုံး
+နေ
+ပေါ
+ဖျား
+ကြေး
+မွေး
+မှု
+ပတ္တာ
+ထင်
+ကြဉ်
+ကော်
+စင်္ကြံ
+သင်္ဘော
+ပသျှူး
+မြွှာ
+သျှောင်
+ကောင်လေးတွေကျောင်းကိုသွားကြတယ်။
+အိပ်ခန်းတံခါးကို
+အိပ်ခန်းတံ⁠ခါးကို
+အင်္ဝေ
+အငွေ
+ယောက်ျား
+ကျွန်ုပ်
+ဝါကျ
+ဂိမှာန်
+ဥယ‌ျာန
+က္လ
+ကျ္လပ်
+နိယ္အ်
commit e9334ce97bb7f1de87fb211bb5a8168033629b14
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 14:57:02 2012 -0800

    Break build when ragel is needed and missing

diff --git a/src/Makefile.am b/src/Makefile.am
index 9f7c7f8..372c10f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -242,7 +242,7 @@ arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt
 .PHONY: unicode-tables arabic-table indic-table
 
 EXTRA_DIST += hb-ot-shape-complex-indic-machine.rl
-hb-ot-shape-complex-indic-machine.hh: hb-ot-shape-complex-indic-machine.rl
+$(srcdir)/hb-ot-shape-complex-indic-machine.hh: hb-ot-shape-complex-indic-machine.rl
 	$(AM_V_GEN)$(top_srcdir)/missing --run ragel -e -F1 -o "$@.tmp" "$<" && \
 	mv "$@.tmp" "$@" || ( $(RM) "$@.tmp" && false )
 
commit dba186711e3f5e723f917b7104e849c4c525d3b8
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 14:48:33 2012 -0800

    [Indic] Make more room in the table
    
    To be used in upcoming commits.

diff --git a/src/hb-ot-shape-complex-indic-private.hh b/src/hb-ot-shape-complex-indic-private.hh
index 91b0be5..d44e82b 100644
--- a/src/hb-ot-shape-complex-indic-private.hh
+++ b/src/hb-ot-shape-complex-indic-private.hh
@@ -39,7 +39,7 @@
 #define indic_position() complex_var_u8_1() /* indic_matra_category_t */
 
 
-#define INDIC_TABLE_ELEMENT_TYPE uint8_t
+#define INDIC_TABLE_ELEMENT_TYPE uint16_t
 
 /* Cateories used in the OpenType spec:
  * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
@@ -146,8 +146,8 @@ enum indic_matra_category_t {
  * because gcc fails to optimize the latter and fills the table in at runtime. */
 #define INDIC_COMBINE_CATEGORIES(S,M) \
   (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || (S == INDIC_SYLLABIC_CATEGORY_VIRAMA || S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT)) + \
-   ASSERT_STATIC_EXPR_ZERO (S < 16 && M < 16) + \
-   ((M << 4) | S))
+   ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+   ((M << 8) | S))
 
 
 #include "hb-ot-shape-complex-indic-table.hh"
@@ -304,8 +304,8 @@ set_indic_properties (hb_glyph_info_t &info)
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = get_indic_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x0F);
-  indic_position_t pos = (indic_position_t) (type >> 4);
+  indic_category_t cat = (indic_category_t) (type & 0x7F);
+  indic_position_t pos = (indic_position_t) (type >> 8);
 
 
   /*
commit c4be9917438c45b972ec76dc68409014110f0837
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 14:27:33 2012 -0800

    Typo

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 73a68fe..32b9cf5 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -523,7 +523,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
 	     * half form.
 	     * A ZWJ before a Halant, requests a subjoined form instead, and hence
 	     * search continues.  This is particularly important for Bengali
-	     * sequence Ra,H,Ya that shouls form Ya-Phalaa by subjoining Ya. */
+	     * sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya. */
 	    if (start < i &&
 		info[i].indic_category() == OT_ZWJ &&
 		info[i - 1].indic_category() == OT_H)
commit 56be677781736bbedc80df6f6aaa2b5f0bc4041c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 14:09:40 2012 -0800

    [Indic] Port 'pref' logic to look into font tables
    
    ...instead of using a hardcoded list of Ra characters.

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 36da948..73a68fe 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -734,9 +734,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
   if (indic_plan->mask_array[PREF] && base + 2 < end)
   {
     /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
-    for (unsigned int i = base + 1; i + 1 < end; i++)
-      if (is_halant_or_coeng (info[i + (indic_plan->is_old_spec ? 1 : 0)]) &&
-	  info[i + (indic_plan->is_old_spec ? 0 : 1)].indic_category() == OT_Ra)
+    for (unsigned int i = base + 1; i + 1 < end; i++) {
+      hb_codepoint_t glyphs[2] = {info[i].codepoint, info[i + 1].codepoint};
+      if (indic_plan->pref.would_substitute (glyphs, ARRAY_LENGTH (glyphs), true, face))
       {
 	info[i++].mask |= indic_plan->mask_array[PREF];
 	info[i++].mask |= indic_plan->mask_array[PREF];
@@ -752,6 +752,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
 
 	break;
       }
+    }
   }
 
   /* Apply ZWJ/ZWNJ effects */
commit f2c0f59043c93c225274fc0c8177077d16c89d61
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 14:02:02 2012 -0800

    [Indic] Port reph handling logic to look into font features
    
    ...instead of using a hardcoded list of Ra characters.

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 8ed6aba..36da948 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -305,6 +305,7 @@ struct indic_shape_plan_t
   bool is_old_spec;
   hb_codepoint_t virama_glyph;
 
+  would_substitute_feature_t rphf;
   would_substitute_feature_t pref;
   would_substitute_feature_t blwf;
   would_substitute_feature_t pstf;
@@ -329,6 +330,7 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
   indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.get_chosen_script (0) & 0x000000FF) != '2');
   indic_plan->virama_glyph = (hb_codepoint_t) -1;
 
+  indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'));
   indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'));
   indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'));
   indic_plan->pstf.init (&plan->map, HB_TAG('p','s','t','f'));
@@ -430,7 +432,9 @@ update_consonant_positions (const hb_ot_shape_plan_t *plan,
  * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */
 
 static void
-initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer,
+initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
+				       hb_face_t *face,
+				       hb_buffer_t *buffer,
 				       unsigned int start, unsigned int end)
 {
   const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data;
@@ -461,18 +465,21 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer
     unsigned int limit = start;
     if (indic_plan->mask_array[RPHF] &&
 	start + 3 <= end &&
-	info[start].indic_category() == OT_Ra &&
-	info[start + 1].indic_category() == OT_H &&
 	(/* TODO Handle other Reph modes. */
 	 (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) ||
 	 (indic_plan->config->reph_mode == REPH_MODE_EXPLICIT && info[start + 2].indic_category() == OT_ZWJ)
 	))
     {
-      limit += 2;
-      while (limit < end && is_joiner (info[limit]))
-        limit++;
-      base = start;
-      has_reph = true;
+      /* See if it matches the 'rphf' feature. */
+      hb_codepoint_t glyphs[2] = {info[start].codepoint, info[start + 1].codepoint};
+      if (indic_plan->rphf.would_substitute (glyphs, ARRAY_LENGTH (glyphs), true, face))
+      {
+	limit += 2;
+	while (limit < end && is_joiner (info[limit]))
+	  limit++;
+	base = start;
+	has_reph = true;
+      }
     };
 
     switch (indic_plan->config->base_pos)
@@ -770,15 +777,17 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, hb_buffer
 
 static void
 initial_reordering_vowel_syllable (const hb_ot_shape_plan_t *plan,
+				   hb_face_t *face,
 				   hb_buffer_t *buffer,
 				   unsigned int start, unsigned int end)
 {
   /* We made the vowels look like consonants.  So let's call the consonant logic! */
-  initial_reordering_consonant_syllable (plan, buffer, start, end);
+  initial_reordering_consonant_syllable (plan, face, buffer, start, end);
 }
 
 static void
 initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
+				       hb_face_t *face,
 				       hb_buffer_t *buffer,
 				       unsigned int start, unsigned int end)
 {
@@ -794,20 +803,22 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan,
       return;
   }
 
-  initial_reordering_consonant_syllable (plan, buffer, start, end);
+  initial_reordering_consonant_syllable (plan, face, buffer, start, end);
 }
 
 static void
 initial_reordering_broken_cluster (const hb_ot_shape_plan_t *plan,
+				   hb_face_t *face,
 				   hb_buffer_t *buffer,
 				   unsigned int start, unsigned int end)
 {
   /* We already inserted dotted-circles, so just call the standalone_cluster. */
-  initial_reordering_standalone_cluster (plan, buffer, start, end);
+  initial_reordering_standalone_cluster (plan, face, buffer, start, end);
 }
 
 static void
 initial_reordering_non_indic_cluster (const hb_ot_shape_plan_t *plan HB_UNUSED,
+				      hb_face_t *face HB_UNUSED,
 				      hb_buffer_t *buffer HB_UNUSED,
 				      unsigned int start HB_UNUSED, unsigned int end HB_UNUSED)
 {
@@ -818,16 +829,17 @@ initial_reordering_non_indic_cluster (const hb_ot_shape_plan_t *plan HB_UNUSED,
 
 static void
 initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
+			     hb_face_t *face,
 			     hb_buffer_t *buffer,
 			     unsigned int start, unsigned int end)
 {
   syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F);
   switch (syllable_type) {
-  case consonant_syllable:	initial_reordering_consonant_syllable (plan, buffer, start, end); return;
-  case vowel_syllable:		initial_reordering_vowel_syllable     (plan, buffer, start, end); return;
-  case standalone_cluster:	initial_reordering_standalone_cluster (plan, buffer, start, end); return;
-  case broken_cluster:		initial_reordering_broken_cluster     (plan, buffer, start, end); return;
-  case non_indic_cluster:	initial_reordering_non_indic_cluster  (plan, buffer, start, end); return;
+  case consonant_syllable:	initial_reordering_consonant_syllable (plan, face, buffer, start, end); return;
+  case vowel_syllable:		initial_reordering_vowel_syllable     (plan, face, buffer, start, end); return;
+  case standalone_cluster:	initial_reordering_standalone_cluster (plan, face, buffer, start, end); return;
+  case broken_cluster:		initial_reordering_broken_cluster     (plan, face, buffer, start, end); return;
+  case non_indic_cluster:	initial_reordering_non_indic_cluster  (plan, face, buffer, start, end); return;
   }
 }
 
@@ -895,11 +907,11 @@ initial_reordering (const hb_ot_shape_plan_t *plan,
   unsigned int last_syllable = info[0].syllable();
   for (unsigned int i = 1; i < count; i++)
     if (last_syllable != info[i].syllable()) {
-      initial_reordering_syllable (plan, buffer, last, i);
+      initial_reordering_syllable (plan, font->face, buffer, last, i);
       last = i;
       last_syllable = info[last].syllable();
     }
-  initial_reordering_syllable (plan, buffer, last, count);
+  initial_reordering_syllable (plan, font->face, buffer, last, count);
 }
 
 static void
commit 43149afbc0007ea075a7017c0e56056c3c0f3614
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 13:34:17 2012 -0800

    Route MEETEI_MAYEK through the Indic shaper
    
    Since it has a couple of left-"matras".

diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index 065264e..e3da44b 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -171,9 +171,6 @@ hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
     /* Unicode-5.1 additions */
     case HB_SCRIPT_SAURASHTRA:
 
-    /* Unicode-5.2 additions */
-    case HB_SCRIPT_MEETEI_MAYEK:
-
     /* Unicode-6.0 additions */
     case HB_SCRIPT_BATAK:
     case HB_SCRIPT_BRAHMI:
@@ -247,8 +244,10 @@ hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
     /* Unicode-5.2 additions */
     case HB_SCRIPT_JAVANESE:
     case HB_SCRIPT_KAITHI:
+    case HB_SCRIPT_MEETEI_MAYEK:
     case HB_SCRIPT_TAI_THAM:
 
+
     /* Unicode-6.1 additions */
     case HB_SCRIPT_CHAKMA:
     case HB_SCRIPT_SHARADA:
commit d0905c3400085f9c0901c558ba1b81b5039510e4
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 13:02:20 2012 -0800

    Minor

diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh
index 0934168..3949531 100644
--- a/src/hb-ot-head-table.hh
+++ b/src/hb-ot-head-table.hh
@@ -47,7 +47,7 @@ struct head
 
   inline unsigned int get_upem (void) const {
     unsigned int upem = unitsPerEm;
-    /* If no valid head table found, assume 1000, which matches typicaly Type1 usage. */
+    /* If no valid head table found, assume 1000, which matches typical Type1 usage. */
     return 16 <= upem && upem <= 16384 ? upem : 1000;
   }
 
commit 365f27ab5ba025bf1be6a882ed213c695cbfed7e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 11:16:57 2012 -0800

    Work around older compilers
    
    As reported on the list:
    
    I am seeing a similar problem building harfbuzz 0.9.5 with Apple gcc
    4.0.1 on OS X 10.5 Leopard:
    
    hb-ot-layout-common-private.hh:406: error: 'struct
    OT::CoverageFormat1::Iter' is private
    hb-ot-layout-common-private.hh:646: error: within this context
    hb-ot-layout-common-private.hh:500: error: 'struct
    OT::CoverageFormat2::Iter' is private
    hb-ot-layout-common-private.hh:647: error: within this context
    make[4]: *** [libharfbuzz_la-hb-ot-layout.lo] Error 1
    
    Also reported as happening with MSVC 2005.

diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh
index f5a067a..bfb3bdb 100644
--- a/src/hb-ot-layout-common-private.hh
+++ b/src/hb-ot-layout-common-private.hh
@@ -403,6 +403,8 @@ struct CoverageFormat1
       glyphs->add (glyphArray[i]);
   }
 
+  public:
+  /* Older compilers need this to be public. */
   struct Iter {
     inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; };
     inline bool more (void) { return i < c->glyphArray.len; }
@@ -414,6 +416,7 @@ struct CoverageFormat1
     const struct CoverageFormat1 *c;
     unsigned int i;
   };
+  private:
 
   protected:
   USHORT	coverageFormat;	/* Format identifier--format = 1 */
@@ -497,6 +500,8 @@ struct CoverageFormat2
       rangeRecord[i].add_coverage (glyphs);
   }
 
+  public:
+  /* Older compilers need this to be public. */
   struct Iter {
     inline void init (const CoverageFormat2 &c_) {
       c = &c_;
@@ -522,6 +527,7 @@ struct CoverageFormat2
     const struct CoverageFormat2 *c;
     unsigned int i, j, coverage;
   };
+  private:
 
   protected:
   USHORT	coverageFormat;	/* Format identifier--format = 2 */
commit 6b389ddc3623d042ded4731f4d62dc354002fdd0
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 11:02:56 2012 -0800

    [Indic] Don't apply 'liga'
    
    Uniscribe doesn't.  And some fonts abuse this feature to get Indic
    shaping working in non-complex applications like Adobe's apps.
    
    No change in numbers:
    
    BENGALI: 353897 out of 354188 tests passed. 291 failed (0.0821598%)
    DEVANAGARI: 707337 out of 707394 tests passed. 57 failed (0.00805774%)
    GUJARATI: 366440 out of 366457 tests passed. 17 failed (0.00463902%)
    GURMUKHI: 60704 out of 60747 tests passed. 43 failed (0.0707854%)
    KANNADA: 951046 out of 951913 tests passed. 867 failed (0.0910798%)
    KHMER: 299074 out of 299124 tests passed. 50 failed (0.0167155%)
    LAO: 53611 out of 53644 tests passed. 33 failed (0.0615167%)
    MALAYALAM: 1048011 out of 1048334 tests passed. 323 failed (0.0308108%)
    ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%)
    SINHALA: 271666 out of 271847 tests passed. 181 failed (0.0665816%)
    TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%)
    TELUGU: 970557 out of 970573 tests passed. 16 failed (0.00164851%)
    TIBETAN: 208469 out of 208469 tests passed. 0 failed (0%)

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 30a9a1f..8ed6aba 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -247,6 +247,8 @@ override_features_indic (hb_ot_shape_planner_t *plan)
   /* Uniscribe does not apply 'kern'. */
   if (indic_options ().uniscribe_bug_compatible)
     plan->map.add_feature (HB_TAG('k','e','r','n'), 0, true);
+
+  plan->map.add_feature (HB_TAG('l','i','g','a'), 0, true);
 }
 
 
commit d05ac7dc3f2949e85f1fe996315b31b7aae370fe
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 10:26:50 2012 -0800

    Fix hb-ft glyph name for broken fonts that return empty glyph names

diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index 9ac556e..6198185 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -242,7 +242,7 @@ hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED,
   FT_Face ft_face = (FT_Face) font_data;
 
   hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size);
-  if (!ret)
+  if (!ret || (size && !*name))
     snprintf (name, size, "gid%u", glyph);
 
   return ret;
commit 3bc22eb7b843c77706bb13fc332009097f247813
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Nov 12 10:07:28 2012 -0800

    Minor

diff --git a/util/options.cc b/util/options.cc
index dc7aeed..9dbc2b1 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -313,7 +313,7 @@ shape_options_t::add_options (option_parser_t *parser)
     "\n"
     "    Mixing it all:\n"
     "\n"
-    "      \"kern[3:5]=0\" 1         3         5         # Turn feature off for range";
+    "      \"aalt[3:5]=2\" 2         3         5         # Turn 2nd alternate on for range";
 
   GOptionEntry entries2[] =
   {



More information about the HarfBuzz mailing list