EMOTICONS = {
    u":\)": "Happy face or smiley",
    u"=\)": "Happy face or smiley",
    u":‑\)": "Happy face or smiley",
    u":-\]": "Happy face or smiley",
    u":\]": "Happy face or smiley",
    u":-3": "Happy face smiley",
    u":3": "Happy face smiley",
    u":->": "Happy face smiley",
    u":>": "Happy face smiley",
    u"8-\)": "Happy face smiley",
    u":o\)": "Happy face smiley",
    u":-\}": "Happy face smiley",
    u":\}": "Happy face smiley",
    u":-\)": "Happy face smiley",
    u":c\)": "Happy face smiley",
    u":\^\)": "Happy face smiley",
    u"=\]": "Happy face smiley",
    u":‑D": "Laughing or big grin or laugh with glasses",
    u":D": "Laughing or big grin or laugh with glasses",
    u"8‑D": "Laughing or big grin or laugh with glasses",
    u"8D": "Laughing or big grin or laugh with glasses",
    u"X‑D": "Laughing or big grin or laugh with glasses",
    u"XD": "Laughing or big grin or laugh with glasses",
    u"=D": "Laughing or big grin or laugh with glasses",
    u"=3": "Laughing or big grin or laugh with glasses",
    u"B\^D": "Laughing or big grin or laugh with glasses",
    u":-\)\)": "Very happy",
    u":‑\(": "Frown or sad or angry or pouting",
    u"=\(": "Frown or sad or angry or pouting",
    u":\(": "Frown or sad or angry or pouting",
    u":-\(": "Frown or sad or angry or pouting",
    u":‑c": "Frown or sad or angry or pouting",
    u":c": "Frown or sad or angry or pouting",
    u":‑<": "Frown or sad or angry or pouting",
    u":<": "Frown or sad or angry or pouting",
    u":‑\[": "Frown or sad or angry or pouting",
    u":\[": "Frown or sad or angry or pouting",
    u":-\|\|": "Frown or sad or angry or pouting",
    u">:\[": "Frown or sad or angry or pouting",
    u":\{": "Frown or sad or angry or pouting",
    u":@": "Frown or sad or angry or pouting",
    u">:\(": "Frown or sad or angry or pouting",
    u":'‑\(": "Crying",
    u":'\(": "Crying",
    u":'‑\)": "Tears of happiness",
    u":'\)": "Tears of happiness",
    u"D‑':": "Horror",
    u"D:<": "Disgust",
    u"D:": "Sadness",
    u"D8": "Great dismay",
    u"D;": "Great dismay",
    u"D=": "Great dismay",
    u"DX": "Great dismay",
    u":‑O": "Surprise",
    u"=O": "Surprise",
    u":‑o": "Surprise",
    u":o": "Surprise",
    u":-0": "Shock",
    u"8‑0": "Yawn",
    u">:O": "Yawn",
    u":-\*": "Kiss",
    u"=\*": "Kiss",
    u":\*": "Kiss",
    u":X": "Kiss",
    u";‑\)": "Wink or smirk",
    u";\)": "Wink or smirk",
    u"\*-\)": "Wink or smirk",
    u"\*\)": "Wink or smirk",
    u";‑\]": "Wink or smirk",
    u";\]": "Wink or smirk",
    u";\^\)": "Wink or smirk",
    u":‑,": "Wink or smirk",
    u";D": "Wink or smirk",
    u":‑P": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u":P": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u"X‑P": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u"XP": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u":‑Þ": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u":Þ": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u":b": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u"d:": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u"=p": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u">:P": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u":‑/": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u":/": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u":-\[.\]": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u">:/": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u"=/": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u":L": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u"=L": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u":S": "Skeptical, annoyed, undecided, uneasy or hesitant",
    u":‑\|": "Straight face",
    u":\|": "Straight face",
    u":$": "Embarrassed or blushing",
    u":‑x": "Sealed lips or wearing braces or tongue-tied",
    u":x": "Sealed lips or wearing braces or tongue-tied",
    u":‑#": "Sealed lips or wearing braces or tongue-tied",
    u":#": "Sealed lips or wearing braces or tongue-tied",
    u":‑&": "Sealed lips or wearing braces or tongue-tied",
    u":&": "Sealed lips or wearing braces or tongue-tied",
    u"O:‑\)": "Angel, saint or innocent",
    u"O:\)": "Angel, saint or innocent",
    u"0:‑3": "Angel, saint or innocent",
    u"0:3": "Angel, saint or innocent",
    u"0:‑\)": "Angel, saint or innocent",
    u"0:\)": "Angel, saint or innocent",
    u":‑b": "Tongue sticking out, cheeky, playful or blowing a raspberry",
    u"0;\^\)": "Angel, saint or innocent",
    u">:‑\)": "Evil or devilish",
    u">:\)": "Evil or devilish",
    u"\}:‑\)": "Evil or devilish",
    u"\}:\)": "Evil or devilish",
    u"3:‑\)": "Evil or devilish",
    u"3:\)": "Evil or devilish",
    u">;\)": "Evil or devilish",
    u"\|;‑\)": "Cool",
    u"\|‑O": "Bored",
    u":‑J": "Tongue in cheek",
    u"#‑\)": "Party all night",
    u"%‑\)": "Drunk or confused",
    u"%\)": "Drunk or confused",
    u":-###..": "Being sick",
    u":###..": "Being sick",
    u"<:‑\|": "Dump",
    u"\(>_<\)": "Troubled",
    u"\(>_<\)>": "Troubled",
    u"\(';'\)": "Baby",
    u"\(\^\^>``": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"\(\^_\^;\)": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"\(-_-;\)": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"-_-": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"\(~_~;\)": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"\(・.・;\)": "Nervous or Embarrassed or Troubled or Shy or Sweat drop",
    u"\(-_-\)zzz": "Sleeping",
    u"\(\^_-\)": "Wink",
    u"\(\(+_+\)\)": "Confused",
    u"\(+o+\)": "Confused",
    u"\(o\|o\)": "Ultraman",
    u"\^_\^": "Joyful",
    u"\^\^": "Joyful",
    u"\(\^_\^\)/": "Joyful",
    u"\(\^O\^\)／": "Joyful",
    u"\(\^o\^\)／": "Joyful",
    u"\(__\)": "Kowtow as a sign of respect, or dogeza for apology",
    u"_\(._.\)_": "Kowtow as a sign of respect, or dogeza for apology",
    u"<\(_ _\)>": "Kowtow as a sign of respect, or dogeza for apology",
    u"<m\(__\)m>": "Kowtow as a sign of respect, or dogeza for apology",
    u"m\(__\)m": "Kowtow as a sign of respect, or dogeza for apology",
    u"m\(_ _\)m": "Kowtow as a sign of respect, or dogeza for apology",
    u"\('_'\)": "Sad or Crying",
    u"\(T_T\)": "Sad or Crying",
    u"\(;_;\)": "Sad or Crying",
    u"\(;_;": "Sad of Crying",
    u"\(;_:\)": "Sad or Crying",
    u"\(;O;\)": "Sad or Crying",
    u"\(:_;\)": "Sad or Crying",
    u"\(ToT\)": "Sad or Crying",
    u";_;": "Sad or Crying",
    u";-;": "Sad or Crying",
    u";n;": "Sad or Crying",
    u";;": "Sad or Crying",
    u"Q.Q": "Sad or Crying",
    u"T.T": "Sad or Crying",
    u"QQ": "Sad or Crying",
    u"Q_Q": "Sad or Crying",
    u"\(-.-\)": "Shame",
    u"\(-_-\)": "Shame",
    u"\(一一\)": "Shame",
    u"\(；一_一\)": "Shame",
    u"\(=_=\)": "Tired",
    u"\(=\^·\^=\)": "cat",
    u"\(=\^··\^=\)": "cat",
    u"=_\^=	": "cat",
    u"\(..\)": "Looking down",
    u"\(._.\)": "Looking down",
    u"\^m\^": "Giggling with hand covering mouth",
    u"\(・・\?": "Confusion",
    u"\(\?_\?\)": "Confusion",
    u">\^_\^<": "Normal Laugh",
    u"<\^!\^>": "Normal Laugh",
    u"\^/\^": "Normal Laugh",
    u"（\*\^_\^\*）": "Normal Laugh",
    u"\(\^<\^\)": "Normal Laugh",
    u"\(\^\^\)": "Normal Laugh",
    u"\(\^.\^\)": "Normal Laugh",
    u"\(\^_\^.\)": "Normal Laugh",
    u"\(\^_\^\)": "Normal Laugh",
    u"\(\^J\^\)": "Normal Laugh",
    u"\(\*\^.\^\*\)": "Normal Laugh",
    u"\(\^—\^）": "Normal Laugh",
    u"\(#\^.\^#\)": "Normal Laugh",
    u"（\^—\^）": "Waving",
    u"\(;_;\)/~~~": "Waving",
    u"\(\^.\^\)/~~~": "Waving",
    u"\($··\)/~~~": "Waving",
    u"\(-_-\)/~~~": "Waving",
    u"\(T_T\)/~~~": "Waving",
    u"\(ToT\)/~~~": "Waving",
    u"\(\*\^0\^\*\)": "Excited",
    u"\(\*_\*\)": "Amazed",
    u"\(\*_\*;": "Amazed",
    u"\(+_+\) \(@_@\)": "Amazed",
    u"\(\*\^\^\)v": "Laughing, Cheerful",
    u"\(\^_\^\)v": "Laughing, Cheerful",
    u"\(\(d\[-_-\]b\)\)": "Headphones, Listening to music",
    u'\(-"-\)': "Worried",
    u"\(ーー;\)": "Worried",
    u"\(\^0_0\^\)": "Eyeglasses",
    u"\(＾ｖ＾\)": "Happy",
    u"\(＾ｕ＾\)": "Happy",
    u"\(\^\)o\(\^\)": "Happy",
    u"\(\^O\^\)": "Happy",
    u"\(\^o\^\)": "Happy",
    u"\)\^o\^\(": "Happy",
    u":O": "Surprised",
    u"o_O": "Surprised",
    u"Oo": "Surprised",
    u"o_0": "Surprised",
    u"o.O": "Surpised",
    u"\(o.o\)": "Surprised",
    u"oO": "Surprised",
    u"\(\*￣m￣\)": "Dissatisfied",
    u"\(‘A`\)": "Snubbed or Deflated",
    u"c====3": "Penis",
    u"c===3": "Penis",
    u"c==3": "Penis",
    u"c====8": "Penis",
    u"c===8": "Penis",
    u"c==8": "Penis",
    u"8====D": "Penis",
    u"8===D": "Penis",
    u"8==D": "Penis",
    u"<3": "Heart",
    u"</3": "Broken_heart",
}


def preprocess_emoticons(s: str) -> str:
    return 'TOKEN_EMOTICON_' + s.replace(',', '') \
        .replace(' ', '_') \
        .replace('-', '_') \
        .upper()


EMOTICONS = {k: preprocess_emoticons(v) for k, v in EMOTICONS.items()}
