code: function Decoder() {
      var skip = 0 // how many bits we have from the previous character
      var byte = 0 // current byte we're producing
  
      this.output = ''
  
      // Consume a character from the stream, store
      // the output in this.output. As before, better
      // to use update().
      this.readChar = function(char) {
          if (typeof char != 'string'){
              if (typeof char == 'number') {
                  char = String.fromCharCode(char)
              }
          }
          char = char.toLowerCase()
          var val = lookup()[char]
          if (typeof val == 'undefined') {
              // character does not exist in our lookup table
              return // skip silently. An alternative would be:
              // throw Error('Could not find character "' + char + '" in lookup table.')
          }
          val <<= 3 // move to the high bits
          byte |= val >>> skip
          skip += 5
          if (skip >= 8) {
              // we have enough to preduce output
              this.output += String.fromCharCode(byte)
              skip -= 8
              if (skip > 0) byte = (val << (5 - skip)) & 255
              else byte = 0
          }
  
      }
  
      this.finish = function(check) {
          var output = this.output + (skip < 0 ? alphabet[bits >> 3] : '') + (check ? '$' : '')
          this.output = ''
          return output
      }
  }
docs: Functions analogously to Encoder