#!/bin/bash
awk -v from="foo" -v to="bar" '
BEGIN {
if (length(from)!=length(to)) {
print "length mismatch" >"/dev/stderr"
exit(42)
}
n = length(from)
for(i=1; i<=n; i++) {
f[i] = tolower(substr(from, i, 1))
g[i] = toupper(substr(from,i, 1))
t[i] = tolower(substr(to, i, 1))
u[i] = toupper(substr(to, i, 1))
}
for(i=0; i<2**n; ++i) {
a = b = ""
q = i
k = 2**(n-1)
for(j = 1; j<=n; j++) {
c = (q > 0) && (q - k >= 0)
a = a (c ? f[j] : g[j])
b = b (c ? t[j] : u[j])
if (c) q -= k
k = int(k/2)
}
s[a] = b
}
}
{ for(r in s) gsub(r, s[r]) } 1'
IyEvYmluL2Jhc2gKCmF3ayAtdiBmcm9tPSJmb28iIC12IHRvPSJiYXIiICcKICAgIEJFR0lOIHsKICAgICAgICBpZiAobGVuZ3RoKGZyb20pIT1sZW5ndGgodG8pKSB7CiAgICAgICAgICAgIHByaW50ICJsZW5ndGggbWlzbWF0Y2giID4iL2Rldi9zdGRlcnIiCiAgICAgICAgICAgIGV4aXQoNDIpCiAgICAgICAgfQogICAgICAgIG4gPSBsZW5ndGgoZnJvbSkKICAgICAgICBmb3IoaT0xOyBpPD1uOyBpKyspIHsKICAgICAgICAgICAgZltpXSA9IHRvbG93ZXIoc3Vic3RyKGZyb20sIGksIDEpKQogICAgICAgICAgICBnW2ldID0gdG91cHBlcihzdWJzdHIoZnJvbSxpLCAxKSkKICAgICAgICAgICAgdFtpXSA9IHRvbG93ZXIoc3Vic3RyKHRvLCBpLCAxKSkKICAgICAgICAgICAgdVtpXSA9IHRvdXBwZXIoc3Vic3RyKHRvLCBpLCAxKSkKICAgICAgICB9CiAgICAgICAgZm9yKGk9MDsgaTwyKipuOyArK2kpIHsKICAgICAgICAgICAgYSA9IGIgPSAiIgogICAgICAgICAgICBxID0gaQogICAgICAgICAgICBrID0gMioqKG4tMSkKICAgICAgICAgICAgZm9yKGogPSAxOyBqPD1uOyAgaisrKSB7CiAgICAgICAgICAgICAgICBjID0gKHEgPiAwKSAmJiAocSAtIGsgPj0gMCkKICAgICAgICAgICAgICAgIGEgPSBhIChjID8gZltqXSA6IGdbal0pCiAgICAgICAgICAgICAgICBiID0gYiAoYyA/IHRbal0gOiB1W2pdKQogICAgICAgICAgICAgICAgaWYgKGMpIHEgLT0gawogICAgICAgICAgICAgICAgayA9IGludChrLzIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc1thXSA9IGIKICAgICAgICB9CiAgICB9CiAgICB7IGZvcihyIGluIHMpIGdzdWIociwgc1tyXSkgfSAxJw==