mono_unicode_from_external (const gchar * in, gsize * bytes)
{
  gunichar2 * D.4739;
  int D.4636;
  int iftmp.0;
  int D.4635;
  unsigned int i.1;
  unsigned int D.4746;
  gchar * * D.4747;
  const char[15] * D.4748;
  unsigned char D.4749;
  int D.4750;
  unsigned char D.4751;
  int D.4752;
  const unsigned char * D.4757;
  unsigned char D.4758;
  int D.4759;
  const unsigned char * D.4760;
  unsigned char D.4761;
  int D.4762;
  const unsigned char * D.4767;
  unsigned char D.4768;
  int D.4769;
  const unsigned char * D.4770;
  unsigned char D.4771;
  int D.4772;
  const unsigned char * D.4777;
  unsigned char D.4778;
  int D.4779;
  const unsigned char * D.4780;
  unsigned char D.4781;
  int D.4782;
  gchar * D.4784;
  long int lbytes.2;
  unsigned int lbytes.3;
  unsigned int D.4792;
  int D.4793;
  unsigned int D.4798;
  unsigned int D.4799;
  int D.4800;
  gchar * res;
  gchar * * encodings;
  const gchar * encoding_list;
  int i;
  glong lbytes;

  try
    {
      res = 0B;
      if (in == 0B) goto <D.4737>; else goto <D.4738>;
      <D.4737>:
      D.4739 = 0B;
      return D.4739;
      <D.4738>:
      encoding_list = monoeg_g_getenv ("MONO_EXTERNAL_ENCODINGS");
      if (encoding_list == 0B) goto <D.4740>; else goto <D.4741>;
      <D.4740>:
      encoding_list = "";
      <D.4741>:
      encodings = monoeg_g_strsplit (encoding_list, ":", 0);
      i = 0;
      goto <D.4640>;
      <D.4639>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 14;
        if (__s2_len <= 3) goto <D.4743>; else goto <D.4744>;
        <D.4743>:
        {
          const unsigned char * __s2;
          int __result;

          i.1 = (unsigned int) i;
          D.4746 = i.1 * 4;
          D.4747 = encodings + D.4746;
          __s2 = *D.4747;
          D.4748 = "default_locale";
          D.4749 = MEM[(const unsigned char *)D.4748];
          D.4750 = (int) D.4749;
          D.4751 = *__s2;
          D.4752 = (int) D.4751;
          __result = D.4750 - D.4752;
          {
            if (__s2_len != 0) goto <D.4753>; else goto <D.4754>;
            <D.4753>:
            if (__result == 0) goto <D.4755>; else goto <D.4756>;
            <D.4755>:
            D.4757 = &MEM[(void *)"default_locale" + 1B];
            D.4758 = *D.4757;
            D.4759 = (int) D.4758;
            D.4760 = __s2 + 1;
            D.4761 = *D.4760;
            D.4762 = (int) D.4761;
            __result = D.4759 - D.4762;
            if (__s2_len > 1) goto <D.4763>; else goto <D.4764>;
            <D.4763>:
            if (__result == 0) goto <D.4765>; else goto <D.4766>;
            <D.4765>:
            D.4767 = &MEM[(void *)"default_locale" + 2B];
            D.4768 = *D.4767;
            D.4769 = (int) D.4768;
            D.4770 = __s2 + 2;
            D.4771 = *D.4770;
            D.4772 = (int) D.4771;
            __result = D.4769 - D.4772;
            if (__s2_len > 2) goto <D.4773>; else goto <D.4774>;
            <D.4773>:
            if (__result == 0) goto <D.4775>; else goto <D.4776>;
            <D.4775>:
            D.4777 = &MEM[(void *)"default_locale" + 3B];
            D.4778 = *D.4777;
            D.4779 = (int) D.4778;
            D.4780 = __s2 + 3;
            D.4781 = *D.4780;
            D.4782 = (int) D.4781;
            __result = D.4779 - D.4782;
            <D.4776>:
            <D.4774>:
            <D.4766>:
            <D.4764>:
            <D.4756>:
            <D.4754>:
          }
          D.4635 = __result;
        }
        iftmp.0 = -D.4635;
        goto <D.4783>;
        <D.4744>:
        i.1 = (unsigned int) i;
        D.4746 = i.1 * 4;
        D.4747 = encodings + D.4746;
        D.4784 = *D.4747;
        iftmp.0 = __builtin_strcmp (D.4784, "default_locale");
        <D.4783>:
        D.4636 = iftmp.0;
      }
      if (D.4636 == 0) goto <D.4785>; else goto <D.4786>;
      <D.4785>:
      {
        gchar * utf8;

        utf8 = monoeg_g_locale_to_utf8 (in, -1, 0B, 0B, 0B);
        if (utf8 != 0B) goto <D.4787>; else goto <D.4788>;
        <D.4787>:
        res = monoeg_g_utf8_to_utf16 (utf8, -1, 0B, &lbytes, 0B);
        lbytes.2 = lbytes;
        lbytes.3 = (unsigned int) lbytes.2;
        *bytes = lbytes.3;
        <D.4788>:
        monoeg_g_free (utf8);
      }
      goto <D.4791>;
      <D.4786>:
      D.4792 = strlen (in);
      D.4793 = (int) D.4792;
      i.1 = (unsigned int) i;
      D.4746 = i.1 * 4;
      D.4747 = encodings + D.4746;
      D.4784 = *D.4747;
      res = monoeg_g_convert (in, D.4793, "UTF8", D.4784, 0B, bytes, 0B);
      if (res != 0B) goto <D.4794>; else goto <D.4795>;
      <D.4794>:
      {
        gchar * ptr;

        ptr = res;
        res = monoeg_g_utf8_to_utf16 (res, -1, 0B, &lbytes, 0B);
        lbytes.2 = lbytes;
        lbytes.3 = (unsigned int) lbytes.2;
        *bytes = lbytes.3;
        monoeg_g_free (ptr);
      }
      <D.4795>:
      <D.4791>:
      if (res != 0B) goto <D.4796>; else goto <D.4797>;
      <D.4796>:
      monoeg_g_strfreev (encodings);
      D.4798 = *bytes;
      D.4799 = D.4798 * 2;
      *bytes = D.4799;
      D.4739 = res;
      return D.4739;
      <D.4797>:
      i = i + 1;
      <D.4640>:
      i.1 = (unsigned int) i;
      D.4746 = i.1 * 4;
      D.4747 = encodings + D.4746;
      D.4784 = *D.4747;
      if (D.4784 != 0B) goto <D.4639>; else goto <D.4641>;
      <D.4641>:
      monoeg_g_strfreev (encodings);
      D.4800 = monoeg_g_utf8_validate (in, -1, 0B);
      if (D.4800 != 0) goto <D.4801>; else goto <D.4802>;
      <D.4801>:
      {
        gunichar2 * unires;

        unires = monoeg_g_utf8_to_utf16 (in, -1, 0B, bytes, 0B);
        D.4798 = *bytes;
        D.4799 = D.4798 * 2;
        *bytes = D.4799;
        D.4739 = unires;
        return D.4739;
      }
      <D.4802>:
      D.4739 = 0B;
      return D.4739;
    }
  finally
    {
      lbytes = {CLOBBER};
    }
}


mono_utf8_from_external (const gchar * in)
{
  gchar * D.4807;
  int D.4658;
  int iftmp.4;
  int D.4657;
  unsigned int i.5;
  unsigned int D.4814;
  gchar * * D.4815;
  const char[15] * D.4816;
  unsigned char D.4817;
  int D.4818;
  unsigned char D.4819;
  int D.4820;
  const unsigned char * D.4825;
  unsigned char D.4826;
  int D.4827;
  const unsigned char * D.4828;
  unsigned char D.4829;
  int D.4830;
  const unsigned char * D.4835;
  unsigned char D.4836;
  int D.4837;
  const unsigned char * D.4838;
  unsigned char D.4839;
  int D.4840;
  const unsigned char * D.4845;
  unsigned char D.4846;
  int D.4847;
  const unsigned char * D.4848;
  unsigned char D.4849;
  int D.4850;
  gchar * D.4852;
  int D.4857;
  int D.4863;
  gchar * res;
  gchar * * encodings;
  const gchar * encoding_list;
  int i;

  res = 0B;
  if (in == 0B) goto <D.4805>; else goto <D.4806>;
  <D.4805>:
  D.4807 = 0B;
  return D.4807;
  <D.4806>:
  encoding_list = monoeg_g_getenv ("MONO_EXTERNAL_ENCODINGS");
  if (encoding_list == 0B) goto <D.4808>; else goto <D.4809>;
  <D.4808>:
  encoding_list = "";
  <D.4809>:
  encodings = monoeg_g_strsplit (encoding_list, ":", 0);
  i = 0;
  goto <D.4660>;
  <D.4659>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 14;
    if (__s2_len <= 3) goto <D.4811>; else goto <D.4812>;
    <D.4811>:
    {
      const unsigned char * __s2;
      int __result;

      i.5 = (unsigned int) i;
      D.4814 = i.5 * 4;
      D.4815 = encodings + D.4814;
      __s2 = *D.4815;
      D.4816 = "default_locale";
      D.4817 = MEM[(const unsigned char *)D.4816];
      D.4818 = (int) D.4817;
      D.4819 = *__s2;
      D.4820 = (int) D.4819;
      __result = D.4818 - D.4820;
      {
        if (__s2_len != 0) goto <D.4821>; else goto <D.4822>;
        <D.4821>:
        if (__result == 0) goto <D.4823>; else goto <D.4824>;
        <D.4823>:
        D.4825 = &MEM[(void *)"default_locale" + 1B];
        D.4826 = *D.4825;
        D.4827 = (int) D.4826;
        D.4828 = __s2 + 1;
        D.4829 = *D.4828;
        D.4830 = (int) D.4829;
        __result = D.4827 - D.4830;
        if (__s2_len > 1) goto <D.4831>; else goto <D.4832>;
        <D.4831>:
        if (__result == 0) goto <D.4833>; else goto <D.4834>;
        <D.4833>:
        D.4835 = &MEM[(void *)"default_locale" + 2B];
        D.4836 = *D.4835;
        D.4837 = (int) D.4836;
        D.4838 = __s2 + 2;
        D.4839 = *D.4838;
        D.4840 = (int) D.4839;
        __result = D.4837 - D.4840;
        if (__s2_len > 2) goto <D.4841>; else goto <D.4842>;
        <D.4841>:
        if (__result == 0) goto <D.4843>; else goto <D.4844>;
        <D.4843>:
        D.4845 = &MEM[(void *)"default_locale" + 3B];
        D.4846 = *D.4845;
        D.4847 = (int) D.4846;
        D.4848 = __s2 + 3;
        D.4849 = *D.4848;
        D.4850 = (int) D.4849;
        __result = D.4847 - D.4850;
        <D.4844>:
        <D.4842>:
        <D.4834>:
        <D.4832>:
        <D.4824>:
        <D.4822>:
      }
      D.4657 = __result;
    }
    iftmp.4 = -D.4657;
    goto <D.4851>;
    <D.4812>:
    i.5 = (unsigned int) i;
    D.4814 = i.5 * 4;
    D.4815 = encodings + D.4814;
    D.4852 = *D.4815;
    iftmp.4 = __builtin_strcmp (D.4852, "default_locale");
    <D.4851>:
    D.4658 = iftmp.4;
  }
  if (D.4658 == 0) goto <D.4853>; else goto <D.4854>;
  <D.4853>:
  res = monoeg_g_locale_to_utf8 (in, -1, 0B, 0B, 0B);
  if (res != 0B) goto <D.4855>; else goto <D.4856>;
  <D.4855>:
  D.4857 = monoeg_g_utf8_validate (res, -1, 0B);
  if (D.4857 == 0) goto <D.4858>; else goto <D.4859>;
  <D.4858>:
  monoeg_g_free (res);
  res = 0B;
  <D.4859>:
  <D.4856>:
  goto <D.4860>;
  <D.4854>:
  i.5 = (unsigned int) i;
  D.4814 = i.5 * 4;
  D.4815 = encodings + D.4814;
  D.4852 = *D.4815;
  res = monoeg_g_convert (in, -1, "UTF8", D.4852, 0B, 0B, 0B);
  <D.4860>:
  if (res != 0B) goto <D.4861>; else goto <D.4862>;
  <D.4861>:
  monoeg_g_strfreev (encodings);
  D.4807 = res;
  return D.4807;
  <D.4862>:
  i = i + 1;
  <D.4660>:
  i.5 = (unsigned int) i;
  D.4814 = i.5 * 4;
  D.4815 = encodings + D.4814;
  D.4852 = *D.4815;
  if (D.4852 != 0B) goto <D.4659>; else goto <D.4661>;
  <D.4661>:
  monoeg_g_strfreev (encodings);
  D.4863 = monoeg_g_utf8_validate (in, -1, 0B);
  if (D.4863 != 0) goto <D.4864>; else goto <D.4865>;
  <D.4864>:
  D.4807 = monoeg_strdup (in);
  return D.4807;
  <D.4865>:
  D.4807 = 0B;
  return D.4807;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.4869;

  if (str != 0B) goto <D.4867>; else goto <D.4868>;
  <D.4867>:
  D.4869 = __strdup (str);
  return D.4869;
  <D.4868>:
  D.4869 = 0B;
  return D.4869;
}


mono_unicode_to_external (const gunichar2 * uni)
{
  _Bool D.4871;
  long int D.4872;
  long int D.4873;
  gchar * D.4878;
  int D.4678;
  int iftmp.6;
  int D.4677;
  unsigned int i.7;
  unsigned int D.4883;
  gchar * * D.4884;
  const char[15] * D.4885;
  unsigned char D.4886;
  int D.4887;
  unsigned char D.4888;
  int D.4889;
  const unsigned char * D.4894;
  unsigned char D.4895;
  int D.4896;
  const unsigned char * D.4897;
  unsigned char D.4898;
  int D.4899;
  const unsigned char * D.4904;
  unsigned char D.4905;
  int D.4906;
  const unsigned char * D.4907;
  unsigned char D.4908;
  int D.4909;
  const unsigned char * D.4914;
  unsigned char D.4915;
  int D.4916;
  const unsigned char * D.4917;
  unsigned char D.4918;
  int D.4919;
  gchar * D.4921;
  gchar * utf8;
  const gchar * encoding_list;

  utf8 = monoeg_g_utf16_to_utf8 (uni, -1, 0B, 0B, 0B);
  D.4871 = utf8 == 0B;
  D.4872 = (long int) D.4871;
  D.4873 = __builtin_expect (D.4872, 0);
  if (D.4873 != 0) goto <D.4874>; else goto <D.4875>;
  <D.4874>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "strenc.c", 183, "utf8!=NULL");
  <D.4875>:
  encoding_list = monoeg_g_getenv ("MONO_EXTERNAL_ENCODINGS");
  if (encoding_list == 0B) goto <D.4876>; else goto <D.4877>;
  <D.4876>:
  D.4878 = utf8;
  return D.4878;
  <D.4877>:
  {
    gchar * res;
    gchar * * encodings;
    int i;

    encodings = monoeg_g_strsplit (encoding_list, ":", 0);
    i = 0;
    goto <D.4680>;
    <D.4679>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 14;
      if (__s2_len <= 3) goto <D.4880>; else goto <D.4881>;
      <D.4880>:
      {
        const unsigned char * __s2;
        int __result;

        i.7 = (unsigned int) i;
        D.4883 = i.7 * 4;
        D.4884 = encodings + D.4883;
        __s2 = *D.4884;
        D.4885 = "default_locale";
        D.4886 = MEM[(const unsigned char *)D.4885];
        D.4887 = (int) D.4886;
        D.4888 = *__s2;
        D.4889 = (int) D.4888;
        __result = D.4887 - D.4889;
        {
          if (__s2_len != 0) goto <D.4890>; else goto <D.4891>;
          <D.4890>:
          if (__result == 0) goto <D.4892>; else goto <D.4893>;
          <D.4892>:
          D.4894 = &MEM[(void *)"default_locale" + 1B];
          D.4895 = *D.4894;
          D.4896 = (int) D.4895;
          D.4897 = __s2 + 1;
          D.4898 = *D.4897;
          D.4899 = (int) D.4898;
          __result = D.4896 - D.4899;
          if (__s2_len > 1) goto <D.4900>; else goto <D.4901>;
          <D.4900>:
          if (__result == 0) goto <D.4902>; else goto <D.4903>;
          <D.4902>:
          D.4904 = &MEM[(void *)"default_locale" + 2B];
          D.4905 = *D.4904;
          D.4906 = (int) D.4905;
          D.4907 = __s2 + 2;
          D.4908 = *D.4907;
          D.4909 = (int) D.4908;
          __result = D.4906 - D.4909;
          if (__s2_len > 2) goto <D.4910>; else goto <D.4911>;
          <D.4910>:
          if (__result == 0) goto <D.4912>; else goto <D.4913>;
          <D.4912>:
          D.4914 = &MEM[(void *)"default_locale" + 3B];
          D.4915 = *D.4914;
          D.4916 = (int) D.4915;
          D.4917 = __s2 + 3;
          D.4918 = *D.4917;
          D.4919 = (int) D.4918;
          __result = D.4916 - D.4919;
          <D.4913>:
          <D.4911>:
          <D.4903>:
          <D.4901>:
          <D.4893>:
          <D.4891>:
        }
        D.4677 = __result;
      }
      iftmp.6 = -D.4677;
      goto <D.4920>;
      <D.4881>:
      i.7 = (unsigned int) i;
      D.4883 = i.7 * 4;
      D.4884 = encodings + D.4883;
      D.4921 = *D.4884;
      iftmp.6 = __builtin_strcmp (D.4921, "default_locale");
      <D.4920>:
      D.4678 = iftmp.6;
    }
    if (D.4678 == 0) goto <D.4922>; else goto <D.4923>;
    <D.4922>:
    res = monoeg_g_locale_from_utf8 (utf8, -1, 0B, 0B, 0B);
    goto <D.4924>;
    <D.4923>:
    i.7 = (unsigned int) i;
    D.4883 = i.7 * 4;
    D.4884 = encodings + D.4883;
    D.4921 = *D.4884;
    res = monoeg_g_convert (utf8, -1, D.4921, "UTF8", 0B, 0B, 0B);
    <D.4924>:
    if (res != 0B) goto <D.4925>; else goto <D.4926>;
    <D.4925>:
    monoeg_g_free (utf8);
    monoeg_g_strfreev (encodings);
    D.4878 = res;
    return D.4878;
    <D.4926>:
    i = i + 1;
    <D.4680>:
    i.7 = (unsigned int) i;
    D.4883 = i.7 * 4;
    D.4884 = encodings + D.4883;
    D.4921 = *D.4884;
    if (D.4921 != 0B) goto <D.4679>; else goto <D.4681>;
    <D.4681>:
    monoeg_g_strfreev (encodings);
  }
  D.4878 = utf8;
  return D.4878;
}


mono_utf8_validate_and_len (const gchar * source, glong * oLength, const gchar * * oEnd)
{
  unsigned char D.4928;
  int D.4929;
  char D.4930;
  int D.4931;
  int D.4932;
  signed char a.8;
  unsigned char D.4937;
  guchar * D.4940;
  unsigned char D.4941;
  guchar * D.4946;
  unsigned char D.4947;
  guchar * D.4963;
  unsigned char D.4964;
  unsigned char D.4965;
  unsigned char D.4970;
  unsigned char D.4979;
  long int D.4990;
  long int D.4991;
  gboolean D.4996;
  gboolean retVal;
  gboolean lastRet;
  guchar * ptr;
  guchar * srcPtr;
  guint length;
  guchar a;

  retVal = 1;
  lastRet = 1;
  ptr = source;
  *oLength = 0;
  goto <D.4706>;
  <D.4705>:
  D.4928 = *ptr;
  D.4929 = (int) D.4928;
  D.4930 = trailingBytesForUTF8[D.4929];
  D.4931 = (int) D.4930;
  D.4932 = D.4931 + 1;
  length = (guint) D.4932;
  srcPtr = ptr + length;
  switch (length) <default: <D.4693>, case 1: <D.4704>, case 2: <D.4696>, case 3: <D.4695>, case 4: <D.4694>>
  <D.4693>:
  retVal = 0;
  <D.4694>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.8 = (signed char) a;
  if (a.8 >= 0) goto <D.4933>; else goto <D.4936>;
  <D.4936>:
  if (a > 191) goto <D.4933>; else goto <D.4934>;
  <D.4933>:
  retVal = 0;
  <D.4934>:
  D.4937 = a + 66;
  if (D.4937 <= 1) goto <D.4938>; else goto <D.4939>;
  <D.4938>:
  D.4940 = srcPtr + 4294967295;
  D.4941 = *D.4940;
  if (D.4941 == 191) goto <D.4942>; else goto <D.4943>;
  <D.4942>:
  D.4946 = srcPtr + 4294967294;
  D.4947 = *D.4946;
  if (D.4947 == 143) goto <D.4944>; else goto <D.4948>;
  <D.4948>:
  D.4946 = srcPtr + 4294967294;
  D.4947 = *D.4946;
  if (D.4947 == 159) goto <D.4944>; else goto <D.4949>;
  <D.4949>:
  D.4946 = srcPtr + 4294967294;
  D.4947 = *D.4946;
  if (D.4947 == 175) goto <D.4944>; else goto <D.4950>;
  <D.4950>:
  D.4946 = srcPtr + 4294967294;
  D.4947 = *D.4946;
  if (D.4947 == 191) goto <D.4944>; else goto <D.4945>;
  <D.4944>:
  retVal = 0;
  <D.4945>:
  <D.4943>:
  <D.4939>:
  <D.4695>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.8 = (signed char) a;
  if (a.8 >= 0) goto <D.4951>; else goto <D.4953>;
  <D.4953>:
  if (a > 191) goto <D.4951>; else goto <D.4952>;
  <D.4951>:
  retVal = 0;
  <D.4952>:
  <D.4696>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.8 = (signed char) a;
  if (a.8 >= 0) goto <D.4954>; else goto <D.4956>;
  <D.4956>:
  if (a > 191) goto <D.4954>; else goto <D.4955>;
  <D.4954>:
  retVal = 0;
  <D.4955>:
  D.4928 = *ptr;
  D.4929 = (int) D.4928;
  switch (D.4929) <default: <D.4703>, case 224: <D.4697>, case 237: <D.4699>, case 239: <D.4700>, case 240: <D.4701>, case 244: <D.4702>>
  <D.4697>:
  if (a <= 159) goto <D.4957>; else goto <D.4958>;
  <D.4957>:
  retVal = 0;
  <D.4958>:
  goto <D.4698>;
  <D.4699>:
  if (a > 159) goto <D.4959>; else goto <D.4960>;
  <D.4959>:
  retVal = 0;
  <D.4960>:
  goto <D.4698>;
  <D.4700>:
  if (a == 183) goto <D.4961>; else goto <D.4962>;
  <D.4961>:
  D.4963 = srcPtr + 1;
  D.4964 = *D.4963;
  D.4965 = D.4964 + 112;
  if (D.4965 <= 31) goto <D.4966>; else goto <D.4967>;
  <D.4966>:
  retVal = 0;
  <D.4967>:
  <D.4962>:
  if (a == 191) goto <D.4968>; else goto <D.4969>;
  <D.4968>:
  D.4963 = srcPtr + 1;
  D.4964 = *D.4963;
  D.4970 = D.4964 + 66;
  if (D.4970 <= 1) goto <D.4971>; else goto <D.4972>;
  <D.4971>:
  retVal = 0;
  <D.4972>:
  <D.4969>:
  goto <D.4698>;
  <D.4701>:
  if (a <= 143) goto <D.4973>; else goto <D.4974>;
  <D.4973>:
  retVal = 0;
  <D.4974>:
  goto <D.4698>;
  <D.4702>:
  if (a > 143) goto <D.4975>; else goto <D.4976>;
  <D.4975>:
  retVal = 0;
  <D.4976>:
  goto <D.4698>;
  <D.4703>:
  a.8 = (signed char) a;
  if (a.8 >= 0) goto <D.4977>; else goto <D.4978>;
  <D.4977>:
  retVal = 0;
  <D.4978>:
  <D.4698>:
  <D.4704>:
  D.4928 = *ptr;
  D.4979 = D.4928 + 128;
  if (D.4979 <= 65) goto <D.4980>; else goto <D.4981>;
  <D.4980>:
  retVal = 0;
  <D.4981>:
  D.4928 = *ptr;
  if (D.4928 > 244) goto <D.4982>; else goto <D.4983>;
  <D.4982>:
  retVal = 0;
  <D.4983>:
  if (retVal == 0) goto <D.4984>; else goto <D.4985>;
  <D.4984>:
  if (lastRet != 0) goto <D.4986>; else goto <D.4987>;
  <D.4986>:
  if (oEnd != 0B) goto <D.4988>; else goto <D.4989>;
  <D.4988>:
  *oEnd = ptr;
  <D.4989>:
  lastRet = 0;
  <D.4987>:
  <D.4985>:
  ptr = ptr + length;
  D.4990 = *oLength;
  D.4991 = D.4990 + 1;
  *oLength = D.4991;
  <D.4706>:
  D.4928 = *ptr;
  if (D.4928 != 0) goto <D.4705>; else goto <D.4707>;
  <D.4707>:
  if (retVal != 0) goto <D.4992>; else goto <D.4993>;
  <D.4992>:
  if (oEnd != 0B) goto <D.4994>; else goto <D.4995>;
  <D.4994>:
  *oEnd = ptr;
  <D.4995>:
  <D.4993>:
  D.4996 = retVal;
  return D.4996;
}


mono_utf8_validate_and_len_with_bounds (const gchar * source, glong max_bytes, glong * oLength, const gchar * * oEnd)
{
  sizetype max_bytes.9;
  gboolean D.5003;
  unsigned char D.5004;
  int D.5005;
  char D.5006;
  int D.5007;
  int D.5008;
  signed char a.10;
  unsigned char D.5015;
  guchar * D.5018;
  unsigned char D.5019;
  guchar * D.5024;
  unsigned char D.5025;
  guchar * D.5041;
  unsigned char D.5042;
  unsigned char D.5043;
  unsigned char D.5048;
  unsigned char D.5057;
  long int D.5068;
  long int D.5069;
  gboolean retVal;
  gboolean lastRet;
  guchar * ptr;
  guchar * end;
  guchar * srcPtr;
  guint length;
  guchar a;

  retVal = 1;
  lastRet = 1;
  ptr = source;
  max_bytes.9 = (sizetype) max_bytes;
  end = ptr + max_bytes.9;
  *oLength = 0;
  if (max_bytes <= 0) goto <D.4999>; else goto <D.5000>;
  <D.4999>:
  if (oEnd != 0B) goto <D.5001>; else goto <D.5002>;
  <D.5001>:
  *oEnd = ptr;
  <D.5002>:
  D.5003 = 0;
  return D.5003;
  <D.5000>:
  goto <D.4735>;
  <D.4734>:
  D.5004 = *ptr;
  D.5005 = (int) D.5004;
  D.5006 = trailingBytesForUTF8[D.5005];
  D.5007 = (int) D.5006;
  D.5008 = D.5007 + 1;
  length = (guint) D.5008;
  srcPtr = ptr + length;
  if (srcPtr >= end) goto <D.5009>; else goto <D.5010>;
  <D.5009>:
  retVal = 0;
  goto <D.4721>;
  <D.5010>:
  switch (length) <default: <D.4722>, case 1: <D.4733>, case 2: <D.4725>, case 3: <D.4724>, case 4: <D.4723>>
  <D.4722>:
  retVal = 0;
  <D.4723>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.10 = (signed char) a;
  if (a.10 >= 0) goto <D.5011>; else goto <D.5014>;
  <D.5014>:
  if (a > 191) goto <D.5011>; else goto <D.5012>;
  <D.5011>:
  retVal = 0;
  <D.5012>:
  D.5015 = a + 66;
  if (D.5015 <= 1) goto <D.5016>; else goto <D.5017>;
  <D.5016>:
  D.5018 = srcPtr + 4294967295;
  D.5019 = *D.5018;
  if (D.5019 == 191) goto <D.5020>; else goto <D.5021>;
  <D.5020>:
  D.5024 = srcPtr + 4294967294;
  D.5025 = *D.5024;
  if (D.5025 == 143) goto <D.5022>; else goto <D.5026>;
  <D.5026>:
  D.5024 = srcPtr + 4294967294;
  D.5025 = *D.5024;
  if (D.5025 == 159) goto <D.5022>; else goto <D.5027>;
  <D.5027>:
  D.5024 = srcPtr + 4294967294;
  D.5025 = *D.5024;
  if (D.5025 == 175) goto <D.5022>; else goto <D.5028>;
  <D.5028>:
  D.5024 = srcPtr + 4294967294;
  D.5025 = *D.5024;
  if (D.5025 == 191) goto <D.5022>; else goto <D.5023>;
  <D.5022>:
  retVal = 0;
  <D.5023>:
  <D.5021>:
  <D.5017>:
  <D.4724>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.10 = (signed char) a;
  if (a.10 >= 0) goto <D.5029>; else goto <D.5031>;
  <D.5031>:
  if (a > 191) goto <D.5029>; else goto <D.5030>;
  <D.5029>:
  retVal = 0;
  <D.5030>:
  <D.4725>:
  srcPtr = srcPtr + 4294967295;
  a = *srcPtr;
  a.10 = (signed char) a;
  if (a.10 >= 0) goto <D.5032>; else goto <D.5034>;
  <D.5034>:
  if (a > 191) goto <D.5032>; else goto <D.5033>;
  <D.5032>:
  retVal = 0;
  <D.5033>:
  D.5004 = *ptr;
  D.5005 = (int) D.5004;
  switch (D.5005) <default: <D.4732>, case 224: <D.4726>, case 237: <D.4728>, case 239: <D.4729>, case 240: <D.4730>, case 244: <D.4731>>
  <D.4726>:
  if (a <= 159) goto <D.5035>; else goto <D.5036>;
  <D.5035>:
  retVal = 0;
  <D.5036>:
  goto <D.4727>;
  <D.4728>:
  if (a > 159) goto <D.5037>; else goto <D.5038>;
  <D.5037>:
  retVal = 0;
  <D.5038>:
  goto <D.4727>;
  <D.4729>:
  if (a == 183) goto <D.5039>; else goto <D.5040>;
  <D.5039>:
  D.5041 = srcPtr + 1;
  D.5042 = *D.5041;
  D.5043 = D.5042 + 112;
  if (D.5043 <= 31) goto <D.5044>; else goto <D.5045>;
  <D.5044>:
  retVal = 0;
  <D.5045>:
  <D.5040>:
  if (a == 191) goto <D.5046>; else goto <D.5047>;
  <D.5046>:
  D.5041 = srcPtr + 1;
  D.5042 = *D.5041;
  D.5048 = D.5042 + 66;
  if (D.5048 <= 1) goto <D.5049>; else goto <D.5050>;
  <D.5049>:
  retVal = 0;
  <D.5050>:
  <D.5047>:
  goto <D.4727>;
  <D.4730>:
  if (a <= 143) goto <D.5051>; else goto <D.5052>;
  <D.5051>:
  retVal = 0;
  <D.5052>:
  goto <D.4727>;
  <D.4731>:
  if (a > 143) goto <D.5053>; else goto <D.5054>;
  <D.5053>:
  retVal = 0;
  <D.5054>:
  goto <D.4727>;
  <D.4732>:
  a.10 = (signed char) a;
  if (a.10 >= 0) goto <D.5055>; else goto <D.5056>;
  <D.5055>:
  retVal = 0;
  <D.5056>:
  <D.4727>:
  <D.4733>:
  D.5004 = *ptr;
  D.5057 = D.5004 + 128;
  if (D.5057 <= 65) goto <D.5058>; else goto <D.5059>;
  <D.5058>:
  retVal = 0;
  <D.5059>:
  D.5004 = *ptr;
  if (D.5004 > 244) goto <D.5060>; else goto <D.5061>;
  <D.5060>:
  retVal = 0;
  <D.5061>:
  if (retVal == 0) goto <D.5062>; else goto <D.5063>;
  <D.5062>:
  if (lastRet != 0) goto <D.5064>; else goto <D.5065>;
  <D.5064>:
  if (oEnd != 0B) goto <D.5066>; else goto <D.5067>;
  <D.5066>:
  *oEnd = ptr;
  <D.5067>:
  lastRet = 0;
  <D.5065>:
  <D.5063>:
  ptr = ptr + length;
  D.5068 = *oLength;
  D.5069 = D.5068 + 1;
  *oLength = D.5069;
  <D.4735>:
  D.5004 = *ptr;
  if (D.5004 != 0) goto <D.4734>; else goto <D.4721>;
  <D.4721>:
  if (retVal != 0) goto <D.5070>; else goto <D.5071>;
  <D.5070>:
  if (oEnd != 0B) goto <D.5072>; else goto <D.5073>;
  <D.5072>:
  *oEnd = ptr;
  <D.5073>:
  <D.5071>:
  D.5003 = retVal;
  return D.5003;
}


