public static bool ReadHexAndDownload(string fileName, ref ushort pk2num)
 {
     try
     {
         FileInfo   fileInfo   = new FileInfo(fileName);
         TextReader textReader = fileInfo.OpenText();
         byte[]     array      = new byte[35];
         string     text       = textReader.ReadLine();
         if (text != null)
         {
             PICkitFunctions.EnterBootloader();
             PICkitFunctions.ResetPk2Number();
             Thread.Sleep(3000);
             pk2num = 0;
             int i;
             for (i = 0; i < 10; i++)
             {
                 if (PICkitFunctions.DetectPICkit2Device(pk2num, readFW: true) == Constants.PICkit2USB.bootloader)
                 {
                     if (PICkitFunctions.VerifyBootloaderMode())
                     {
                         break;
                     }
                 }
                 else
                 {
                     pk2num++;
                 }
                 Thread.Sleep(500);
             }
             if (i == 10)
             {
                 textReader.Close();
                 return(false);
             }
         }
         PICkitFunctions.BL_EraseFlash();
         bool flag = false;
         while (text != null)
         {
             if (text[0] == ':' && text.Length >= 11)
             {
                 int num  = int.Parse(text.Substring(1, 2), NumberStyles.HexNumber);
                 int num2 = int.Parse(text.Substring(3, 4), NumberStyles.HexNumber);
                 int num3 = int.Parse(text.Substring(7, 2), NumberStyles.HexNumber);
                 if (flag && (num2 & 0x10) == 0)
                 {
                     PICkitFunctions.BL_WriteFlash(array);
                     for (int j = 0; j < array.Length; j++)
                     {
                         array[j] = byte.MaxValue;
                     }
                 }
                 flag = ((num2 & 0x10) == 16);
                 if (num3 == 0 && num2 >= 8192 && num2 < 32736)
                 {
                     if (!flag)
                     {
                         int num4 = num2 & 0xFFE0;
                         array[0] = (byte)(num4 & 0xFF);
                         array[1] = (byte)((num4 >> 8) & 0xFF);
                         array[2] = 0;
                     }
                     if (text.Length >= 11 + 2 * num)
                     {
                         int num5 = num2 & 0xF;
                         int num6 = num5 + num;
                         int num7 = 3;
                         if (flag)
                         {
                             num7 = 19;
                         }
                         for (int k = 0; k < 16; k++)
                         {
                             if (k >= num5 && k < num6)
                             {
                                 uint num8 = uint.Parse(text.Substring(9 + 2 * (k - num5), 2), NumberStyles.HexNumber);
                                 array[num7 + k] = (byte)(num8 & 0xFF);
                             }
                         }
                     }
                 }
                 if (num3 == 1)
                 {
                     break;
                 }
             }
             text = textReader.ReadLine();
         }
         PICkitFunctions.BL_WriteFlash(array);
         textReader.Close();
         return(true);
     }
     catch
     {
         return(false);
     }
 }