private void InitializeBodyTag()
		{
			if (this.bodyTagInfo != null)
			{
				return;
			}
			int num = 0;
			uint num2 = 0U;
			int num3 = 0;
			int startWordIndex = base.StartWordIndex;
			int endWordIndex = base.EndWordIndex;
			for (int i = startWordIndex; i < endWordIndex; i++)
			{
				uint num4;
				if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[i], out num4))
				{
					int num5 = num % 32;
					if (num5 == 0)
					{
						num2 ^= num4;
					}
					else
					{
						num2 ^= (num4 << num5) + (num4 >> 32 - num5);
					}
					num++;
				}
			}
			if (base.StartLineIndex < base.EndLineIndex)
			{
				num3 = BodyFragmentInfo.GetFormatCrc(base.BodyScanner.FormatStore, base.BodyScanner.Lines[base.StartLineIndex].Node);
				if (base.BodyScanner.Words.Count > 0 && startWordIndex < base.BodyScanner.Words.Count)
				{
					num3 ^= BodyFragmentInfo.GetInlineObjectCount(base.BodyScanner.FormatStore.GetTextRun(base.BodyScanner.Lines[base.StartLineIndex].TextPosition), (base.EndLineIndex == base.BodyScanner.Lines.Count) ? null : new TextRun?(base.BodyScanner.FormatStore.GetTextRun(base.BodyScanner.Lines[base.EndLineIndex].TextPosition)));
				}
			}
			this.bodyTagInfo = new BodyTagInfo(num, (int)num2, num3);
		}
		private BodyFragmentInfo GetParentBodyPart(BodyTagInfo parentBodyTagInfo)
		{
			if (parentBodyTagInfo.WordCount == 0 && parentBodyTagInfo.FormatCrc == 0)
			{
				return new BodyFragmentInfo(base.BodyScanner, base.EndLineIndex, base.EndLineIndex);
			}
			int i = base.EndLineIndex;
			int num = base.EndLineIndex;
			int num2 = base.GetFirstWordIndex(i);
			int num3 = num2;
			int num4 = 0;
			uint num5 = 0U;
			while (num3 >= base.StartWordIndex && i >= base.StartLineIndex)
			{
				if (num4 == parentBodyTagInfo.WordCount && num5 == (uint)parentBodyTagInfo.WordCrc)
				{
					while (i > 0)
					{
						int num6 = base.GetFirstWordIndex(i - 1);
						uint num7 = 0U;
						while (num6 < num2 && !BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num6], out num7))
						{
							num6++;
						}
						if (num6 != num2)
						{
							break;
						}
						i--;
						num2 = base.GetFirstWordIndex(i);
					}
					FragmentInfo.TrimBoundary(base.BodyScanner, ref i, ref num);
					return new BodyFragmentInfo(base.BodyScanner, i, num);
				}
				if (num4 <= parentBodyTagInfo.WordCount)
				{
					if (i == 0)
					{
						break;
					}
					int j = base.GetFirstWordIndex(--i);
					while (j < num2)
					{
						if (base.StartWordIndex >= num2)
						{
							break;
						}
						uint num8 = 0U;
						num2--;
						if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num2], out num8))
						{
							num4++;
							num5 = (num5 << 1) + (num5 >> 31);
							num5 ^= num8;
						}
					}
				}
				else if (num4 > parentBodyTagInfo.WordCount)
				{
					int k = base.GetFirstWordIndex(--num);
					while (k < num3)
					{
						num3--;
						uint num9;
						if (BodyFragmentInfo.IsUsefulWord(base.BodyScanner.Words[num3], out num9))
						{
							num4--;
							int num10 = num4 % 32;
							if (num10 == 0)
							{
								num5 ^= num9;
							}
							else
							{
								num5 ^= (num9 << num10) + (num9 >> 32 - num10);
							}
						}
					}
				}
			}
			return null;
		}