├── avro-bangla.png ├── utf8.js ├── evars.js.in ├── .gitignore ├── configure.ac ├── ibus-avro.xml.in ├── com.omicronlab.avro.gschema.xml ├── levenshtein.js ├── README.md ├── pref.js ├── Makefile.am ├── dbsearch.js ├── database-compiler.js ├── avropref.ui ├── main-gjs.js ├── suggestionbuilder.js ├── MPL-1.1.txt ├── suffixdict.js └── avroregexlib.js /avro-bangla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omicronlab/ibus-avro/HEAD/avro-bangla.png -------------------------------------------------------------------------------- /utf8.js: -------------------------------------------------------------------------------- 1 | function utf8Decode(str) { 2 | return decodeURIComponent( escape( str ) ); 3 | } 4 | -------------------------------------------------------------------------------- /evars.js.in: -------------------------------------------------------------------------------- 1 | function get_pkgdatadir(){ 2 | return \"${pkgdatadir}\"; 3 | } 4 | function get_libexecdir(){ 5 | return \"${libexecdir}\"; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ibus-avro.xml 2 | Makefile 3 | evars.js 4 | autom4te.cache/ 5 | aclocal.m4 6 | config.log 7 | config.status 8 | configure 9 | Makefile.in 10 | install-sh 11 | missing 12 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | # -*- Autoconf -*- 2 | # Process this file with autoconf to produce a configure script. 3 | 4 | AC_PREREQ([2.68]) 5 | AC_INIT([ibus-avro], [1.0], [sarim2005@gmail.com]) 6 | AM_INIT_AUTOMAKE(ibus-avro, 1.0) 7 | AC_OUTPUT(Makefile) 8 | # Checks for programs. 9 | 10 | # Checks for libraries. 11 | PKG_CHECK_MODULES(ibus, ibus-1.0) 12 | 13 | # Checks for header files. 14 | 15 | # Checks for typedefs, structures, and compiler characteristics. 16 | 17 | # Checks for library functions. 18 | 19 | AC_OUTPUT 20 | -------------------------------------------------------------------------------- /ibus-avro.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | org.freedesktop.IBus.Avro 5 | Avro Phonetic 6 | /usr/bin/env gjs --include-path=${pkgdatadir} ${pkgdatadir}/main-gjs.js --ibus > /dev/null 7 | 1.0 8 | Sarim Khan <sarim2005@gmail.com> 9 | MPL 1.1 10 | https://github.com/sarim/ibus-avro 11 | ibus-avro 12 | 13 | 14 | 15 | ibus-avro 16 | bn 17 | MPL 18 | Sarim Khan <sarim2005@gmail.com> 19 | ${pkgdatadir}/avro-bangla.png 20 | bn 21 | Avro Phonetic 22 | Avro Phonetic Input Method 23 | /usr/bin/env gjs --include-path=${pkgdatadir} ${pkgdatadir}/pref.js --standalone 24 | 0 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /com.omicronlab.avro.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | switch-preview 7 | Whether Preview window (auxiliary text, suggestions) will be shown 8 | 9 | 10 | true 11 | switch-dict 12 | Whether dictionary suggestions will be shown 13 | 14 | 15 | false 16 | switch-newline 17 | Whether enter key should commit newline after applying candidate 18 | 19 | 20 | 16 21 | lutable-size 22 | Dictionary suggestion lookup table size 23 | 24 | 25 | 0 26 | cboxorient 27 | Orientation of Lookup Table 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /levenshtein.js: -------------------------------------------------------------------------------- 1 | /* 2 | Javascript Implementation Of Damerau-Levenshtein Distance 3 | 4 | Source: 5 | 1. http://www.dzone.com/snippets/javascript-implementation 6 | 7 | Based on: 8 | 1. http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance 9 | 2. http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance 10 | 11 | */ 12 | 13 | function levenshtein( a, b ) 14 | { 15 | var i; 16 | var j; 17 | var cost; 18 | var d = new Array(); 19 | 20 | if ( a.length == 0 ) 21 | { 22 | return b.length; 23 | } 24 | 25 | if ( b.length == 0 ) 26 | { 27 | return a.length; 28 | } 29 | 30 | for ( i = 0; i <= a.length; i++ ) 31 | { 32 | d[ i ] = new Array(); 33 | d[ i ][ 0 ] = i; 34 | } 35 | 36 | for ( j = 0; j <= b.length; j++ ) 37 | { 38 | d[ 0 ][ j ] = j; 39 | } 40 | 41 | for ( i = 1; i <= a.length; i++ ) 42 | { 43 | for ( j = 1; j <= b.length; j++ ) 44 | { 45 | if ( a.charAt( i - 1 ) == b.charAt( j - 1 ) ) 46 | { 47 | cost = 0; 48 | } 49 | else 50 | { 51 | cost = 1; 52 | } 53 | 54 | d[ i ][ j ] = Math.min( d[ i - 1 ][ j ] + 1, d[ i ][ j - 1 ] + 1, d[ i - 1 ][ j - 1 ] + cost ); 55 | 56 | if( 57 | i > 1 && 58 | j > 1 && 59 | a.charAt(i - 1) == b.charAt(j-2) && 60 | a.charAt(i-2) == b.charAt(j-1) 61 | ){ 62 | d[i][j] = Math.min( 63 | d[i][j], 64 | d[i - 2][j - 2] + cost 65 | ) 66 | 67 | } 68 | } 69 | } 70 | 71 | return d[ a.length ][ b.length ]; 72 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Avro phonetic for Linux in IBus 2 | Avro phonetic implementation for Linux in IBus. 3 | 4 | ## Installation 5 | 6 | 1. Open terminal/package manager and install following packages: 7 | 8 | git 9 | libibus-1.0-0 10 | libibus-1.0-dev 11 | ibus 12 | automake 13 | autoconf 14 | gjs 15 | gir1.2-gjsdbus-1.0 16 | gir1.2-ibus-1.0 17 | 18 | __For Ubuntu 12.04__ 19 | 20 | sudo apt-get install git ibus libibus-1.0-dev automake autoconf gjs gir1.2-gjsdbus-1.0 gir1.2-ibus-1.0 21 | 22 | 23 | __For other linux distributions__ 24 | 25 | You'll need all related build tools like `automake`, `autoconf` etc... 26 | and Latest __IBus__ from _git_ compiled with _gobject-introspection_ support enabled. 27 | 28 | 2. Now give the following commands step-by-step: 29 | 30 | git clone git://github.com/sarim/ibus-avro.git 31 | cd ibus-avro 32 | aclocal && autoconf && automake --add-missing 33 | ./configure --prefix=/usr 34 | sudo make install 35 | 36 | 37 | ## Usage 38 | 1. Run __IBus__ (`Applications -> System Tools -> IBus`) from _Dash_ 39 | 2. Open __IBus__ `Preferences` from the top panel icon 40 | 3. Go to `Input method` 41 | 4. `Select an input method -> Bengali -> Avro` 42 | 5. Now Click `Add` button to add __Avro__ to the list 43 | 6. Now restart __IBus__ from the top panel icon (`Right Click -> Restart`) 44 | 7. Now Press `Ctrl+Space` to toggle between _English_ and _Avro_ (Bengali) 45 | 8. Enjoy __Avro Phonetic!__ 46 | 47 | 48 | ## Contributors 49 | 50 | __IBus Engine__ by __Sarim Khan__ 51 | 52 | [__Avro JavaScript Phonetic Library__](https://github.com/torifat/jsAvroPhonetic) by [__Rifat Nabi__](https://github.com/torifat) 53 | 54 | __Avro Phonetic Dictionary Search Library__ by [__Mehdi Hasan Khan__](https://github.com/omicronlab) 55 | 56 | _Licensed under Mozilla Public License 1.1 ("MPL"), an open source/free software license._ -------------------------------------------------------------------------------- /pref.js: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================= 3 | ***************************************************************************** 4 | The contents of this file are subject to the Mozilla Public License 5 | Version 1.1 (the "License"); you may not use this file except in 6 | compliance with the License. You may obtain a copy of the License at 7 | http://www.mozilla.org/MPL/ 8 | 9 | Software distributed under the License is distributed on an "AS IS" 10 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 11 | License for the specific language governing rights and limitations 12 | under the License. 13 | 14 | The Original Code is ibus-avro 15 | 16 | The Initial Developer of the Original Code is 17 | Sarim Khan 18 | 19 | Copyright (C) Sarim Khan (http://www.sarimkhan.com). All Rights Reserved. 20 | 21 | 22 | Contributor(s): ______________________________________. 23 | 24 | ***************************************************************************** 25 | ============================================================================= 26 | */ 27 | 28 | imports.searchPath.unshift('.'); 29 | const Gio = imports.gi.Gio; 30 | const Gtk = imports.gi.Gtk; 31 | const GLib = imports.gi.GLib; 32 | const eevars = imports.evars; 33 | 34 | var prefwindow, switch_preview, switch_newline, switch_dict, lutable_size, cboxorient, scale1; 35 | 36 | function runpref() { 37 | 38 | Gtk.init(null, 0); 39 | let builder = new Gtk.Builder(); 40 | builder.add_from_file(eevars.get_pkgdatadir() + "/avropref.ui"); 41 | 42 | prefwindow = builder.get_object("window1"); 43 | switch_preview = builder.get_object("switch_preview"); 44 | switch_newline = builder.get_object("switch_newline"); 45 | switch_dict = builder.get_object("switch_dict"); 46 | lutable_size = builder.get_object("lutable_size"); 47 | scale1 = builder.get_object("scale1"); 48 | cboxorient = builder.get_object("cboxorient"); 49 | 50 | switch_preview.connect("notify::active", validate); 51 | switch_newline.connect("notify::active", validate); 52 | switch_dict.connect("notify::active", validate); 53 | 54 | 55 | let setting = Gio.Settings.new("com.omicronlab.avro") 56 | setting.bind("switch-preview", switch_preview, "active", Gio.SettingsBindFlags.DEFAULT) 57 | setting.bind("switch-dict", switch_dict, "active", Gio.SettingsBindFlags.DEFAULT) 58 | setting.bind("switch-newline", switch_newline, "active", Gio.SettingsBindFlags.DEFAULT) 59 | setting.bind("lutable-size", lutable_size, "value", Gio.SettingsBindFlags.DEFAULT) 60 | setting.bind("cboxorient", cboxorient, "active", Gio.SettingsBindFlags.DEFAULT) 61 | 62 | validate(); 63 | 64 | prefwindow.connect ("destroy", function(){Gtk.main_quit()}); 65 | prefwindow.show_all(); 66 | 67 | Gtk.main(); 68 | } 69 | 70 | function validate(){ 71 | if (!switch_preview.get_active()){ 72 | switch_newline.set_active(false); 73 | switch_dict.set_active(false); 74 | 75 | switch_dict.sensitive = false; 76 | switch_newline.sensitive = false; 77 | scale1.sensitive = false; 78 | cboxorient.sensitive = false; 79 | } else { 80 | switch_dict.sensitive = true; 81 | switch_newline.sensitive = true; 82 | scale1.sensitive = true; 83 | cboxorient.sensitive = true; 84 | } 85 | } 86 | 87 | //check if running standalone 88 | if(ARGV[0] == '--standalone'){ 89 | //running standalone, so no one to call me,calling myself 90 | runpref(); 91 | } 92 | -------------------------------------------------------------------------------- /Makefile.am: -------------------------------------------------------------------------------- 1 | AUTOMAKE_OPTIONS = foreign 2 | FILES = autocorrect.js avro-bangla.png avrodict.js avrolib.js avropref.ui avroregexlib.js changeloggen.sh com.omicronlab.avro.gschema.xml configure.ac database-compiler.js Database.db3 dbsearch.js evars.js.in ibus-avro.xml.in levenshtein.js main-gjs.js Makefile.am pref.js README.md suffixdict.js suggestionbuilder.js utf8.js 3 | 4 | all: build 5 | @: 6 | 7 | build: evars.js ibus-avro.xml main-gjs.js avrolib.js utf8.js avro-bangla.png avrodict.js suffixdict.js dbsearch.js avroregexlib.js suggestionbuilder.js levenshtein.js autocorrect.js 8 | @: 9 | 10 | ibus-avro.xml: ibus-avro.xml.in 11 | $(AM_V_GEN) \ 12 | ( \ 13 | libexecdir=${libexecdir}; \ 14 | pkgdatadir=${pkgdatadir}; \ 15 | s=`cat $<`; \ 16 | eval "echo \"$${s}\""; \ 17 | ) > $@ 18 | 19 | 20 | evars.js: evars.js.in 21 | $(AM_V_GEN) \ 22 | ( \ 23 | libexecdir=${libexecdir}; \ 24 | pkgdatadir=${pkgdatadir}; \ 25 | s=`cat $<`; \ 26 | eval "echo \"$${s}\""; \ 27 | ) > $@ 28 | 29 | install: all 30 | mkdir -p $(pkgdatadir)/ 31 | mkdir -p $(libexecdir)/ 32 | mkdir -p ${pkgdatadir}/../glib-2.0/schemas/ 33 | mkdir -p ${pkgdatadir}/../ibus/component/ 34 | ${INSTALL} -m 644 evars.js ${pkgdatadir}/evars.js 35 | ${INSTALL} -m 755 main-gjs.js ${pkgdatadir}/main-gjs.js 36 | ${INSTALL} -m 644 avrolib.js ${pkgdatadir}/avrolib.js 37 | ${INSTALL} -m 644 utf8.js ${pkgdatadir}/utf8.js 38 | ${INSTALL} -m 644 avrodict.js ${pkgdatadir}/avrodict.js 39 | ${INSTALL} -m 644 suffixdict.js ${pkgdatadir}/suffixdict.js 40 | ${INSTALL} -m 644 dbsearch.js ${pkgdatadir}/dbsearch.js 41 | ${INSTALL} -m 644 avroregexlib.js ${pkgdatadir}/avroregexlib.js 42 | ${INSTALL} -m 644 suggestionbuilder.js ${pkgdatadir}/suggestionbuilder.js 43 | ${INSTALL} -m 644 levenshtein.js ${pkgdatadir}/levenshtein.js 44 | ${INSTALL} -m 644 autocorrect.js ${pkgdatadir}/autocorrect.js 45 | ${INSTALL} -m 755 pref.js ${pkgdatadir}/pref.js 46 | ${INSTALL} -m 644 avropref.ui ${pkgdatadir}/avropref.ui 47 | ${INSTALL} -m 644 avro-bangla.png ${pkgdatadir}/avro-bangla.png 48 | ${INSTALL} -m 644 ibus-avro.xml ${pkgdatadir}/../ibus/component/ibus-avro.xml 49 | ${INSTALL} -m 644 com.omicronlab.avro.gschema.xml ${pkgdatadir}/../glib-2.0/schemas/com.omicronlab.avro.gschema.xml 50 | glib-compile-schemas ${pkgdatadir}/../glib-2.0/schemas/ 51 | 52 | installdeb: all 53 | mkdir -p $(DESTDIR)$(pkgdatadir)/ 54 | mkdir -p $(DESTDIR)$(libexecdir)/ 55 | mkdir -p $(DESTDIR)${pkgdatadir}/../glib-2.0/schemas/ 56 | mkdir -p $(DESTDIR)${pkgdatadir}/../ibus/component/ 57 | ${INSTALL} -m 644 evars.js $(DESTDIR)${pkgdatadir}/evars.js 58 | ${INSTALL} -m 755 main-gjs.js $(DESTDIR)${pkgdatadir}/main-gjs.js 59 | ${INSTALL} -m 644 avrolib.js $(DESTDIR)${pkgdatadir}/avrolib.js 60 | ${INSTALL} -m 644 utf8.js $(DESTDIR)${pkgdatadir}/utf8.js 61 | ${INSTALL} -m 644 avrodict.js $(DESTDIR)${pkgdatadir}/avrodict.js 62 | ${INSTALL} -m 644 suffixdict.js $(DESTDIR)${pkgdatadir}/suffixdict.js 63 | ${INSTALL} -m 644 dbsearch.js $(DESTDIR)${pkgdatadir}/dbsearch.js 64 | ${INSTALL} -m 644 avroregexlib.js $(DESTDIR)${pkgdatadir}/avroregexlib.js 65 | ${INSTALL} -m 644 suggestionbuilder.js $(DESTDIR)${pkgdatadir}/suggestionbuilder.js 66 | ${INSTALL} -m 644 levenshtein.js $(DESTDIR)${pkgdatadir}/levenshtein.js 67 | ${INSTALL} -m 644 autocorrect.js $(DESTDIR)${pkgdatadir}/autocorrect.js 68 | ${INSTALL} -m 755 pref.js $(DESTDIR)${pkgdatadir}/pref.js 69 | ${INSTALL} -m 644 avropref.ui $(DESTDIR)${pkgdatadir}/avropref.ui 70 | ${INSTALL} -m 644 avro-bangla.png $(DESTDIR)${pkgdatadir}/avro-bangla.png 71 | ${INSTALL} -m 644 ibus-avro.xml $(DESTDIR)${pkgdatadir}/../ibus/component/ibus-avro.xml 72 | ${INSTALL} -m 644 com.omicronlab.avro.gschema.xml $(DESTDIR)${pkgdatadir}/../glib-2.0/schemas/com.omicronlab.avro.gschema.xml 73 | 74 | uninstall: 75 | rm ${pkgdatadir}/../ibus/component/ibus-avro.xml 76 | rm ${pkgdatadir}/../glib-2.0/schemas/com.omicronlab.avro.gschema.xml 77 | glib-compile-schemas ${pkgdatadir}/../glib-2.0/schemas/ 78 | rm -rf ${pkgdatadir} 79 | 80 | clean: 81 | @: 82 | cleanup: 83 | rm -r evars.js ibus-avro.xml Makefile autom4te.cache/ aclocal.m4 config.log config.status configure Makefile.in install-sh missing 84 | .PHONY: all build clean 85 | -------------------------------------------------------------------------------- /dbsearch.js: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================= 3 | ***************************************************************************** 4 | The contents of this file are subject to the Mozilla Public License 5 | Version 1.1 (the "License"); you may not use this file except in 6 | compliance with the License. You may obtain a copy of the License at 7 | http://www.mozilla.org/MPL/ 8 | 9 | Software distributed under the License is distributed on an "AS IS" 10 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 11 | License for the specific language governing rights and limitations 12 | under the License. 13 | 14 | The Original Code is jsAvroPhonetic 15 | 16 | The Initial Developer of the Original Code is 17 | Mehdi Hasan Khan 18 | 19 | Copyright (C) OmicronLab (http://www.omicronlab.com). All Rights Reserved. 20 | 21 | 22 | Contributor(s): ______________________________________. 23 | 24 | ***************************************************************************** 25 | ============================================================================= 26 | */ 27 | 28 | 29 | const db = imports.avrodict; 30 | const RegexServer = imports.avroregexlib; 31 | const utfconv = imports.utf8; 32 | 33 | function DBSearch () { 34 | this._init(); 35 | } 36 | 37 | DBSearch.prototype = { 38 | 39 | search: function (enText) { 40 | 41 | var lmc = enText.toLowerCase().charAt(0); 42 | var tableList = []; 43 | switch (lmc) { 44 | case 'a': 45 | tableList = ["a", "aa", "e", "oi", "o", "nya", "y"]; 46 | break; 47 | case 'b': 48 | tableList = ["b", "bh"]; 49 | break; 50 | case 'c': 51 | tableList = ["c", "ch", "k"]; 52 | break; 53 | case 'd': 54 | tableList = ["d", "dh", "dd", "ddh"]; 55 | break; 56 | case 'e': 57 | tableList = ["i", "ii", "e", "y"]; 58 | break; 59 | case 'f': 60 | tableList = ["ph"]; 61 | break; 62 | case 'g': 63 | tableList = ["g", "gh", "j"]; 64 | break; 65 | case 'h': 66 | tableList = ["h"]; 67 | break; 68 | case 'i': 69 | tableList = ["i", "ii", "y"]; 70 | break; 71 | case 'j': 72 | tableList = ["j", "jh", "z"]; 73 | break; 74 | case 'k': 75 | tableList = ["k", "kh"]; 76 | break; 77 | case 'l': 78 | tableList = ["l"]; 79 | break; 80 | case 'm': 81 | tableList = ["h", "m"]; 82 | break; 83 | case 'n': 84 | tableList = ["n", "nya", "nga", "nn"]; 85 | break; 86 | case 'o': 87 | tableList = ["a", "u", "uu", "oi", "o", "ou", "y"]; 88 | break; 89 | case 'p': 90 | tableList = ["p", "ph"]; 91 | break; 92 | case 'q': 93 | tableList = ["k"]; 94 | break; 95 | case 'r': 96 | tableList = ["rri", "h", "r", "rr", "rrh"]; 97 | break; 98 | case 's': 99 | tableList = ["s", "sh", "ss"]; 100 | break; 101 | case 't': 102 | tableList = ["t", "th", "tt", "tth", "khandatta"]; 103 | break; 104 | case 'u': 105 | tableList = ["u", "uu", "y"]; 106 | break; 107 | case 'v': 108 | tableList = ["bh"]; 109 | break; 110 | case 'w': 111 | tableList = ["o"]; 112 | break; 113 | case 'x': 114 | tableList = ["e", "k"]; 115 | break; 116 | case 'y': 117 | tableList = ["i", "y"]; 118 | break; 119 | case 'z': 120 | tableList = ["h", "j", "jh", "z"]; 121 | break; 122 | default: 123 | break; 124 | } 125 | 126 | var pattern = this._regex.parse(enText); 127 | pattern = '^' + pattern + '$'; 128 | 129 | var retWords = []; 130 | 131 | for(i in tableList) { 132 | var table = 'w_' + tableList[i]; 133 | retWords = retWords.concat(this._searchInArray(pattern, db.tables[table])); 134 | } 135 | 136 | return retWords; 137 | }, 138 | 139 | 140 | _searchInArray: function(pattern, wArray){ 141 | var retWords = []; 142 | var word = ''; 143 | var re = new RegExp(pattern); 144 | 145 | for (w in wArray){ 146 | word = wArray[w]; 147 | if (re.test(word)){ 148 | retWords.push(word); 149 | } 150 | } 151 | return retWords; 152 | }, 153 | 154 | 155 | _printWords: function (enText) { 156 | var words = this.search(enText); 157 | for (w in words){ 158 | print(words[w]); 159 | } 160 | }, 161 | 162 | 163 | _init: function () { 164 | this._regex = new RegexServer.AvroRegex(); 165 | } 166 | } 167 | 168 | 169 | /* --------- */ 170 | /* Test code */ 171 | /* --------- */ 172 | // var __dbSearch = new DBSearch (); 173 | // __dbSearch._printWords('onirban'); 174 | -------------------------------------------------------------------------------- /database-compiler.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env gjs 2 | 3 | /* 4 | ============================================================================= 5 | ***************************************************************************** 6 | The contents of this file are subject to the Mozilla Public License 7 | Version 1.1 (the "License"); you may not use this file except in 8 | compliance with the License. You may obtain a copy of the License at 9 | http://www.mozilla.org/MPL/ 10 | 11 | Software distributed under the License is distributed on an "AS IS" 12 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 13 | License for the specific language governing rights and limitations 14 | under the License. 15 | 16 | The Original Code is jsAvroPhonetic 17 | 18 | The Initial Developer of the Original Code is 19 | Mehdi Hasan Khan 20 | 21 | Copyright (C) OmicronLab (http://www.omicronlab.com). All Rights Reserved. 22 | 23 | 24 | Contributor(s): ______________________________________. 25 | 26 | ***************************************************************************** 27 | ============================================================================= 28 | */ 29 | 30 | const gio = imports.gi.Gio; 31 | const GLib = imports.gi.GLib; 32 | const Gda = imports.gi.Gda; 33 | 34 | function DB () {} 35 | 36 | var database = {}; 37 | var suffixDict = {}; 38 | 39 | DB.prototype = { 40 | 41 | loadDb: function () { 42 | this._init(); 43 | //TODO: Change path 44 | this.connection = new Gda.Connection ({provider: Gda.Config.get_provider("SQLite"), 45 | cnc_string:"DB_DIR=" + GLib.get_current_dir() + ";DB_NAME=Database.db3"}); 46 | this.connection.open (); 47 | //Vowels 48 | this._loadOneTable('A', database.w_a); 49 | this._loadOneTable('AA', database.w_aa); 50 | this._loadOneTable('I', database.w_i); 51 | this._loadOneTable('II', database.w_ii); 52 | this._loadOneTable('U', database.w_u); 53 | this._loadOneTable('UU', database.w_uu); 54 | this._loadOneTable('RRI', database.w_rri); 55 | this._loadOneTable('E', database.w_e); 56 | this._loadOneTable('OI', database.w_oi); 57 | this._loadOneTable('O', database.w_o); 58 | this._loadOneTable('OU', database.w_ou); 59 | //Consonants 60 | this._loadOneTable('B', database.w_b); 61 | this._loadOneTable('BH', database.w_bh); 62 | this._loadOneTable('C', database.w_c); 63 | this._loadOneTable('CH', database.w_ch); 64 | this._loadOneTable('D', database.w_d); 65 | this._loadOneTable('Dd', database.w_dd); 66 | this._loadOneTable('Dh', database.w_dh); 67 | this._loadOneTable('Ddh', database.w_ddh); 68 | this._loadOneTable('G', database.w_g); 69 | this._loadOneTable('Gh', database.w_gh); 70 | this._loadOneTable('H', database.w_h); 71 | this._loadOneTable('J', database.w_j); 72 | this._loadOneTable('Jh', database.w_jh); 73 | this._loadOneTable('K', database.w_k); 74 | this._loadOneTable('Kh', database.w_kh); 75 | this._loadOneTable('L', database.w_l); 76 | this._loadOneTable('M', database.w_m); 77 | this._loadOneTable('N', database.w_n); 78 | this._loadOneTable('NN', database.w_nn); 79 | this._loadOneTable('NGA', database.w_nga); 80 | this._loadOneTable('NYA', database.w_nya); 81 | this._loadOneTable('P', database.w_p); 82 | this._loadOneTable('Ph', database.w_ph); 83 | this._loadOneTable('R', database.w_r); 84 | this._loadOneTable('Rr', database.w_rr); 85 | this._loadOneTable('Rrh', database.w_rrh); 86 | this._loadOneTable('S', database.w_s); 87 | this._loadOneTable('Sh', database.w_sh); 88 | this._loadOneTable('Ss', database.w_ss); 89 | this._loadOneTable('T', database.w_t); 90 | this._loadOneTable('TT', database.w_tt); 91 | this._loadOneTable('TH', database.w_th); 92 | this._loadOneTable('TTH', database.w_tth); 93 | this._loadOneTable('Y', database.w_y); 94 | this._loadOneTable('Z', database.w_z); 95 | this._loadOneTable('Khandatta', database.w_khandatta); 96 | 97 | this._loadSuffix(); 98 | 99 | this.connection.close (); 100 | }, 101 | 102 | 103 | unloadDb: function () { 104 | this._init(); 105 | }, 106 | 107 | 108 | _loadSuffix: function(){ 109 | if (this.connection){ 110 | if (this.connection.is_opened){ 111 | var dm = this.connection.execute_select_command ("select * from Suffix"); 112 | var iter = dm.create_iter(); 113 | 114 | while (iter.move_next ()) { 115 | suffixDict[Gda.value_stringify (iter.get_value_at (0))] = Gda.value_stringify (iter.get_value_at (1)); 116 | } 117 | } 118 | } 119 | }, 120 | 121 | _loadOneTable: function (tableName, wArray) { 122 | if (this.connection){ 123 | if (this.connection.is_opened){ 124 | var dm = this.connection.execute_select_command ("select * from " + tableName); 125 | var iter = dm.create_iter(); 126 | 127 | while (iter.move_next ()) { 128 | var w = Gda.value_stringify (iter.get_value_at (0)); 129 | wArray.push(w); 130 | } 131 | } 132 | } 133 | }, 134 | 135 | 136 | _init: function () { 137 | 138 | database = {}; 139 | suffixDict = {}; 140 | 141 | database.w_a = []; 142 | database.w_aa = []; 143 | database.w_i = []; 144 | database.w_ii = []; 145 | database.w_u = []; 146 | database.w_uu = []; 147 | database.w_rri = []; 148 | database.w_e = []; 149 | database.w_oi = []; 150 | database.w_o = []; 151 | database.w_ou = []; 152 | 153 | database.w_b = []; 154 | database.w_bh = []; 155 | database.w_c = []; 156 | database.w_ch = []; 157 | database.w_d = []; 158 | database.w_dh = []; 159 | database.w_dd = []; 160 | database.w_ddh = []; 161 | database.w_g = []; 162 | database.w_gh = []; 163 | database.w_h = []; 164 | database.w_j = []; 165 | database.w_jh = []; 166 | database.w_k = []; 167 | database.w_kh = []; 168 | database.w_l = []; 169 | database.w_m = []; 170 | database.w_n = []; 171 | database.w_nga = []; 172 | database.w_nya = []; 173 | database.w_nn = []; 174 | database.w_p = []; 175 | database.w_ph = []; 176 | database.w_r = []; 177 | database.w_rr = []; 178 | database.w_rrh = []; 179 | database.w_s = []; 180 | database.w_sh = []; 181 | database.w_ss = []; 182 | database.w_t = []; 183 | database.w_th = []; 184 | database.w_tt = []; 185 | database.w_tth = []; 186 | database.w_y = []; 187 | database.w_z = []; 188 | database.w_khandatta = []; 189 | } 190 | } 191 | 192 | function _convertToUnicodeValue(input){ 193 | var output = ''; 194 | 195 | for (var i = 0; i < input.length; i++){ 196 | var charCode = input.charCodeAt(i); 197 | if (charCode >= 255){ 198 | output += '\\u0' + charCode.toString(16); 199 | } else { 200 | output += input.charAt(i); 201 | } 202 | } 203 | return output; 204 | } 205 | 206 | 207 | function saveSuffix () { 208 | try { 209 | var file = gio.File.new_for_path ("suffixdict.js"); 210 | 211 | if (file.query_exists (null)) { 212 | file.delete (null); 213 | } 214 | 215 | // Create a new file with this name 216 | var file_stream = file.create (gio.FileCreateFlags.NONE, null); 217 | 218 | var json = JSON.stringify(suffixDict); 219 | json = "var db = " + _convertToUnicodeValue(json) + ";"; 220 | 221 | // Write text data to file 222 | var data_stream = gio.DataOutputStream.new (file_stream); 223 | data_stream.put_string (json, null); 224 | 225 | } catch (e) { 226 | print ("Error: " + e.message); 227 | } 228 | } 229 | 230 | 231 | function saveData () { 232 | try { 233 | var file = gio.File.new_for_path ("avrodict.js"); 234 | 235 | if (file.query_exists (null)) { 236 | file.delete (null); 237 | } 238 | 239 | // Create a new file with this name 240 | var file_stream = file.create (gio.FileCreateFlags.NONE, null); 241 | 242 | var json = JSON.stringify(database); 243 | json = "var tables = " + _convertToUnicodeValue(json) + ";"; 244 | 245 | // Write text data to file 246 | var data_stream = gio.DataOutputStream.new (file_stream); 247 | data_stream.put_string (json, null); 248 | 249 | } catch (e) { 250 | print ("Error: " + e.message); 251 | } 252 | } 253 | 254 | var __db = new DB (); 255 | __db.loadDb(); 256 | saveData(); 257 | saveSuffix(); -------------------------------------------------------------------------------- /avropref.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 5 6 | 16 7 | 1 8 | 10 9 | 10 | 11 | False 12 | Avro Phonetic Preferences 13 | False 14 | True 15 | avro-bangla.png 16 | True 17 | 18 | 19 | True 20 | False 21 | 0 22 | none 23 | 24 | 25 | True 26 | False 27 | 15 28 | 15 29 | 15 30 | 15 31 | 32 | 33 | True 34 | False 35 | 10 36 | 10 37 | 38 | 39 | True 40 | False 41 | 1 42 | Preview Window: 43 | right 44 | 25 45 | 46 | 47 | 0 48 | 0 49 | 1 50 | 1 51 | 52 | 53 | 54 | 55 | True 56 | False 57 | 1 58 | Dictionary Suggestion: 59 | 60 | 61 | 0 62 | 2 63 | 1 64 | 1 65 | 66 | 67 | 68 | 69 | False 70 | True 71 | True 72 | False 73 | 74 | 75 | 1 76 | 0 77 | 1 78 | 1 79 | 80 | 81 | 82 | 83 | False 84 | True 85 | True 86 | False 87 | 88 | 89 | 1 90 | 2 91 | 1 92 | 1 93 | 94 | 95 | 96 | 97 | True 98 | False 99 | 1 100 | Enter/Return key only closes preview window: 101 | right 102 | 25 103 | 104 | 105 | 0 106 | 1 107 | 1 108 | 1 109 | 110 | 111 | 112 | 113 | False 114 | True 115 | True 116 | False 117 | 118 | 119 | 1 120 | 1 121 | 1 122 | 1 123 | 124 | 125 | 126 | 127 | True 128 | False 129 | 1 130 | Maximum suggestions: 131 | 132 | 133 | 0 134 | 3 135 | 1 136 | 1 137 | 138 | 139 | 140 | 141 | True 142 | True 143 | 18 144 | lutable_size 145 | True 146 | 16 147 | 1 148 | 0 149 | left 150 | 151 | 152 | 1 153 | 3 154 | 1 155 | 1 156 | 157 | 158 | 159 | 160 | True 161 | False 162 | 1 163 | Suggestion List Orientation: 164 | 165 | 166 | 0 167 | 4 168 | 1 169 | 1 170 | 171 | 172 | 173 | 174 | True 175 | False 176 | 0 177 | 1 178 | 179 | Horizontal 180 | Vertical 181 | 182 | 183 | 184 | 1 185 | 4 186 | 1 187 | 1 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | -------------------------------------------------------------------------------- /main-gjs.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env gjs 2 | 3 | /* 4 | ============================================================================= 5 | ***************************************************************************** 6 | The contents of this file are subject to the Mozilla Public License 7 | Version 1.1 (the "License"); you may not use this file except in 8 | compliance with the License. You may obtain a copy of the License at 9 | http://www.mozilla.org/MPL/ 10 | 11 | Software distributed under the License is distributed on an "AS IS" 12 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 13 | License for the specific language governing rights and limitations 14 | under the License. 15 | 16 | The Original Code is ibus-avro 17 | 18 | The Initial Developer of the Original Code is 19 | Sarim Khan 20 | 21 | Copyright (C) Sarim Khan (http://www.sarimkhan.com). All Rights Reserved. 22 | 23 | 24 | Contributor(s): Mehdi Hasan Khan 25 | 26 | ***************************************************************************** 27 | ============================================================================= 28 | */ 29 | 30 | 31 | const IBus = imports.gi.IBus; 32 | imports.searchPath.unshift('.'); 33 | const eevars = imports.evars; 34 | const suggestion = imports.suggestionbuilder; 35 | const Gio = imports.gi.Gio; 36 | const prefwindow = imports.pref; 37 | 38 | //check if running from ibus 39 | exec_by_ibus = (ARGV[0] == '--ibus') 40 | 41 | // Let's initialize ibus 42 | IBus.init(); 43 | 44 | //get the ibus bus 45 | var bus = new IBus.Bus(); 46 | 47 | if (bus.is_connected()) { 48 | 49 | /* =========================================================================== */ 50 | /* =========================================================================== */ 51 | /* IBus Engine */ 52 | /* =========================================================================== */ 53 | /* =========================================================================== */ 54 | 55 | var id = 0; 56 | 57 | function _create_engine_cb(factory, engine_name) { 58 | 59 | id += 1; 60 | var engine = new IBus.Engine({ 61 | engine_name: engine_name, 62 | object_path: '/org/freedesktop/IBus/Engine/' + id, 63 | connection: bus.get_connection() 64 | }); 65 | 66 | engine.connect('process-key-event', function (engine, keyval, keycode, state) { 67 | 68 | //print keypress infos, helpful for debugging 69 | print(keyval + " " + keycode + " " + state); 70 | 71 | //ignore release event 72 | if (!(state == 0 || state == 1 || state == 16 || state == 17)) { 73 | return false; 74 | } 75 | 76 | // capture the shift key 77 | if (keycode == 42) { 78 | return true; 79 | } 80 | 81 | // process letter key events 82 | if ((keyval >= 33 && keyval <= 126) || 83 | (keyval >= IBus.KP_0 && keyval <= IBus.KP_9) || 84 | keyval == IBus.KP_Add || 85 | keyval == IBus.KP_Decimal || 86 | keyval == IBus.KP_Divide || 87 | keyval == IBus.KP_Multiply || 88 | keyval == IBus.KP_Divide || 89 | keyval == IBus.KP_Subtract) { 90 | 91 | engine.buffertext += IBus.keyval_to_unicode(keyval); 92 | updateCurrentSuggestions(engine); 93 | return true; 94 | 95 | } else if (keyval == IBus.Return || keyval == IBus.space || keyval == IBus.Tab) { 96 | if (engine.buffertext.length > 0){ 97 | if ((keyval == IBus.Return) && engine.setting_switch_newline && engine.setting_switch_preview && (engine.buffertext.length > 0)){ 98 | commitCandidate(engine); 99 | return true; 100 | } else { 101 | commitCandidate(engine); 102 | } 103 | } 104 | 105 | } else if (keyval == IBus.BackSpace) { 106 | if (engine.buffertext.length > 0) { 107 | engine.buffertext = engine.buffertext.substr(0, engine.buffertext.length - 1); 108 | updateCurrentSuggestions(engine); 109 | 110 | if (engine.buffertext.length <= 0) { 111 | resetAll(engine); 112 | } 113 | return true; 114 | } 115 | } else if (keyval == IBus.Left || keyval == IBus.KP_Left || keyval == IBus.Right || keyval == IBus.KP_Right) { 116 | if (engine.currentSuggestions.length <= 0 || engine.lookuptable.get_orientation() == 1){ 117 | commitCandidate(engine); 118 | } else { 119 | if (keyval == IBus.Left || keyval == IBus.KP_Left) { 120 | decSelection(engine); 121 | } 122 | else if (keyval == IBus.Right || keyval == IBus.KP_Right) { 123 | incSelection(engine); 124 | } 125 | 126 | return true; 127 | } 128 | 129 | } else if (keyval == IBus.Up || keyval == IBus.KP_Up || keyval == IBus.Down || keyval == IBus.KP_Down) { 130 | print (engine.lookuptable.get_orientation()); 131 | if (engine.currentSuggestions.length <= 0 || engine.lookuptable.get_orientation() == 0){ 132 | commitCandidate(engine); 133 | } else { 134 | if (keyval == IBus.Up) { 135 | decSelection(engine); 136 | } 137 | else if (keyval == IBus.Down) { 138 | incSelection(engine); 139 | } 140 | 141 | return true; 142 | } 143 | 144 | } else if (keyval == IBus.Control_L || 145 | keyval == IBus.Control_R || 146 | keyval == IBus.Insert || 147 | keyval == IBus.KP_Insert || 148 | keyval == IBus.Delete || 149 | keyval == IBus.KP_Delete || 150 | keyval == IBus.Home || 151 | keyval == IBus.KP_Home || 152 | keyval == IBus.Page_Up || 153 | keyval == IBus.KP_Page_Up || 154 | keyval == IBus.Page_Down || 155 | keyval == IBus.KP_Page_Down || 156 | keyval == IBus.End || 157 | keyval == IBus.KP_End || 158 | keyval == IBus.Alt_L || 159 | keyval == IBus.Alt_R || 160 | keyval == IBus.Super_L || 161 | keyval == IBus.Super_R || 162 | keyval == IBus.Return || 163 | keyval == IBus.space || 164 | keyval == IBus.Tab || 165 | keyval == IBus.KP_Enter) { 166 | 167 | commitCandidate(engine); 168 | } 169 | return false; 170 | }); 171 | 172 | engine.connect('candidate-clicked', function (engine,index,button,state) { 173 | if (engine.buffertext.length > 0) { 174 | engine.currentSelection = index; 175 | preeditCandidate(engine); 176 | suggestionBuilder.updateCandidateSelection(engine.buffertext, engine.currentSuggestions[engine.currentSelection]); 177 | print("candidate clicked: " + index + " " + button + " " + state); 178 | } 179 | 180 | }); 181 | 182 | engine.connect('focus-out', function () { 183 | if (engine.buffertext.length > 0) { 184 | commitCandidate(engine); 185 | } 186 | }); 187 | 188 | engine.connect('focus-in', function () { 189 | engine.register_properties(proplist); 190 | }); 191 | 192 | engine.connect('property-activate', function () { 193 | runPreferences(); 194 | }); 195 | 196 | var proplist = new IBus.PropList(); 197 | var propp = new IBus.Property.new( 198 | 'setup', 199 | IBus.PropType.NORMAL, 200 | IBus.Text.new_from_string("Preferences - Avro"), 201 | 'gtk-preferences', 202 | IBus.Text.new_from_string("Configure Avro"), 203 | true, 204 | true, 205 | IBus.PropState.UNCHECKED, 206 | null 207 | ); 208 | 209 | proplist.append(propp); 210 | engine.lookuptable = IBus.LookupTable.new(16, 0, true, true); 211 | resetAll(engine); 212 | initSetting(engine); 213 | return engine; 214 | } 215 | 216 | /* =========================================================================== */ 217 | /* =========================================================================== */ 218 | /* Engine Utility Functions */ 219 | /* =========================================================================== */ 220 | /* =========================================================================== */ 221 | 222 | var suggestionBuilder = new suggestion.SuggestionBuilder(); 223 | 224 | function initSetting(engine){ 225 | engine.setting = Gio.Settings.new("com.omicronlab.avro"); 226 | 227 | //set up a asynchronous callback for instant change later 228 | engine.setting.connect('changed', 229 | function(){ 230 | readSetting(engine); 231 | }); 232 | 233 | //read manually first time 234 | readSetting(engine); 235 | } 236 | 237 | 238 | function readSetting(engine){ 239 | engine.setting_switch_preview = engine.setting.get_boolean('switch-preview'); 240 | engine.setting_switch_dict = engine.setting.get_boolean('switch-dict'); 241 | engine.setting_switch_newline = engine.setting.get_boolean('switch-newline'); 242 | engine.lookuptable.set_orientation(engine.setting.get_int('cboxorient')); 243 | engine.setting_lutable_size = engine.setting.get_int('lutable-size'); 244 | engine.lookuptable.set_page_size(engine.setting_lutable_size); 245 | 246 | if (!engine.setting_switch_preview){ 247 | engine.setting_switch_dict = false; 248 | engine.setting_switch_newline = false; 249 | } 250 | 251 | var dictPref = suggestionBuilder.getPref(); 252 | dictPref.dictEnable = engine.setting_switch_dict; 253 | suggestionBuilder.setPref(dictPref); 254 | } 255 | 256 | 257 | function resetAll(engine){ 258 | engine.currentSuggestions = []; 259 | engine.currentSelection = 0; 260 | 261 | engine.buffertext = ""; 262 | engine.lookuptable.clear(); 263 | engine.hide_preedit_text(); 264 | engine.hide_auxiliary_text(); 265 | engine.hide_lookup_table(); 266 | } 267 | 268 | 269 | function updateCurrentSuggestions(engine){ 270 | var suggestion = suggestionBuilder.suggest(engine.buffertext); 271 | engine.currentSuggestions = suggestion['words'].slice(0, engine.setting_lutable_size); 272 | engine.currentSelection = suggestion['prevSelection']; 273 | 274 | fillLookupTable (engine); 275 | } 276 | 277 | 278 | function fillLookupTable (engine){ 279 | 280 | if (engine.setting_switch_preview){ 281 | var auxiliaryText = IBus.Text.new_from_string(engine.buffertext); 282 | engine.update_auxiliary_text(auxiliaryText, true); 283 | 284 | if (engine.setting_switch_dict){ 285 | engine.lookuptable.clear(); 286 | 287 | engine.currentSuggestions.forEach(function(word){ 288 | let wtext = IBus.Text.new_from_string(word); 289 | //default, ibus sets "1,2,3,4...." as label, i didn't find how to hide it,but a empty string can partially hide it 290 | let wlabel = IBus.Text.new_from_string('');; 291 | engine.lookuptable.append_candidate(wtext); 292 | engine.lookuptable.append_label(wlabel); 293 | }); 294 | } 295 | } 296 | 297 | preeditCandidate(engine); 298 | } 299 | 300 | 301 | function preeditCandidate(engine){ 302 | if (engine.setting_switch_preview){ 303 | if (engine.setting_switch_dict){ 304 | engine.lookuptable.set_cursor_pos(engine.currentSelection); 305 | engine.update_lookup_table_fast(engine.lookuptable,true); 306 | } 307 | } 308 | 309 | var preeditText = IBus.Text.new_from_string(engine.currentSuggestions[engine.currentSelection]); 310 | engine.update_preedit_text(preeditText, engine.currentSuggestions[engine.currentSelection].length, true); 311 | } 312 | 313 | function commitCandidate(engine){ 314 | if (engine.buffertext.length > 0){ 315 | var commitText = IBus.Text.new_from_string(engine.currentSuggestions[engine.currentSelection]); 316 | engine.commit_text(commitText); 317 | } 318 | 319 | suggestionBuilder.stringCommitted(engine.buffertext, engine.currentSuggestions[engine.currentSelection]); 320 | 321 | resetAll(engine); 322 | } 323 | 324 | function incSelection(engine){ 325 | var lastIndex = engine.currentSuggestions.length - 1; 326 | 327 | if ((engine.currentSelection + 1) > lastIndex){ 328 | engine.currentSelection = -1; 329 | } 330 | ++engine.currentSelection; 331 | preeditCandidate(engine); 332 | 333 | suggestionBuilder.updateCandidateSelection(engine.buffertext, engine.currentSuggestions[engine.currentSelection]); 334 | } 335 | 336 | function decSelection(engine){ 337 | if ((engine.currentSelection - 1) < 0){ 338 | engine.currentSelection = engine.currentSuggestions.length; 339 | } 340 | --engine.currentSelection; 341 | preeditCandidate(engine); 342 | 343 | suggestionBuilder.updateCandidateSelection(engine.buffertext, engine.currentSuggestions[engine.currentSelection]); 344 | } 345 | 346 | function runPreferences(){ 347 | //code for running preferences windows will be here 348 | prefwindow.runpref(); 349 | } 350 | /* =========================================================================== */ 351 | /* =========================================================================== */ 352 | /* IBus Factory */ 353 | /* =========================================================================== */ 354 | /* =========================================================================== */ 355 | 356 | var factory = IBus.Factory.new(bus.get_connection()); 357 | factory.connect('create-engine', _create_engine_cb); 358 | 359 | // property 'exec' is changed to 'command-line' in recent ibus,the try-catch block is here for supporting both. 360 | var component = null; 361 | try { 362 | component = new IBus.Component({ 363 | name: "org.freedesktop.IBus.Avro", 364 | description: "Avro Phonetic", 365 | version: "1.0", 366 | license: "MPL 1.1", 367 | author: "Sarim Khan ", 368 | homepage: "https://github.com/sarim/ibus-avro", 369 | command_line: eevars.get_libexecdir() + "/main-gjs.js", 370 | textdomain: "avro-phonetic" 371 | }); 372 | } catch (error) { 373 | component = new IBus.Component({ 374 | name: "org.freedesktop.IBus.Avro", 375 | description: "Avro Phonetic", 376 | version: "1.0", 377 | license: "MPL 1.1", 378 | author: "Sarim Khan ", 379 | homepage: "https://github.com/sarim/ibus-avro", 380 | exec: eevars.get_libexecdir() + "/main-gjs.js", 381 | textdomain: "avro-phonetic" 382 | }); 383 | } 384 | 385 | //opensuse's ibus supports only Property(Menu) but ubuntu only supports "setup" param for Preferences Button, try-catch in rescue 386 | try { 387 | var avroenginedesc = new IBus.EngineDesc({ 388 | name: "avro-phonetic", 389 | longname: "Avro Phonetic", 390 | description: "Avro Phonetic Engine", 391 | language: "bn", 392 | license: "MPL 1.1", 393 | author: "Sarim Khan ", 394 | icon: eevars.get_pkgdatadir() + "/avro-bangla.png", 395 | layout: "bn", 396 | setup: "/usr/bin/env gjs --include-path=" + eevars.get_pkgdatadir() + " " + eevars.get_pkgdatadir() + "/pref.js --standalone" 397 | }); 398 | } catch (error) { 399 | var avroenginedesc = new IBus.EngineDesc({ 400 | name: "avro-phonetic", 401 | longname: "Avro Phonetic", 402 | description: "Avro Phonetic Engine", 403 | language: "bn", 404 | license: "MPL 1.1", 405 | author: "Sarim Khan ", 406 | icon: eevars.get_pkgdatadir() + "/avro-bangla.png", 407 | layout: "bn" 408 | }); 409 | 410 | } 411 | 412 | component.add_engine(avroenginedesc); 413 | 414 | if (exec_by_ibus) { 415 | bus.request_name("org.freedesktop.IBus.Avro", 0); 416 | } else { 417 | bus.register_component(component); 418 | } 419 | IBus.main(); 420 | } 421 | else 422 | print("Exiting because IBus Bus not found, maybe the daemon is not running ?"); 423 | -------------------------------------------------------------------------------- /suggestionbuilder.js: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================= 3 | ***************************************************************************** 4 | The contents of this file are subject to the Mozilla Public License 5 | Version 1.1 (the "License"); you may not use this file except in 6 | compliance with the License. You may obtain a copy of the License at 7 | http://www.mozilla.org/MPL/ 8 | 9 | Software distributed under the License is distributed on an "AS IS" 10 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 11 | License for the specific language governing rights and limitations 12 | under the License. 13 | 14 | The Original Code is jsAvroPhonetic 15 | 16 | The Initial Developer of the Original Code is 17 | Mehdi Hasan Khan 18 | 19 | Copyright (C) OmicronLab (http://www.omicronlab.com). All Rights Reserved. 20 | 21 | 22 | Contributor(s): ______________________________________. 23 | 24 | ***************************************************************************** 25 | ============================================================================= 26 | */ 27 | 28 | const gio = imports.gi.Gio; 29 | const GLib = imports.gi.GLib; 30 | 31 | const dictsearch = imports.dbsearch; 32 | const autocorrectdb = imports.autocorrect.db; 33 | const Avroparser = imports.avrolib.OmicronLab.Avro.Phonetic; 34 | const utfconv = imports.utf8; 35 | const EditDistance = imports.levenshtein; 36 | const suffixDict = imports.suffixdict.db; 37 | 38 | function SuggestionBuilder(){ 39 | this._init(); 40 | } 41 | 42 | SuggestionBuilder.prototype = { 43 | 44 | _init: function(){ 45 | this._dbSearch = new dictsearch.DBSearch (); 46 | this._candidateSelections = {}; 47 | this._phoneticCache = {}; 48 | this._loadCandidateSelectionsFromFile(); 49 | this._tempCache = {}; 50 | this._pref = this._defaultPref(); 51 | }, 52 | 53 | 54 | _defaultPref: function(){ 55 | var pref = {}; 56 | pref.dictEnable = true; 57 | 58 | return pref; 59 | }, 60 | 61 | 62 | _getDictionarySuggestion: function(splitWord){ 63 | var words = []; 64 | 65 | var key = splitWord['middle'].toLowerCase(); 66 | 67 | if (this._phoneticCache[key]){ 68 | words = this._phoneticCache[key].slice(0); 69 | } else { 70 | words = this._dbSearch.search(key); 71 | } 72 | return words; 73 | }, 74 | 75 | 76 | _getClassicPhonetic: function(banglish){ 77 | return utfconv.utf8Decode(Avroparser.parse(banglish)); 78 | }, 79 | 80 | 81 | _correctCase:function (banglish){ 82 | return Avroparser.fixString(banglish); 83 | }, 84 | 85 | 86 | _getAutocorrect: function(word, splitWord){ 87 | var corrected = {}; 88 | 89 | //Search for whole match 90 | if(autocorrectdb[word]){ 91 | // [smiley rule] 92 | if (autocorrectdb[word] == word){ 93 | corrected['corrected'] = word; 94 | corrected['exact'] = true; 95 | } else { 96 | corrected['corrected'] = this._getClassicPhonetic(autocorrectdb[word]); 97 | corrected['exact'] = false; 98 | } 99 | } else { 100 | //Whole word is not present, search without padding 101 | var correctedMiddle = this._correctCase(splitWord['middle']); 102 | if(autocorrectdb[correctedMiddle]){ 103 | corrected['corrected'] = this._getClassicPhonetic(autocorrectdb[correctedMiddle]); 104 | corrected['exact'] = false; 105 | } 106 | } 107 | 108 | return corrected; 109 | }, 110 | 111 | 112 | _separatePadding: function(word){ 113 | // Feeling lost? Ask Rifat :D 114 | var match = word.match(/(^(?::`|\.`|[\-\]~!@#%&*()_=+[{}'";<>\/?|.,])*?(?=(?:,{2,}))|^(?::`|\.`|[\-\]~!@#%&*()_=+[{}'";<>\/?|.,])*)(.*?(?:,,)*)((?::`|\.`|[\-\]~!@#%&*()_=+[{}'";<>\/?|.,])*$)/); 115 | 116 | var splitWord = {}; 117 | splitWord['begin'] = match[1]; 118 | splitWord['middle'] = match[2]; 119 | splitWord['end'] = match[3]; 120 | 121 | return splitWord; 122 | }, 123 | 124 | 125 | _sortByPhoneticRelevance: function (phonetic, dictSuggestion){ 126 | //Copy array 127 | var sortedSuggestion = dictSuggestion.slice(0); 128 | 129 | sortedSuggestion.sort(function(a, b){ 130 | var da = EditDistance.levenshtein(phonetic, a); 131 | var db = EditDistance.levenshtein(phonetic, b); 132 | 133 | if (da < db){ 134 | return -1; 135 | } else if (da > db){ 136 | return 1; 137 | } else{ 138 | return 0; 139 | } 140 | }); 141 | 142 | return sortedSuggestion; 143 | }, 144 | 145 | _addToArray: function (arr,item) { 146 | if (arr.indexOf(item) == -1){ 147 | arr.push(item); 148 | } 149 | }, 150 | 151 | 152 | _convertToUnicodeValue: function(input){ 153 | var output = ''; 154 | 155 | for (var i = 0; i < input.length; i++){ 156 | var charCode = input.charCodeAt(i); 157 | if (charCode >= 255){ 158 | output += '\\u0' + charCode.toString(16); 159 | } else { 160 | output += input.charAt(i); 161 | } 162 | } 163 | return output; 164 | }, 165 | 166 | 167 | _isKar: function(input){ 168 | if (input.length < 1){ 169 | return false; 170 | } 171 | var cInput = input.charAt(0); 172 | return /^[\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c7\u09c8\u09cb\u09cc\u09c4]$/.test(cInput); 173 | }, 174 | 175 | 176 | _isVowel: function(input){ 177 | if (input.length < 1){ 178 | return false; 179 | } 180 | var cInput = input.charAt(0); 181 | return /^[\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098f\u0990\u0993\u0994\u098c\u09e1\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c7\u09c8\u09cb\u09cc]$/.test(cInput); 182 | }, 183 | 184 | 185 | _addToTempCache: function(full, base, eng){ 186 | //Don't overwrite 187 | if (!this._tempCache[full]){ 188 | this._tempCache[full] = {}; 189 | this._tempCache[full].base = base; 190 | this._tempCache[full].eng = eng; 191 | } 192 | }, 193 | 194 | 195 | _addSuffix: function(splitWord){ 196 | var tempList = []; 197 | var fullWord = ''; 198 | var word = splitWord['middle'].toLowerCase(); 199 | var len = word.length; 200 | 201 | var rList = []; 202 | if (this._phoneticCache[word]){ 203 | rList = this._phoneticCache[word].slice(0); 204 | } 205 | 206 | this._tempCache = {}; 207 | 208 | if (len >= 2){ 209 | for (var j = 1; j <= len; j++){ 210 | var testSuffix = word.substr(j, len); 211 | 212 | var suffix = suffixDict[testSuffix]; 213 | if (suffix){ 214 | var key = word.substr(0, word.length - testSuffix.length); 215 | if (this._phoneticCache[key]){ 216 | for (var k = 0; k < this._phoneticCache[key].length; k++){ 217 | var cacheItem = this._phoneticCache[key][k]; 218 | var cacheRightChar = cacheItem.substr(-1); 219 | var suffixLeftChar = suffix.substr(0, 1); 220 | if (this._isVowel(cacheRightChar) && this._isKar(suffixLeftChar)){ 221 | fullWord = cacheItem + "\u09df" + suffix; // \u09df = B_Y 222 | tempList.push(fullWord); 223 | this._addToTempCache(fullWord, cacheItem, key); 224 | } else { 225 | if (cacheRightChar == "\u09ce"){ // \u09ce = b_Khandatta 226 | fullWord = cacheItem.substr(0, cacheItem.length - 1) + "\u09a4" + suffix; // \u09a4 = b_T 227 | tempList.push(fullWord); 228 | this._addToTempCache(fullWord, cacheItem, key); 229 | } else if (cacheRightChar == "\u0982"){ // \u0982 = b_Anushar 230 | fullWord = cacheItem.substr(0, cacheItem.length - 1) + "\u0999" + suffix; // \u09a4 = b_NGA 231 | tempList.push(fullWord); 232 | } else { 233 | fullWord = cacheItem + suffix; 234 | tempList.push(fullWord); 235 | this._addToTempCache(fullWord, cacheItem, key); 236 | } 237 | } 238 | } 239 | 240 | for (i in tempList){ 241 | rList.push(tempList[i]); 242 | } 243 | } 244 | } 245 | } 246 | } 247 | 248 | return rList; 249 | }, 250 | 251 | 252 | _joinSuggestion: function(autoCorrect, dictSuggestion, phonetic, splitWord){ 253 | var words = []; 254 | 255 | if (!this._pref.dictEnable){ 256 | words.push(phonetic); 257 | words[0] = splitWord['begin'] + words[0] + splitWord['end']; 258 | 259 | var suggestion = {}; 260 | suggestion['words'] = words; 261 | suggestion['prevSelection'] = 0; 262 | } else { 263 | 264 | /* 1st Item: Autocorrect */ 265 | if (autoCorrect['corrected']){ 266 | words.push(autoCorrect['corrected']); 267 | //Add autocorrect entry to dictSuggestion for suffix support 268 | if (!autoCorrect['exact']){ 269 | dictSuggestion.push(autoCorrect['corrected']); 270 | } 271 | } 272 | 273 | 274 | /* 2rd Item: Dictionary Avro Phonetic */ 275 | //Update Phonetic Cache 276 | if(!this._phoneticCache[splitWord['middle'].toLowerCase()]){ 277 | if (dictSuggestion.length > 0){ 278 | this._phoneticCache[splitWord['middle'].toLowerCase()] = dictSuggestion.slice(0); 279 | } 280 | } 281 | //Add Suffix 282 | var dictSuggestionWithSuffix = this._addSuffix(splitWord); 283 | 284 | var sortedWords = this._sortByPhoneticRelevance(phonetic, dictSuggestionWithSuffix); 285 | for (i in sortedWords){ 286 | this._addToArray(words, sortedWords[i]); 287 | } 288 | 289 | /* 3rd Item: Classic Avro Phonetic */ 290 | this._addToArray(words, phonetic); 291 | 292 | var suggestion = {}; 293 | 294 | //Is there any previous custom selection of the user? 295 | suggestion['prevSelection'] = this._getPreviousSelection(splitWord, words); 296 | 297 | //Add padding to all, except exact autocorrect 298 | for (i in words){ 299 | if (autoCorrect['exact']){ 300 | if (autoCorrect['corrected'] != words[i]){ 301 | words[i] = splitWord['begin'] + words[i] + splitWord['end']; 302 | } 303 | } else { 304 | words[i] = splitWord['begin'] + words[i] + splitWord['end']; 305 | } 306 | } 307 | 308 | suggestion['words'] = words; 309 | 310 | } 311 | 312 | return suggestion; 313 | }, 314 | 315 | 316 | _getPreviousSelection: function (splitWord, suggestionWords){ 317 | var word = splitWord['middle']; 318 | var len = word.length; 319 | var selectedWord = ''; 320 | 321 | if (this._candidateSelections[word]){ 322 | selectedWord = this._candidateSelections[word]; 323 | } else { 324 | //Full word was not found, try checking without suffix 325 | if (len >= 2){ 326 | for (var j = 1; j < len; j++){ 327 | var testSuffix = word.substr(-j).toLowerCase(); 328 | 329 | var suffix = suffixDict[testSuffix]; 330 | if (suffix){ 331 | var key = word.substr(0, word.length - testSuffix.length); 332 | 333 | if (this._candidateSelections[key]){ 334 | 335 | //Get possible words for key 336 | var keyWord = this._candidateSelections[key]; 337 | 338 | var kwRightChar = keyWord.substr(-1); 339 | var suffixLeftChar = suffix.substr(0, 1); 340 | 341 | var selectedWord = ''; 342 | 343 | if (this._isVowel(kwRightChar) && this._isKar(suffixLeftChar)){ 344 | selectedWord = keyWord + "\u09df" + suffix; // \u09df = B_Y 345 | } else { 346 | if (kwRightChar == "\u09ce"){ // \u09ce = b_Khandatta 347 | selectedWord = keyWord.substr(0, keyWord.length - 1) + "\u09a4" + suffix; // \u09a4 = b_T 348 | } else if (kwRightChar == "\u0982"){ // \u0982 = b_Anushar 349 | selectedWord = keyWord.substr(0, keyWord.length - 1) + "\u0999" + suffix; // \u09a4 = b_NGA 350 | } else { 351 | selectedWord = keyWord + suffix; 352 | } 353 | } 354 | 355 | //Save this referrence 356 | this._updateCandidateSelection(word, selectedWord); 357 | break; 358 | } 359 | } 360 | } 361 | } 362 | } 363 | 364 | var i = suggestionWords.indexOf(selectedWord); 365 | return (i < 0) ? i = 0 : i; 366 | }, 367 | 368 | 369 | _loadCandidateSelectionsFromFile: function(){ 370 | try { 371 | var file = gio.File.new_for_path(GLib.get_home_dir() + "/.candidate-selections.json"); 372 | 373 | if (file.query_exists (null)) { 374 | 375 | var file_stream = file.read(null); 376 | var data_stream = gio.DataInputStream.new(file_stream); 377 | var json = data_stream.read_until("", null); 378 | this._candidateSelections = JSON.parse(json[0]); 379 | 380 | /* 381 | file.read_async(0, null, 382 | function(source, result){ 383 | var file_stream = source.read_finish(result); 384 | 385 | if (file_stream){ 386 | var data_stream = gio.DataInputStream.new(file_stream); 387 | var json = data_stream.read_until("", null); 388 | this._candidateSelections = JSON.parse(json[0]); 389 | } else { 390 | this._logger(e, 'Error in _loadCandidateSelectionsFromFile'); 391 | } 392 | }); 393 | */ 394 | } else { 395 | this._candidateSelections = {}; 396 | } 397 | } catch (e){ 398 | this._candidateSelections = {}; 399 | this._logger(e, 'Error in _loadCandidateSelectionsFromFile'); 400 | } 401 | }, 402 | 403 | 404 | _saveCandidateSelectionsToFile: function(){ 405 | try { 406 | var file = gio.File.new_for_path ( GLib.get_home_dir() + "/.candidate-selections.json"); 407 | 408 | if (file.query_exists (null)) { 409 | file.delete (null); 410 | } 411 | /* 412 | var file_stream = file.create (gio.FileCreateFlags.NONE, null); 413 | var json = JSON.stringify(this._candidateSelections); 414 | json = this._convertToUnicodeValue(json); 415 | // Write text data to file 416 | var data_stream = gio.DataOutputStream.new (file_stream); 417 | data_stream.put_string (json, null); 418 | */ 419 | var that = this; 420 | // Create a new file with this name 421 | file.create_async(gio.FileCreateFlags.NONE, 0, null, 422 | function(source, result){ 423 | var file_stream = source.create_finish(result); 424 | 425 | if (file_stream){ 426 | var json = JSON.stringify(that._candidateSelections); 427 | json = that._convertToUnicodeValue(json); 428 | 429 | // Write text data to file 430 | var data_stream = gio.DataOutputStream.new (file_stream); 431 | data_stream.put_string (json, null); 432 | } else { 433 | this._logger(e, 'Error in _saveCandidateSelectionsToFile'); 434 | } 435 | }); 436 | } catch (e) { 437 | this._logger(e, '_saveCandidateSelectionsToFile Error'); 438 | } 439 | }, 440 | 441 | 442 | _updateCandidateSelection: function(word, candidate){ 443 | this._candidateSelections[word] = candidate; 444 | }, 445 | 446 | 447 | 448 | _logger: function (obj, msg){ 449 | print ((msg || 'Log') + ': ' + JSON.stringify(obj, null, '\t')); 450 | }, 451 | 452 | 453 | getPref: function(){ 454 | return this._pref; 455 | }, 456 | 457 | 458 | setPref: function(pref){ 459 | //TODO: Add Validation 460 | this._pref = pref; 461 | }, 462 | 463 | 464 | stringCommitted: function(word, candidate){ 465 | if (!this._pref.dictEnable){ 466 | return; 467 | } 468 | 469 | //If it is called, user made the final decision here 470 | 471 | //Check and save selection without suffix if that is not present 472 | if (this._tempCache[candidate]){ 473 | var base = this._tempCache[candidate].base; 474 | var eng = this._tempCache[candidate].eng; 475 | //Don't overwrite existing value 476 | if (!this._candidateSelections[eng]){ 477 | this._candidateSelections[eng] = base; 478 | this._saveCandidateSelectionsToFile(); 479 | } 480 | } 481 | 482 | this._saveCandidateSelectionsToFile(); 483 | }, 484 | 485 | 486 | updateCandidateSelection: function(word, candidate){ 487 | if (!this._pref.dictEnable){ 488 | return; 489 | } 490 | 491 | //Seperate begining and trailing padding characters, punctuations etc. from whole word 492 | var splitWord = this._separatePadding(word); 493 | this._updateCandidateSelection(splitWord['middle'], candidate); 494 | }, 495 | 496 | 497 | suggest: function(word){ 498 | //Seperate begining and trailing padding characters, punctuations etc. from whole word 499 | var splitWord = this._separatePadding(word); 500 | 501 | //Convert begining and trailing padding text to phonetic Bangla 502 | splitWord['begin'] = this._getClassicPhonetic(splitWord['begin']); 503 | splitWord['end'] = this._getClassicPhonetic(splitWord['end']); 504 | 505 | //Convert the word to Bangla using 3 separate methods 506 | var phonetic = this._getClassicPhonetic(splitWord['middle']); 507 | 508 | if (this._pref.dictEnable){ 509 | var dictSuggestion = this._getDictionarySuggestion(splitWord); 510 | var autoCorrect = this._getAutocorrect(word, splitWord); 511 | } 512 | 513 | //Prepare suggestion object 514 | var suggestion = this._joinSuggestion(autoCorrect, dictSuggestion, phonetic, splitWord); 515 | 516 | return suggestion; 517 | } 518 | } 519 | -------------------------------------------------------------------------------- /MPL-1.1.txt: -------------------------------------------------------------------------------- 1 | MOZILLA PUBLIC LICENSE 2 | Version 1.1 3 | 4 | --------------- 5 | 6 | 1. Definitions. 7 | 8 | 1.0.1. "Commercial Use" means distribution or otherwise making the 9 | Covered Code available to a third party. 10 | 11 | 1.1. "Contributor" means each entity that creates or contributes to 12 | the creation of Modifications. 13 | 14 | 1.2. "Contributor Version" means the combination of the Original 15 | Code, prior Modifications used by a Contributor, and the Modifications 16 | made by that particular Contributor. 17 | 18 | 1.3. "Covered Code" means the Original Code or Modifications or the 19 | combination of the Original Code and Modifications, in each case 20 | including portions thereof. 21 | 22 | 1.4. "Electronic Distribution Mechanism" means a mechanism generally 23 | accepted in the software development community for the electronic 24 | transfer of data. 25 | 26 | 1.5. "Executable" means Covered Code in any form other than Source 27 | Code. 28 | 29 | 1.6. "Initial Developer" means the individual or entity identified 30 | as the Initial Developer in the Source Code notice required by Exhibit 31 | A. 32 | 33 | 1.7. "Larger Work" means a work which combines Covered Code or 34 | portions thereof with code not governed by the terms of this License. 35 | 36 | 1.8. "License" means this document. 37 | 38 | 1.8.1. "Licensable" means having the right to grant, to the maximum 39 | extent possible, whether at the time of the initial grant or 40 | subsequently acquired, any and all of the rights conveyed herein. 41 | 42 | 1.9. "Modifications" means any addition to or deletion from the 43 | substance or structure of either the Original Code or any previous 44 | Modifications. When Covered Code is released as a series of files, a 45 | Modification is: 46 | A. Any addition to or deletion from the contents of a file 47 | containing Original Code or previous Modifications. 48 | 49 | B. Any new file that contains any part of the Original Code or 50 | previous Modifications. 51 | 52 | 1.10. "Original Code" means Source Code of computer software code 53 | which is described in the Source Code notice required by Exhibit A as 54 | Original Code, and which, at the time of its release under this 55 | License is not already Covered Code governed by this License. 56 | 57 | 1.10.1. "Patent Claims" means any patent claim(s), now owned or 58 | hereafter acquired, including without limitation, method, process, 59 | and apparatus claims, in any patent Licensable by grantor. 60 | 61 | 1.11. "Source Code" means the preferred form of the Covered Code for 62 | making modifications to it, including all modules it contains, plus 63 | any associated interface definition files, scripts used to control 64 | compilation and installation of an Executable, or source code 65 | differential comparisons against either the Original Code or another 66 | well known, available Covered Code of the Contributor's choice. The 67 | Source Code can be in a compressed or archival form, provided the 68 | appropriate decompression or de-archiving software is widely available 69 | for no charge. 70 | 71 | 1.12. "You" (or "Your") means an individual or a legal entity 72 | exercising rights under, and complying with all of the terms of, this 73 | License or a future version of this License issued under Section 6.1. 74 | For legal entities, "You" includes any entity which controls, is 75 | controlled by, or is under common control with You. For purposes of 76 | this definition, "control" means (a) the power, direct or indirect, 77 | to cause the direction or management of such entity, whether by 78 | contract or otherwise, or (b) ownership of more than fifty percent 79 | (50%) of the outstanding shares or beneficial ownership of such 80 | entity. 81 | 82 | 2. Source Code License. 83 | 84 | 2.1. The Initial Developer Grant. 85 | The Initial Developer hereby grants You a world-wide, royalty-free, 86 | non-exclusive license, subject to third party intellectual property 87 | claims: 88 | (a) under intellectual property rights (other than patent or 89 | trademark) Licensable by Initial Developer to use, reproduce, 90 | modify, display, perform, sublicense and distribute the Original 91 | Code (or portions thereof) with or without Modifications, and/or 92 | as part of a Larger Work; and 93 | 94 | (b) under Patents Claims infringed by the making, using or 95 | selling of Original Code, to make, have made, use, practice, 96 | sell, and offer for sale, and/or otherwise dispose of the 97 | Original Code (or portions thereof). 98 | 99 | (c) the licenses granted in this Section 2.1(a) and (b) are 100 | effective on the date Initial Developer first distributes 101 | Original Code under the terms of this License. 102 | 103 | (d) Notwithstanding Section 2.1(b) above, no patent license is 104 | granted: 1) for code that You delete from the Original Code; 2) 105 | separate from the Original Code; or 3) for infringements caused 106 | by: i) the modification of the Original Code or ii) the 107 | combination of the Original Code with other software or devices. 108 | 109 | 2.2. Contributor Grant. 110 | Subject to third party intellectual property claims, each Contributor 111 | hereby grants You a world-wide, royalty-free, non-exclusive license 112 | 113 | (a) under intellectual property rights (other than patent or 114 | trademark) Licensable by Contributor, to use, reproduce, modify, 115 | display, perform, sublicense and distribute the Modifications 116 | created by such Contributor (or portions thereof) either on an 117 | unmodified basis, with other Modifications, as Covered Code 118 | and/or as part of a Larger Work; and 119 | 120 | (b) under Patent Claims infringed by the making, using, or 121 | selling of Modifications made by that Contributor either alone 122 | and/or in combination with its Contributor Version (or portions 123 | of such combination), to make, use, sell, offer for sale, have 124 | made, and/or otherwise dispose of: 1) Modifications made by that 125 | Contributor (or portions thereof); and 2) the combination of 126 | Modifications made by that Contributor with its Contributor 127 | Version (or portions of such combination). 128 | 129 | (c) the licenses granted in Sections 2.2(a) and 2.2(b) are 130 | effective on the date Contributor first makes Commercial Use of 131 | the Covered Code. 132 | 133 | (d) Notwithstanding Section 2.2(b) above, no patent license is 134 | granted: 1) for any code that Contributor has deleted from the 135 | Contributor Version; 2) separate from the Contributor Version; 136 | 3) for infringements caused by: i) third party modifications of 137 | Contributor Version or ii) the combination of Modifications made 138 | by that Contributor with other software (except as part of the 139 | Contributor Version) or other devices; or 4) under Patent Claims 140 | infringed by Covered Code in the absence of Modifications made by 141 | that Contributor. 142 | 143 | 3. Distribution Obligations. 144 | 145 | 3.1. Application of License. 146 | The Modifications which You create or to which You contribute are 147 | governed by the terms of this License, including without limitation 148 | Section 2.2. The Source Code version of Covered Code may be 149 | distributed only under the terms of this License or a future version 150 | of this License released under Section 6.1, and You must include a 151 | copy of this License with every copy of the Source Code You 152 | distribute. You may not offer or impose any terms on any Source Code 153 | version that alters or restricts the applicable version of this 154 | License or the recipients' rights hereunder. However, You may include 155 | an additional document offering the additional rights described in 156 | Section 3.5. 157 | 158 | 3.2. Availability of Source Code. 159 | Any Modification which You create or to which You contribute must be 160 | made available in Source Code form under the terms of this License 161 | either on the same media as an Executable version or via an accepted 162 | Electronic Distribution Mechanism to anyone to whom you made an 163 | Executable version available; and if made available via Electronic 164 | Distribution Mechanism, must remain available for at least twelve (12) 165 | months after the date it initially became available, or at least six 166 | (6) months after a subsequent version of that particular Modification 167 | has been made available to such recipients. You are responsible for 168 | ensuring that the Source Code version remains available even if the 169 | Electronic Distribution Mechanism is maintained by a third party. 170 | 171 | 3.3. Description of Modifications. 172 | You must cause all Covered Code to which You contribute to contain a 173 | file documenting the changes You made to create that Covered Code and 174 | the date of any change. You must include a prominent statement that 175 | the Modification is derived, directly or indirectly, from Original 176 | Code provided by the Initial Developer and including the name of the 177 | Initial Developer in (a) the Source Code, and (b) in any notice in an 178 | Executable version or related documentation in which You describe the 179 | origin or ownership of the Covered Code. 180 | 181 | 3.4. Intellectual Property Matters 182 | (a) Third Party Claims. 183 | If Contributor has knowledge that a license under a third party's 184 | intellectual property rights is required to exercise the rights 185 | granted by such Contributor under Sections 2.1 or 2.2, 186 | Contributor must include a text file with the Source Code 187 | distribution titled "LEGAL" which describes the claim and the 188 | party making the claim in sufficient detail that a recipient will 189 | know whom to contact. If Contributor obtains such knowledge after 190 | the Modification is made available as described in Section 3.2, 191 | Contributor shall promptly modify the LEGAL file in all copies 192 | Contributor makes available thereafter and shall take other steps 193 | (such as notifying appropriate mailing lists or newsgroups) 194 | reasonably calculated to inform those who received the Covered 195 | Code that new knowledge has been obtained. 196 | 197 | (b) Contributor APIs. 198 | If Contributor's Modifications include an application programming 199 | interface and Contributor has knowledge of patent licenses which 200 | are reasonably necessary to implement that API, Contributor must 201 | also include this information in the LEGAL file. 202 | 203 | (c) Representations. 204 | Contributor represents that, except as disclosed pursuant to 205 | Section 3.4(a) above, Contributor believes that Contributor's 206 | Modifications are Contributor's original creation(s) and/or 207 | Contributor has sufficient rights to grant the rights conveyed by 208 | this License. 209 | 210 | 3.5. Required Notices. 211 | You must duplicate the notice in Exhibit A in each file of the Source 212 | Code. If it is not possible to put such notice in a particular Source 213 | Code file due to its structure, then You must include such notice in a 214 | location (such as a relevant directory) where a user would be likely 215 | to look for such a notice. If You created one or more Modification(s) 216 | You may add your name as a Contributor to the notice described in 217 | Exhibit A. You must also duplicate this License in any documentation 218 | for the Source Code where You describe recipients' rights or ownership 219 | rights relating to Covered Code. You may choose to offer, and to 220 | charge a fee for, warranty, support, indemnity or liability 221 | obligations to one or more recipients of Covered Code. However, You 222 | may do so only on Your own behalf, and not on behalf of the Initial 223 | Developer or any Contributor. You must make it absolutely clear than 224 | any such warranty, support, indemnity or liability obligation is 225 | offered by You alone, and You hereby agree to indemnify the Initial 226 | Developer and every Contributor for any liability incurred by the 227 | Initial Developer or such Contributor as a result of warranty, 228 | support, indemnity or liability terms You offer. 229 | 230 | 3.6. Distribution of Executable Versions. 231 | You may distribute Covered Code in Executable form only if the 232 | requirements of Section 3.1-3.5 have been met for that Covered Code, 233 | and if You include a notice stating that the Source Code version of 234 | the Covered Code is available under the terms of this License, 235 | including a description of how and where You have fulfilled the 236 | obligations of Section 3.2. The notice must be conspicuously included 237 | in any notice in an Executable version, related documentation or 238 | collateral in which You describe recipients' rights relating to the 239 | Covered Code. You may distribute the Executable version of Covered 240 | Code or ownership rights under a license of Your choice, which may 241 | contain terms different from this License, provided that You are in 242 | compliance with the terms of this License and that the license for the 243 | Executable version does not attempt to limit or alter the recipient's 244 | rights in the Source Code version from the rights set forth in this 245 | License. If You distribute the Executable version under a different 246 | license You must make it absolutely clear that any terms which differ 247 | from this License are offered by You alone, not by the Initial 248 | Developer or any Contributor. You hereby agree to indemnify the 249 | Initial Developer and every Contributor for any liability incurred by 250 | the Initial Developer or such Contributor as a result of any such 251 | terms You offer. 252 | 253 | 3.7. Larger Works. 254 | You may create a Larger Work by combining Covered Code with other code 255 | not governed by the terms of this License and distribute the Larger 256 | Work as a single product. In such a case, You must make sure the 257 | requirements of this License are fulfilled for the Covered Code. 258 | 259 | 4. Inability to Comply Due to Statute or Regulation. 260 | 261 | If it is impossible for You to comply with any of the terms of this 262 | License with respect to some or all of the Covered Code due to 263 | statute, judicial order, or regulation then You must: (a) comply with 264 | the terms of this License to the maximum extent possible; and (b) 265 | describe the limitations and the code they affect. Such description 266 | must be included in the LEGAL file described in Section 3.4 and must 267 | be included with all distributions of the Source Code. Except to the 268 | extent prohibited by statute or regulation, such description must be 269 | sufficiently detailed for a recipient of ordinary skill to be able to 270 | understand it. 271 | 272 | 5. Application of this License. 273 | 274 | This License applies to code to which the Initial Developer has 275 | attached the notice in Exhibit A and to related Covered Code. 276 | 277 | 6. Versions of the License. 278 | 279 | 6.1. New Versions. 280 | Netscape Communications Corporation ("Netscape") may publish revised 281 | and/or new versions of the License from time to time. Each version 282 | will be given a distinguishing version number. 283 | 284 | 6.2. Effect of New Versions. 285 | Once Covered Code has been published under a particular version of the 286 | License, You may always continue to use it under the terms of that 287 | version. You may also choose to use such Covered Code under the terms 288 | of any subsequent version of the License published by Netscape. No one 289 | other than Netscape has the right to modify the terms applicable to 290 | Covered Code created under this License. 291 | 292 | 6.3. Derivative Works. 293 | If You create or use a modified version of this License (which you may 294 | only do in order to apply it to code which is not already Covered Code 295 | governed by this License), You must (a) rename Your license so that 296 | the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", 297 | "MPL", "NPL" or any confusingly similar phrase do not appear in your 298 | license (except to note that your license differs from this License) 299 | and (b) otherwise make it clear that Your version of the license 300 | contains terms which differ from the Mozilla Public License and 301 | Netscape Public License. (Filling in the name of the Initial 302 | Developer, Original Code or Contributor in the notice described in 303 | Exhibit A shall not of themselves be deemed to be modifications of 304 | this License.) 305 | 306 | 7. DISCLAIMER OF WARRANTY. 307 | 308 | COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, 309 | WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 310 | WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF 311 | DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. 312 | THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE 313 | IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, 314 | YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE 315 | COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER 316 | OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF 317 | ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 318 | 319 | 8. TERMINATION. 320 | 321 | 8.1. This License and the rights granted hereunder will terminate 322 | automatically if You fail to comply with terms herein and fail to cure 323 | such breach within 30 days of becoming aware of the breach. All 324 | sublicenses to the Covered Code which are properly granted shall 325 | survive any termination of this License. Provisions which, by their 326 | nature, must remain in effect beyond the termination of this License 327 | shall survive. 328 | 329 | 8.2. If You initiate litigation by asserting a patent infringement 330 | claim (excluding declatory judgment actions) against Initial Developer 331 | or a Contributor (the Initial Developer or Contributor against whom 332 | You file such action is referred to as "Participant") alleging that: 333 | 334 | (a) such Participant's Contributor Version directly or indirectly 335 | infringes any patent, then any and all rights granted by such 336 | Participant to You under Sections 2.1 and/or 2.2 of this License 337 | shall, upon 60 days notice from Participant terminate prospectively, 338 | unless if within 60 days after receipt of notice You either: (i) 339 | agree in writing to pay Participant a mutually agreeable reasonable 340 | royalty for Your past and future use of Modifications made by such 341 | Participant, or (ii) withdraw Your litigation claim with respect to 342 | the Contributor Version against such Participant. If within 60 days 343 | of notice, a reasonable royalty and payment arrangement are not 344 | mutually agreed upon in writing by the parties or the litigation claim 345 | is not withdrawn, the rights granted by Participant to You under 346 | Sections 2.1 and/or 2.2 automatically terminate at the expiration of 347 | the 60 day notice period specified above. 348 | 349 | (b) any software, hardware, or device, other than such Participant's 350 | Contributor Version, directly or indirectly infringes any patent, then 351 | any rights granted to You by such Participant under Sections 2.1(b) 352 | and 2.2(b) are revoked effective as of the date You first made, used, 353 | sold, distributed, or had made, Modifications made by that 354 | Participant. 355 | 356 | 8.3. If You assert a patent infringement claim against Participant 357 | alleging that such Participant's Contributor Version directly or 358 | indirectly infringes any patent where such claim is resolved (such as 359 | by license or settlement) prior to the initiation of patent 360 | infringement litigation, then the reasonable value of the licenses 361 | granted by such Participant under Sections 2.1 or 2.2 shall be taken 362 | into account in determining the amount or value of any payment or 363 | license. 364 | 365 | 8.4. In the event of termination under Sections 8.1 or 8.2 above, 366 | all end user license agreements (excluding distributors and resellers) 367 | which have been validly granted by You or any distributor hereunder 368 | prior to termination shall survive termination. 369 | 370 | 9. LIMITATION OF LIABILITY. 371 | 372 | UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT 373 | (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL 374 | DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, 375 | OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR 376 | ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY 377 | CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, 378 | WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER 379 | COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN 380 | INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF 381 | LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY 382 | RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW 383 | PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE 384 | EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO 385 | THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 386 | 387 | 10. U.S. GOVERNMENT END USERS. 388 | 389 | The Covered Code is a "commercial item," as that term is defined in 390 | 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer 391 | software" and "commercial computer software documentation," as such 392 | terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 393 | C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), 394 | all U.S. Government End Users acquire Covered Code with only those 395 | rights set forth herein. 396 | 397 | 11. MISCELLANEOUS. 398 | 399 | This License represents the complete agreement concerning subject 400 | matter hereof. If any provision of this License is held to be 401 | unenforceable, such provision shall be reformed only to the extent 402 | necessary to make it enforceable. This License shall be governed by 403 | California law provisions (except to the extent applicable law, if 404 | any, provides otherwise), excluding its conflict-of-law provisions. 405 | With respect to disputes in which at least one party is a citizen of, 406 | or an entity chartered or registered to do business in the United 407 | States of America, any litigation relating to this License shall be 408 | subject to the jurisdiction of the Federal Courts of the Northern 409 | District of California, with venue lying in Santa Clara County, 410 | California, with the losing party responsible for costs, including 411 | without limitation, court costs and reasonable attorneys' fees and 412 | expenses. The application of the United Nations Convention on 413 | Contracts for the International Sale of Goods is expressly excluded. 414 | Any law or regulation which provides that the language of a contract 415 | shall be construed against the drafter shall not apply to this 416 | License. 417 | 418 | 12. RESPONSIBILITY FOR CLAIMS. 419 | 420 | As between Initial Developer and the Contributors, each party is 421 | responsible for claims and damages arising, directly or indirectly, 422 | out of its utilization of rights under this License and You agree to 423 | work with Initial Developer and Contributors to distribute such 424 | responsibility on an equitable basis. Nothing herein is intended or 425 | shall be deemed to constitute any admission of liability. 426 | 427 | 13. MULTIPLE-LICENSED CODE. 428 | 429 | Initial Developer may designate portions of the Covered Code as 430 | "Multiple-Licensed". "Multiple-Licensed" means that the Initial 431 | Developer permits you to utilize portions of the Covered Code under 432 | Your choice of the NPL or the alternative licenses, if any, specified 433 | by the Initial Developer in the file described in Exhibit A. 434 | 435 | EXHIBIT A -Mozilla Public License. 436 | 437 | ``The contents of this file are subject to the Mozilla Public License 438 | Version 1.1 (the "License"); you may not use this file except in 439 | compliance with the License. You may obtain a copy of the License at 440 | http://www.mozilla.org/MPL/ 441 | 442 | Software distributed under the License is distributed on an "AS IS" 443 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 444 | License for the specific language governing rights and limitations 445 | under the License. 446 | 447 | The Original Code is ibus-avro. 448 | 449 | The Initial Developer of the Original Code is 450 | Sarim Khan 451 | 452 | Copyright (C) Sarim Khan, unless otherwise stated. All Rights Reserved. 453 | 454 | 455 | Contributor(s): Mehdi Hasan , Rifat Nabi " 456 | 457 | -------------------------------------------------------------------------------- /suffixdict.js: -------------------------------------------------------------------------------- 1 | var db = {"e":"\u09c7","r":"\u09b0","y":"\u09df","o":"\u0993","i":"\u0987","eo":"\u09c7\u0993","ei":"\u09c7\u0987","er":"\u09c7\u09b0","gon":"\u0997\u09a3","ke":"\u0995\u09c7","ro":"\u09b0\u0993","ri":"\u09b0\u0987","ra":"\u09b0\u09be","re":"\u09b0\u09c7","te":"\u09a4\u09c7","yo":"\u09df\u0993","yi":"\u09df\u0987","ye":"\u09df\u09c7","shob":"\u09b8\u09ac","sob":"\u09b8\u09ac","ta":"\u099f\u09be","ti":"\u099f\u09bf","shoho":"\u09b8\u09b9","soho":"\u09b8\u09b9","der":"\u09a6\u09c7\u09b0","digo":"\u09a6\u09bf\u0997","ero":"\u09c7\u09b0\u0993","eri":"\u09c7\u09b0\u0987","era":"\u09c7\u09b0\u09be","ere":"\u09c7\u09b0\u09c7","ete":"\u09c7\u09a4\u09c7","gono":"\u0997\u09a3\u0993","goni":"\u0997\u09a3\u0987","gone":"\u0997\u09a3\u09c7","keo":"\u0995\u09c7\u0993","kei":"\u0995\u09c7\u0987","rao":"\u09b0\u09be\u0993","rai":"\u09b0\u09be\u0987","reo":"\u09b0\u09c7\u0993","rei":"\u09b0\u09c7\u0987","teo":"\u09a4\u09c7\u0993","tei":"\u09a4\u09c7\u0987","yeo":"\u09df\u09c7\u0993","yei":"\u09df\u09c7\u0987","yer":"\u09df\u09c7\u09b0","kul":"\u0995\u09c1\u09b2","shobo":"\u09b8\u09ac\u0993","shobi":"\u09b8\u09ac\u0987","shobe":"\u09b8\u09ac\u09c7","shokol":"\u09b8\u0995\u09b2","sobo":"\u09b8\u09ac\u0993","sobi":"\u09b8\u09ac\u0987","sobe":"\u09b8\u09ac\u09c7","sokol":"\u09b8\u0995\u09b2","tao":"\u099f\u09be\u0993","tai":"\u099f\u09be\u0987","tar":"\u099f\u09be\u09b0","tay":"\u099f\u09be\u09df","tio":"\u099f\u09bf\u0993","tii":"\u099f\u09bf\u0987","tir":"\u099f\u09bf\u09b0","shohoo":"\u09b8\u09b9\u0993","shohoi":"\u09b8\u09b9\u0987","sohoo":"\u09b8\u09b9\u0993","sohoi":"\u09b8\u09b9\u0987","tuk":"\u099f\u09c1\u0995","gun":"\u0997\u09c1\u09a3","dero":"\u09a6\u09c7\u09b0\u0993","deri":"\u09a6\u09c7\u09b0\u0987","dige":"\u09a6\u09bf\u0997\u09c7","digoo":"\u09a6\u09bf\u0997\u0993","digoi":"\u09a6\u09bf\u0997\u0987","erao":"\u09c7\u09b0\u09be\u0993","erai":"\u09c7\u09b0\u09be\u0987","ereo":"\u09c7\u09b0\u09c7\u0993","erei":"\u09c7\u09b0\u09c7\u0987","eteo":"\u09c7\u09a4\u09c7\u0993","etei":"\u09c7\u09a4\u09c7\u0987","goneo":"\u0997\u09a3\u09c7\u0993","gonei":"\u0997\u09a3\u09c7\u0987","goner":"\u0997\u09a3\u09c7\u09b0","gonke":"\u0997\u09a3\u0995\u09c7","gula":"\u0997\u09c1\u09b2\u09be","guli":"\u0997\u09c1\u09b2\u09bf","gulo":"\u0997\u09c1\u09b2\u09cb","yero":"\u09df\u09c7\u09b0\u0993","yeri":"\u09df\u09c7\u09b0\u0987","yera":"\u09df\u09c7\u09b0\u09be","yere":"\u09df\u09c7\u09b0\u09c7","yete":"\u09df\u09c7\u09a4\u09c7","borgo":"\u09ac\u09b0\u09cd\u0997","borrgo":"\u09ac\u09b0\u09cd\u0997","gonra":"\u0997\u09a3\u09b0\u09be","khana":"\u0996\u09be\u09a8\u09be","khani":"\u0996\u09be\u09a8\u09bf","kulo":"\u0995\u09c1\u09b2\u0993","kuli":"\u0995\u09c1\u09b2\u0987","kule":"\u0995\u09c1\u09b2\u09c7","mala":"\u09ae\u09be\u09b2\u09be","raji":"\u09b0\u09be\u099c\u09bf","razi":"\u09b0\u09be\u099c\u09bf","shobeo":"\u09b8\u09ac\u09c7\u0993","shobei":"\u09b8\u09ac\u09c7\u0987","shober":"\u09b8\u09ac\u09c7\u09b0","shobke":"\u09b8\u09ac\u0995\u09c7","shokolo":"\u09b8\u0995\u09b2\u0993","shokoli":"\u09b8\u0995\u09b2\u0987","shokole":"\u09b8\u0995\u09b2\u09c7","shomuho":"\u09b8\u09ae\u09c2\u09b9","sobeo":"\u09b8\u09ac\u09c7\u0993","sobei":"\u09b8\u09ac\u09c7\u0987","sober":"\u09b8\u09ac\u09c7\u09b0","sobke":"\u09b8\u09ac\u0995\u09c7","sokolo":"\u09b8\u0995\u09b2\u0993","sokoli":"\u09b8\u0995\u09b2\u0987","sokole":"\u09b8\u0995\u09b2\u09c7","somuho":"\u09b8\u09ae\u09c2\u09b9","take":"\u099f\u09be\u0995\u09c7","taro":"\u099f\u09be\u09b0\u0993","tari":"\u099f\u09be\u09b0\u0987","tare":"\u099f\u09be\u09b0\u09c7","tate":"\u099f\u09be\u09a4\u09c7","tayo":"\u099f\u09be\u09df\u0993","tayi":"\u099f\u09be\u09df\u0987","tike":"\u099f\u09bf\u0995\u09c7","tiro":"\u099f\u09bf\u09b0\u0993","tiri":"\u099f\u09bf\u09b0\u0987","tire":"\u099f\u09bf\u09b0\u09c7","tite":"\u099f\u09bf\u09a4\u09c7","mulok":"\u09ae\u09c2\u09b2\u0995","shuchok":"\u09b8\u09c2\u099a\u0995","shucok":"\u09b8\u09c2\u099a\u0995","suchok":"\u09b8\u09c2\u099a\u0995","sucok":"\u09b8\u09c2\u099a\u0995","gaca":"\u0997\u09be\u099b\u09be","gacha":"\u0997\u09be\u099b\u09be","gachha":"\u0997\u09be\u099b\u09be","gachhi":"\u0997\u09be\u099b\u09bf","gachi":"\u0997\u09be\u099b\u09bf","gaci":"\u0997\u09be\u099b\u09bf","tuko":"\u099f\u09c1\u0995\u0993","tuki":"\u099f\u09c1\u0995\u0987","tuke":"\u099f\u09c1\u0995\u09c7","tuku":"\u099f\u09c1\u0995\u09c1","guno":"\u0997\u09c1\u09a3\u0993","guni":"\u0997\u09c1\u09a3\u0987","derke":"\u09a6\u09c7\u09b0\u0995\u09c7","digeo":"\u09a6\u09bf\u0997\u09c7\u0993","digei":"\u09a6\u09bf\u0997\u09c7\u0987","diger":"\u09a6\u09bf\u0997\u09c7\u09b0","digoke":"\u09a6\u09bf\u0997\u0995\u09c7","digore":"\u09a6\u09bf\u0997\u09b0\u09c7","gonero":"\u0997\u09a3\u09c7\u09b0\u0993","goneri":"\u0997\u09a3\u09c7\u09b0\u0987","gonkeo":"\u0997\u09a3\u0995\u09c7\u0993","gonkei":"\u0997\u09a3\u0995\u09c7\u0987","gulao":"\u0997\u09c1\u09b2\u09be\u0993","gulai":"\u0997\u09c1\u09b2\u09be\u0987","gulan":"\u0997\u09c1\u09b2\u09be\u09a8","gular":"\u0997\u09c1\u09b2\u09be\u09b0","gulio":"\u0997\u09c1\u09b2\u09bf\u0993","gulii":"\u0997\u09c1\u09b2\u09bf\u0987","gulir":"\u0997\u09c1\u09b2\u09bf\u09b0","guloo":"\u0997\u09c1\u09b2\u09cb\u0993","guloi":"\u0997\u09c1\u09b2\u09cb\u0987","gulor":"\u0997\u09c1\u09b2\u09cb\u09b0","yerao":"\u09df\u09c7\u09b0\u09be\u0993","yerai":"\u09df\u09c7\u09b0\u09be\u0987","yereo":"\u09df\u09c7\u09b0\u09c7\u0993","yerei":"\u09df\u09c7\u09b0\u09c7\u0987","yeteo":"\u09df\u09c7\u09a4\u09c7\u0993","yetei":"\u09df\u09c7\u09a4\u09c7\u0987","borge":"\u09ac\u09b0\u09cd\u0997\u09c7","borgoo":"\u09ac\u09b0\u09cd\u0997\u0993","borgoi":"\u09ac\u09b0\u09cd\u0997\u0987","borrge":"\u09ac\u09b0\u09cd\u0997\u09c7","borrgoo":"\u09ac\u09b0\u09cd\u0997\u0993","borrgoi":"\u09ac\u09b0\u09cd\u0997\u0987","brindo":"\u09ac\u09c3\u09a8\u09cd\u09a6","brrindo":"\u09ac\u09c3\u09a8\u09cd\u09a6","gonrao":"\u0997\u09a3\u09b0\u09be\u0993","gonrai":"\u0997\u09a3\u09b0\u09be\u0987","khanao":"\u0996\u09be\u09a8\u09be\u0993","khanai":"\u0996\u09be\u09a8\u09be\u0987","khanar":"\u0996\u09be\u09a8\u09be\u09b0","khanay":"\u0996\u09be\u09a8\u09be\u09df","khaner":"\u0996\u09be\u09a8\u09c7\u09b0","khanio":"\u0996\u09be\u09a8\u09bf\u0993","khanii":"\u0996\u09be\u09a8\u09bf\u0987","khanir":"\u0996\u09be\u09a8\u09bf\u09b0","kuleo":"\u0995\u09c1\u09b2\u09c7\u0993","kulei":"\u0995\u09c1\u09b2\u09c7\u0987","kuler":"\u0995\u09c1\u09b2\u09c7\u09b0","kulke":"\u0995\u09c1\u09b2\u0995\u09c7","malao":"\u09ae\u09be\u09b2\u09be\u0993","malai":"\u09ae\u09be\u09b2\u09be\u0987","malar":"\u09ae\u09be\u09b2\u09be\u09b0","malay":"\u09ae\u09be\u09b2\u09be\u09df","punjo":"\u09aa\u09c1\u099e\u09cd\u099c","rajio":"\u09b0\u09be\u099c\u09bf\u0993","rajii":"\u09b0\u09be\u099c\u09bf\u0987","rajir":"\u09b0\u09be\u099c\u09bf\u09b0","razio":"\u09b0\u09be\u099c\u09bf\u0993","razii":"\u09b0\u09be\u099c\u09bf\u0987","shobero":"\u09b8\u09ac\u09c7\u09b0\u0993","shoberi":"\u09b8\u09ac\u09c7\u09b0\u0987","shobkeo":"\u09b8\u09ac\u0995\u09c7\u0993","shobkei":"\u09b8\u09ac\u0995\u09c7\u0987","shokoleo":"\u09b8\u0995\u09b2\u09c7\u0993","shokolei":"\u09b8\u0995\u09b2\u09c7\u0987","shokoler":"\u09b8\u0995\u09b2\u09c7\u09b0","shokolke":"\u09b8\u0995\u09b2\u0995\u09c7","shokolre":"\u09b8\u0995\u09b2\u09b0\u09c7","shomuhe":"\u09b8\u09ae\u09c2\u09b9\u09c7","shomuhoo":"\u09b8\u09ae\u09c2\u09b9\u0993","shomuhoi":"\u09b8\u09ae\u09c2\u09b9\u0987","sobero":"\u09b8\u09ac\u09c7\u09b0\u0993","soberi":"\u09b8\u09ac\u09c7\u09b0\u0987","sobkeo":"\u09b8\u09ac\u0995\u09c7\u0993","sobkei":"\u09b8\u09ac\u0995\u09c7\u0987","sokoleo":"\u09b8\u0995\u09b2\u09c7\u0993","sokolei":"\u09b8\u0995\u09b2\u09c7\u0987","sokoler":"\u09b8\u0995\u09b2\u09c7\u09b0","sokolke":"\u09b8\u0995\u09b2\u0995\u09c7","sokolre":"\u09b8\u0995\u09b2\u09b0\u09c7","somuhe":"\u09b8\u09ae\u09c2\u09b9\u09c7","somuhoo":"\u09b8\u09ae\u09c2\u09b9\u0993","somuhoi":"\u09b8\u09ae\u09c2\u09b9\u0987","takeo":"\u099f\u09be\u0995\u09c7\u0993","takei":"\u099f\u09be\u0995\u09c7\u0987","tareo":"\u099f\u09be\u09b0\u09c7\u0993","tarei":"\u099f\u09be\u09b0\u09c7\u0987","tateo":"\u099f\u09be\u09a4\u09c7\u0993","tatei":"\u099f\u09be\u09a4\u09c7\u0987","tikeo":"\u099f\u09bf\u0995\u09c7\u0993","tikei":"\u099f\u09bf\u0995\u09c7\u0987","tireo":"\u099f\u09bf\u09b0\u09c7\u0993","tirei":"\u099f\u09bf\u09b0\u09c7\u0987","titeo":"\u099f\u09bf\u09a4\u09c7\u0993","titei":"\u099f\u09bf\u09a4\u09c7\u0987","bises":"\u09ac\u09bf\u09b6\u09c7\u09b7","bishesh":"\u09ac\u09bf\u09b6\u09c7\u09b7","jatio":"\u099c\u09be\u09a4\u09c0\u09df","jatiyo":"\u099c\u09be\u09a4\u09c0\u09df","muloko":"\u09ae\u09c2\u09b2\u0995\u0993","muloki":"\u09ae\u09c2\u09b2\u0995\u0987","shuchoko":"\u09b8\u09c2\u099a\u0995\u0993","shuchoki":"\u09b8\u09c2\u099a\u0995\u0987","shucoko":"\u09b8\u09c2\u099a\u0995\u0993","shucoki":"\u09b8\u09c2\u099a\u0995\u0987","suchoko":"\u09b8\u09c2\u099a\u0995\u0993","suchoki":"\u09b8\u09c2\u099a\u0995\u0987","sucoko":"\u09b8\u09c2\u099a\u0995\u0993","sucoki":"\u09b8\u09c2\u099a\u0995\u0987","gacao":"\u0997\u09be\u099b\u09be\u0993","gacai":"\u0997\u09be\u099b\u09be\u0987","gacar":"\u0997\u09be\u099b\u09be\u09b0","gachao":"\u0997\u09be\u099b\u09be\u0993","gachai":"\u0997\u09be\u099b\u09be\u0987","gachar":"\u0997\u09be\u099b\u09be\u09b0","gachhao":"\u0997\u09be\u099b\u09be\u0993","gachhai":"\u0997\u09be\u099b\u09be\u0987","gachhar":"\u0997\u09be\u099b\u09be\u09b0","gachhio":"\u0997\u09be\u099b\u09bf\u0993","gachhii":"\u0997\u09be\u099b\u09bf\u0987","gachhir":"\u0997\u09be\u099b\u09bf\u09b0","gachio":"\u0997\u09be\u099b\u09bf\u0993","gachii":"\u0997\u09be\u099b\u09bf\u0987","gachir":"\u0997\u09be\u099b\u09bf\u09b0","gacio":"\u0997\u09be\u099b\u09bf\u0993","gacii":"\u0997\u09be\u099b\u09bf\u0987","gacir":"\u0997\u09be\u099b\u09bf\u09b0","tukeo":"\u099f\u09c1\u0995\u09c7\u0993","tukei":"\u099f\u09c1\u0995\u09c7\u0987","tuker":"\u099f\u09c1\u0995\u09c7\u09b0","tukke":"\u099f\u09c1\u0995\u0995\u09c7","tukre":"\u099f\u09c1\u0995\u09b0\u09c7","tukte":"\u099f\u09c1\u0995\u09a4\u09c7","tukuo":"\u099f\u09c1\u0995\u09c1\u0993","tukui":"\u099f\u09c1\u0995\u09c1\u0987","tukun":"\u099f\u09c1\u0995\u09c1\u09a8","tukur":"\u099f\u09c1\u0995\u09c1\u09b0","guner":"\u0997\u09c1\u09a3\u09c7\u09b0","gunke":"\u0997\u09c1\u09a3\u0995\u09c7","gunre":"\u0997\u09c1\u09a3\u09b0\u09c7","dara":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be","derkeo":"\u09a6\u09c7\u09b0\u0995\u09c7\u0993","derkei":"\u09a6\u09c7\u09b0\u0995\u09c7\u0987","digero":"\u09a6\u09bf\u0997\u09c7\u09b0\u0993","digeri":"\u09a6\u09bf\u0997\u09c7\u09b0\u0987","digere":"\u09a6\u09bf\u0997\u09c7\u09b0\u09c7","digete":"\u09a6\u09bf\u0997\u09c7\u09a4\u09c7","digokeo":"\u09a6\u09bf\u0997\u0995\u09c7\u0993","digokei":"\u09a6\u09bf\u0997\u0995\u09c7\u0987","digoreo":"\u09a6\u09bf\u0997\u09b0\u09c7\u0993","digorei":"\u09a6\u09bf\u0997\u09b0\u09c7\u0987","dwara":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gulake":"\u0997\u09c1\u09b2\u09be\u0995\u09c7","gulano":"\u0997\u09c1\u09b2\u09be\u09a8\u0993","gulani":"\u0997\u09c1\u09b2\u09be\u09a8\u0987","gularo":"\u0997\u09c1\u09b2\u09be\u09b0\u0993","gulari":"\u0997\u09c1\u09b2\u09be\u09b0\u0987","gulate":"\u0997\u09c1\u09b2\u09be\u09a4\u09c7","gulike":"\u0997\u09c1\u09b2\u09bf\u0995\u09c7","guliro":"\u0997\u09c1\u09b2\u09bf\u09b0\u0993","guliri":"\u0997\u09c1\u09b2\u09bf\u09b0\u0987","gulite":"\u0997\u09c1\u09b2\u09bf\u09a4\u09c7","guloke":"\u0997\u09c1\u09b2\u09cb\u0995\u09c7","guloro":"\u0997\u09c1\u09b2\u09cb\u09b0\u0993","gulori":"\u0997\u09c1\u09b2\u09cb\u09b0\u0987","gulote":"\u0997\u09c1\u09b2\u09cb\u09a4\u09c7","korrtrrik":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995","kortrik":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995","borgeo":"\u09ac\u09b0\u09cd\u0997\u09c7\u0993","borgei":"\u09ac\u09b0\u09cd\u0997\u09c7\u0987","borger":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0","borgoke":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7","borrgeo":"\u09ac\u09b0\u09cd\u0997\u09c7\u0993","borrgei":"\u09ac\u09b0\u09cd\u0997\u09c7\u0987","borrger":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0","borrgoke":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7","brinde":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7","brindoo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0993","brindoi":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0987","brrinde":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7","brrindoo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0993","brrindoi":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0987","khanake":"\u0996\u09be\u09a8\u09be\u0995\u09c7","khanaro":"\u0996\u09be\u09a8\u09be\u09b0\u0993","khanari":"\u0996\u09be\u09a8\u09be\u09b0\u0987","khanare":"\u0996\u09be\u09a8\u09be\u09b0\u09c7","khanate":"\u0996\u09be\u09a8\u09be\u09a4\u09c7","khanayo":"\u0996\u09be\u09a8\u09be\u09df\u0993","khanayi":"\u0996\u09be\u09a8\u09be\u09df\u0987","khanero":"\u0996\u09be\u09a8\u09c7\u09b0\u0993","khaneri":"\u0996\u09be\u09a8\u09c7\u09b0\u0987","khanete":"\u0996\u09be\u09a8\u09c7\u09a4\u09c7","khanike":"\u0996\u09be\u09a8\u09bf\u0995\u09c7","khaniro":"\u0996\u09be\u09a8\u09bf\u09b0\u0993","khaniri":"\u0996\u09be\u09a8\u09bf\u09b0\u0987","khanire":"\u0996\u09be\u09a8\u09bf\u09b0\u09c7","khanite":"\u0996\u09be\u09a8\u09bf\u09a4\u09c7","kulero":"\u0995\u09c1\u09b2\u09c7\u09b0\u0993","kuleri":"\u0995\u09c1\u09b2\u09c7\u09b0\u0987","kulkeo":"\u0995\u09c1\u09b2\u0995\u09c7\u0993","kulkei":"\u0995\u09c1\u09b2\u0995\u09c7\u0987","malake":"\u09ae\u09be\u09b2\u09be\u0995\u09c7","malaro":"\u09ae\u09be\u09b2\u09be\u09b0\u0993","malari":"\u09ae\u09be\u09b2\u09be\u09b0\u0987","malara":"\u09ae\u09be\u09b2\u09be\u09b0\u09be","malate":"\u09ae\u09be\u09b2\u09be\u09a4\u09c7","malayo":"\u09ae\u09be\u09b2\u09be\u09df\u0993","malayi":"\u09ae\u09be\u09b2\u09be\u09df\u0987","mondoli":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0","punje":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7","punjoo":"\u09aa\u09c1\u099e\u09cd\u099c\u0993","punjoi":"\u09aa\u09c1\u099e\u09cd\u099c\u0987","rajike":"\u09b0\u09be\u099c\u09bf\u0995\u09c7","rajiro":"\u09b0\u09be\u099c\u09bf\u09b0\u0993","rajiri":"\u09b0\u09be\u099c\u09bf\u09b0\u0987","rajira":"\u09b0\u09be\u099c\u09bf\u09b0\u09be","rajite":"\u09b0\u09be\u099c\u09bf\u09a4\u09c7","shokolero":"\u09b8\u0995\u09b2\u09c7\u09b0\u0993","shokoleri":"\u09b8\u0995\u09b2\u09c7\u09b0\u0987","shokolera":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be","shokolkeo":"\u09b8\u0995\u09b2\u0995\u09c7\u0993","shokolkei":"\u09b8\u0995\u09b2\u0995\u09c7\u0987","shokolreo":"\u09b8\u0995\u09b2\u09b0\u09c7\u0993","shokolrei":"\u09b8\u0995\u09b2\u09b0\u09c7\u0987","shomuheo":"\u09b8\u09ae\u09c2\u09b9\u09c7\u0993","shomuhei":"\u09b8\u09ae\u09c2\u09b9\u09c7\u0987","shomuher":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0","shomuhoke":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7","shomuhore":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7","shomuhote":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7","sokolero":"\u09b8\u0995\u09b2\u09c7\u09b0\u0993","sokoleri":"\u09b8\u0995\u09b2\u09c7\u09b0\u0987","sokolera":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be","sokolkeo":"\u09b8\u0995\u09b2\u0995\u09c7\u0993","sokolkei":"\u09b8\u0995\u09b2\u0995\u09c7\u0987","sokolreo":"\u09b8\u0995\u09b2\u09b0\u09c7\u0993","sokolrei":"\u09b8\u0995\u09b2\u09b0\u09c7\u0987","somuheo":"\u09b8\u09ae\u09c2\u09b9\u09c7\u0993","somuhei":"\u09b8\u09ae\u09c2\u09b9\u09c7\u0987","somuher":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0","somuhoke":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7","somuhore":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7","somuhote":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7","biseso":"\u09ac\u09bf\u09b6\u09c7\u09b7\u0993","bisesi":"\u09ac\u09bf\u09b6\u09c7\u09b7\u0987","bishesho":"\u09ac\u09bf\u09b6\u09c7\u09b7\u0993","bisheshi":"\u09ac\u09bf\u09b6\u09c7\u09b7\u0987","jatioo":"\u099c\u09be\u09a4\u09c0\u09df\u0993","jatioi":"\u099c\u09be\u09a4\u09c0\u09df\u0987","jatiyoo":"\u099c\u09be\u09a4\u09c0\u09df\u0993","jatiyoi":"\u099c\u09be\u09a4\u09c0\u09df\u0987","shorup":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa","shworup":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa","sorup":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa","sworup":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa","gacake":"\u0997\u09be\u099b\u09be\u0995\u09c7","gacaro":"\u0997\u09be\u099b\u09be\u09b0\u0993","gacari":"\u0997\u09be\u099b\u09be\u09b0\u0987","gacare":"\u0997\u09be\u099b\u09be\u09b0\u09c7","gacate":"\u0997\u09be\u099b\u09be\u09a4\u09c7","gachake":"\u0997\u09be\u099b\u09be\u0995\u09c7","gacharo":"\u0997\u09be\u099b\u09be\u09b0\u0993","gachari":"\u0997\u09be\u099b\u09be\u09b0\u0987","gachare":"\u0997\u09be\u099b\u09be\u09b0\u09c7","gachate":"\u0997\u09be\u099b\u09be\u09a4\u09c7","gachhake":"\u0997\u09be\u099b\u09be\u0995\u09c7","gachharo":"\u0997\u09be\u099b\u09be\u09b0\u0993","gachhari":"\u0997\u09be\u099b\u09be\u09b0\u0987","gachhare":"\u0997\u09be\u099b\u09be\u09b0\u09c7","gachhate":"\u0997\u09be\u099b\u09be\u09a4\u09c7","gachhike":"\u0997\u09be\u099b\u09bf\u0995\u09c7","gachhiro":"\u0997\u09be\u099b\u09bf\u09b0\u0993","gachhiri":"\u0997\u09be\u099b\u09bf\u09b0\u0987","gachhire":"\u0997\u09be\u099b\u09bf\u09b0\u09c7","gachhite":"\u0997\u09be\u099b\u09bf\u09a4\u09c7","gachike":"\u0997\u09be\u099b\u09bf\u0995\u09c7","gachiro":"\u0997\u09be\u099b\u09bf\u09b0\u0993","gachiri":"\u0997\u09be\u099b\u09bf\u09b0\u0987","gachire":"\u0997\u09be\u099b\u09bf\u09b0\u09c7","gachite":"\u0997\u09be\u099b\u09bf\u09a4\u09c7","gacike":"\u0997\u09be\u099b\u09bf\u0995\u09c7","gaciro":"\u0997\u09be\u099b\u09bf\u09b0\u0993","gaciri":"\u0997\u09be\u099b\u09bf\u09b0\u0987","gacire":"\u0997\u09be\u099b\u09bf\u09b0\u09c7","gacite":"\u0997\u09be\u099b\u09bf\u09a4\u09c7","tukero":"\u099f\u09c1\u0995\u09c7\u09b0\u0993","tukeri":"\u099f\u09c1\u0995\u09c7\u09b0\u0987","tukkeo":"\u099f\u09c1\u0995\u0995\u09c7\u0993","tukkei":"\u099f\u09c1\u0995\u0995\u09c7\u0987","tukreo":"\u099f\u09c1\u0995\u09b0\u09c7\u0993","tukrei":"\u099f\u09c1\u0995\u09b0\u09c7\u0987","tukteo":"\u099f\u09c1\u0995\u09a4\u09c7\u0993","tuktei":"\u099f\u09c1\u0995\u09a4\u09c7\u0987","tukuke":"\u099f\u09c1\u0995\u09c1\u0995\u09c7","tukuno":"\u099f\u09c1\u0995\u09c1\u09a8\u0993","tukuni":"\u099f\u09c1\u0995\u09c1\u09a8\u0987","tukune":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7","tukuro":"\u099f\u09c1\u0995\u09c1\u09b0\u0993","tukuri":"\u099f\u09c1\u0995\u09c1\u09b0\u0987","tukure":"\u099f\u09c1\u0995\u09c1\u09b0\u09c7","tukute":"\u099f\u09c1\u0995\u09c1\u09a4\u09c7","gunero":"\u0997\u09c1\u09a3\u09c7\u09b0\u0993","guneri":"\u0997\u09c1\u09a3\u09c7\u09b0\u0987","gunkeo":"\u0997\u09c1\u09a3\u0995\u09c7\u0993","gunkei":"\u0997\u09c1\u09a3\u0995\u09c7\u0987","gunreo":"\u0997\u09c1\u09a3\u09b0\u09c7\u0993","gunrei":"\u0997\u09c1\u09a3\u09b0\u09c7\u0987","darao":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","darai":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","digereo":"\u09a6\u09bf\u0997\u09c7\u09b0\u09c7\u0993","digerei":"\u09a6\u09bf\u0997\u09c7\u09b0\u09c7\u0987","digeteo":"\u09a6\u09bf\u0997\u09c7\u09a4\u09c7\u0993","digetei":"\u09a6\u09bf\u0997\u09c7\u09a4\u09c7\u0987","dwarao":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","dwarai":"\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gulakeo":"\u0997\u09c1\u09b2\u09be\u0995\u09c7\u0993","gulakei":"\u0997\u09c1\u09b2\u09be\u0995\u09c7\u0987","gulaner":"\u0997\u09c1\u09b2\u09be\u09a8\u09c7\u09b0","gulateo":"\u0997\u09c1\u09b2\u09be\u09a4\u09c7\u0993","gulatei":"\u0997\u09c1\u09b2\u09be\u09a4\u09c7\u0987","gulikeo":"\u0997\u09c1\u09b2\u09bf\u0995\u09c7\u0993","gulikei":"\u0997\u09c1\u09b2\u09bf\u0995\u09c7\u0987","guliteo":"\u0997\u09c1\u09b2\u09bf\u09a4\u09c7\u0993","gulitei":"\u0997\u09c1\u09b2\u09bf\u09a4\u09c7\u0987","gulokeo":"\u0997\u09c1\u09b2\u09cb\u0995\u09c7\u0993","gulokei":"\u0997\u09c1\u09b2\u09cb\u0995\u09c7\u0987","guloteo":"\u0997\u09c1\u09b2\u09cb\u09a4\u09c7\u0993","gulotei":"\u0997\u09c1\u09b2\u09cb\u09a4\u09c7\u0987","korrtrriko":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995\u0993","korrtrriki":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995\u0987","kortriko":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995\u0993","kortriki":"\u0995\u09b0\u09cd\u09a4\u09c3\u0995\u0987","borgero":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u0993","borgeri":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u0987","borgera":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be","borgokeo":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7\u0993","borgokei":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7\u0987","borrgero":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u0993","borrgeri":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u0987","borrgera":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be","borrgokeo":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7\u0993","borrgokei":"\u09ac\u09b0\u09cd\u0997\u0995\u09c7\u0987","brindeo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u0993","brindei":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u0987","brinder":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0","brindoke":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7","brindora":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be","brrindeo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u0993","brrindei":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u0987","brrinder":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0","brrindoke":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7","brrindora":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be","khanakeo":"\u0996\u09be\u09a8\u09be\u0995\u09c7\u0993","khanakei":"\u0996\u09be\u09a8\u09be\u0995\u09c7\u0987","khanareo":"\u0996\u09be\u09a8\u09be\u09b0\u09c7\u0993","khanarei":"\u0996\u09be\u09a8\u09be\u09b0\u09c7\u0987","khanateo":"\u0996\u09be\u09a8\u09be\u09a4\u09c7\u0993","khanatei":"\u0996\u09be\u09a8\u09be\u09a4\u09c7\u0987","khaneteo":"\u0996\u09be\u09a8\u09c7\u09a4\u09c7\u0993","khanetei":"\u0996\u09be\u09a8\u09c7\u09a4\u09c7\u0987","khanikeo":"\u0996\u09be\u09a8\u09bf\u0995\u09c7\u0993","khanikei":"\u0996\u09be\u09a8\u09bf\u0995\u09c7\u0987","khanireo":"\u0996\u09be\u09a8\u09bf\u09b0\u09c7\u0993","khanirei":"\u0996\u09be\u09a8\u09bf\u09b0\u09c7\u0987","khaniteo":"\u0996\u09be\u09a8\u09bf\u09a4\u09c7\u0993","khanitei":"\u0996\u09be\u09a8\u09bf\u09a4\u09c7\u0987","malakeo":"\u09ae\u09be\u09b2\u09be\u0995\u09c7\u0993","malakei":"\u09ae\u09be\u09b2\u09be\u0995\u09c7\u0987","malarao":"\u09ae\u09be\u09b2\u09be\u09b0\u09be\u0993","malarai":"\u09ae\u09be\u09b2\u09be\u09b0\u09be\u0987","malateo":"\u09ae\u09be\u09b2\u09be\u09a4\u09c7\u0993","malatei":"\u09ae\u09be\u09b2\u09be\u09a4\u09c7\u0987","mondolio":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u0993","mondolii":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u0987","mondolir":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0","punjeo":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7\u0993","punjei":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7\u0987","punjer":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7\u09b0","punjoke":"\u09aa\u09c1\u099e\u09cd\u099c\u0995\u09c7","punjora":"\u09aa\u09c1\u099e\u09cd\u099c\u09b0\u09be","punjote":"\u09aa\u09c1\u099e\u09cd\u099c\u09a4\u09c7","rajikeo":"\u09b0\u09be\u099c\u09bf\u0995\u09c7\u0993","rajikei":"\u09b0\u09be\u099c\u09bf\u0995\u09c7\u0987","rajirao":"\u09b0\u09be\u099c\u09bf\u09b0\u09be\u0993","rajirai":"\u09b0\u09be\u099c\u09bf\u09b0\u09be\u0987","rajiteo":"\u09b0\u09be\u099c\u09bf\u09a4\u09c7\u0993","rajitei":"\u09b0\u09be\u099c\u09bf\u09a4\u09c7\u0987","shokolerao":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be\u0993","shokolerai":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be\u0987","shomuhero":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0\u0993","shomuheri":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0\u0987","shomuhokeo":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7\u0993","shomuhokei":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7\u0987","shomuhoreo":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7\u0993","shomuhorei":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7\u0987","shomuhoteo":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7\u0993","shomuhotei":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7\u0987","sokolerao":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be\u0993","sokolerai":"\u09b8\u0995\u09b2\u09c7\u09b0\u09be\u0987","somuhero":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0\u0993","somuheri":"\u09b8\u09ae\u09c2\u09b9\u09c7\u09b0\u0987","somuhokeo":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7\u0993","somuhokei":"\u09b8\u09ae\u09c2\u09b9\u0995\u09c7\u0987","somuhoreo":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7\u0993","somuhorei":"\u09b8\u09ae\u09c2\u09b9\u09b0\u09c7\u0987","somuhoteo":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7\u0993","somuhotei":"\u09b8\u09ae\u09c2\u09b9\u09a4\u09c7\u0987","bishishto":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f","bisisto":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f","shorupo":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0993","shorupi":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0987","shworupo":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0993","shworupi":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0987","sorupo":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0993","sorupi":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0987","sworupo":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0993","sworupi":"\u09b8\u09cd\u09ac\u09b0\u09c2\u09aa\u0987","gacakeo":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0993","gacakei":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0987","gacareo":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0993","gacarei":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0987","gacateo":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0993","gacatei":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0987","gachakeo":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0993","gachakei":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0987","gachareo":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0993","gacharei":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0987","gachateo":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0993","gachatei":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0987","gachhakeo":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0993","gachhakei":"\u0997\u09be\u099b\u09be\u0995\u09c7\u0987","gachhareo":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0993","gachharei":"\u0997\u09be\u099b\u09be\u09b0\u09c7\u0987","gachhateo":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0993","gachhatei":"\u0997\u09be\u099b\u09be\u09a4\u09c7\u0987","gachhikeo":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0993","gachhikei":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0987","gachhireo":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0993","gachhirei":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0987","gachhiteo":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0993","gachhitei":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0987","gachikeo":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0993","gachikei":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0987","gachireo":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0993","gachirei":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0987","gachiteo":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0993","gachitei":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0987","gacikeo":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0993","gacikei":"\u0997\u09be\u099b\u09bf\u0995\u09c7\u0987","gacireo":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0993","gacirei":"\u0997\u09be\u099b\u09bf\u09b0\u09c7\u0987","gaciteo":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0993","gacitei":"\u0997\u09be\u099b\u09bf\u09a4\u09c7\u0987","tukukeo":"\u099f\u09c1\u0995\u09c1\u0995\u09c7\u0993","tukukei":"\u099f\u09c1\u0995\u09c1\u0995\u09c7\u0987","tukuneo":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7\u0993","tukunei":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7\u0987","tukuner":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7\u09b0","tukunke":"\u099f\u09c1\u0995\u09c1\u09a8\u0995\u09c7","tukunre":"\u099f\u09c1\u0995\u09c1\u09a8\u09b0\u09c7","tukureo":"\u099f\u09c1\u0995\u09c1\u09b0\u09c7\u0993","tukurei":"\u099f\u09c1\u0995\u09c1\u09b0\u09c7\u0987","tukuteo":"\u099f\u09c1\u0995\u09c1\u09a4\u09c7\u0993","tukutei":"\u099f\u09c1\u0995\u09c1\u09a4\u09c7\u0987","gulanero":"\u0997\u09c1\u09b2\u09be\u09a8\u09c7\u09b0\u0993","gulaneri":"\u0997\u09c1\u09b2\u09be\u09a8\u09c7\u09b0\u0987","borgerao":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be\u0993","borgerai":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be\u0987","borrgerao":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be\u0993","borrgerai":"\u09ac\u09b0\u09cd\u0997\u09c7\u09b0\u09be\u0987","brindero":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u0993","brinderi":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u0987","brindera":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be","brindokeo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7\u0993","brindokei":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7\u0987","brindorao":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be\u0993","brindorai":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be\u0987","brrindero":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u0993","brrinderi":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u0987","brrindera":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be","brrindokeo":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7\u0993","brrindokei":"\u09ac\u09c3\u09a8\u09cd\u09a6\u0995\u09c7\u0987","brrindorao":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be\u0993","brrindorai":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09b0\u09be\u0987","mondolike":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u0995\u09c7","mondoliro":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0\u0993","mondoliri":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0\u0987","mondolira":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0\u09be","punjero":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7\u09b0\u0993","punjeri":"\u09aa\u09c1\u099e\u09cd\u099c\u09c7\u09b0\u0987","punjokeo":"\u09aa\u09c1\u099e\u09cd\u099c\u0995\u09c7\u0993","punjokei":"\u09aa\u09c1\u099e\u09cd\u099c\u0995\u09c7\u0987","punjorao":"\u09aa\u09c1\u099e\u09cd\u099c\u09b0\u09be\u0993","punjorai":"\u09aa\u09c1\u099e\u09cd\u099c\u09b0\u09be\u0987","punjoteo":"\u09aa\u09c1\u099e\u09cd\u099c\u09a4\u09c7\u0993","punjotei":"\u09aa\u09c1\u099e\u09cd\u099c\u09a4\u09c7\u0987","bishishtoo":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f\u0993","bishishtoi":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f\u0987","bisistoo":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f\u0993","bisistoi":"\u09ac\u09bf\u09b6\u09bf\u09b7\u09cd\u099f\u0987","tukunero":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7\u09b0\u0993","tukuneri":"\u099f\u09c1\u0995\u09c1\u09a8\u09c7\u09b0\u0987","tukunkeo":"\u099f\u09c1\u0995\u09c1\u09a8\u0995\u09c7\u0993","tukunkei":"\u099f\u09c1\u0995\u09c1\u09a8\u0995\u09c7\u0987","tukunreo":"\u099f\u09c1\u0995\u09c1\u09a8\u09b0\u09c7\u0993","tukunrei":"\u099f\u09c1\u0995\u09c1\u09a8\u09b0\u09c7\u0987","brinderao":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be\u0993","brinderai":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be\u0987","brrinderao":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be\u0993","brrinderai":"\u09ac\u09c3\u09a8\u09cd\u09a6\u09c7\u09b0\u09be\u0987","mondolikeo":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u0995\u09c7\u0993","mondolikei":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u0995\u09c7\u0987","mondolirao":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0\u09be\u0993","mondolirai":"\u09ae\u09a3\u09cd\u09a1\u09b2\u09c0\u09b0\u09be\u0987","shombondhio":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df","shombondhiyo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df","shongkranto":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4","shonkanto":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4","sombondhio":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df","sombondhiyo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df","songkranto":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4","sonkanto":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4","tukdara":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be","tukdwara":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be","shombondhioo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0993","shombondhioi":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0987","shombondhiyoo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0993","shombondhiyoi":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0987","shongkrantoo":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0993","shongkrantoi":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0987","shonkantoo":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0993","shonkantoi":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0987","sombondhioo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0993","sombondhioi":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0987","sombondhiyoo":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0993","sombondhiyoi":"\u09b8\u09ae\u09cd\u09ac\u09a8\u09cd\u09a7\u09c0\u09df\u0987","songkrantoo":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0993","songkrantoi":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0987","sonkantoo":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0993","sonkantoi":"\u09b8\u0982\u0995\u09cd\u09b0\u09be\u09a8\u09cd\u09a4\u0987","gacadara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gacadwara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachadara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachadwara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachhadara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachhadwara":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachhidara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachhidwara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachidara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gachidwara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gacidara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gacidwara":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be","tukdarao":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukdarai":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukdwarao":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukdwarai":"\u099f\u09c1\u0995\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukudara":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be","tukudwara":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be","gacadarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gacadarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gacadwarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gacadwarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachadarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachadarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachadwarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachadwarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachhadarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachhadarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachhadwarao":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachhadwarai":"\u0997\u09be\u099b\u09be\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachhidarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachhidarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachhidwarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachhidwarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachidarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachidarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gachidwarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gachidwarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gacidarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gacidarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","gacidwarao":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","gacidwarai":"\u0997\u09be\u099b\u09bf\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukudarao":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukudarai":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukudwarao":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukudwarai":"\u099f\u09c1\u0995\u09c1\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukundara":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be","tukundwara":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be","tukundarao":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukundarai":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987","tukundwarao":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0993","tukundwarai":"\u099f\u09c1\u0995\u09c1\u09a8\u09a6\u09cd\u09ac\u09be\u09b0\u09be\u0987"}; -------------------------------------------------------------------------------- /avroregexlib.js: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================= 3 | ***************************************************************************** 4 | The contents of this file are subject to the Mozilla Public License 5 | Version 1.1 (the "License"); you may not use this file except in 6 | compliance with the License. You may obtain a copy of the License at 7 | http://www.mozilla.org/MPL/ 8 | 9 | Software distributed under the License is distributed on an "AS IS" 10 | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the 11 | License for the specific language governing rights and limitations 12 | under the License. 13 | 14 | The Original Code is jsAvroPhonetic 15 | 16 | The Initial Developer of the Original Code is 17 | Mehdi Hasan Khan 18 | Rifat Nabi 19 | 20 | Copyright (C) OmicronLab (http://www.omicronlab.com). All Rights Reserved. 21 | 22 | 23 | Contributor(s): ______________________________________. 24 | 25 | ***************************************************************************** 26 | ============================================================================= 27 | */ 28 | 29 | const utfconv = imports.utf8; 30 | 31 | function AvroRegex () {} 32 | 33 | AvroRegex.prototype = { 34 | parse: function(input) { 35 | var fixed = this._fixString(input); 36 | var output = ""; 37 | for(var cur = 0; cur < fixed.length; ++cur) { 38 | var start = cur, end = cur + 1, prev = start - 1; 39 | var matched = false; 40 | 41 | for(var i = 0; i < this.data.patterns.length; ++i) { 42 | var pattern = this.data.patterns[i]; 43 | end = cur + pattern.find.length; 44 | if(end <= fixed.length && fixed.substring(start, end) == pattern.find) { 45 | prev = start - 1; 46 | if(typeof pattern.rules !== 'undefined') { 47 | for(var j = 0; j < pattern.rules.length; ++j) { 48 | var rule = pattern.rules[j]; 49 | var replace = true; 50 | 51 | var chk = 0; 52 | for(var k=0; k < rule.matches.length; ++k) { 53 | var match = rule.matches[k]; 54 | 55 | if(match.type === "suffix") { 56 | chk = end; 57 | } 58 | // Prefix 59 | else { 60 | chk = prev; 61 | } 62 | 63 | // Handle Negative 64 | if(typeof match.negative === 'undefined') { 65 | match.negative = false; 66 | if(match.scope.charAt(0) === '!') { 67 | match.negative = true; 68 | match.scope = match.scope.substring(1); 69 | } 70 | } 71 | 72 | // Handle empty value 73 | if(typeof match.value === 'undefined') match.value = ''; 74 | 75 | // Beginning 76 | if(match.scope === "punctuation") { 77 | if( 78 | ! ( 79 | ((chk < 0) && (match.type === "prefix")) || 80 | ((chk >= fixed.length) && (match.type === "suffix")) || 81 | this._isPunctuation(fixed.charAt(chk)) 82 | ) ^ match.negative 83 | ) { 84 | replace = false; 85 | break; 86 | } 87 | } 88 | // Vowel 89 | else if(match.scope === "vowel") { 90 | if( 91 | ! ( 92 | ( 93 | (chk >= 0 && (match.type === "prefix")) || 94 | (chk < fixed.length && (match.type === "suffix")) 95 | ) && 96 | this._isVowel(fixed.charAt(chk)) 97 | ) ^ match.negative 98 | ) { 99 | replace = false; 100 | break; 101 | } 102 | } 103 | // Consonant 104 | else if(match.scope === "consonant") { 105 | if( 106 | ! ( 107 | ( 108 | (chk >= 0 && (match.type === "prefix")) || 109 | (chk < fixed.length && match.type === ("suffix")) 110 | ) && 111 | this._isConsonant(fixed.charAt(chk)) 112 | ) ^ match.negative 113 | ) { 114 | replace = false; 115 | break; 116 | } 117 | } 118 | // Exact 119 | else if(match.scope === "exact") { 120 | var s, e; 121 | if(match.type === "suffix") { 122 | s = end; 123 | e = end + match.value.length; 124 | } 125 | // Prefix 126 | else { 127 | s = start - match.value.length; 128 | e = start; 129 | } 130 | if(!this._isExact(match.value, fixed, s, e, match.negative)) { 131 | replace = false; 132 | break; 133 | } 134 | } 135 | } 136 | 137 | if(replace) { 138 | output += rule.replace + "(্[যবম])?(্?)([ঃঁ]?)"; 139 | cur = end - 1; 140 | matched = true; 141 | break; 142 | } 143 | 144 | } 145 | } 146 | if(matched == true) break; 147 | 148 | // Default 149 | output += pattern.replace + "(্[যবম])?(্?)([ঃঁ]?)"; 150 | cur = end - 1; 151 | matched = true; 152 | break; 153 | } 154 | } 155 | 156 | if(!matched) { 157 | output += fixed.charAt(cur); 158 | } 159 | } 160 | return this._convertToUnicodeValue(output); 161 | }, 162 | 163 | 164 | _convertToUnicodeValue: function(input){ 165 | var output = ''; 166 | input = utfconv.utf8Decode(input); 167 | 168 | for (var i = 0; i < input.length; i++){ 169 | var charCode = input.charCodeAt(i); 170 | if (charCode >= 255){ 171 | output += '\\u0' + charCode.toString(16); 172 | } else { 173 | output += input.charAt(i); 174 | } 175 | } 176 | return output; 177 | }, 178 | 179 | 180 | _fixString: function(input) { 181 | var fixed = ''; 182 | for(var i=0; i < input.length; ++i) { 183 | var cChar = input.charAt(i); 184 | if(!this._isIgnore(cChar)) { 185 | fixed += cChar.toLowerCase(); 186 | } 187 | } 188 | return fixed; 189 | }, 190 | 191 | 192 | _isVowel: function(c) { 193 | return (this.data.vowel.indexOf(c.toLowerCase()) >= 0); 194 | }, 195 | 196 | 197 | _isConsonant: function(c) { 198 | return (this.data.consonant.indexOf(c.toLowerCase()) >= 0); 199 | }, 200 | 201 | 202 | _isPunctuation: function(c) { 203 | return (!(this._isVowel(c) || this._isConsonant(c))); 204 | }, 205 | 206 | 207 | _isExact: function(needle, heystack, start, end, not) { 208 | return ((start >= 0 && end < heystack.length && (heystack.substring(start, end) === needle)) ^ not); 209 | }, 210 | 211 | 212 | _isIgnore: function(c) { 213 | return (this.data.ignore.indexOf(c.toLowerCase()) >= 0); 214 | }, 215 | 216 | 217 | data: { 218 | "patterns": 219 | [ 220 | { 221 | "find":"aa", 222 | "replace":"(আ|(য়া)|া|((([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া))((([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া)))?))", 223 | "rules": 224 | [ 225 | ] 226 | }, 227 | { 228 | "find":"au", 229 | "replace":"(ঔ|ৌ(([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া))([উঊুূ]|(য়[ুূ])))", 230 | "rules": 231 | [ 232 | ] 233 | }, 234 | { 235 | "find":"az", 236 | "replace":"((([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া))((জ|য|(জ়)|([‍‌]?্য)))?)", 237 | "rules": 238 | [ 239 | ] 240 | }, 241 | { 242 | "find":"ai", 243 | "replace":"(ঐ|ৈ|(([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া))([ইঈিী]|(য়[িী])))", 244 | "rules": 245 | [ 246 | ] 247 | }, 248 | { 249 | "find":"a", 250 | "replace":"(([অএ]্যা?)|[অআএ]|([‍‌]?(্য)?া)|(য়া))", 251 | "rules": 252 | [ 253 | ] 254 | }, 255 | { 256 | "find":"bdh", 257 | "replace":"((ব(্?)(ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?)))))|((ব(্?)[দড])(্?)(হ|ঃ|(হ্‌?)))|(ব(্?)[দড](্?)(হ|ঃ|(হ্‌?))))", 258 | "rules": 259 | [ 260 | ] 261 | }, 262 | { 263 | "find":"bhl", 264 | "replace":"(((ভ|(ব(্?)(হ|ঃ|(হ্‌?))))(্?)ল)|(ব(্?)((হ|ঃ|(হ্‌?))(্?)ল))|(ব(্?)(হ|ঃ|(হ্‌?))(্?)ল))", 265 | "rules": 266 | [ 267 | ] 268 | }, 269 | { 270 | "find":"bh", 271 | "replace":"(ভ|(ব(্?)(হ|ঃ|(হ্‌?))))", 272 | "rules": 273 | [ 274 | ] 275 | }, 276 | { 277 | "find":"bb", 278 | "replace":"(ব(্?)ব?)", 279 | "rules": 280 | [ 281 | ] 282 | }, 283 | { 284 | "find":"bd", 285 | "replace":"(ব(্?)[দড])", 286 | "rules": 287 | [ 288 | ] 289 | }, 290 | { 291 | "find":"bv", 292 | "replace":"(ব?(্?)ভ)", 293 | "rules": 294 | [ 295 | ] 296 | }, 297 | { 298 | "find":"b", 299 | "replace":"ব", 300 | "rules": 301 | [ 302 | ] 303 | }, 304 | { 305 | "find":"chchh", 306 | "replace":"((চ্ছ)|((চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))(্?)(((চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))(্?)((হ|ঃ|(হ্‌?)))?)|([চছ](্?)((হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?))))|([চছ](্?)(হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?)))))|((চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))(্?)(চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))(্?)(হ|ঃ|(হ্‌?)))|([চছ](্?)(হ|ঃ|(হ্‌?))(্?)[চছ](্?)(হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?))))", 307 | "rules": 308 | [ 309 | ] 310 | }, 311 | { 312 | "find":"cch", 313 | "replace":"(([চছ](্?)(চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?)))))|([চছ](্?)[চছ](্?)(হ|ঃ|(হ্‌?))))", 314 | "rules": 315 | [ 316 | ] 317 | }, 318 | { 319 | "find":"chh", 320 | "replace":"(((চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))(্?)((হ|ঃ|(হ্‌?)))?)|([চছ](্?)((হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?))))|([চছ](্?)(হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?))))", 321 | "rules": 322 | [ 323 | ] 324 | }, 325 | { 326 | "find":"cng", 327 | "replace":"((চ্ঞ)|([চছ](্?)(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ)))))|([চছ](্?)[নণঁঙঞং](্?)(গ|(জ্ঞ)))|(([চছ](্?)[নণঁঙঞং])(্?)(গ|(জ্ঞ))))", 328 | "rules": 329 | [ 330 | ] 331 | }, 332 | { 333 | "find":"ch", 334 | "replace":"(চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?))))", 335 | "rules": 336 | [ 337 | ] 338 | }, 339 | { 340 | "find":"ck", 341 | "replace":"(ক|([চছ](্?)ক))", 342 | "rules": 343 | [ 344 | ] 345 | }, 346 | { 347 | "find":"cc", 348 | "replace":"([চছ](্?)[চছ]?)", 349 | "rules": 350 | [ 351 | ] 352 | }, 353 | { 354 | "find":"cn", 355 | "replace":"([চছ](্?)[নণঁঙঞং])", 356 | "rules": 357 | [ 358 | ] 359 | }, 360 | { 361 | "find":"c", 362 | "replace":"[চছ]", 363 | "rules": 364 | [ 365 | ] 366 | }, 367 | { 368 | "find":"dhm", 369 | "replace":"((([দড](্?)(গ|(জ্ঞ)))(্?)ম)|([দড](্?)((হ|ঃ|(হ্‌?))(্?)ম))|([দড](্?)(হ|ঃ|(হ্‌?))(্?)ম))", 370 | "rules": 371 | [ 372 | ] 373 | }, 374 | { 375 | "find":"dhn", 376 | "replace":"(((ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|([দড](্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|([দড](্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))", 377 | "rules": 378 | [ 379 | ] 380 | }, 381 | { 382 | "find":"dbh", 383 | "replace":"(([দড](্?)(ভ|(ব(্?)(হ|ঃ|(হ্‌?)))))|(([দড](্?)ব)(্?)(হ|ঃ|(হ্‌?)))|([দড](্?)ব(্?)(হ|ঃ|(হ্‌?))))", 384 | "rules": 385 | [ 386 | ] 387 | }, 388 | { 389 | "find":"ddh", 390 | "replace":"(([দড]?(্?)([দড](্?)(গ|(জ্ঞ))))|(([দড](্?)[দড]?)(্?)(হ|ঃ|(হ্‌?)))|([দড](্?)[দড](্?)(হ|ঃ|(হ্‌?))))", 391 | "rules": 392 | [ 393 | ] 394 | }, 395 | { 396 | "find":"dgh", 397 | "replace":"(([দড](্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|(([দড](্?)(গ|(জ্ঞ)))(্?)(হ|ঃ|(হ্‌?)))|([দড](্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))", 398 | "rules": 399 | [ 400 | ] 401 | }, 402 | { 403 | "find":"db", 404 | "replace":"([দড](্?)ব)", 405 | "rules": 406 | [ 407 | ] 408 | }, 409 | { 410 | "find":"dd", 411 | "replace":"([দড](্?)[দড]?)", 412 | "rules": 413 | [ 414 | ] 415 | }, 416 | { 417 | "find":"dg", 418 | "replace":"([দড](্?)(গ|(জ্ঞ)))", 419 | "rules": 420 | [ 421 | ] 422 | }, 423 | { 424 | "find":"dh", 425 | "replace":"(ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?))))", 426 | "rules": 427 | [ 428 | ] 429 | }, 430 | { 431 | "find":"d", 432 | "replace":"[দড]", 433 | "rules": 434 | [ 435 | ] 436 | }, 437 | { 438 | "find":"ey", 439 | "replace":"(এ|ই|ে|(েই)|(এই)|ঈ|ী|(((এ্যা?)|[এে]|([‍‌]?(্য)া)|(য়ে))(য়|(ইয়)|([‍‌]?্য))))", 440 | "rules": 441 | [ 442 | ] 443 | }, 444 | { 445 | "find":"ee", 446 | "replace":"(ই|ঈ|ি|ী|(য়েই)|(((এ্যা?)|[এে]|([‍‌]?(্য)া)|(য়ে))((এ্যা?)|[এে]|([‍‌]?(্য)া)|(য়ে))))", 447 | "rules": 448 | [ 449 | ] 450 | }, 451 | { 452 | "find":"e", 453 | "replace":"((এ্যা?)|[এে]|([‍‌]?(্য)া)|(য়ে))", 454 | "rules": 455 | [ 456 | ] 457 | }, 458 | { 459 | "find":"ff", 460 | "replace":"(ফ(্?)ফ?)", 461 | "rules": 462 | [ 463 | ] 464 | }, 465 | { 466 | "find":"f", 467 | "replace":"ফ", 468 | "rules": 469 | [ 470 | ] 471 | }, 472 | { 473 | "find":"ggh", 474 | "replace":"((((জ্ঞ)|((গ|(জ্ঞ))(্?)((গ|(জ্ঞ)))?))(্?)(হ|ঃ|(হ্‌?)))|((গ|(জ্ঞ))(্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))(্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))", 475 | "rules": 476 | [ 477 | ] 478 | }, 479 | { 480 | "find":"gdh", 481 | "replace":"(((গ|(জ্ঞ))(্?)(ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))(্?)[দড](্?)(হ|ঃ|(হ্‌?))))", 482 | "rules": 483 | [ 484 | ] 485 | }, 486 | { 487 | "find":"ghn", 488 | "replace":"(((ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|((গ|(জ্ঞ))(্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))", 489 | "rules": 490 | [ 491 | ] 492 | }, 493 | { 494 | "find":"gh", 495 | "replace":"(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))", 496 | "rules": 497 | [ 498 | ] 499 | }, 500 | { 501 | "find":"gg", 502 | "replace":"((জ্ঞ)|((গ|(জ্ঞ))(্?)((গ|(জ্ঞ)))?))", 503 | "rules": 504 | [ 505 | ] 506 | }, 507 | { 508 | "find":"g", 509 | "replace":"(গ|(জ্ঞ))", 510 | "rules": 511 | [ 512 | ] 513 | }, 514 | { 515 | "find":"hl", 516 | "replace":"((হ|ঃ|(হ্‌?))(্?)ল)", 517 | "rules": 518 | [ 519 | ] 520 | }, 521 | { 522 | "find":"hh", 523 | "replace":"((হ|ঃ|(হ্‌?))(্?)(হ|ঃ|(হ্‌?)))", 524 | "rules": 525 | [ 526 | ] 527 | }, 528 | { 529 | "find":"hm", 530 | "replace":"((হ|ঃ|(হ্‌?))(্?)ম)", 531 | "rules": 532 | [ 533 | ] 534 | }, 535 | { 536 | "find":"hn", 537 | "replace":"((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং])", 538 | "rules": 539 | [ 540 | ] 541 | }, 542 | { 543 | "find":"h", 544 | "replace":"(হ|ঃ|(হ্‌?))", 545 | "rules": 546 | [ 547 | ] 548 | }, 549 | { 550 | "find":"ia", 551 | "replace":"((ঞা)|(([ইঈিী]|(য়[িী]))(([অএ]্যা?)|[আএ]|([‍‌]?(্য)?া)|(য়া))))", 552 | "rules": 553 | [ 554 | ] 555 | }, 556 | { 557 | "find":"i", 558 | "replace":"([ইঈিী]|(য়[িী]))", 559 | "rules": 560 | [ 561 | ] 562 | }, 563 | { 564 | "find":"jng", 565 | "replace":"((জ্ঞ)|(([জয]|(জ়))(্?)(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ)))))|(([জয]|(জ়))(্?)[নণঁঙঞং](্?)(গ|(জ্ঞ))))", 566 | "rules": 567 | [ 568 | ] 569 | }, 570 | { 571 | "find":"jjh", 572 | "replace":"(((([জয]|(জ়)))?(্?)(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?)))))|(হ্য)|(((হ্য)|(([জয]|(জ়))(্?)(([জয]|(জ়)))?))(্?)(হ|ঃ|(হ্‌?)))|(([জয]|(জ়))(্?)([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?))))", 573 | "rules": 574 | [ 575 | ] 576 | }, 577 | { 578 | "find":"jj", 579 | "replace":"((হ্য)|(([জয]|(জ়))(্?)(([জয]|(জ়)))?))", 580 | "rules": 581 | [ 582 | ] 583 | }, 584 | { 585 | "find":"jh", 586 | "replace":"(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?))))", 587 | "rules": 588 | [ 589 | ] 590 | }, 591 | { 592 | "find":"j", 593 | "replace":"([জয]|(জ়))", 594 | "rules": 595 | [ 596 | ] 597 | }, 598 | { 599 | "find":"kshm", 600 | "replace":"((((ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ক(্?)[সশষ])(্?)(হ|ঃ|(হ্‌?)))|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)ম)|(ক(্?)(((স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)ম)|([সশষ](্?)((হ|ঃ|(হ্‌?))(্?)ম))|([সশষ](্?)(হ|ঃ|(হ্‌?))(্?)ম)))|((ক(্?)[সশষ])(্?)((হ|ঃ|(হ্‌?))(্?)ম))|(ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)ম)|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))(্?)ম))", 601 | "rules": 602 | [ 603 | ] 604 | }, 605 | { 606 | "find":"kkhm", 607 | "replace":"((((ক্ষ)|((ক(্?)ক?)(্?)(হ|ঃ|(হ্‌?)))|(ক?(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?))))(্?)ম)|((ক(্?)ক?)(্?)((হ|ঃ|(হ্‌?))(্?)ম))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?))(্?)ম)|(ক(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?))))(্?)ম))", 608 | "rules": 609 | [ 610 | ] 611 | }, 612 | { 613 | "find":"kshn", 614 | "replace":"((((ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ক(্?)[সশষ])(্?)(হ|ঃ|(হ্‌?)))|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|(ক(্?)(((স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|([সশষ](্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|([সশষ](্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং])))|((ক(্?)[সশষ])(্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|(ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))", 615 | "rules": 616 | [ 617 | ] 618 | }, 619 | { 620 | "find":"kkhn", 621 | "replace":"((((ক্ষ)|((ক(্?)ক?)(্?)(হ|ঃ|(হ্‌?)))|(ক?(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|((ক(্?)ক?)(্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং])|(ক(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং]))", 622 | "rules": 623 | [ 624 | ] 625 | }, 626 | { 627 | "find":"ksh", 628 | "replace":"((ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ক(্?)[সশষ])(্?)(হ|ঃ|(হ্‌?)))|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))", 629 | "rules": 630 | [ 631 | ] 632 | }, 633 | { 634 | "find":"kkh", 635 | "replace":"((ক্ষ)|((ক(্?)ক?)(্?)(হ|ঃ|(হ্‌?)))|(ক?(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?))))", 636 | "rules": 637 | [ 638 | ] 639 | }, 640 | { 641 | "find":"kxm", 642 | "replace":"((((ক্ষ)|(ক(্?)((ক্স)|(এক্স)|ষ)))(্?)ম)|(ক(্?)(((ক্স)|(এক্স)|ষ)(্?)ম))|(ক(্?)((ক্স)|(এক্স)|ষ)(্?)ম))", 643 | "rules": 644 | [ 645 | ] 646 | }, 647 | { 648 | "find":"kxn", 649 | "replace":"((((ক্ষ)|(ক(্?)((ক্স)|(এক্স)|ষ)))(্?)[নণঁঙঞং])|(ক(্?)(((ক্স)|(এক্স)|ষ)(্?)[নণঁঙঞং]))|(ক(্?)((ক্স)|(এক্স)|ষ)(্?)[নণঁঙঞং]))", 650 | "rules": 651 | [ 652 | ] 653 | }, 654 | { 655 | "find":"kh", 656 | "replace":"(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?))))", 657 | "rules": 658 | [ 659 | ] 660 | }, 661 | { 662 | "find":"kk", 663 | "replace":"(ক(্?)ক?)", 664 | "rules": 665 | [ 666 | ] 667 | }, 668 | { 669 | "find":"ks", 670 | "replace":"(ক(্?)[সশষ])", 671 | "rules": 672 | [ 673 | ] 674 | }, 675 | { 676 | "find":"kx", 677 | "replace":"((ক্ষ)|(ক(্?)((ক্স)|(এক্স)|ষ)))", 678 | "rules": 679 | [ 680 | ] 681 | }, 682 | { 683 | "find":"k", 684 | "replace":"ক", 685 | "rules": 686 | [ 687 | ] 688 | }, 689 | { 690 | "find":"lkh", 691 | "replace":"((ল(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|((ল(্?)ক)(্?)(হ|ঃ|(হ্‌?)))|(ল(্?)ক(্?)(হ|ঃ|(হ্‌?))))", 692 | "rules": 693 | [ 694 | ] 695 | }, 696 | { 697 | "find":"lgh", 698 | "replace":"((ল(্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|((ল(্?)(গ|(জ্ঞ)))(্?)(হ|ঃ|(হ্‌?)))|(ল(্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))", 699 | "rules": 700 | [ 701 | ] 702 | }, 703 | { 704 | "find":"lph", 705 | "replace":"((ল(্?)(ফ|(প(্?)(হ|ঃ|(হ্‌?)))))|((ল(্?)প)(্?)(হ|ঃ|(হ্‌?)))|(ল(্?)প(্?)(হ|ঃ|(হ্‌?))))", 706 | "rules": 707 | [ 708 | ] 709 | }, 710 | { 711 | "find":"ldh", 712 | "replace":"((ল(্?)(ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?)))))|((ল(্?)[দড])(্?)(হ|ঃ|(হ্‌?)))|(ল(্?)[দড](্?)(হ|ঃ|(হ্‌?))))", 713 | "rules": 714 | [ 715 | ] 716 | }, 717 | { 718 | "find":"lbh", 719 | "replace":"((ল(্?)(ভ|(ব(্?)(হ|ঃ|(হ্‌?)))))|((ল(্?)ব)(্?)(হ|ঃ|(হ্‌?)))|(ল(্?)ব(্?)(হ|ঃ|(হ্‌?))))", 720 | "rules": 721 | [ 722 | ] 723 | }, 724 | { 725 | "find":"ll", 726 | "replace":"((হ্ল)|(ল?(্?)ল)|(ল(্?)ল))", 727 | "rules": 728 | [ 729 | ] 730 | }, 731 | { 732 | "find":"lk", 733 | "replace":"(ল(্?)ক)", 734 | "rules": 735 | [ 736 | ] 737 | }, 738 | { 739 | "find":"lg", 740 | "replace":"(ল(্?)(গ|(জ্ঞ)))", 741 | "rules": 742 | [ 743 | ] 744 | }, 745 | { 746 | "find":"lp", 747 | "replace":"(ল(্?)প)", 748 | "rules": 749 | [ 750 | ] 751 | }, 752 | { 753 | "find":"ld", 754 | "replace":"(ল(্?)[দড])", 755 | "rules": 756 | [ 757 | ] 758 | }, 759 | { 760 | "find":"lb", 761 | "replace":"(ল(্?)ব)", 762 | "rules": 763 | [ 764 | ] 765 | }, 766 | { 767 | "find":"l", 768 | "replace":"ল", 769 | "rules": 770 | [ 771 | ] 772 | }, 773 | { 774 | "find":"mbh", 775 | "replace":"((ম(্?)(ভ|(ব(্?)(হ|ঃ|(হ্‌?)))))|((ম(্?)ব)(্?)(হ|ঃ|(হ্‌?)))|(ম(্?)ব(্?)(হ|ঃ|(হ্‌?))))", 776 | "rules": 777 | [ 778 | ] 779 | }, 780 | { 781 | "find":"mph", 782 | "replace":"((ম(্?)(ফ|(প(্?)(হ|ঃ|(হ্‌?)))))|((ম(্?)প)(্?)(হ|ঃ|(হ্‌?)))|(ম(্?)প(্?)(হ|ঃ|(হ্‌?))))", 783 | "rules": 784 | [ 785 | ] 786 | }, 787 | { 788 | "find":"mth", 789 | "replace":"((ম(্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|((ম(্?)[তটৎ])(্?)(হ|ঃ|(হ্‌?)))|(ম(্?)[তটৎ](্?)(হ|ঃ|(হ্‌?))))", 790 | "rules": 791 | [ 792 | ] 793 | }, 794 | { 795 | "find":"mm", 796 | "replace":"((হ্ম)|(ম(্?)ম?))", 797 | "rules": 798 | [ 799 | ] 800 | }, 801 | { 802 | "find":"mb", 803 | "replace":"(ম(্?)ব)", 804 | "rules": 805 | [ 806 | ] 807 | }, 808 | { 809 | "find":"mp", 810 | "replace":"(ম(্?)প)", 811 | "rules": 812 | [ 813 | ] 814 | }, 815 | { 816 | "find":"mt", 817 | "replace":"(ম(্?)[তটৎ])", 818 | "rules": 819 | [ 820 | ] 821 | }, 822 | { 823 | "find":"m", 824 | "replace":"ম", 825 | "rules": 826 | [ 827 | ] 828 | }, 829 | { 830 | "find":"ngksh", 831 | "replace":"(((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক))(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)((ক(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ক(্?)[সশষ])(্?)(হ|ঃ|(হ্‌?)))|(ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(ক(্?)[সশষ])(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))", 832 | "rules": 833 | [ 834 | ] 835 | }, 836 | { 837 | "find":"ngkkh", 838 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)((ক্ষ)|((ক(্?)ক?)(্?)(হ|ঃ|(হ্‌?)))|(ক?(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|(ক(্?)ক(্?)(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক))(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(ক(্?)ক?)(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক(্?)ক(্?)(হ|ঃ|(হ্‌?))))", 839 | "rules": 840 | [ 841 | ] 842 | }, 843 | { 844 | "find":"ngch", 845 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)[চছ])|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)[চছ]))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)[চছ](্?)(হ|ঃ|(হ্‌?))))", 846 | "rules": 847 | [ 848 | ] 849 | }, 850 | { 851 | "find":"nggh", 852 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং](্?)((জ্ঞ)|((গ|(জ্ঞ))(্?)((গ|(জ্ঞ)))?))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)((((জ্ঞ)|((গ|(জ্ঞ))(্?)((গ|(জ্ঞ)))?))(্?)(হ|ঃ|(হ্‌?)))|((গ|(জ্ঞ))(্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|((গ|(জ্ঞ))(্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))|(((ঙ্গ)|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(গ|(জ্ঞ)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)(গ|(জ্ঞ))))(্?)(হ|ঃ|(হ্‌?))))", 853 | "rules": 854 | [ 855 | ] 856 | }, 857 | { 858 | "find":"ngkx", 859 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)((ক্ষ)|(ক(্?)((ক্স)|(এক্স)|ষ))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক))(্?)((ক্স)|(এক্স)|ষ))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)((ক্ষ)|(ক(্?)((ক্স)|(এক্স)|ষ))))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক(্?)((ক্স)|(এক্স)|ষ)))", 860 | "rules": 861 | [ 862 | ] 863 | }, 864 | { 865 | "find":"ngjh", 866 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?)))))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)([জয]|(জ়)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)([জয]|(জ়))))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?))))", 867 | "rules": 868 | [ 869 | ] 870 | }, 871 | { 872 | "find":"ngkh", 873 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক(্?)(হ|ঃ|(হ্‌?)))|((((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক))(্?)(হ|ঃ|(হ্‌?))))", 874 | "rules": 875 | [ 876 | ] 877 | }, 878 | { 879 | "find":"nsh", 880 | "replace":"(([নণঁঙঞং](্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং](্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))", 881 | "rules": 882 | [ 883 | ] 884 | }, 885 | { 886 | "find":"ndh", 887 | "replace":"(([নণঁঙঞং](্?)(ধ|ঢ|([দড](্?)(হ|ঃ|(হ্‌?)))))|(([নণঁঙঞং](্?)[দড])(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)[দড](্?)(হ|ঃ|(হ্‌?))))", 888 | "rules": 889 | [ 890 | ] 891 | }, 892 | { 893 | "find":"nkh", 894 | "replace":"(([নণঁঙঞং](্?)(খ|(ক্ষ)|(ক(্?)(হ|ঃ|(হ্‌?)))))|(((ঙ্ক)|([নণঁঙঞং](্?)ক))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)ক(্?)(হ|ঃ|(হ্‌?))))", 895 | "rules": 896 | [ 897 | ] 898 | }, 899 | { 900 | "find":"nth", 901 | "replace":"(([নণঁঙঞং](্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|(([নণঁঙঞং](্?)[তটৎ])(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)[তটৎ](্?)(হ|ঃ|(হ্‌?))))", 902 | "rules": 903 | [ 904 | ] 905 | }, 906 | { 907 | "find":"ngj", 908 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)([জয]|(জ়)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)([জয]|(জ়))))", 909 | "rules": 910 | [ 911 | ] 912 | }, 913 | { 914 | "find":"ngm", 915 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ম)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ম))", 916 | "rules": 917 | [ 918 | ] 919 | }, 920 | { 921 | "find":"ngg", 922 | "replace":"((ঙ্গ)|((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)(গ|(জ্ঞ)))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)(গ|(জ্ঞ))))", 923 | "rules": 924 | [ 925 | ] 926 | }, 927 | { 928 | "find":"ngx", 929 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)((ক্স)|(এক্স)|ষ))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)((ক্স)|(এক্স)|ষ)))", 930 | "rules": 931 | [ 932 | ] 933 | }, 934 | { 935 | "find":"ngk", 936 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)ক)|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)ক))", 937 | "rules": 938 | [ 939 | ] 940 | }, 941 | { 942 | "find":"ngh", 943 | "replace":"((ঙ্ঘ)|([নণঁঙঞং](্?)(ঘ|((গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?)))))|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)(হ|ঃ|(হ্‌?))))", 944 | "rules": 945 | [ 946 | ] 947 | }, 948 | { 949 | "find":"nch", 950 | "replace":"(([নণঁঙঞং](্?)(চ|ছ|([চছ](্?)(হ|ঃ|(হ্‌?)))))|(((ঞ্চ)|([নণঁঙঞং](্?)[চছ]))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)[চছ](্?)(হ|ঃ|(হ্‌?))))", 951 | "rules": 952 | [ 953 | ] 954 | }, 955 | { 956 | "find":"njh", 957 | "replace":"(([নণঁঙঞং](্?)(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?)))))|(((ঞ্জ)|([নণঁঙঞং](্?)([জয]|(জ়))))(্?)(হ|ঃ|(হ্‌?)))|([নণঁঙঞং](্?)([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?))))", 958 | "rules": 959 | [ 960 | ] 961 | }, 962 | { 963 | "find":"ngc", 964 | "replace":"(((ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))(্?)[চছ])|([নণঁঙঞং](্?)(গ|(জ্ঞ))(্?)[চছ]))", 965 | "rules": 966 | [ 967 | ] 968 | }, 969 | { 970 | "find":"nc", 971 | "replace":"((ঞ্চ)|([নণঁঙঞং](্?)[চছ]))", 972 | "rules": 973 | [ 974 | ] 975 | }, 976 | { 977 | "find":"nn", 978 | "replace":"((হ্ণ)|(হ্ন)|([নণঁঙঞং](্?)[নণঁঙঞং]?))", 979 | "rules": 980 | [ 981 | ] 982 | }, 983 | { 984 | "find":"ng", 985 | "replace":"(ঙ|ং|ঞ|(ঙ্গ)|([নণঁঙঞং](্?)(গ|(জ্ঞ))))", 986 | "rules": 987 | [ 988 | ] 989 | }, 990 | { 991 | "find":"nk", 992 | "replace":"((ঙ্ক)|([নণঁঙঞং](্?)ক))", 993 | "rules": 994 | [ 995 | ] 996 | }, 997 | { 998 | "find":"nj", 999 | "replace":"((ঞ্জ)|([নণঁঙঞং](্?)([জয]|(জ়))))", 1000 | "rules": 1001 | [ 1002 | ] 1003 | }, 1004 | { 1005 | "find":"nd", 1006 | "replace":"([নণঁঙঞং](্?)[দড])", 1007 | "rules": 1008 | [ 1009 | ] 1010 | }, 1011 | { 1012 | "find":"nt", 1013 | "replace":"([নণঁঙঞং](্?)[তটৎ])", 1014 | "rules": 1015 | [ 1016 | ] 1017 | }, 1018 | { 1019 | "find":"n", 1020 | "replace":"[নণঁঙঞং]", 1021 | "rules": 1022 | [ 1023 | ] 1024 | }, 1025 | { 1026 | "find":"oo", 1027 | "replace":"((([উঊুূ]|(য়[ুূ])))|(([ওোঅ]|(অ্য)|(য়ো?))?([ওোঅ]|(অ্য)|(য়ো?))?))", 1028 | "rules": 1029 | [ 1030 | ] 1031 | }, 1032 | { 1033 | "find":"oi", 1034 | "replace":"(ঐ|ৈ|(([ওোঅ]|(অ্য)|(য়ো?))?([ইঈিী]|(য়[িী]))))", 1035 | "rules": 1036 | [ 1037 | ] 1038 | }, 1039 | { 1040 | "find":"ou", 1041 | "replace":"(ঔ|ৌ|(([ওোঅ]|(অ্য)|(য়ো?))?([উঊুূ]|(য়[ুূ]))))", 1042 | "rules": 1043 | [ 1044 | ] 1045 | }, 1046 | { 1047 | "find":"o", 1048 | "replace":"([ওোঅ]|(অ্য)|(য়ো?))?", 1049 | "rules": 1050 | [ 1051 | { 1052 | "matches": 1053 | [ 1054 | { 1055 | "type":"prefix", 1056 | "scope":"punctuation", 1057 | "value":"", 1058 | "negative":"FALSE" 1059 | } 1060 | ], 1061 | "replace":"([ওোঅ]|(অ্য)|(য়ো?))" 1062 | } 1063 | ] 1064 | }, 1065 | { 1066 | "find":"phl", 1067 | "replace":"(((ফ|(প(্?)(হ|ঃ|(হ্‌?))))(্?)ল)|(প(্?)((হ|ঃ|(হ্‌?))(্?)ল))|(প(্?)(হ|ঃ|(হ্‌?))(্?)ল))", 1068 | "rules": 1069 | [ 1070 | ] 1071 | }, 1072 | { 1073 | "find":"ph", 1074 | "replace":"(ফ|(প(্?)(হ|ঃ|(হ্‌?))))", 1075 | "rules": 1076 | [ 1077 | ] 1078 | }, 1079 | { 1080 | "find":"pp", 1081 | "replace":"(প(্?)প?)", 1082 | "rules": 1083 | [ 1084 | ] 1085 | }, 1086 | { 1087 | "find":"p", 1088 | "replace":"প", 1089 | "rules": 1090 | [ 1091 | ] 1092 | }, 1093 | { 1094 | "find":"qq", 1095 | "replace":"(ক(্?)ক?)", 1096 | "rules": 1097 | [ 1098 | ] 1099 | }, 1100 | { 1101 | "find":"q", 1102 | "replace":"ক", 1103 | "rules": 1104 | [ 1105 | ] 1106 | }, 1107 | { 1108 | "find":"rri", 1109 | "replace":"(ঋ|ৃ|(([রড়ঢ়]|(হ্র))([রড়ঢ়]|(হ্র))([ইঈিী]|(য়[িী]))))", 1110 | "rules": 1111 | [ 1112 | ] 1113 | }, 1114 | { 1115 | "find":"ri", 1116 | "replace":"(ঋ|ৃ|(হৃ)|(([রড়ঢ়]|(হ্র))([ইঈিী]|(য়[িী]))))", 1117 | "rules": 1118 | [ 1119 | ] 1120 | }, 1121 | { 1122 | "find":"rh", 1123 | "replace":"((([রড়ঢ়]|(হ্র)))|(([রড়ঢ়]|(হ্র))(্?)(হ|ঃ|(হ্‌?))))", 1124 | "rules": 1125 | [ 1126 | ] 1127 | }, 1128 | { 1129 | "find":"r", 1130 | "replace":"([রড়ঢ়]|(হ্র))", 1131 | "rules": 1132 | [ 1133 | ] 1134 | }, 1135 | { 1136 | "find":"shsh", 1137 | "replace":"((((স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))?(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|([সশষ](্?)(হ|ঃ|(হ্‌?))(্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))", 1138 | "rules": 1139 | [ 1140 | ] 1141 | }, 1142 | { 1143 | "find":"ssh", 1144 | "replace":"(([সশষ]?(্?)(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?)))))|([সশষ](্?)[সশষ](্?)(হ|ঃ|(হ্‌?))))", 1145 | "rules": 1146 | [ 1147 | ] 1148 | }, 1149 | { 1150 | "find":"shm", 1151 | "replace":"(((স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)ম)|([সশষ](্?)((হ|ঃ|(হ্‌?))(্?)ম))|([সশষ](্?)(হ|ঃ|(হ্‌?))(্?)ম))", 1152 | "rules": 1153 | [ 1154 | ] 1155 | }, 1156 | { 1157 | "find":"shn", 1158 | "replace":"(((স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))(্?)[নণঁঙঞং])|([সশষ](্?)((হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))|([সশষ](্?)(হ|ঃ|(হ্‌?))(্?)[নণঁঙঞং]))", 1159 | "rules": 1160 | [ 1161 | ] 1162 | }, 1163 | { 1164 | "find":"ss", 1165 | "replace":"([সশষ](্?)[সশষ]?)", 1166 | "rules": 1167 | [ 1168 | ] 1169 | }, 1170 | { 1171 | "find":"sh", 1172 | "replace":"(স|শ|ষ|([সশষ](্?)(হ|ঃ|(হ্‌?))))", 1173 | "rules": 1174 | [ 1175 | ] 1176 | }, 1177 | { 1178 | "find":"s", 1179 | "replace":"[সশষ]", 1180 | "rules": 1181 | [ 1182 | ] 1183 | }, 1184 | { 1185 | "find":"thth", 1186 | "replace":"((ত্থ)|(((থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))?(্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|([তটৎ](্?)(হ|ঃ|(হ্‌?))(্?)[তটৎ](্?)(হ|ঃ|(হ্‌?))))", 1187 | "rules": 1188 | [ 1189 | ] 1190 | }, 1191 | { 1192 | "find":"tth", 1193 | "replace":"(([তটৎ]?(্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|(([তটৎ](্?)[তটৎ]?)(্?)(হ|ঃ|(হ্‌?)))|([তটৎ](্?)[তটৎ](্?)(হ|ঃ|(হ্‌?))))", 1194 | "rules": 1195 | [ 1196 | ] 1197 | }, 1198 | { 1199 | "find":"t``", 1200 | "replace":"ৎ", 1201 | "rules": 1202 | [ 1203 | ] 1204 | }, 1205 | { 1206 | "find":"tth", 1207 | "replace":"(([তটৎ]?(্?)(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?)))))|(([তটৎ](্?)[তটৎ]?)(্?)(হ|ঃ|(হ্‌?)))|([তটৎ](্?)[তটৎ](্?)(হ|ঃ|(হ্‌?))))", 1208 | "rules": 1209 | [ 1210 | ] 1211 | }, 1212 | { 1213 | "find":"tt", 1214 | "replace":"([তটৎ](্?)[তটৎ]?)", 1215 | "rules": 1216 | [ 1217 | ] 1218 | }, 1219 | { 1220 | "find":"th", 1221 | "replace":"(থ|ঠ|([তটৎ](্?)(হ|ঃ|(হ্‌?))))", 1222 | "rules": 1223 | [ 1224 | ] 1225 | }, 1226 | { 1227 | "find":"t", 1228 | "replace":"[তটৎ]", 1229 | "rules": 1230 | [ 1231 | ] 1232 | }, 1233 | { 1234 | "find":"uu", 1235 | "replace":"(ঊ|ূ|(([উঊুূ]|(য়[ুূ]))(([উঊুূ]|(য়[ুূ])))?))", 1236 | "rules": 1237 | [ 1238 | ] 1239 | }, 1240 | { 1241 | "find":"u", 1242 | "replace":"([উঊুূ]|(য়[ুূ]))", 1243 | "rules": 1244 | [ 1245 | ] 1246 | }, 1247 | { 1248 | "find":"vv", 1249 | "replace":"(ভ(্?)ভ?)", 1250 | "rules": 1251 | [ 1252 | ] 1253 | }, 1254 | { 1255 | "find":"v", 1256 | "replace":"ভ", 1257 | "rules": 1258 | [ 1259 | ] 1260 | }, 1261 | { 1262 | "find":"w", 1263 | "replace":"(ও|(ওয়)|(্ব))", 1264 | "rules": 1265 | [ 1266 | ] 1267 | }, 1268 | { 1269 | "find":"xm", 1270 | "replace":"(((ক্স)|(এক্স)|ষ)(্?)ম)", 1271 | "rules": 1272 | [ 1273 | ] 1274 | }, 1275 | { 1276 | "find":"xn", 1277 | "replace":"(((ক্স)|(এক্স)|ষ)(্?)[নণঁঙঞং])", 1278 | "rules": 1279 | [ 1280 | ] 1281 | }, 1282 | { 1283 | "find":"x", 1284 | "replace":"((ক্স)|(এক্স)|ষ)", 1285 | "rules": 1286 | [ 1287 | ] 1288 | }, 1289 | { 1290 | "find":"y", 1291 | "replace":"(য়|(ইয়)|([‍‌]?্য))", 1292 | "rules": 1293 | [ 1294 | ] 1295 | }, 1296 | { 1297 | "find":"zzh", 1298 | "replace":"((হ্য)|((জ|য|(জ়)|([‍‌]?্য))(্?)(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?)))))|(((হ্য)|((জ|য|(জ়)|([‍‌]?্য))(্?)((জ|য|(জ়)|([‍‌]?্য)))?))(্?)(হ|ঃ|(হ্‌?)))|((জ|য|(জ়)|([‍‌]?্য))(্?)(জ|য|(জ়)|([‍‌]?্য))(্?)(হ|ঃ|(হ্‌?))))", 1299 | "rules": 1300 | [ 1301 | ] 1302 | }, 1303 | { 1304 | "find":"zh", 1305 | "replace":"(ঝ|(([জয]|(জ়))(্?)(হ|ঃ|(হ্‌?))))", 1306 | "rules": 1307 | [ 1308 | ] 1309 | }, 1310 | { 1311 | "find":"zz", 1312 | "replace":"((হ্য)|((জ|য|(জ়)|([‍‌]?্য))(্?)((জ|য|(জ়)|([‍‌]?্য)))?))", 1313 | "rules": 1314 | [ 1315 | ] 1316 | }, 1317 | { 1318 | "find":"z", 1319 | "replace":"(জ|য|(জ়)|([‍‌]?্য))", 1320 | "rules": 1321 | [ 1322 | ] 1323 | }, 1324 | { 1325 | "find":"0", 1326 | "replace":"(০|(0)|(শূন্য))", 1327 | "rules": 1328 | [ 1329 | ] 1330 | }, 1331 | { 1332 | "find":"1", 1333 | "replace":"(১|(1)|(এক))", 1334 | "rules": 1335 | [ 1336 | ] 1337 | }, 1338 | { 1339 | "find":"2", 1340 | "replace":"(২|(2)|(দুই))", 1341 | "rules": 1342 | [ 1343 | ] 1344 | }, 1345 | { 1346 | "find":"3", 1347 | "replace":"(৩|(3)|(তিন))", 1348 | "rules": 1349 | [ 1350 | ] 1351 | }, 1352 | { 1353 | "find":"4", 1354 | "replace":"(৪|(4)|(চার))", 1355 | "rules": 1356 | [ 1357 | ] 1358 | }, 1359 | { 1360 | "find":"5", 1361 | "replace":"(৫|(5)|(পাঁচ))", 1362 | "rules": 1363 | [ 1364 | ] 1365 | }, 1366 | { 1367 | "find":"6", 1368 | "replace":"((6)|৬|(ছয়))", 1369 | "rules": 1370 | [ 1371 | ] 1372 | }, 1373 | { 1374 | "find":"7", 1375 | "replace":"(৭|(7)|(সাত))", 1376 | "rules": 1377 | [ 1378 | ] 1379 | }, 1380 | { 1381 | "find":"8", 1382 | "replace":"(৮|(8)|(আট))", 1383 | "rules": 1384 | [ 1385 | ] 1386 | }, 1387 | { 1388 | "find":"9", 1389 | "replace":"(৯|(9)|(নয়))", 1390 | "rules": 1391 | [ 1392 | ] 1393 | }, 1394 | { 1395 | "find":"`", 1396 | "replace":"", 1397 | "rules": 1398 | [ 1399 | ] 1400 | } 1401 | ], 1402 | "vowel":"aeiou", 1403 | "consonant":"bcdfghjklmnpqrstvwxyz", 1404 | "ignore":"|()[]{}^$*+?.~!@#%&-_='\";<>/\\,:`" 1405 | } 1406 | } 1407 | 1408 | /* --------- */ 1409 | /* Test code */ 1410 | /* --------- */ 1411 | //var __avroRegex = new AvroRegex (); 1412 | //print(__avroRegex.parse('a(!k)')); --------------------------------------------------------------------------------