14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the License at
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * License for the specific language governing permissions and limitations under
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the License.
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This converts the data found at http://www.speech.cs.cmu.edu/cgi-bin/cmudict
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// into the *.ok format used by Nuance.
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// We use the file c0.6, which corresponds to (v. 0.6).
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// to run: make cmu2nuance && ./cmu2nuance <c0.6 >c0.6.ok
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// TODO: look at generation of 'L', ')', and ','
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ctype.h>
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char* xlate(const char* phone, const char* cmu, const char* nuance) {
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ncmu = strlen(cmu);
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (strncmp(phone, cmu, ncmu) || !isspace(phone[ncmu])) return NULL;
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fputs(nuance, stdout);
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return phone + strlen(cmu);
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint main(int argc, const char* argv[]) {
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char line[200];
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fputs("#LANG=EN-US\n", stdout);
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (int lineno = 1; NULL != fgets(line, sizeof(line), stdin); lineno++)
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (line[0] == '#') continue;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (line[0] == 0) continue;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!isalnum(line[0])) {
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fprintf(stderr, "warning: ignoring line %d - %s", lineno, line);
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      continue;
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const char* p = line;
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // parse name, echoing in lower case and skipping (2) suffix
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (!isspace(*p)) {
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (*p == 0) {
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fprintf(stderr, "can't read name at line %d\n", lineno);
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (p[0] == '(' && isdigit(p[1]) && p[2] == ')' && isspace(p[3])) {
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        p += 3;
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fputc(tolower(*p), stdout);
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      p++;
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fputc(' ', stdout);
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // loop over whitespace delimited phonemes
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (1) {
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      // skip leading whitespace
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      while (isspace(*p)) p++;
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (*p == 0) break;
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const char* next = 0;
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AA1 R", ")r")) ||   // odd     AA D
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AA0", "o")) ||   // odd     AA D
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AA1", "o")) ||   // odd     AA D
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AA2", "o")) ||   // odd     AA D
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AE0", "a")) ||   // at      AE T
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AE1", "a")) ||   // at      AE T
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AE2", "a")) ||   // at      AE T
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//        (next=xlate(p, "AH0 L", "L")) || // drops accuracy by 1%
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AH0 N", "~")) ||   // hut     HH AH T - from jean
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AH0 M", "}")) ||   // hut     HH AH T - from jean
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AH0", "@")) ||   // hut     HH AH T - from jean
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AH1", "u")) ||   // hut     HH AH T
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AH2", "u")) ||   // hut     HH AH T
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AO0", "{")) ||   // ought   AO T
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AO1", "{")) ||   // ought   AO T
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AO2", "{")) ||   // ought   AO T
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AW0", "?")) ||   // cow     K AW
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AW1", "?")) ||   // cow     K AW
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AW2", "?")) ||   // cow     K AW
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AY0", "I")) ||   // hide    HH AY D
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AY1", "I")) ||   // hide    HH AY D
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "AY2", "I")) ||   // hide    HH AY D
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "B"  , "b")) ||   // be      B IY
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "CH" , "C")) ||   // cheese  CH IY Z
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "D"  , "d")) ||   // dee     D IY
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "DH" , "D")) ||   // thee    DH IY
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EH1 R", ",r")) ||   // Ed      EH D
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EH0", "c")) ||   // Ed      EH D - from jean
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EH1", "e")) ||   // Ed      EH D
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EH2", "e")) ||   // Ed      EH D
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "ER0", "P")) ||   // hurt    HH ER T
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "ER1", "V")) ||   // hurt    HH ER T
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "ER2", "V")) ||   // hurt    HH ER T
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EY0", "A")) ||   // ate     EY T
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EY1", "A")) ||   // ate     EY T
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "EY2", "A")) ||   // ate     EY T
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "F"  , "f")) ||   // fee     F IY
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "G"  , "g")) ||   // green   G R IY N
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "HH" , "h")) ||   // he      HH IY
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IH0", "6")) ||   // it      IH T
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IH1", "i")) ||   // it      IH T
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IH2", "i")) ||   // it      IH T
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IY0", "/")) ||   // eat     IY T - from jean
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IY1", "E")) ||   // eat     IY T
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "IY2", "E")) ||   // eat     IY T
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "JH" , "j")) ||   // gee     JH IY
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "K"  , "k")) ||   // key     K IY
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "L"  , "l")) ||   // lee     L IY
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "M"  , "m")) ||   // me      M IY
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "N"  , "n")) ||   // knee    N IY
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "NG" , "N")) ||   // ping    P IH NG
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OW0", "]")) ||   // oat     OW T
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OW1", "O")) ||   // oat     OW T
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OW2", "O")) ||   // oat     OW T
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OY0", "<")) ||   // toy     T OY
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OY1", "<")) ||   // toy     T OY
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "OY2", "<")) ||   // toy     T OY
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "P"  , "p")) ||   // pee     P IY
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "R"  , "r")) ||   // read    R IY D
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "S"  , "s")) ||   // sea     S IY
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "SH" , "S")) ||   // she     SH IY
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "T"  , "t")) ||   // tea     T IY
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "TH" , "T")) ||   // theta   TH EY T AH
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UH0", "q")) ||   // hood    HH UH D
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UH1", "q")) ||   // hood    HH UH D
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UH2", "q")) ||   // hood    HH UH D
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UW0", "U")) ||   // two     T UW
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UW1", "U")) ||   // two     T UW
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "UW2", "U")) ||   // two     T UW
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "V"  , "v")) ||   // vee     V IY
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "W"  , "w")) ||   // we      W IY
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "Y"  , "y")) ||   // yield   Y IY L D
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "Z"  , "z")) ||   // zee     Z IY
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        (next=xlate(p, "ZH" , "Z")) ||   // seizure S IY ZH ER
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        0) {
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        p = next;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fprintf(stderr, "can't pronounce line %d: %s", lineno, p);
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        break;
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fputc('\n', stdout);
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
187