// Path: src/main/java/com/tiemens/secretshare/exceptions/SecretShareException.java
// public class SecretShareException
//     extends RuntimeException
// {
//     // ==================================================
//     // class static data
//     // ==================================================
// 
//     private static final long serialVersionUID = 2193317873773384997L;
// 
//     // ==================================================
//     // class static methods
//     // ==================================================
// 
// 
// 
//     // ==================================================
//     // instance data
//     // ==================================================
// 
//     // ==================================================
//     // factories
//     // ==================================================
// 
//     // ==================================================
//     // constructors
//     // ==================================================
// 
// 
//     /** Constructs a new runtime exception with the specified detail message.
//      * The cause is not initialized, and may subsequently be initialized by a
//      * call to {@link #initCause}.
//      *
//      * @param   message   the detail message. The detail message is saved for
//      *          later retrieval by the {@link #getMessage()} method.
//      */
//     public SecretShareException(final String message)
//     {
//         super(message);
//     }
// 
//     /**
//      * Constructs a new runtime exception with the specified detail message and
//      * cause.  <p>Note that the detail message associated with
//      * <code>cause</code> is <i>not</i> automatically incorporated in
//      * this runtime exception's detail message.
//      *
//      * @param  message the detail message (which is saved for later retrieval
//      *         by the {@link #getMessage()} method).
//      * @param  cause the cause (which is saved for later retrieval by the
//      *         {@link #getCause()} method).  (A <code>null</code> value is
//      *         permitted, and indicates that the cause is nonexistent or
//      *         unknown.)
//      */
//     public SecretShareException(final String message,
//                                 final Throwable cause)
//     {
//         super(message, cause);
//     }
// 
//     // ==================================================
//     // public methods
//     // ==================================================
// 
//     // ==================================================
//     // non public methods
//     // ==================================================
// }
// 
// Path: src/main/java/com/tiemens/secretshare/md5sum/Md5Checksummer.java
// public interface Md5Checksummer
// {
//     /**
//      * @param in the byte array to compute a checksum
//      * @return the complete md5 checksum
//      */
//     public byte[] createMd5Checksum(final byte[] in);
// }
// 
// Path: src/main/java/com/tiemens/secretshare/md5sum/Md5ChecksummerFactory.java
// public final class Md5ChecksummerFactory
// {
// 
//     // ==================================================
//     // class static data
//     // ==================================================
// 
//     private static final String KEY = "ssmd5class";
// 
//     // ==================================================
//     // class static methods
//     // ==================================================
// 
//     // ==================================================
//     // instance data
//     // ==================================================
// 
//     // ==================================================
//     // factories
//     // ==================================================
//     public static Md5Checksummer create()
//     {
//         String cname = System.getProperty(KEY);
//         if (cname != null)
//         {
//             return createFromClassName(cname);
//         }
//         else
//         {
//             try
//             {
//                 return new Md5ChecksummerImpl();
//             }
//             catch (SecretShareException e)
//             {
//                 throw new SecretShareException("Failed to create built-in MD5 digest.  " +
//                                                "Use -D" + KEY + "=a.b.c.YourMd5Checksummer" +
//                                                " where your class must implement the interface " +
//                                                Md5Checksummer.class.getName(), e);
//             }
// 
//         }
//     }
// 
//     /**
//      * @param cname the name of the class that implements Md5Checksummer interface
//      * @return instance
//      * @throws SecretShareException on error
//      */
//     public static Md5Checksummer createFromClassName(String cname)
//     {
//         final String msg = "create md5, name='" + cname + "' ";
//         try
//         {
//             Class<?> c = Class.forName(cname);
//             if (Md5Checksummer.class.isAssignableFrom(c))
//             {
//                 return (Md5Checksummer) c.newInstance();
//             }
//             else
//             {
//                 throw new SecretShareException(msg + " does not implement interface " +
//                                                Md5Checksummer.class.getName());
//             }
//         }
//         catch (InstantiationException e)
//         {
//             throw new SecretShareException(msg + "instantiation", e);
//         }
//         catch (IllegalAccessException e)
//         {
//             throw new SecretShareException(msg + "access", e);
//         }
//         catch (ClassNotFoundException e)
//         {
//             throw new SecretShareException(msg + "class not found", e);
//         }
//     }
// 
//     // ==================================================
//     // constructors
//     // ==================================================
// 
//     private Md5ChecksummerFactory()
//     {
//         // no instances
//     }
// 
//     // ==================================================
//     // public methods
//     // ==================================================
// 
//     // ==================================================
//     // non public methods
//     // ==================================================
// }


import java.math.BigInteger;
import com.tiemens.secretshare.exceptions.SecretShareException;
import com.tiemens.secretshare.md5sum.Md5Checksummer;
import com.tiemens.secretshare.md5sum.Md5ChecksummerFactory;
        {
            returnIsNegative = true;
            input = input.substring(1);
        }
        while ((input.length() % lengthPerGroup) != 0)
        {
            input = "0" + input;
        }
        String sep = "";
        for (int i = 0, n = input.length() / lengthPerGroup; i < n; i++)
        {
            ret += sep;
            sep = "-";
            ret += input.substring((i + 0) * lengthPerGroup,
                                   (i + 1) * lengthPerGroup);
        }
        if (returnIsNegative)
        {
            ret = "-" + ret;
        }
        return ret;
    }


    private static boolean testonlyUseInternalMd5Impl = false;

    private static byte[] computeMd5ChecksumFull(String inAsHex2)
    {
       Md5Checksummer md5summer = null;

// Path: src/main/java/com/tiemens/secretshare/exceptions/SecretShareException.java
// public class SecretShareException
//     extends RuntimeException
// {
//     // ==================================================
//     // class static data
//     // ==================================================
// 
//     private static final long serialVersionUID = 2193317873773384997L;
// 
//     // ==================================================
//     // class static methods
//     // ==================================================
// 
// 
// 
//     // ==================================================
//     // instance data
//     // ==================================================
// 
//     // ==================================================
//     // factories
//     // ==================================================
// 
//     // ==================================================
//     // constructors
//     // ==================================================
// 
// 
//     /** Constructs a new runtime exception with the specified detail message.
//      * The cause is not initialized, and may subsequently be initialized by a
//      * call to {@link #initCause}.
//      *
//      * @param   message   the detail message. The detail message is saved for
//      *          later retrieval by the {@link #getMessage()} method.
//      */
//     public SecretShareException(final String message)
//     {
//         super(message);
//     }
// 
//     /**
//      * Constructs a new runtime exception with the specified detail message and
//      * cause.  <p>Note that the detail message associated with
//      * <code>cause</code> is <i>not</i> automatically incorporated in
//      * this runtime exception's detail message.
//      *
//      * @param  message the detail message (which is saved for later retrieval
//      *         by the {@link #getMessage()} method).
//      * @param  cause the cause (which is saved for later retrieval by the
//      *         {@link #getCause()} method).  (A <code>null</code> value is
//      *         permitted, and indicates that the cause is nonexistent or
//      *         unknown.)
//      */
//     public SecretShareException(final String message,
//                                 final Throwable cause)
//     {
//         super(message, cause);
//     }
// 
//     // ==================================================
//     // public methods
//     // ==================================================
// 
//     // ==================================================
//     // non public methods
//     // ==================================================
// }
// 
// Path: src/main/java/com/tiemens/secretshare/md5sum/Md5Checksummer.java
// public interface Md5Checksummer
// {
//     /**
//      * @param in the byte array to compute a checksum
//      * @return the complete md5 checksum
//      */
//     public byte[] createMd5Checksum(final byte[] in);
// }
// 
// Path: src/main/java/com/tiemens/secretshare/md5sum/Md5ChecksummerFactory.java
// public final class Md5ChecksummerFactory
// {
// 
//     // ==================================================
//     // class static data
//     // ==================================================
// 
//     private static final String KEY = "ssmd5class";
// 
//     // ==================================================
//     // class static methods
//     // ==================================================
// 
//     // ==================================================
//     // instance data
//     // ==================================================
// 
//     // ==================================================
//     // factories
//     // ==================================================
//     public static Md5Checksummer create()
//     {
//         String cname = System.getProperty(KEY);
//         if (cname != null)
//         {
//             return createFromClassName(cname);
//         }
//         else
//         {
//             try
//             {
//                 return new Md5ChecksummerImpl();
//             }
//             catch (SecretShareException e)
//             {
//                 throw new SecretShareException("Failed to create built-in MD5 digest.  " +
//                                                "Use -D" + KEY + "=a.b.c.YourMd5Checksummer" +
//                                                " where your class must implement the interface " +
//                                                Md5Checksummer.class.getName(), e);
//             }
// 
//         }
//     }
// 
//     /**
//      * @param cname the name of the class that implements Md5Checksummer interface
//      * @return instance
//      * @throws SecretShareException on error
//      */
//     public static Md5Checksummer createFromClassName(String cname)
//     {
//         final String msg = "create md5, name='" + cname + "' ";
//         try
//         {
//             Class<?> c = Class.forName(cname);
//             if (Md5Checksummer.class.isAssignableFrom(c))
//             {
//                 return (Md5Checksummer) c.newInstance();
//             }
//             else
//             {
//                 throw new SecretShareException(msg + " does not implement interface " +
//                                                Md5Checksummer.class.getName());
//             }
//         }
//         catch (InstantiationException e)
//         {
//             throw new SecretShareException(msg + "instantiation", e);
//         }
//         catch (IllegalAccessException e)
//         {
//             throw new SecretShareException(msg + "access", e);
//         }
//         catch (ClassNotFoundException e)
//         {
//             throw new SecretShareException(msg + "class not found", e);
//         }
//     }
// 
//     // ==================================================
//     // constructors
//     // ==================================================
// 
//     private Md5ChecksummerFactory()
//     {
//         // no instances
//     }
// 
//     // ==================================================
//     // public methods
//     // ==================================================
// 
//     // ==================================================
//     // non public methods
//     // ==================================================
// }


// Path: src/main/java/com/tiemens/secretshare/math/type/BigIntStringChecksum.java
import java.math.BigInteger;
import com.tiemens.secretshare.exceptions.SecretShareException;
import com.tiemens.secretshare.md5sum.Md5Checksummer;
import com.tiemens.secretshare.md5sum.Md5ChecksummerFactory;

        {
            returnIsNegative = true;
            input = input.substring(1);
        }
        while ((input.length() % lengthPerGroup) != 0)
        {
            input = "0" + input;
        }
        String sep = "";
        for (int i = 0, n = input.length() / lengthPerGroup; i < n; i++)
        {
            ret += sep;
            sep = "-";
            ret += input.substring((i + 0) * lengthPerGroup,
                                   (i + 1) * lengthPerGroup);
        }
        if (returnIsNegative)
        {
            ret = "-" + ret;
        }
        return ret;
    }


    private static boolean testonlyUseInternalMd5Impl = false;

    private static byte[] computeMd5ChecksumFull(String inAsHex2)
    {
       Md5Checksummer md5summer = null;

       md5summer = Md5ChecksummerFactory.create();