Ejemplo n.º 1
0
 internal int Process(InflateBlocks blocks, int r)
 {
     ZlibCodec z = blocks._codec;
     int num1 = z.NextIn;
     int num2 = z.AvailableBytesIn;
     int number = blocks.bitb;
     int num3 = blocks.bitk;
     int num4 = blocks.write;
     int num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
     while (true)
     {
         switch (this.mode)
         {
             case 0:
                 if (num5 >= 258 && num2 >= 10)
                 {
                     blocks.bitb = number;
                     blocks.bitk = num3;
                     z.AvailableBytesIn = num2;
                     z.TotalBytesIn += (long)(num1 - z.NextIn);
                     z.NextIn = num1;
                     blocks.write = num4;
                     r = this.InflateFast((int)this.lbits, (int)this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z);
                     num1 = z.NextIn;
                     num2 = z.AvailableBytesIn;
                     number = blocks.bitb;
                     num3 = blocks.bitk;
                     num4 = blocks.write;
                     num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                     if (r != 0)
                     {
                         this.mode = r == 1 ? 7 : 9;
                         break;
                     }
                 }
                 this.need = (int)this.lbits;
                 this.tree = this.ltree;
                 this.tree_index = this.ltree_index;
                 this.mode = 1;
                 goto case 1;
             case 1:
                 int index1 = this.need;
                 while (num3 < index1)
                 {
                     if (num2 != 0)
                     {
                         r = 0;
                         --num2;
                         number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                         num3 += 8;
                     }
                     else
                     {
                         blocks.bitb = number;
                         blocks.bitk = num3;
                         z.AvailableBytesIn = num2;
                         z.TotalBytesIn += (long)(num1 - z.NextIn);
                         z.NextIn = num1;
                         blocks.write = num4;
                         return blocks.Flush(r);
                     }
                 }
                 int index2 = (this.tree_index + (number & InflateCodes.inflate_mask[index1])) * 3;
                 number = SharedUtils.URShift(number, this.tree[index2 + 1]);
                 num3 -= this.tree[index2 + 1];
                 int num6 = this.tree[index2];
                 if (num6 == 0)
                 {
                     this.lit = this.tree[index2 + 2];
                     this.mode = 6;
                     break;
                 }
                 else if ((num6 & 16) != 0)
                 {
                     this.get_Renamed = num6 & 15;
                     this.len = this.tree[index2 + 2];
                     this.mode = 2;
                     break;
                 }
                 else if ((num6 & 64) == 0)
                 {
                     this.need = num6;
                     this.tree_index = index2 / 3 + this.tree[index2 + 2];
                     break;
                 }
                 else if ((num6 & 32) != 0)
                 {
                     this.mode = 7;
                     break;
                 }
                 else
                     goto label_18;
             case 2:
                 int index3 = this.get_Renamed;
                 while (num3 < index3)
                 {
                     if (num2 != 0)
                     {
                         r = 0;
                         --num2;
                         number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                         num3 += 8;
                     }
                     else
                     {
                         blocks.bitb = number;
                         blocks.bitk = num3;
                         z.AvailableBytesIn = num2;
                         z.TotalBytesIn += (long)(num1 - z.NextIn);
                         z.NextIn = num1;
                         blocks.write = num4;
                         return blocks.Flush(r);
                     }
                 }
                 this.len += number & InflateCodes.inflate_mask[index3];
                 number >>= index3;
                 num3 -= index3;
                 this.need = (int)this.dbits;
                 this.tree = this.dtree;
                 this.tree_index = this.dtree_index;
                 this.mode = 3;
                 goto case 3;
             case 3:
                 int index4 = this.need;
                 while (num3 < index4)
                 {
                     if (num2 != 0)
                     {
                         r = 0;
                         --num2;
                         number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                         num3 += 8;
                     }
                     else
                     {
                         blocks.bitb = number;
                         blocks.bitk = num3;
                         z.AvailableBytesIn = num2;
                         z.TotalBytesIn += (long)(num1 - z.NextIn);
                         z.NextIn = num1;
                         blocks.write = num4;
                         return blocks.Flush(r);
                     }
                 }
                 int index5 = (this.tree_index + (number & InflateCodes.inflate_mask[index4])) * 3;
                 number >>= this.tree[index5 + 1];
                 num3 -= this.tree[index5 + 1];
                 int num7 = this.tree[index5];
                 if ((num7 & 16) != 0)
                 {
                     this.get_Renamed = num7 & 15;
                     this.dist = this.tree[index5 + 2];
                     this.mode = 4;
                     break;
                 }
                 else if ((num7 & 64) == 0)
                 {
                     this.need = num7;
                     this.tree_index = index5 / 3 + this.tree[index5 + 2];
                     break;
                 }
                 else
                     goto label_34;
             case 4:
                 int index6 = this.get_Renamed;
                 while (num3 < index6)
                 {
                     if (num2 != 0)
                     {
                         r = 0;
                         --num2;
                         number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                         num3 += 8;
                     }
                     else
                     {
                         blocks.bitb = number;
                         blocks.bitk = num3;
                         z.AvailableBytesIn = num2;
                         z.TotalBytesIn += (long)(num1 - z.NextIn);
                         z.NextIn = num1;
                         blocks.write = num4;
                         return blocks.Flush(r);
                     }
                 }
                 this.dist += number & InflateCodes.inflate_mask[index6];
                 number >>= index6;
                 num3 -= index6;
                 this.mode = 5;
                 goto case 5;
             case 5:
                 int num8 = num4 - this.dist;
                 while (num8 < 0)
                     num8 += blocks.end;
                 for (; this.len != 0; --this.len)
                 {
                     if (num5 == 0)
                     {
                         if (num4 == blocks.end && blocks.read != 0)
                         {
                             num4 = 0;
                             num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                         }
                         if (num5 == 0)
                         {
                             blocks.write = num4;
                             r = blocks.Flush(r);
                             num4 = blocks.write;
                             num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                             if (num4 == blocks.end && blocks.read != 0)
                             {
                                 num4 = 0;
                                 num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                             }
                             if (num5 == 0)
                             {
                                 blocks.bitb = number;
                                 blocks.bitk = num3;
                                 z.AvailableBytesIn = num2;
                                 z.TotalBytesIn += (long)(num1 - z.NextIn);
                                 z.NextIn = num1;
                                 blocks.write = num4;
                                 return blocks.Flush(r);
                             }
                         }
                     }
                     blocks.window[num4++] = blocks.window[num8++];
                     --num5;
                     if (num8 == blocks.end)
                         num8 = 0;
                 }
                 this.mode = 0;
                 break;
             case 6:
                 if (num5 == 0)
                 {
                     if (num4 == blocks.end && blocks.read != 0)
                     {
                         num4 = 0;
                         num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                     }
                     if (num5 == 0)
                     {
                         blocks.write = num4;
                         r = blocks.Flush(r);
                         num4 = blocks.write;
                         num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                         if (num4 == blocks.end && blocks.read != 0)
                         {
                             num4 = 0;
                             num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                         }
                         if (num5 == 0)
                             goto label_65;
                     }
                 }
                 r = 0;
                 blocks.window[num4++] = (byte)this.lit;
                 --num5;
                 this.mode = 0;
                 break;
             case 7:
                 goto label_68;
             case 8:
                 goto label_73;
             case 9:
                 goto label_74;
             default:
                 goto label_75;
         }
     }
     label_18:
     this.mode = 9;
     z.Message = "invalid literal/length code";
     r = -3;
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
     label_34:
     this.mode = 9;
     z.Message = "invalid distance code";
     r = -3;
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
     label_65:
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
     label_68:
     if (num3 > 7)
     {
         num3 -= 8;
         ++num2;
         --num1;
     }
     blocks.write = num4;
     r = blocks.Flush(r);
     num4 = blocks.write;
     int num9 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
     if (blocks.read != blocks.write)
     {
         blocks.bitb = number;
         blocks.bitk = num3;
         z.AvailableBytesIn = num2;
         z.TotalBytesIn += (long)(num1 - z.NextIn);
         z.NextIn = num1;
         blocks.write = num4;
         return blocks.Flush(r);
     }
     else
         this.mode = 8;
     label_73:
     r = 1;
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
     label_74:
     r = -3;
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
     label_75:
     r = -2;
     blocks.bitb = number;
     blocks.bitk = num3;
     z.AvailableBytesIn = num2;
     z.TotalBytesIn += (long)(num1 - z.NextIn);
     z.NextIn = num1;
     blocks.write = num4;
     return blocks.Flush(r);
 }
Ejemplo n.º 2
0
        internal int Process(InflateBlocks blocks, int r)
        {
            ZlibCodec z      = blocks._codec;
            int       num1   = z.NextIn;
            int       num2   = z.AvailableBytesIn;
            int       number = blocks.bitb;
            int       num3   = blocks.bitk;
            int       num4   = blocks.write;
            int       num5   = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;

            while (true)
            {
                switch (this.mode)
                {
                case 0:
                    if (num5 >= 258 && num2 >= 10)
                    {
                        blocks.bitb        = number;
                        blocks.bitk        = num3;
                        z.AvailableBytesIn = num2;
                        z.TotalBytesIn    += (long)(num1 - z.NextIn);
                        z.NextIn           = num1;
                        blocks.write       = num4;
                        r      = this.InflateFast((int)this.lbits, (int)this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z);
                        num1   = z.NextIn;
                        num2   = z.AvailableBytesIn;
                        number = blocks.bitb;
                        num3   = blocks.bitk;
                        num4   = blocks.write;
                        num5   = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                        if (r != 0)
                        {
                            this.mode = r == 1 ? 7 : 9;
                            break;
                        }
                    }
                    this.need       = (int)this.lbits;
                    this.tree       = this.ltree;
                    this.tree_index = this.ltree_index;
                    this.mode       = 1;
                    goto case 1;

                case 1:
                    int index1 = this.need;
                    while (num3 < index1)
                    {
                        if (num2 != 0)
                        {
                            r = 0;
                            --num2;
                            number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                            num3   += 8;
                        }
                        else
                        {
                            blocks.bitb        = number;
                            blocks.bitk        = num3;
                            z.AvailableBytesIn = num2;
                            z.TotalBytesIn    += (long)(num1 - z.NextIn);
                            z.NextIn           = num1;
                            blocks.write       = num4;
                            return(blocks.Flush(r));
                        }
                    }
                    int index2 = (this.tree_index + (number & InflateCodes.inflate_mask[index1])) * 3;
                    number = SharedUtils.URShift(number, this.tree[index2 + 1]);
                    num3  -= this.tree[index2 + 1];
                    int num6 = this.tree[index2];
                    if (num6 == 0)
                    {
                        this.lit  = this.tree[index2 + 2];
                        this.mode = 6;
                        break;
                    }
                    else if ((num6 & 16) != 0)
                    {
                        this.get_Renamed = num6 & 15;
                        this.len         = this.tree[index2 + 2];
                        this.mode        = 2;
                        break;
                    }
                    else if ((num6 & 64) == 0)
                    {
                        this.need       = num6;
                        this.tree_index = index2 / 3 + this.tree[index2 + 2];
                        break;
                    }
                    else if ((num6 & 32) != 0)
                    {
                        this.mode = 7;
                        break;
                    }
                    else
                    {
                        goto label_18;
                    }

                case 2:
                    int index3 = this.get_Renamed;
                    while (num3 < index3)
                    {
                        if (num2 != 0)
                        {
                            r = 0;
                            --num2;
                            number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                            num3   += 8;
                        }
                        else
                        {
                            blocks.bitb        = number;
                            blocks.bitk        = num3;
                            z.AvailableBytesIn = num2;
                            z.TotalBytesIn    += (long)(num1 - z.NextIn);
                            z.NextIn           = num1;
                            blocks.write       = num4;
                            return(blocks.Flush(r));
                        }
                    }
                    this.len       += number & InflateCodes.inflate_mask[index3];
                    number        >>= index3;
                    num3           -= index3;
                    this.need       = (int)this.dbits;
                    this.tree       = this.dtree;
                    this.tree_index = this.dtree_index;
                    this.mode       = 3;
                    goto case 3;

                case 3:
                    int index4 = this.need;
                    while (num3 < index4)
                    {
                        if (num2 != 0)
                        {
                            r = 0;
                            --num2;
                            number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                            num3   += 8;
                        }
                        else
                        {
                            blocks.bitb        = number;
                            blocks.bitk        = num3;
                            z.AvailableBytesIn = num2;
                            z.TotalBytesIn    += (long)(num1 - z.NextIn);
                            z.NextIn           = num1;
                            blocks.write       = num4;
                            return(blocks.Flush(r));
                        }
                    }
                    int index5 = (this.tree_index + (number & InflateCodes.inflate_mask[index4])) * 3;
                    number >>= this.tree[index5 + 1];
                    num3    -= this.tree[index5 + 1];
                    int num7 = this.tree[index5];
                    if ((num7 & 16) != 0)
                    {
                        this.get_Renamed = num7 & 15;
                        this.dist        = this.tree[index5 + 2];
                        this.mode        = 4;
                        break;
                    }
                    else if ((num7 & 64) == 0)
                    {
                        this.need       = num7;
                        this.tree_index = index5 / 3 + this.tree[index5 + 2];
                        break;
                    }
                    else
                    {
                        goto label_34;
                    }

                case 4:
                    int index6 = this.get_Renamed;
                    while (num3 < index6)
                    {
                        if (num2 != 0)
                        {
                            r = 0;
                            --num2;
                            number |= ((int)z.InputBuffer[num1++] & (int)byte.MaxValue) << num3;
                            num3   += 8;
                        }
                        else
                        {
                            blocks.bitb        = number;
                            blocks.bitk        = num3;
                            z.AvailableBytesIn = num2;
                            z.TotalBytesIn    += (long)(num1 - z.NextIn);
                            z.NextIn           = num1;
                            blocks.write       = num4;
                            return(blocks.Flush(r));
                        }
                    }
                    this.dist += number & InflateCodes.inflate_mask[index6];
                    number   >>= index6;
                    num3      -= index6;
                    this.mode  = 5;
                    goto case 5;

                case 5:
                    int num8 = num4 - this.dist;
                    while (num8 < 0)
                    {
                        num8 += blocks.end;
                    }
                    for (; this.len != 0; --this.len)
                    {
                        if (num5 == 0)
                        {
                            if (num4 == blocks.end && blocks.read != 0)
                            {
                                num4 = 0;
                                num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                            }
                            if (num5 == 0)
                            {
                                blocks.write = num4;
                                r            = blocks.Flush(r);
                                num4         = blocks.write;
                                num5         = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                                if (num4 == blocks.end && blocks.read != 0)
                                {
                                    num4 = 0;
                                    num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                                }
                                if (num5 == 0)
                                {
                                    blocks.bitb        = number;
                                    blocks.bitk        = num3;
                                    z.AvailableBytesIn = num2;
                                    z.TotalBytesIn    += (long)(num1 - z.NextIn);
                                    z.NextIn           = num1;
                                    blocks.write       = num4;
                                    return(blocks.Flush(r));
                                }
                            }
                        }
                        blocks.window[num4++] = blocks.window[num8++];
                        --num5;
                        if (num8 == blocks.end)
                        {
                            num8 = 0;
                        }
                    }
                    this.mode = 0;
                    break;

                case 6:
                    if (num5 == 0)
                    {
                        if (num4 == blocks.end && blocks.read != 0)
                        {
                            num4 = 0;
                            num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                        }
                        if (num5 == 0)
                        {
                            blocks.write = num4;
                            r            = blocks.Flush(r);
                            num4         = blocks.write;
                            num5         = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                            if (num4 == blocks.end && blocks.read != 0)
                            {
                                num4 = 0;
                                num5 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;
                            }
                            if (num5 == 0)
                            {
                                goto label_65;
                            }
                        }
                    }
                    r = 0;
                    blocks.window[num4++] = (byte)this.lit;
                    --num5;
                    this.mode = 0;
                    break;

                case 7:
                    goto label_68;

                case 8:
                    goto label_73;

                case 9:
                    goto label_74;

                default:
                    goto label_75;
                }
            }
label_18:
            this.mode          = 9;
            z.Message          = "invalid literal/length code";
            r                  = -3;
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));

label_34:
            this.mode          = 9;
            z.Message          = "invalid distance code";
            r                  = -3;
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));

label_65:
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));

label_68:
            if (num3 > 7)
            {
                num3 -= 8;
                ++num2;
                --num1;
            }
            blocks.write = num4;
            r            = blocks.Flush(r);
            num4         = blocks.write;
            int num9 = num4 < blocks.read ? blocks.read - num4 - 1 : blocks.end - num4;

            if (blocks.read != blocks.write)
            {
                blocks.bitb        = number;
                blocks.bitk        = num3;
                z.AvailableBytesIn = num2;
                z.TotalBytesIn    += (long)(num1 - z.NextIn);
                z.NextIn           = num1;
                blocks.write       = num4;
                return(blocks.Flush(r));
            }
            else
            {
                this.mode = 8;
            }
label_73:
            r                  = 1;
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));

label_74:
            r                  = -3;
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));

label_75:
            r                  = -2;
            blocks.bitb        = number;
            blocks.bitk        = num3;
            z.AvailableBytesIn = num2;
            z.TotalBytesIn    += (long)(num1 - z.NextIn);
            z.NextIn           = num1;
            blocks.write       = num4;
            return(blocks.Flush(r));
        }
Ejemplo n.º 3
0
        internal int Process(InflateBlocks blocks, int r)
        {
            int       num7;
            int       num11;
            int       num15;
            ZlibCodec z                = blocks._codec;
            int       nextIn           = z.NextIn;
            int       availableBytesIn = z.AvailableBytesIn;
            int       bitb             = blocks.bitb;
            int       bitk             = blocks.bitk;
            int       write            = blocks.write;
            int       num6             = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);

Label_004E:
            switch (this.mode)
            {
            case 0:
                if ((num6 < 0x102) || (availableBytesIn < 10))
                {
                    break;
                }
                blocks.bitb        = bitb;
                blocks.bitk        = bitk;
                z.AvailableBytesIn = availableBytesIn;
                z.TotalBytesIn    += nextIn - z.NextIn;
                z.NextIn           = nextIn;
                blocks.write       = write;
                r                = this.InflateFast(this.lbits, this.dbits, this.ltree, this.ltree_index, this.dtree, this.dtree_index, blocks, z);
                nextIn           = z.NextIn;
                availableBytesIn = z.AvailableBytesIn;
                bitb             = blocks.bitb;
                bitk             = blocks.bitk;
                write            = blocks.write;
                num6             = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                if (r == 0)
                {
                    break;
                }
                this.mode = (r == 1) ? 7 : 9;
                goto Label_004E;

            case 1:
                goto Label_0190;

            case 2:
            {
                int num10 = this.get_Renamed;
                while (bitk < num10)
                {
                    if (availableBytesIn != 0)
                    {
                        r = 0;
                        availableBytesIn--;
                        bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk;
                        bitk += 8;
                    }
                    else
                    {
                        blocks.bitb        = bitb;
                        blocks.bitk        = bitk;
                        z.AvailableBytesIn = availableBytesIn;
                        z.TotalBytesIn    += nextIn - z.NextIn;
                        z.NextIn           = nextIn;
                        blocks.write       = write;
                        return(blocks.Flush(r));
                    }
                }
                this.len       += bitb & inflate_mask[num10];
                bitb            = bitb >> num10;
                bitk           -= num10;
                this.need       = this.dbits;
                this.tree       = this.dtree;
                this.tree_index = this.dtree_index;
                this.mode       = 3;
                goto Label_03B3;
            }

            case 3:
                goto Label_03B3;

            case 4:
            {
                int num14 = this.get_Renamed;
                while (bitk < num14)
                {
                    if (availableBytesIn != 0)
                    {
                        r = 0;
                        availableBytesIn--;
                        bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk;
                        bitk += 8;
                    }
                    else
                    {
                        blocks.bitb        = bitb;
                        blocks.bitk        = bitk;
                        z.AvailableBytesIn = availableBytesIn;
                        z.TotalBytesIn    += nextIn - z.NextIn;
                        z.NextIn           = nextIn;
                        blocks.write       = write;
                        return(blocks.Flush(r));
                    }
                }
                this.dist += bitb & inflate_mask[num14];
                bitb       = bitb >> num14;
                bitk      -= num14;
                this.mode  = 5;
                goto Label_057D;
            }

            case 5:
                goto Label_057D;

            case 6:
                if (num6 == 0)
                {
                    if ((write == blocks.end) && (blocks.read != 0))
                    {
                        write = 0;
                        num6  = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                    }
                    if (num6 == 0)
                    {
                        blocks.write = write;
                        r            = blocks.Flush(r);
                        write        = blocks.write;
                        num6         = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                        if ((write == blocks.end) && (blocks.read != 0))
                        {
                            write = 0;
                            num6  = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                        }
                        if (num6 == 0)
                        {
                            blocks.bitb        = bitb;
                            blocks.bitk        = bitk;
                            z.AvailableBytesIn = availableBytesIn;
                            z.TotalBytesIn    += nextIn - z.NextIn;
                            z.NextIn           = nextIn;
                            blocks.write       = write;
                            return(blocks.Flush(r));
                        }
                    }
                }
                r = 0;
                blocks.window[write++] = (byte)this.lit;
                num6--;
                this.mode = 0;
                goto Label_004E;

            case 7:
                if (bitk > 7)
                {
                    bitk -= 8;
                    availableBytesIn++;
                    nextIn--;
                }
                blocks.write = write;
                r            = blocks.Flush(r);
                write        = blocks.write;
                if (write >= blocks.read)
                {
                    int end = blocks.end;
                }
                else
                {
                    int read = blocks.read;
                }
                if (blocks.read != blocks.write)
                {
                    blocks.bitb        = bitb;
                    blocks.bitk        = bitk;
                    z.AvailableBytesIn = availableBytesIn;
                    z.TotalBytesIn    += nextIn - z.NextIn;
                    z.NextIn           = nextIn;
                    blocks.write       = write;
                    return(blocks.Flush(r));
                }
                this.mode = 8;
                goto Label_096B;

            case 8:
                goto Label_096B;

            case 9:
                r                  = -3;
                blocks.bitb        = bitb;
                blocks.bitk        = bitk;
                z.AvailableBytesIn = availableBytesIn;
                z.TotalBytesIn    += nextIn - z.NextIn;
                z.NextIn           = nextIn;
                blocks.write       = write;
                return(blocks.Flush(r));

            default:
                r                  = -2;
                blocks.bitb        = bitb;
                blocks.bitk        = bitk;
                z.AvailableBytesIn = availableBytesIn;
                z.TotalBytesIn    += nextIn - z.NextIn;
                z.NextIn           = nextIn;
                blocks.write       = write;
                return(blocks.Flush(r));
            }
            this.need       = this.lbits;
            this.tree       = this.ltree;
            this.tree_index = this.ltree_index;
            this.mode       = 1;
Label_0190:
            num7 = this.need;
            while (bitk < num7)
            {
                if (availableBytesIn != 0)
                {
                    r = 0;
                    availableBytesIn--;
                    bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk;
                    bitk += 8;
                }
                else
                {
                    blocks.bitb        = bitb;
                    blocks.bitk        = bitk;
                    z.AvailableBytesIn = availableBytesIn;
                    z.TotalBytesIn    += nextIn - z.NextIn;
                    z.NextIn           = nextIn;
                    blocks.write       = write;
                    return(blocks.Flush(r));
                }
            }
            int index = (this.tree_index + (bitb & inflate_mask[num7])) * 3;

            bitb  = SharedUtils.URShift(bitb, this.tree[index + 1]);
            bitk -= this.tree[index + 1];
            int num9 = this.tree[index];

            if (num9 == 0)
            {
                this.lit  = this.tree[index + 2];
                this.mode = 6;
            }
            else if ((num9 & 0x10) != 0)
            {
                this.get_Renamed = num9 & 15;
                this.len         = this.tree[index + 2];
                this.mode        = 2;
            }
            else if ((num9 & 0x40) == 0)
            {
                this.need       = num9;
                this.tree_index = (index / 3) + this.tree[index + 2];
            }
            else
            {
                if ((num9 & 0x20) == 0)
                {
                    this.mode          = 9;
                    z.Message          = "invalid literal/length code";
                    r                  = -3;
                    blocks.bitb        = bitb;
                    blocks.bitk        = bitk;
                    z.AvailableBytesIn = availableBytesIn;
                    z.TotalBytesIn    += nextIn - z.NextIn;
                    z.NextIn           = nextIn;
                    blocks.write       = write;
                    return(blocks.Flush(r));
                }
                this.mode = 7;
            }
            goto Label_004E;
Label_03B3:
            num11 = this.need;
            while (bitk < num11)
            {
                if (availableBytesIn != 0)
                {
                    r = 0;
                    availableBytesIn--;
                    bitb |= (z.InputBuffer[nextIn++] & 0xff) << bitk;
                    bitk += 8;
                }
                else
                {
                    blocks.bitb        = bitb;
                    blocks.bitk        = bitk;
                    z.AvailableBytesIn = availableBytesIn;
                    z.TotalBytesIn    += nextIn - z.NextIn;
                    z.NextIn           = nextIn;
                    blocks.write       = write;
                    return(blocks.Flush(r));
                }
            }
            int num12 = (this.tree_index + (bitb & inflate_mask[num11])) * 3;

            bitb  = bitb >> this.tree[num12 + 1];
            bitk -= this.tree[num12 + 1];
            int num13 = this.tree[num12];

            if ((num13 & 0x10) != 0)
            {
                this.get_Renamed = num13 & 15;
                this.dist        = this.tree[num12 + 2];
                this.mode        = 4;
            }
            else
            {
                if ((num13 & 0x40) != 0)
                {
                    this.mode          = 9;
                    z.Message          = "invalid distance code";
                    r                  = -3;
                    blocks.bitb        = bitb;
                    blocks.bitk        = bitk;
                    z.AvailableBytesIn = availableBytesIn;
                    z.TotalBytesIn    += nextIn - z.NextIn;
                    z.NextIn           = nextIn;
                    blocks.write       = write;
                    return(blocks.Flush(r));
                }
                this.need       = num13;
                this.tree_index = (num12 / 3) + this.tree[num12 + 2];
            }
            goto Label_004E;
Label_057D:
            num15 = write - this.dist;
            while (num15 < 0)
            {
                num15 += blocks.end;
            }
            while (this.len != 0)
            {
                if (num6 == 0)
                {
                    if ((write == blocks.end) && (blocks.read != 0))
                    {
                        write = 0;
                        num6  = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                    }
                    if (num6 == 0)
                    {
                        blocks.write = write;
                        r            = blocks.Flush(r);
                        write        = blocks.write;
                        num6         = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                        if ((write == blocks.end) && (blocks.read != 0))
                        {
                            write = 0;
                            num6  = (write < blocks.read) ? ((blocks.read - write) - 1) : (blocks.end - write);
                        }
                        if (num6 == 0)
                        {
                            blocks.bitb        = bitb;
                            blocks.bitk        = bitk;
                            z.AvailableBytesIn = availableBytesIn;
                            z.TotalBytesIn    += nextIn - z.NextIn;
                            z.NextIn           = nextIn;
                            blocks.write       = write;
                            return(blocks.Flush(r));
                        }
                    }
                }
                blocks.window[write++] = blocks.window[num15++];
                num6--;
                if (num15 == blocks.end)
                {
                    num15 = 0;
                }
                this.len--;
            }
            this.mode = 0;
            goto Label_004E;
Label_096B:
            r                  = 1;
            blocks.bitb        = bitb;
            blocks.bitk        = bitk;
            z.AvailableBytesIn = availableBytesIn;
            z.TotalBytesIn    += nextIn - z.NextIn;
            z.NextIn           = nextIn;
            blocks.write       = write;
            return(blocks.Flush(r));
        }