docs: private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset )
      {
          // Example: Dk==
          if( source[ srcOffset + 2] == EQUALS_SIGN )
          {
              // Two ways to do the same thing. Don't know which way I like best.
              //int outBuff =   ( ( DECODABET[ source[ srcOffset    ] ] << 24 ) >>>  6 )
              //              | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
              int outBuff =   ( ( DECODABET[ source[ srcOffset    ] ] & 0xFF ) << 18 )
                            | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 );
              
              destination[ destOffset ] = (byte)( outBuff >>> 16 );
              return 1;
          }
          
          // Example: DkL=
          else if( source[ srcOffset + 3 ] == EQUALS_SIGN )
          {
              // Two ways to do the same thing. Don't know which way I like best.
              //int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] << 24 ) >>>  6 )
              //              | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
              //              | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
              int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] & 0xFF ) << 18 )
                            | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
                            | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) <<  6 );
              
              destination[ destOffset     ] = (byte)( outBuff >>> 16 );
              destination[ destOffset + 1 ] = (byte)( outBuff >>>  8 );
              return 2;
          }
          
          // Example: DkLE
          else
          {
              try{
              // Two ways to do the same thing. Don't know which way I like best.
              //int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] << 24 ) >>>  6 )
              //              | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
              //              | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
              //              | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
              int outBuff =   ( ( DECODABET[ source[ srcOffset     ] ] & 0xFF ) << 18 )
                            | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
                            | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) <<  6)
                            | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF )      );
  
              
              destination[ destOffset     ] = (byte)( outBuff >> 16 );
              destination[ destOffset + 1 ] = (byte)( outBuff >>  8 );
              destination[ destOffset + 2 ] = (byte)( outBuff       );
  
              return 3;
              }catch( Exception e){
  				LoggerFactory.getDefaultLogger().error(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset     ] ]  ) );
  				LoggerFactory.getDefaultLogger().error(""+source[srcOffset+1]+  ": " + ( DECODABET[ source[ srcOffset + 1 ] ]  ) );
  				LoggerFactory.getDefaultLogger().error(""+source[srcOffset+2]+  ": " + ( DECODABET[ source[ srcOffset + 2 ] ]  ) );
  				LoggerFactory.getDefaultLogger().error(""+source[srcOffset+3]+  ": " + ( DECODABET[ source[ srcOffset + 3 ] ]  ) );
                  return -1;
              }   // end catch
          }
      }