diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 1fa7fff..5fc7b0a 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -7,12 +7,18 @@ + + - - - + + + + + + + - Unexp - fun getSh - codeRange - isHangul - - toColo fun relo 3633 println( @@ -184,6 +189,12 @@ joiner va- ' + on the + FFFF + FFFF8 + pro + system + this font .141 @@ -204,15 +215,15 @@ @@ -557,18 +568,6 @@ - - - - - - - - - - - - @@ -855,47 +854,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -903,6 +861,18 @@ + + + + + + + + + + + + @@ -910,29 +880,61 @@ + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6959fdd..ec31684 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -#### Pixel Artists Wanted: for Arabic (all four forms) and other Indian scripts. Must willing to follow the styles and have a knowledge in Unicode. Your name will be inscribed in the list of contributors. +#### Pixel Artists Wanted: for Arabic (all four forms) and other Indian scripts (all the ligatures). Must willing to follow the styles and have a knowledge in Unicode. Your name will be inscribed in the list of contributors. You can contribute to the font by fixing wrong glyphs, suggesting better ones, extending character set (letters for other writing systems or filling in the blanks on the existing ones), or code for other game frameworks (not limited to Java). Please leave pull request for that. @@ -7,7 +7,7 @@ Font Spritesheets are stored in ```assets/graphics/fonts``` directory. Image for #### Before getting started, you did read our design goals, right? Good. Now you may continue your awesome work. -### Ascenders, descenders, width informations +### Ascenders, descenders, width informations (aka Glyph Tags) ![Alas, use more modern browser or get better internet connexion!](glyph_height_pos_annotation.png) @@ -89,6 +89,11 @@ Also note that the font compiler will not "stack" these diacritics. (fun fact: it was drawn on Rhodia memopad with Lamy 2000, then photographed and edited on my iPhone. Letter used is a Cherokee WE Ꮺ) +### Technical Limitations + +- Each spritesheet is 4096x4096 maximum, which is a size of 4K Texture. However it is recommended to be smaller or equal to 1024x1024. +- Glyphs exceeding 15px of width needs to be broken down with 2 or more characters. Wider sheets WILL NOT BE IMPLEMENTED, can't waste much pixels just for few superwide glyphs. + ### Implementing the Korean writing system On this font, Hangul letters are printed by assemblying two or three letter pieces. There are 10 sets of Hangul letter pieces on the font. Top 6 are initials, middle 2 are medials, and bottom 2 are finals. On the rightmost side, there's eight assembled glyphs to help you with (assuming you have basic knowledge on the writing system). Top 6 tells you how to use 6 initials, and bottom 2 tells you how to use 2 finals. diff --git a/FontTestGDX/lib/TerrarumSansBitmap.jar b/FontTestGDX/lib/TerrarumSansBitmap.jar index b0c3f86..171803c 100644 Binary files a/FontTestGDX/lib/TerrarumSansBitmap.jar and b/FontTestGDX/lib/TerrarumSansBitmap.jar differ diff --git a/FontTestGDX/src/FontTestGDX.kt b/FontTestGDX/src/FontTestGDX.kt index e59a676..03e06ba 100644 --- a/FontTestGDX/src/FontTestGDX.kt +++ b/FontTestGDX/src/FontTestGDX.kt @@ -27,7 +27,7 @@ class FontTestGDX : Game() { private val outimageName = "testing.png" override fun create() { - font = GameFontBase("./assets", flipY = false, errorOnUnknownChar = true) // must test for two flipY cases + font = GameFontBase("./assets", flipY = false, errorOnUnknownChar = false) // must test for two flipY cases val inTextFile = Gdx.files.internal("./$demotextName") val reader = inTextFile.reader("UTF-8") @@ -39,107 +39,9 @@ class FontTestGDX : Game() { - println("START") - - val l = intArrayOf(0xFF00, - 0xFF10, - 0xFF20, - 0xFF30, - 0xFF40, - 0xFF50, - 0xFF60, - 0xFF70, - 0xFF80, - 0xFF90, - 0xFFA0, - 0xFFB0, - 0xFFC0, - 0xFFD0, - 0xFFE0, - 0xFFF0, - 0xFEF0, - 0xFDF0, - 0xFCF0, - 0xFBF0, - 0xFAF0, - 0xF9F0, - 0xF8F0, - 0xF7F0, - 0xF6F0, - 0xF5F0, - 0xF4F0, - 0xF3F0, - 0xF2F0, - 0xF1F0, - 0xF0F0, - 0xF0F1, - 0xF0F2, - 0xF0F3, - 0xF0F4, - 0xF0F5, - 0xF0F6, - 0xF0F7, - 0xF0F8, - 0xF0F9, - 0xF0FA, - 0xF0FB, - 0xF0FC, - 0xF0FD, - 0xF0FE, - 0xF0FF, - 0xF0EF, - 0xF0DF, - 0xF0CF, - 0xF0BF, - 0xF0AF, - 0xF09F, - 0xF08F, - 0xF07F, - 0xF06F, - 0xF05F, - 0xF04F, - 0xF03F, - 0xF02F, - 0xF01F, - 0xF00F, - 0xF10F, - 0xF20F, - 0xF30F, - 0xF40F, - 0xF50F, - 0xF60F, - 0xF70F, - 0xF80F, - 0xF90F, - 0xFA0F, - 0xFB0F, - 0xFC0F, - 0xFD0F, - 0xFE0F, - 0xFF0F) - val s = "ᚱᛂᚴᛋᛂᛋᛏᛋᚮᚾᛔᚢᛏᛚᚮᛋ᛬ᚱᛂᚴᛋᛋᚢᚼᚾᚢᛘᚢᛚᚾᛏᚮ᛬ᛏᚮᛋᛁᚮᚵᛂᚢᛏᚮᚱᛘᛔᚱᛂᚴᛋᛏ᛭ᛋᚢᚼᚾᚢᛋᛘᚮᛁᚵᚾᛁᛂᛏᚮᛑ᛭ᚵᛂᚢᛏᚮᚱ" - var lc = 0 - var sc = 0 - - while (lc < l.size) { - print(font.toColorCode(l[lc])) - print(s[sc]) - - lc++ - sc++ - - if (sc == s.length) break - - if (s[sc] == ' ') { - print(" ") - sc++ - } - } - - println("${font.noColorCode}\nEND") - - println(font.toColorCode(0xF_F07)) - println(font.toColorCode(0x0000)) + println(font.charsetOverrideDefault) + println(font.charsetOverrideBulgarian) + println(font.charsetOverrideSerbian) frameBuffer = FrameBuffer(Pixmap.Format.RGBA8888, TEXW, TEXH, true) diff --git a/PUA_allocation_chart.xlsx b/PUA_allocation_chart.xlsx index 9fc9005..16e8c62 100644 Binary files a/PUA_allocation_chart.xlsx and b/PUA_allocation_chart.xlsx differ diff --git a/README.md b/README.md index 4b0d395..50e1eb3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The JAR package is meant to be used with Slick2d (extends ```Font``` class) and The issue page is open. If you have some issues to submit, or have a question, please leave it on the page. #### Little notes -- To display Bulgarian/Serbian variants, you need special Control Characters. (GameFontBase.charsetOverrideBulgarian -- U+FFFF9; GameFontBase.charsetOverrideSerbian -- U+FFFFA) +- To display Bulgarian/Serbian variants, you need special Control Characters. (GameFontBase.charsetOverrideBulgarian -- U+FFFC1; GameFontBase.charsetOverrideSerbian -- U+FFFC2) - All Han characters are in Chinese variant, no other variants are to be supported as most Chinese, Japanese and Korean can understand other's variant and to be honest, we don't bother anyway. - Indian script in general is not perfect: this font will never do the proper ligatures (I can't draw all the 1 224 possible combinations). Hopefully it's still be able to understand without them. diff --git a/assets/LatinExtA_variable.tga b/assets/LatinExtA_variable.tga index 644c960..9177154 100644 Binary files a/assets/LatinExtA_variable.tga and b/assets/LatinExtA_variable.tga differ diff --git a/assets/richtext_furigana.tga b/assets/richtext_furigana.tga new file mode 100644 index 0000000..318c449 Binary files /dev/null and b/assets/richtext_furigana.tga differ diff --git a/demotext.txt b/demotext.txt index 25ee118..a79d26e 100644 --- a/demotext.txt +++ b/demotext.txt @@ -27,7 +27,7 @@ How multilingual? Real multilingual! 􏻬ՄՇԱԿԻՉ ԿԱՄ ԿԵՆՏՐՈՆԱԿԱՆ ՄՇԱԿԻՉ ՀԱՆԳՈՒՅՑԸ ՀԱՆԴԻՍԱՆՈՒՄ Է ՀԱՄԱԿԱՐԳՉԻ ՍԱՐՔԱՎՈՐՈՒՄՆԵՐԻՑ􀀀 􏻬Zəfər, jaketini də papağını da götür, bu axşam hava çox soyuq olacaq􀀀 􏻬আমি কাঁচ খেতে পারি, তাতে আমার কোনো ক্ষতি হয় না। 􀀀 - 􏻬󿿹Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче󿿸􀀀 + 􏻬󿿁Под южно дърво, цъфтящо в синьо, бягаше малко пухкаво зайче󿿀􀀀 􏻬ᎠᏍᎦᏯᎡᎦᎢᎾᎨᎢᎣᏍᏓᎤᎩᏍᏗᎥᎴᏓᎯᎲᎢᏔᎵᏕᎦᏟᏗᏖᎸᎳᏗᏗᎧᎵᎢᏘᎴᎩ ᏙᏱᏗᏜᏫᏗᏣᏚᎦᏫᏛᏄᏓᎦᏝᏃᎠᎾᏗᎭᏞᎦᎯᎦᏘᏓᏠᎨᏏᏕᏡᎬᏢᏓᏥᏩᏝᎡᎢᎪᎢ􀀀 􏻬ᎠᎦᏂᏗᎮᎢᎫᎩᎬᏩᎴᎢᎠᏆᏅᏛᎫᏊᎾᎥᎠᏁᏙᎲᏐᏈᎵᎤᎩᎸᏓᏭᎷᏤᎢᏏᏉᏯᏌᏊ ᎤᏂᏋᎢᏡᎬᎢᎰᏩᎬᏤᎵᏍᏗᏱᎩᎱᎱᎤᎩᎴᎢᏦᎢᎠᏂᏧᏣᏨᎦᏥᎪᎥᏌᏊᎤᎶᏒᎢᎢᏡᎬᎢ􀀀 􏻬ᎹᎦᎺᎵᏥᎻᎼᏏᎽᏗᏩᏂᎦᏘᎾᎿᎠᏁᎬᎢᏅᎩᎾᏂᎡᎢᏌᎶᎵᏎᎷᎠᏑᏍᏗᏪᎩ ᎠᎴ ᏬᏗᏲᏭᎾᏓᏍᏓᏴᏁᎢᎤᎦᏅᏮᏰᎵᏳᏂᎨᎢ􀀀 @@ -54,7 +54,7 @@ How multilingual? Real multilingual! 􏻬कः खगौघाङचिच्छौजा झाञ्ज्ञोऽटौठीडडण्ढणः। तथोदधीन् पफर्बाभीर्मयोऽरिल्वाशिषां सहः॥􀀀 􏻬Înjurând pițigăiat, zoofobul comandă vexat whisky și tequila􀀀 􏻬Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства􀀀 - 􏻬󿿺Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу󿿸􀀀 + 􏻬󿿂Ајшо, лепото и чежњо, за љубав срца мога дођи у Хаџиће на кафу󿿀􀀀 􏻬Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!􀀀 􏻬นายสังฆภัณฑ์ เฮงพิทักษ์ฝั่ง ผู้เฒ่าซึ่งมีอาชีพเป็นฅนขายฃวด ถูกตำรวจปฏิบัติการจับฟ้องศาล ฐานลักนาฬิกาคุณหญิงฉัตรชฎา ฌานสมาธิ􀀀 􏻬Pijamalı hasta yağız şoföre çabucak güvendi􀀀 @@ -77,8 +77,8 @@ How multilingual? Real multilingual! 􎳌Colour-code that supports 65535 opaque or semi-transparent colours via 4 bit ARGB􀀀 - 􏿿󿿹Щиглецът се яде само пържен в юфка без чушки и хвойна󿿸 (Bulgarian)􀀀 - 􏿿󿿺Љубазни фењерџија чађавог лица хоће да ми покаже штос󿿸 (Serbian)􀀀 + 􏿿󿿁Щиглецът се яде само пържен в юфка без чушки и хвойна󿿀 (Bulgarian)􀀀 + 􏿿󿿂Љубазни фењерџија чађавог лица хоће да ми покаже штос󿿀 (Serbian)􀀀 􏿿Разъяренный чтец эгоистично бьёт пятью жердями шустрого фехтовальщика (Russian)􀀀 􎳌Control characters to support Bulgarian and Serbian letter shapes on the fly􀀀 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt index c2c36b3..5ca2f88 100644 --- a/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt +++ b/src/net/torvald/terrarumsansbitmap/gdx/GameFontBase.kt @@ -29,6 +29,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.* +import com.badlogic.gdx.utils.GdxRuntimeException import net.torvald.terrarumsansbitmap.GlyphProps import java.io.BufferedOutputStream import java.io.FileOutputStream @@ -65,9 +66,9 @@ typealias CodepointSequence = ArrayList * * - U+100000: Clear colour keys * - U+100001..U+10FFFF: Colour key (in RGBA order) - * - U+FFFF8: Charset override -- normal (incl. Russian, Ukrainian, etc.) - * - U+FFFF9: Charset override -- Bulgarian - * - U+FFFFA: Charset override -- Serbian + * - U+FFFC0: Charset override -- Default (incl. Russian, Ukrainian, etc.) + * - U+FFFC1: Charset override -- Bulgarian + * - U+FFFC2: Charset override -- Serbian * * ## Auto Shift Down * @@ -139,7 +140,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo private fun isLatinExtAdd(c: Int) = c in 0x1E00..0x1EFF private fun isBulgarian(c: Int) = c in 0x400..0x45F private fun isColourCode(c: Int) = c in 0x100000..0x10FFFF - private fun isCharsetOverride(c: Int) = c in 0xFFFF8..0xFFFFF + private fun isCharsetOverride(c: Int) = c in 0xFFFC0..0xFFFFF private fun isCherokee(c: Int) = c in codeRange[SHEET_TSALAGI_VARW] private fun isInsular(c: Int) = c == 0x1D79 || c in 0xA779..0xA787 private fun isNagariBengali(c: Int) = c in codeRange[SHEET_NAGARI_BENGALI_VARW] @@ -347,7 +348,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo throw Error("[TerrarumSansBitmap] font is enlisted as variable on the name but not named as") - val pixmap: Pixmap + var pixmap: Pixmap if (isVariable) { @@ -375,7 +376,17 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo //File(tmpFileName).delete() } else { - pixmap = Pixmap(Gdx.files.internal(fontParentDir + it)) + try { + pixmap = Pixmap(Gdx.files.internal(fontParentDir + it)) + } + catch (e: GdxRuntimeException) { + e.printStackTrace() + + // if non-ascii chart is missing, replace it with null sheet + pixmap = Pixmap(1, 1, Pixmap.Format.RGBA8888) + // else, notify by error + if (index != 0) System.exit(1) + } } @@ -525,7 +536,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo } } else if (isCharsetOverride(c)) { - charsetOverride = c - CHARSET_OVERRIDE_NULL + charsetOverride = c - CHARSET_OVERRIDE_DEFAULT } else if (sheetID == SHEET_HANGUL) { val hangulSheet = sheets[SHEET_HANGUL] @@ -903,7 +914,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo this.codeRange[SHEET_UNIHAN].forEach { glyphProps[it] = GlyphProps(W_UNIHAN, 0) } (0xD800..0xDFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } (0x100000..0x10FFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } - (0xFFFF8..0xFFFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } + (0xFFFA0..0xFFFFF).forEach { glyphProps[it] = GlyphProps(0, 0) } // manually build width table of Kana Supplements @@ -1137,7 +1148,7 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo fun toColorCode(r: Int, g: Int, b: Int, a: Int = 0x0F): String = GameFontBase.toColorCode(r, g, b, a) val noColorCode = toColorCode(0x0000) - val charsetOverrideNormal = Character.toChars(CHARSET_OVERRIDE_NULL) + val charsetOverrideDefault = Character.toChars(CHARSET_OVERRIDE_DEFAULT) val charsetOverrideBulgarian = Character.toChars(CHARSET_OVERRIDE_BG_BG) val charsetOverrideSerbian = Character.toChars(CHARSET_OVERRIDE_SR_SR) @@ -1204,12 +1215,21 @@ class GameFontBase(fontDir: String, val noShadow: Boolean = false, val flipY: Bo internal val SHEET_UNKNOWN = 254 - internal val CHARSET_OVERRIDE_NULL = 0xFFFF8 - internal val CHARSET_OVERRIDE_BG_BG = 0xFFFF9 - internal val CHARSET_OVERRIDE_SR_SR = 0xFFFFA + // custom codepoints + + internal val RICH_TEXT_MODIFIER_RUBY_MASTER = 0xFFFA0 + internal val RICH_TEXT_MODIFIER_RUBY_SLAVE = 0xFFFA0 + internal val RICH_TEXT_MODIFIER_TAG_END = 0xFFFA0 + + internal val CHARSET_OVERRIDE_DEFAULT = 0xFFFC0 + internal val CHARSET_OVERRIDE_BG_BG = 0xFFFC1 + internal val CHARSET_OVERRIDE_SR_SR = 0xFFFC2 - val charsetOverrideNormal = Character.toChars(CHARSET_OVERRIDE_NULL) + + + + val charsetOverrideDefault = Character.toChars(CHARSET_OVERRIDE_DEFAULT) val charsetOverrideBulgarian = Character.toChars(CHARSET_OVERRIDE_BG_BG) val charsetOverrideSerbian = Character.toChars(CHARSET_OVERRIDE_SR_SR) fun toColorCode(argb4444: Int): String = Character.toChars(0x100000 + argb4444).toColCode() diff --git a/testing.PNG b/testing.PNG index 190ca14..e58672b 100644 Binary files a/testing.PNG and b/testing.PNG differ diff --git a/testtext.txt b/testtext.txt index 652d2ce..80f38ed 100644 --- a/testtext.txt +++ b/testtext.txt @@ -1,28 +1,2 @@ -কঁা (incorrect order, ??? rendering) -কাঁ (correct order, ??? rendering) -हैहैहै -সিওল কোরিয়া রাজধানী -सियोल कोरिया की राजधानी है - -O̸ -o̸ - -Received Pronunciation IPA: /ˌɪntəˈnæʃənəl/, [ˌɪntəˈnæʃənəɫ] -General American IPA: /ˌɪntɚˈnæʃənəl/, [ˌɪntɚˈnæʃənəɫ], [ˌɪɾ̃ɚˈnæʃənəɫ] -Rhymes: -ɛntəl (wtf wiktionary ??) - -ˈkʰomɐ gɛts ɐ ˈkʰjuɚ wɛl çiəz ə ˈstʌɹi fɔ ˈju ˈsɐɾə ˈpɛɾi wɔz ə bɛtʰəˈna˞li ˈnʌɚs hu hæd bin ˈwʌ˞kɪŋ deɪli æt æn -ˈɔʊl̴də d͡zʉ in ə dɪˈzʌɚtɪdə dɪsˈtɹʷɪkt ɔv zə tʰ ˈtʰɛɹɪtəɹi soʊ ʃi wʌz ˈvɛɹi ˈhæpi s tʉ stat ə njʉ d͡ʒɔb æt ə -ˈsʌbʌb˺ ˈpɹaɪbɛt pɹaktis in noʊsə ˈskweɚ niə zə ˈdjʉk ˈstoʊi ˈtaʊɚ ðæt ˈeɾiə wəz mʌt͡ʃ ˈniɾə fɔ hɐ ænd mɔə -tʉ laɪk˺ hɐ ˈlaɪkiŋgə ˈibn̩ so ɔ̃ ha fa˞st ˈmɔnɪŋ ʃi fɛlt͡s s t͡stɹɛst ʃi eɪt ə bɔl̴ ɔb˺ ˈpɔɹʷɪd͡ʒ t͡ʃɛkt hɐ˞sɛlf ɪn ðə -ˈmiɹəɚ ænd wɑʃt hɐ˞ ɸeɪs ɪn ə ˈhʌ˞li zɛn ʃi pʊt ɑn ə pɹeɪn bə ˈjɛloʊ dɹɛs ænd ə ɸʊlɪɸʊlis ˈd͡ʒækɛt pikt ap -hɐ˞ kʰit ænd ˈhɛdɪdə fɔ ˈwʌ˞kʰ - -ˈkʊmɐ gɛts ə ˈkjɚ wɛl̴ ˈɸ͜hi˞ɹɪzə ˈstʌɾi fɔ ʔəju saɹəʔ ˈpɛɹi wɑzə bə ˈbɛtənəɹi bɛt˺ ˈbɛtəˌɹɪnəɹi ənʌs f f hu havə bin -ˈw̰ʌ˞kɪŋ deɹi ʔat˺ ʔan ʔat an ol̴d͜zʉ in zə diˈzɑɹɛd d ˈdistɹɪkt ɔb ðəʔ ˈtɛɹɪtəɹʷi soʊ çi wʌz ˈbɛɹɪ ˈhɑpi tʉ stɑ˞t˺ -njʉ ə ˈnjʉ d͡ʒoʊb̥ ɐʔ to s̩ˈpɚb pɹaɪvɛt ˈpɹaktɪs ɪn nɔsˈkwɛɚ niə ðə ˈdʌk sɹit˺ t ˈtɔʌ˞ zat˺ ˈeɹiə wɑz mat͡ʃ ˈniɹɪ ˈniɹə fɔ -hʌ̥ɕʉ̥ fɔ hɚ ændə mɔ̰ mɔə tu ˈħə ˈɹaɪkɪŋ ˈivn̩ zoʊ ɔn ɸ hɐ fɐst mɔɹɪŋ ʃi fɛlt ˈsɹɛɾɛ ɛ̰ ʃi eɪt˺ ʌ boʊl̴ ɔb ˈpɹis æ̃ ˈt͡ʃɛkʰt -ˈhɑsɛlf ɪnə ˈmiɹə and wɔʃt hɐ fʷeɪs ɪn ˈhʌ˞ɹi ʌ ˈðɛn si pʊt ɔn ðə pɹeɪnə ˈjɛɹoʊ ˈdɹɛsɪz an fɹis ˈd͡ʒækɛt n̩ pik ʌpt -ˈhɑ kɪt an ˈhɛdɪd fɔ ə fɔ wɔk fɔ ˈwʌ˞kʰ æ̰̃ - -acegijmnopqrsuvwxyzɱɳʙɾɽʒʂʐʋɹɻɥɟɡɢʛȵɲŋɴʀɕʑçʝxɣχʁʜʍɰʟɨʉɯuʊøɘɵɤəɛœɜɞʌɔæɐɶɑɒɚɝɩɪʅʈʏʞ \ No newline at end of file +Nijntje Pluis +Nijntje Pluis \ No newline at end of file