import sys
def get_symb(i, string):
symbol = ''
if string[i].isupper():
symbol += string[i]
i += 1
if i < len(string) and string[i].islower():
symbol += string[i]
i += 1
return (i, symbol)
def get_mult(i, string):
mult = 0
while i < len(string) and string[i].isdigit():
mult = mult * 10 + int(string[i])
i += 1
return (i, 1) if not mult else (i, mult)
def parse(index, string):
counts = {}
def update_counts(dct, mult):
for s in dct:
if s in counts: counts[s] += dct[s] * mult
else: counts[s] = dct[s] * mult
while index < len(string):
if string[index] == ')':
return (index+1,counts)
elif string[index]=='(':
index,grp_cnts = parse(index+1, string)
index,grp_cnt = get_mult(index, string)
update_counts(grp_cnts, grp_cnt)
else:
index,symbol = get_symb(index, string)
index,count = get_mult(index, string)
update_counts({symbol:count}, 1)
return counts
if __name__ == '__main__':
for line in sys.stdin:
result = parse(0,line.strip())
for sym,mult in sorted(result.items()):
print('{}: {}'.format(sym, mult))
print()
aW1wb3J0IHN5cwoKZGVmIGdldF9zeW1iKGksIHN0cmluZyk6CiAgICBzeW1ib2wgPSAnJwogICAgaWYgc3RyaW5nW2ldLmlzdXBwZXIoKToKICAgICAgICBzeW1ib2wgKz0gc3RyaW5nW2ldCiAgICAgICAgaSArPSAxCiAgICAgICAgaWYgaSA8IGxlbihzdHJpbmcpIGFuZCBzdHJpbmdbaV0uaXNsb3dlcigpOgogICAgICAgICAgICBzeW1ib2wgKz0gc3RyaW5nW2ldCiAgICAgICAgICAgIGkgKz0gMQogICAgcmV0dXJuIChpLCBzeW1ib2wpCgpkZWYgZ2V0X211bHQoaSwgc3RyaW5nKToKICAgIG11bHQgPSAwCiAgICB3aGlsZSBpIDwgbGVuKHN0cmluZykgYW5kIHN0cmluZ1tpXS5pc2RpZ2l0KCk6CiAgICAgICAgbXVsdCA9IG11bHQgKiAxMCArIGludChzdHJpbmdbaV0pCiAgICAgICAgaSArPSAxCiAgICByZXR1cm4gKGksIDEpIGlmIG5vdCBtdWx0IGVsc2UgKGksIG11bHQpCgpkZWYgcGFyc2UoaW5kZXgsIHN0cmluZyk6CiAgICBjb3VudHMgPSB7fQogICAgZGVmIHVwZGF0ZV9jb3VudHMoZGN0LCBtdWx0KToKICAgICAgICBmb3IgcyBpbiBkY3Q6CiAgICAgICAgICAgIGlmIHMgaW4gY291bnRzOiBjb3VudHNbc10gKz0gZGN0W3NdICogbXVsdAogICAgICAgICAgICBlbHNlOiBjb3VudHNbc10gPSBkY3Rbc10gKiBtdWx0CiAgICAKICAgIHdoaWxlIGluZGV4IDwgbGVuKHN0cmluZyk6CiAgICAgICAgaWYgc3RyaW5nW2luZGV4XSA9PSAnKSc6CiAgICAgICAgICAgIHJldHVybiAoaW5kZXgrMSxjb3VudHMpCiAgICAgICAgZWxpZiBzdHJpbmdbaW5kZXhdPT0nKCc6CiAgICAgICAgICAgIGluZGV4LGdycF9jbnRzID0gcGFyc2UoaW5kZXgrMSwgc3RyaW5nKQogICAgICAgICAgICBpbmRleCxncnBfY250ID0gZ2V0X211bHQoaW5kZXgsIHN0cmluZykKICAgICAgICAgICAgdXBkYXRlX2NvdW50cyhncnBfY250cywgZ3JwX2NudCkgICAgICAgICAgICAKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmRleCxzeW1ib2wgPSBnZXRfc3ltYihpbmRleCwgc3RyaW5nKQogICAgICAgICAgICBpbmRleCxjb3VudCA9IGdldF9tdWx0KGluZGV4LCBzdHJpbmcpCiAgICAgICAgICAgIHVwZGF0ZV9jb3VudHMoe3N5bWJvbDpjb3VudH0sIDEpCiAgICByZXR1cm4gY291bnRzCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgZm9yIGxpbmUgaW4gc3lzLnN0ZGluOgogICAgICAgIHJlc3VsdCA9IHBhcnNlKDAsbGluZS5zdHJpcCgpKQogICAgICAgIGZvciBzeW0sbXVsdCBpbiBzb3J0ZWQocmVzdWx0Lml0ZW1zKCkpOgogICAgICAgICAgICBwcmludCgne306IHt9Jy5mb3JtYXQoc3ltLCBtdWx0KSkKICAgICAgICBwcmludCgp