berdn: Internationale Suche

Hallo liebes Forum,

wir planen gerade eine „Wohnungs-Vermittlung“ in 5 Sprachen, mit Angeboten aus noch mehr Ländern.
d.h. Sprachen sind Deutsch, Englisch, Französisch, Spanisch, Türkisch.
Ich kann aber z.B. als Pole auch Angebote einstellen.

Nun haben wir nach der Suche nach Städte, bzw. Regionen zwei Schwierigkeiten:

Nun werden Städtenamen aber in jedem Land anders geschrieben ;-(

Ich gebe z.B. als Ort München in die Datenbank ein, aber ein Engländer sucht vielleicht nach Munich.

Oder z.B. Dünkirchen (deutsch), Dunkerque (französisch) Duinkerke (niederländisch)

Gibt es hier für fertige (freie) Lösungen? Oder übertreibe ich ggf. das Problem nur?

Evtl. brauchen wir auch einen Parser für Umlaute das z.B.
Länder auch  bei der Eingabe von Laender oder Lander
Bzw. Småland auch mit Smäland, oder Smaland gefunden wird, ich weiss spontan gar nicht wo das å auf meine Tastatur ist.

Das Einzige was mir dazu einfällt wäre eine Art Übersetzungs-Tabelle die man manuell erstellen müsste ;-(.

Entwicklung wird mit PHP und mySQL,

Für Anregungen dankbar,

Sonnige Grüße,

Bernd

  1. ihr braucht eine n:1 tabelle, in welcher n für die einzelnen bezeichnungen steht, und 1 auf den index der entsprechenden tabelle zeigt. diese beiden tabellen kann man miteinander joinen.

    soll nur die korrekte bezeichnung gefunden werden, muß in der neuen tabelle eine weitere spalte mit der landesidentifikation, welche in der where bedingung mit anzugeben ist.

    1. Hallo fanelf,

      also alle Variationen von Städtenamen suchen und
      eingeben ;-(

      Trotzdem Danke,

      Bernd

      1. Hallo fanelf,

        also alle Variationen von Städtenamen suchen und
        eingeben ;-(

        Trotzdem Danke,

        Bernd

        ja alle variationen in der tabelle eintragen. irgendjemand muss ja wissen wie münchen auf russisch oder spanisch genannt wird. so schlau sind computer ja noch nicht von selbst.

        1. Hi,

          ja alle variationen in der tabelle eintragen. irgendjemand muss ja wissen wie münchen auf russisch oder spanisch genannt wird. so schlau sind computer ja noch nicht von selbst.

          Vielleicht schon. Man kann mit MySQL auch soundex-Vergleiche machen.

          Ich mache das bei einer sehr rudimentären Fuzzy-Suche, die ich selbst geschrieben habe, so:
          1. Suche nach dem exakten Vorkommen. Wenn gefunden, gib aus und Ende.
          2. Suche nach dem Soundex-Wert des Suchterms. Wenn gefunden, gib aus und Ende.
          3. Suche den Treffer mit der geringsten Abweichung mithilfe des Levenshtein-Algorithmus. Wenn Differenz größer als Schwellwert ist, gib false zurück, ansonsten den Treffer.

          Nachteil: Soundex vergleicht ähnlich klingende Worte aufgrund der englischen Aussprache. Für internationale Vergleiche vielleicht nur bedingt einsetzbar, aber schon ein Ansatz. Zur Not einfach Schritt 2 komplett auslassen. Außerdem liefern manche Worte den gleichen Wert zurück, obwohl sie völlig unterschiedlich sind (rest und reset). Zusätzlich kommt noch hinzu, dass bei MySQL und PHP wohl unterschiedliche Soundex-Versionen oder ähnliches eingesetzt werden, so dass teilweise die Soundex-Werte aus MySQL mit den Soundex-Werten desselben Wortes aus PHP nicht mehr übereinstimmen.

          Aber probier's doch einfach. ;-)

          Der Yeti

          --
          Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
          Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
          Und bin so klug als wie zuvor!
          sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
          1. Hi,

            ja alle variationen in der tabelle eintragen. irgendjemand muss ja wissen wie münchen auf russisch oder spanisch genannt wird.

            Google? Wikipedia? "Der Fisch"? Eine mühselige Suche, das kann ich Dir sagen. Ich würde die Liste zukaufen. Dürfte bei rein interner Benutzung und gröberer Auflösung auch nicht so teuer sein.

            BTW: Das Beispiel ist gut gewählt, da hier das Problem der verschiedenen Zeichensätze geradezu in's Auge springt.

            Ich mache das bei einer sehr rudimentären Fuzzy-Suche, die ich selbst geschrieben habe, so:

            1. Suche nach dem exakten Vorkommen. Wenn gefunden, gib aus und Ende.
            2. Suche nach dem Soundex-Wert des Suchterms. Wenn gefunden, gib aus und Ende.
            3. Suche den Treffer mit der geringsten Abweichung mithilfe des Levenshtein-Algorithmus. Wenn Differenz größer als Schwellwert ist, gib false zurück, ansonsten den Treffer.

            Na, so rudimentär ist die schon gar nicht mehr, viel mehr gibt's da nämlich kaum noch.

            Nachteil: Soundex vergleicht ähnlich klingende Worte aufgrund der englischen Aussprache.

            Mmh, nein, ganz so ist das nicht. Dieser Algorithmus (US. Patent #1261167 (von 1918) und #1435663 (von 1922)) wurde zum Gebrauch im US-Amerikanischem Zensus erstellt und mußte auf die dort vorkommenden, aus fast dem gesamtem weltlichem Sprachraum stammenden Namen passen. Dadurch funktioniert er allgemein recht gut, auch wenn er bei indo-germanischem Sprachen stets ein klein wenig besser ist, dafür aber leichte Schwierigkeiten im finnisch-ugurischen hat.
            Deshalb ist er auch für den allgemeinen Gebrauch recht gut geeignet. Aufgrund einiger, teilweise künstlicher, der damaligen Technik geschuldeter Beschränkungen wie zum Beispiel die begrenzte Wort- und Hashlänge gab es eine Reihe Verbesserungsversuche auch in sprachlich eingrenzender Weise. "Metaphone", "double Metaphone", "Phonem" und jede Menge anderer. Selbst ich habe mal einen gebastelt ;-)

            Für internationale Vergleiche vielleicht nur bedingt einsetzbar, aber schon ein Ansatz.

            Wo liegt die Beschränkung im internationalem Einsatz? In der Sprachverwandschaft: je weiter die individuellen Sprachen auseinandergelaufen sind, desto schwieriger wird's. Stadtnamen werden jedoch falls keine politischen Gründe dagegen stehen meist phonetisch übersetzt.
            München -> munchen -> M525 (de)
            Munich  -> munich  -> M52  (en)
            Múnich  -> munich  -> M52  (es)
            мюнхен   -> mjunchen (ISO) -> M2525 (ru)
            мюнхен   -> múnchen (ISO Alternative) -> munchen -> M525 (ru)

            Zur Not einfach Schritt 2 komplett auslassen.

            Nö, Soundex o.ä., also eine imperfekte Hashfunktion ist schon ganz gut. Über das Ergebnis, also den Hash kann dann eine Ähnlchkeitsanalyse geführt werden. Sei es eine Variation über die Hammingdistanz wie der Damerau-Levenshtein-Algorithmus, eine longest-common-substring/subsequence o.ä.

            Außerdem liefern manche Worte den gleichen Wert zurück, obwohl sie völlig unterschiedlich sind (rest und reset).

            Nun, genau das ist ja auch der Witz daran!

            Wichtiger beim Vergleich ist das, was ich bei meiner Liste oben angestellt habe: Minimieren der Unterschiede der Zeichensätze durch Überführung (hier: unter Verlust) in einen gemeinsamen Zeichensatz. Die Wahrscheinlichkeiten für eine Treffer sind sehr hoch, da der benötigte Datensatz recht klein ist. Es wird ja nicht der Name jedes Kuhdorfs in allen Sprachen benötigt, sondern nur die der Orte, die tatsächlich auch benutzt werden.

            so short

            Christoph Zurnieden

            1. Hi,

              Na, so rudimentär ist die schon gar nicht mehr, viel mehr gibt's da nämlich kaum noch.

              Okay, dann habe ich wohl zu tief gestapelt. Das war nämlich die allererste Vorgehensweise, die mir einfiel, als ich auf die soundex-Funktion in PHP stieß. In einem Userkommentar stand dann noch der Hinweis auf levenshtein(), womit der Server fast schon zum "Gedankenlesen" gebracht werden könnte. ;-)
              Da ich aber immer noch ein paar falsche Hits hatte, hab ich das für imperfekt gehalten. Allerdings für meine Zwecke hat es gereicht (ich überprüfe, ob es die entsprechende Firma schon gibt, also z.B. BMW = Bayerische Motorenwerke AG o.ä.). Da ist ein Fehler nicht allzu tragisch, zur Not müssen erkannte Duplikate manuell gelöscht werden.

              Mmh, nein, ganz so ist das nicht. Dieser Algorithmus (US. Patent #1261167 (von 1918) und #1435663 (von 1922)) wurde zum Gebrauch im US-Amerikanischem Zensus erstellt und mußte auf die dort vorkommenden, aus fast dem gesamtem weltlichem Sprachraum stammenden Namen passen. Dadurch funktioniert er allgemein recht gut, auch wenn er bei indo-germanischem Sprachen stets ein klein wenig besser ist, dafür aber leichte Schwierigkeiten im finnisch-ugurischen hat.
              Deshalb ist er auch für den allgemeinen Gebrauch recht gut geeignet. Aufgrund einiger, teilweise künstlicher, der damaligen Technik geschuldeter Beschränkungen wie zum Beispiel die begrenzte Wort- und Hashlänge gab es eine Reihe Verbesserungsversuche auch in sprachlich eingrenzender Weise. "Metaphone", "double Metaphone", "Phonem" und jede Menge anderer. Selbst ich habe mal einen gebastelt ;-)

              Okay, hab mich da nicht wirklich eingearbeitet. Mir kam es aber so vor, als wäre das speziell auf eine Sprache angepasst.

              Wo liegt die Beschränkung im internationalem Einsatz? In der Sprachverwandschaft: je weiter die individuellen Sprachen auseinandergelaufen sind, desto schwieriger wird's. Stadtnamen werden jedoch falls keine politischen Gründe dagegen stehen meist phonetisch übersetzt.
              München -> munchen -> M525 (de)
              Munich  -> munich  -> M52  (en)
              Múnich  -> munich  -> M52  (es)
              мюнхен   -> mjunchen (ISO) -> M2525 (ru)
              мюнхен   -> múnchen (ISO Alternative) -> munchen -> M525 (ru)

              Wie gesagt, einfach mal ausprobieren. Wollte nur darauf hinweisen, dass es keine perfekten Ergebnisse liefert und man mit Ungenauigkeiten arbeiten muss.

              Nö, Soundex o.ä., also eine imperfekte Hashfunktion ist schon ganz gut. Über das Ergebnis, also den Hash kann dann eine Ähnlchkeitsanalyse geführt werden. Sei es eine Variation über die Hammingdistanz wie der Damerau-Levenshtein-Algorithmus, eine longest-common-substring/subsequence o.ä.

              Okay, dann soll er das machen. ;-)

              Außerdem liefern manche Worte den gleichen Wert zurück, obwohl sie völlig unterschiedlich sind (rest und reset).

              Nun, genau das ist ja auch der Witz daran!

              Bei Städtenamen mag das stimmen, wenn du aber z.B. übersetzen willst und dann für "I rested on the way" bekommst "Ich startete auf dem Weg neu", dann ist das falsch. ;-)
              Aber stimmt, für seine Zwecke ist genau das der Witz daran.

              Wichtiger beim Vergleich ist das, was ich bei meiner Liste oben angestellt habe: Minimieren der Unterschiede der Zeichensätze durch Überführung (hier: unter Verlust) in einen gemeinsamen Zeichensatz. Die Wahrscheinlichkeiten für eine Treffer sind sehr hoch, da der benötigte Datensatz recht klein ist. Es wird ja nicht der Name jedes Kuhdorfs in allen Sprachen benötigt, sondern nur die der Orte, die tatsächlich auch benutzt werden.

              D'accord.

              Der Yeti

              --
              Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
              Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
              Und bin so klug als wie zuvor!
              sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
              1. Hallo Forum,

                ich bin beeindruckt !
                Und will allen schonmal Danke sagen, das muß jetzt mal ausprobiert werden.

                Bernd

              2. Hi,

                Na, so rudimentär ist die schon gar nicht mehr, viel mehr gibt's da nämlich kaum noch.

                Okay, dann habe ich wohl zu tief gestapelt.

                Nun, meistens besser als zu hoch, denn das kann im Einzelfall als Bestseller enden ;-)

                Das war nämlich die allererste Vorgehensweise, die mir einfiel, als ich auf die soundex-Funktion in PHP stieß. In einem Userkommentar stand dann noch der Hinweis auf levenshtein(), womit der Server fast schon zum "Gedankenlesen" gebracht werden könnte. ;-)

                Beides zusammen funktioniert wirklich sehr gut bei Vertippern. Wenn Du Dir selbst mal etwas zusammenbasteln möchtest: es gibt das Perlmodul Lingua::TypoGenerator
                das die Buchstaben eines Wortes auf recht typische Vertipper Art (englische Tastatur! Eine Anpassung auf deutsche Tastatur kannst Du selber basteln, ist nicht weiter schwierig) durcheinanderwirbelt. Soundex ist AFAIK Perlbuildin seit 5.8.7 ansonsten gibt es das hier:http://search.cpan.org/~markm/Text-Soundex-3.02/Soundex.pm denn es dürfte etwas bequemer sein, alles in Perl zu machen, als sich etwas in Perl+PHP zusammenzubasteln. Ich nehme zumindest an, das Du Windowsbenutzer ohne pipefähige Shell bist. Ansonsten habe ich alles hier beschriebene noch in Javascript vorrätig.

                Da ich aber immer noch ein paar falsche Hits hatte, hab ich das für imperfekt gehalten. Allerdings für meine Zwecke hat es gereicht (ich überprüfe, ob es die entsprechende Firma schon gibt, also z.B. BMW = Bayerische Motorenwerke AG o.ä.). Da ist ein Fehler nicht allzu tragisch, zur Not müssen erkannte Duplikate manuell gelöscht werden.

                Ja, das ist normal, da es natürlich keine exakten Suchalgorithmen sind. Selbst wenn die Wahrscheinlichkeiten recht hoch sind, so hat man doch immer noch den einen oder anderen Ausrutscher zu erwarten. Es ist daher stets abzuwägen ob dieses Risiko akzeptabel ist.

                Deshalb ist er auch für den allgemeinen Gebrauch recht gut geeignet. Aufgrund einiger, teilweise künstlicher, der damaligen Technik geschuldeter Beschränkungen wie zum Beispiel die begrenzte Wort- und Hashlänge gab es eine Reihe Verbesserungsversuche auch in sprachlich eingrenzender Weise. "Metaphone", "double Metaphone", "Phonem" und jede Menge anderer. Selbst ich habe mal einen gebastelt ;-)

                Okay, hab mich da nicht wirklich eingearbeitet. Mir kam es aber so vor, als wäre das speziell auf eine Sprache angepasst.

                Auf die Aussprache, ja, aber nicht auf die Sprache. Wie die Bezeichnung schon anzudeuten versucht.

                Außerdem liefern manche Worte den gleichen Wert zurück, obwohl sie völlig unterschiedlich sind (rest und reset).

                Nun, genau das ist ja auch der Witz daran!

                Bei Städtenamen mag das stimmen, wenn du aber z.B. übersetzen willst und dann für "I rested on the way" bekommst "Ich startete auf dem Weg neu", dann ist das falsch. ;-)

                Auch für Benutzer eines bestimmten Redmonder Computerbetriebsystems? >;->

                so short

                Christoph Zurnieden

          2. der sinn von phonetischen überprüfungen liegt hauptsächlich darin, schreibfehler zu tolerieren. es ist nicht die aufgabe phonetischer ähnlichkeiten auf die ??? sprachen dieser welt einen eindeutigkeit herauszukristallisieren (neue schreibweise?). bei münchen mag das ja noch klappen, aber wenn ich an danzig denke, welches in polnisch ja gdansk ist, fürchte ich für die phonetische überprüfung doch arge schwierigkeiten.

            daher 2 einträge: danzig und gdansk, welche beide auf einen gemeinsames normal für diese stadt zeigen.

            1. Moin,

              es ist nicht die aufgabe phonetischer ähnlichkeiten auf die ??? sprachen dieser welt einen eindeutigkeit herauszukristallisieren (neue schreibweise?).

              Nein. Man kann weder "auf die Sprachen eine Eindeutigkeit herauskristallisieren" (Doppelfehler Grammatik), noch sind Großbuchstaben abgeschafft worden (Groß- und Kleinschreibung), noch hat sich die Schreibung von Verbindungen aus Partikel und Verb gegenüber der alten Regelung geändert. Die Schreibung mit der Infinitivkonjunktion "zu" richtet sich prinzipiell nach der Infinitivform, d. h. nach der Form, die im Wörterbuch steht; "herauskristallisieren" steht in meinem Wörterbuch, in anderen wohl auch.

              ;-)

              Swen Wacker

              1. vielen dank für die hinweise. bei uns in bs gehen die leute nach karstadt.

                1. Moin,

                  bei uns in bs gehen die leute nach karstadt.

                  Und? Manche gehen sogar in den Karstadt ;-)

                  Ich habe mal gelernt, dass es "zu der Person" (ich wende mich an jemanden, bewege mich auf ihn zu, häufig mit Artikel: "Ich gehe zum Doktor", ".. .zur Freundin") und "nach Orten" (weil mehr eine Richtung bzw. "in die Nähe von" gemeint ist: Ich fahre nach Kiel). Ich finde es echt schwer, das genau auseinanderzuhalten und verlasse mich in meiner Sprechsprache allein auf mein Gefühl - und das wird nicht von Regeln sondern von Gewohnheiten geprägt. Ich gehe also ab und an nach Aldi. Ältere Leute umschiffen das gern mit einem beherztem "auf": Ich gehe auf die Post" :-)

                  Viele Grüße

                  Swen Wacker
                  [ ] Ich gehe ins SELFHTML-Forum
                  [ ] Ich gehe zum SELFHTML-Forum
                  [ ] Ich gehe nach dem SELFHTML-Forum
                  [ ] Ich gehe auf das SELFHTML-Forum
                  [ ] Ich gehe garnicht dahin, ich bin daimmer

                  1. Hi,

                    Ich habe mal gelernt, dass es "zu der Person" (ich wende mich an jemanden, bewege mich auf ihn zu, häufig mit Artikel: "Ich gehe zum Doktor", ".. .zur Freundin") und "nach Orten" (weil mehr eine Richtung bzw. "in die Nähe von" gemeint ist: Ich fahre nach Kiel). Ich finde es echt schwer, das genau auseinanderzuhalten und verlasse mich in meiner Sprechsprache allein auf mein Gefühl - und das wird nicht von Regeln sondern von Gewohnheiten geprägt. Ich gehe also ab und an nach Aldi. Ältere Leute umschiffen das gern mit einem beherztem "auf": Ich gehe auf die Post" :-)

                    Damals, als ich noch auf dem Dorf gewohnt habe, gingen dort alle immer "nam Bett" (also "nach dem Bett"). Allerdings bewegten sich die Betten gar nicht, so dass eigentlich keiner hätte hinterlaufen müssen. ;-)

                    Bei Aldi könnte man argumentieren, dass eine (juristische) Person ist bzw. die Abkürzung eines namens. Ich gehe auch immer zum Aldi, Lidl, Plus, Conrad, Mädchenmarkt, Bäcker, Metzger, Bahnhof und auch zur Post ... Warum man allerdings "aufs" Amt geht (die Post war früher auch staatlich), weiß ich nicht.

                    Der Yeti

                    --
                    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
                    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
                    Und bin so klug als wie zuvor!
                    sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
                    1. Moin,

                      Damals, als ich noch auf dem Dorf gewohnt habe, gingen dort alle immer "nam Bett" (also "nach dem Bett").

                      Was ich sprachlich sogar irgendwie logisch empfinde. Das Bett kann ja vielleicht so groß sein, das es der Größe einer durchwschnittlichen schleswig-holsteinschen Gmeinde entspräche, das sind nicht viel mehr als 4 m² :-)
                      Zudem unterscheide ich mich mit "nach dem Bett" von der anders gemeinten Möglichkeit "zu Bett" ab, ähnlich "nach Hause" <-> "zuhause".

                      So, das war nicht ganz so ernst gemeint.

                      Warum man allerdings "aufs" Amt geht (die Post war früher auch staatlich), weiß ich nicht.

                      Eben. Ein Ausdruck, der die Obrigkeit des Staates verbildlicht?

                      Viele Grüße

                      Swen Wacker

            2. Hi,

              daher 2 einträge: danzig und gdansk, welche beide auf einen gemeinsames normal für diese stadt zeigen.

              Das kann man ja alternativ machen, wo man es weiß. Aber was ist z.B. mit einem Ami, der nach Nuremburg ziehen will/muss und dieser Eintrag ist nicht mit Nürnberg (oder Nurnberg) verknüpft, weil der Seitenbetreiber nicht weiß, dass es in einer anderen Sprache anders heißt?

              Bei Danzig und Gdansk würde ich wetten, dass meine Fuzzy-Suche (richtig kalibriert) das richtige Ergebnis findet. Klingen schließlich auch ähnlich (zumindest wenn man's deutsch ausspricht).
              Anders bei Göcs (ungarisch für Wien). ;-) Da sind eindeutig zwei Einträge nötig.

              Der Yeti

              --
              Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
              Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
              Und bin so klug als wie zuvor!
              sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
  2. Moin berdn,

    Evtl. brauchen wir auch einen Parser für Umlaute das z.B.
    Länder auch  bei der Eingabe von Laender oder Lander
    Bzw. Småland auch mit Smäland, oder Smaland gefunden wird, ich weiss spontan gar nicht wo das å auf meine Tastatur ist.

    zumindest den Part kann dir die mySQL-Volltextsuche weitgehend abnehmen, ich habe das gerade mal in meinem aktuellen Projekt getestet, im Text steht "Außenbüros" und das wird sowohl bei Eingabe von "außenbüros" als auch bei "außenburos" oder "ausenburos" gefunden; die Umsetzung von "ß" zum einfachen "s" statt "ss" entspricht leider nicht dem gewünschten, "aussenburos" wird nämlich nicht gefunden, ebensowenig "außenbueros", aber einige (bzw. die meisten) Fälle lassen sich so schon erschlagen...

    Glück auf
    Dirk

    1. Hi,

      zumindest den Part kann dir die mySQL-Volltextsuche weitgehend abnehmen, ich habe das gerade mal in meinem aktuellen Projekt getestet, im Text steht "Außenbüros" und das wird sowohl bei Eingabe von "außenbüros" als auch bei "außenburos" oder "ausenburos" gefunden; die Umsetzung von "ß" zum einfachen "s" statt "ss" entspricht leider nicht dem gewünschten, "aussenburos" wird nämlich nicht gefunden, ebensowenig "außenbueros", aber einige (bzw. die meisten) Fälle lassen sich so schon erschlagen...

      Ohne Gewähr, aber ich glaube das hat was mit der verwendeten Collation zu tun, standardmäßig ist MySQL nämlich auf Schwedisch optimiert.

      Der Yeti

      --
      Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
      Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
      Und bin so klug als wie zuvor!
      sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|