// Path: src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java
// public class InventoryWorkbenchAdditionalMaterials implements IInventory
// {
// 	private ItemStack[] stackList;
// 
// 	private Container container;
// 
// 	public InventoryWorkbenchAdditionalMaterials(Container container_, int size)
// 	{
// 		stackList = new ItemStack[size];
// 		container = container_;
// 	}
// 
// 	@Override
// 	public int getSizeInventory()
// 	{
// 		return stackList.length;
// 	}
// 
// 	@Override
// 	public ItemStack getStackInSlot(int slot)
// 	{
// 		if (getSizeInventory() <= slot)
// 		{
// 			return null;
// 		}
// 		else
// 		{
// 			return stackList[slot];
// 		}
// 	}
// 
// 	@Override
// 	public ItemStack decrStackSize(int slot, int amount)
// 	{
// 		if (stackList[slot] != null)
// 		{
// 			ItemStack itemstack;
// 
// 			if (stackList[slot].stackSize <= amount)
// 			{
// 				itemstack = stackList[slot];
// 				stackList[slot] = null;
// 				container.onCraftMatrixChanged(this);
// 				return itemstack;
// 			}
// 			else
// 			{
// 				itemstack = stackList[slot].splitStack(amount);
// 
// 				if (stackList[slot].stackSize == 0)
// 				{
// 					stackList[slot] = null;
// 				}
// 
// 				container.onCraftMatrixChanged(this);
// 				return itemstack;
// 			}
// 		}
// 		else
// 		{
// 			return null;
// 		}
// 	}
// 
// 	@Override
// 	public ItemStack getStackInSlotOnClosing(int slot)
// 	{
// 		if (stackList[slot] != null)
// 		{
// 			ItemStack itemstack = stackList[slot];
// 			stackList[slot] = null;
// 			return itemstack;
// 		}
// 		else
// 		{
// 			return null;
// 		}
// 	}
// 
// 	@Override
// 	public void setInventorySlotContents(int slot, ItemStack stack)
// 	{
// 		stackList[slot] = stack;
// 		container.onCraftMatrixChanged(this);
// 	}
// 
// 	@Override
// 	public String getCommandSenderName()
// 	{
// 		return "container.workbenchmaterials";
// 	}
// 
// 	@Override
// 	public boolean hasCustomName()
// 	{
// 		return false;
// 	}
// 
// 	@Override
// 	public IChatComponent getDisplayName()
// 	{
// 		return new ChatComponentText(getCommandSenderName());
// 	}
// 
// 	@Override
// 	public int getInventoryStackLimit()
// 	{
// 		return 64;
// 	}
// 
// 	@Override
// 	public void markDirty()
// 	{
// 		container.onCraftMatrixChanged(this);
// 	}
// 
// 	@Override
// 	public boolean isUseableByPlayer(EntityPlayer player)
// 	{
// 		return true;
// 	}
// 
// 	@Override
// 	public void openInventory(EntityPlayer player)
// 	{ }
// 
// 	@Override
// 	public void closeInventory(EntityPlayer player)
// 	{ }
// 
// 	@Override
// 	public boolean isItemValidForSlot(int slot, ItemStack stack)
// 	{
// 		return true;
// 	}
// 
// 	@Override
// 	public int getField(int id)
// 	{
// 		return 0;
// 	}
// 
// 	@Override
// 	public void setField(int id, int value)
// 	{ }
// 
// 	@Override
// 	public int getFieldCount()
// 	{
// 		return 0;
// 	}
// 
// 	@Override
// 	public void clear()
// 	{
// 		for (int i = 0; i < stackList.length; i++)
// 		{
// 			stackList[i] = null;
// 		}
// 	}
// }
// 
// Path: src/main/java/net/einsteinsci/betterbeginnings/util/LogUtil.java
// public class LogUtil
// {
// 	public static void logDebug(String text)
// 	{
// 		if (BBConfig.debugLogging)
// 		{
// 			log(Level.DEBUG, text);
// 		}
// 	}
// 
// 	public static void logDebug(Level level, String text)
// 	{
// 		if (BBConfig.debugLogging)
// 		{
// 			log(level, text);
// 		}
// 	}
// 
// 	public static void log(Level level, String text)
// 	{
// 		FMLLog.log(ModMain.NAME, level, text);
// 	}
// 
// 	public static void log(String text)
// 	{
// 		log(Level.INFO, text);
// 	}
// }


import org.apache.logging.log4j.Level;
import net.einsteinsci.betterbeginnings.inventory.InventoryWorkbenchAdditionalMaterials;
import net.einsteinsci.betterbeginnings.util.LogUtil;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
				if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight)
				{
					if (mirror)
					{
						neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth];
					}
					else
					{
						neededCraftingStack = recipeItems[i1 + j1 * recipeWidth];
					}
				}

				ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l);

				if (craftingStackInQuestion != null && neededCraftingStack != null)
				{
					if (!neededCraftingStack.matches(craftingStackInQuestion))
					{
						return false;
					}
				}
				else if ((craftingStackInQuestion == null) ^ (neededCraftingStack == null))
				{
					return false;
				}
			}
		}

		if(addedMaterials.length > materials.getSizeInventory())
		{
// Path: src/main/java/net/einsteinsci/betterbeginnings/inventory/InventoryWorkbenchAdditionalMaterials.java
// public class InventoryWorkbenchAdditionalMaterials implements IInventory
// {
// 	private ItemStack[] stackList;
// 
// 	private Container container;
// 
// 	public InventoryWorkbenchAdditionalMaterials(Container container_, int size)
// 	{
// 		stackList = new ItemStack[size];
// 		container = container_;
// 	}
// 
// 	@Override
// 	public int getSizeInventory()
// 	{
// 		return stackList.length;
// 	}
// 
// 	@Override
// 	public ItemStack getStackInSlot(int slot)
// 	{
// 		if (getSizeInventory() <= slot)
// 		{
// 			return null;
// 		}
// 		else
// 		{
// 			return stackList[slot];
// 		}
// 	}
// 
// 	@Override
// 	public ItemStack decrStackSize(int slot, int amount)
// 	{
// 		if (stackList[slot] != null)
// 		{
// 			ItemStack itemstack;
// 
// 			if (stackList[slot].stackSize <= amount)
// 			{
// 				itemstack = stackList[slot];
// 				stackList[slot] = null;
// 				container.onCraftMatrixChanged(this);
// 				return itemstack;
// 			}
// 			else
// 			{
// 				itemstack = stackList[slot].splitStack(amount);
// 
// 				if (stackList[slot].stackSize == 0)
// 				{
// 					stackList[slot] = null;
// 				}
// 
// 				container.onCraftMatrixChanged(this);
// 				return itemstack;
// 			}
// 		}
// 		else
// 		{
// 			return null;
// 		}
// 	}
// 
// 	@Override
// 	public ItemStack getStackInSlotOnClosing(int slot)
// 	{
// 		if (stackList[slot] != null)
// 		{
// 			ItemStack itemstack = stackList[slot];
// 			stackList[slot] = null;
// 			return itemstack;
// 		}
// 		else
// 		{
// 			return null;
// 		}
// 	}
// 
// 	@Override
// 	public void setInventorySlotContents(int slot, ItemStack stack)
// 	{
// 		stackList[slot] = stack;
// 		container.onCraftMatrixChanged(this);
// 	}
// 
// 	@Override
// 	public String getCommandSenderName()
// 	{
// 		return "container.workbenchmaterials";
// 	}
// 
// 	@Override
// 	public boolean hasCustomName()
// 	{
// 		return false;
// 	}
// 
// 	@Override
// 	public IChatComponent getDisplayName()
// 	{
// 		return new ChatComponentText(getCommandSenderName());
// 	}
// 
// 	@Override
// 	public int getInventoryStackLimit()
// 	{
// 		return 64;
// 	}
// 
// 	@Override
// 	public void markDirty()
// 	{
// 		container.onCraftMatrixChanged(this);
// 	}
// 
// 	@Override
// 	public boolean isUseableByPlayer(EntityPlayer player)
// 	{
// 		return true;
// 	}
// 
// 	@Override
// 	public void openInventory(EntityPlayer player)
// 	{ }
// 
// 	@Override
// 	public void closeInventory(EntityPlayer player)
// 	{ }
// 
// 	@Override
// 	public boolean isItemValidForSlot(int slot, ItemStack stack)
// 	{
// 		return true;
// 	}
// 
// 	@Override
// 	public int getField(int id)
// 	{
// 		return 0;
// 	}
// 
// 	@Override
// 	public void setField(int id, int value)
// 	{ }
// 
// 	@Override
// 	public int getFieldCount()
// 	{
// 		return 0;
// 	}
// 
// 	@Override
// 	public void clear()
// 	{
// 		for (int i = 0; i < stackList.length; i++)
// 		{
// 			stackList[i] = null;
// 		}
// 	}
// }
// 
// Path: src/main/java/net/einsteinsci/betterbeginnings/util/LogUtil.java
// public class LogUtil
// {
// 	public static void logDebug(String text)
// 	{
// 		if (BBConfig.debugLogging)
// 		{
// 			log(Level.DEBUG, text);
// 		}
// 	}
// 
// 	public static void logDebug(Level level, String text)
// 	{
// 		if (BBConfig.debugLogging)
// 		{
// 			log(level, text);
// 		}
// 	}
// 
// 	public static void log(Level level, String text)
// 	{
// 		FMLLog.log(ModMain.NAME, level, text);
// 	}
// 
// 	public static void log(String text)
// 	{
// 		log(Level.INFO, text);
// 	}
// }


// Path: src/main/java/net/einsteinsci/betterbeginnings/register/recipe/AdvancedRecipe.java
import org.apache.logging.log4j.Level;
import net.einsteinsci.betterbeginnings.inventory.InventoryWorkbenchAdditionalMaterials;
import net.einsteinsci.betterbeginnings.util.LogUtil;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;

				if (i1 >= 0 && j1 >= 0 && i1 < recipeWidth && j1 < recipeHeight)
				{
					if (mirror)
					{
						neededCraftingStack = recipeItems[recipeWidth - i1 - 1 + j1 * recipeWidth];
					}
					else
					{
						neededCraftingStack = recipeItems[i1 + j1 * recipeWidth];
					}
				}

				ItemStack craftingStackInQuestion = crafting.getStackInRowAndColumn(k, l);

				if (craftingStackInQuestion != null && neededCraftingStack != null)
				{
					if (!neededCraftingStack.matches(craftingStackInQuestion))
					{
						return false;
					}
				}
				else if ((craftingStackInQuestion == null) ^ (neededCraftingStack == null))
				{
					return false;
				}
			}
		}

		if(addedMaterials.length > materials.getSizeInventory())
		{
			LogUtil.log(Level.ERROR, "Recipe for " + this.recipeOutput.getDisplayName() + " has too many catalysts required.");