private static Item getItem(String OfThisID,
								Session session,
								String areaName,
								List objectData,
								List objProgData,
								Map<String,Item> areaItems,
								Map<String,Item> doneItems,
								Map<String,Room> areaRooms,
								Map<String,Room> doneRooms,
								boolean compileErrors,
								List<Object> commands)
	{
		if(OfThisID.startsWith("#"))
		{
			if(areaItems.containsKey(OfThisID.substring(1)))
				return (Item)(areaItems.get(OfThisID.substring(1))).copyOf();
			if(doneItems.containsKey(OfThisID.substring(1)))
				return (Item)(doneItems.get(OfThisID.substring(1))).copyOf();
		}
		else
		{
			if(areaItems.containsKey(OfThisID))
				return (Item)(areaItems.get(OfThisID)).copyOf();
			if(doneItems.containsKey(OfThisID))
				return (Item)(doneItems.get(OfThisID)).copyOf();
		}
		for(int o=0;o<objectData.size();o++)
		{
			List<String> objV=null;
			if(objectData.get(o) instanceof List)
				objV=(List)objectData.get(o);
			else
			if(objectData.get(o) instanceof String)
			{
				final String s=(String)objectData.get(o);
				if((!s.toUpperCase().trim().startsWith("#OBJ"))&&(s.length()>0))
					returnAnError(session,"Eating immaterial line: "+objectData.get(o)+", area="+areaName,compileErrors,commands);
				continue;
			}
			else
				continue;
			final String objectID=eatNextLine(objV);
			if(isBadID(objectID))
			{
				Log.errOut("IMPORT","Eating bad object id "+objectID);
				objectData.remove(o);
				o--;
				continue;
			}

			if(!objectID.equals(OfThisID))
				continue;

			final String simpleName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
			String objectName=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
			final String objectDisplay=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
			String objectDescription="";
			if((nextLine(objV).indexOf('~')>=0)||((nextLine(objV).length()>0)&&(!Character.isDigit(nextLine(objV).charAt(0)))))
				objectDescription=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
			
			String codeStr1=eatNextLine(objV);
			String codeStr2=eatNextLine(objV);
			String codeStr3=eatNextLine(objV);
			
			if((CMParms.numBits(codeStr1)==1)
			&&CMath.isNumber(codeStr1)
			&&(CMParms.numBits(codeStr2)==1)
			&&CMath.isNumber(codeStr2))
			{
				//TODO: BZ: Figure out what codeStr1 & 2 are
				codeStr1=codeStr3;
				codeStr2=eatNextLine(objV);
				codeStr3=eatNextLine(objV);
			}

			if((!objectID.startsWith("#"))
			||((objectName.length()==0)
			&&((CMParms.numBits(codeStr1)<3)
			||(CMParms.numBits(codeStr1)>4)
			||(CMParms.numBits(codeStr2)<4)
			||(codeStr3.length()==0))))
			{
				returnAnError(session,"Malformed object! Aborting this object "+objectID+", display="+objectDisplay+", simple="+simpleName+", name="+objectName+", codeStr1="+codeStr1+", codeStr2="+codeStr2+", codeStr3="+codeStr3+", area="+areaName,compileErrors,commands);
				continue;
			}
			if(objectName.length()==0)
				objectName="Unknown";
			boolean circleForm=false;
			final String obj=CMParms.getBit(codeStr1,0);
			if((obj.trim().length()>1)&&(Character.isLetter(obj.charAt(0))))
				circleForm=true;
			int objType=CMath.s_int(obj);
			final String[][] itemTypes={
			{ "light","1"},
			{ "scroll","2"},
			{ "wand","3"},
			{ "staff","4"},
			{ "weapon","5"},
			{ "treasure","8"},
			{ "armor","9"},
			{ "potion","10"},
			{ "clothing","11"},
			{ "furniture","12"},
			{ "trash","13"},
			{ "container","15"},
			{ "drink","17"},
			{ "key","18"},
			{ "food","19"},
			{ "money","20"},
			{ "boat","22"},
			{ "npc_corpse","99"},
			{ "pc_corpse","99"},
			{ "fountain","25"},
			{ "pill","26"},
			{ "protect",""},
			{ "map","28"},
			{ "portal","97"},
			{ "warp_stone",""},
			{ "room_key","98"},
			{ "gem",""},
			{ "jewelry",""},
			{ "jukebox",""},
			{ "tattoo",""},
			{ "pipe","32"}
			};

			if(circleForm)
			{
				if(obj.equalsIgnoreCase("jukebox"))
					continue;// NO JUKE BOXES!
				for (final String[] itemType : itemTypes)
					if(obj.equalsIgnoreCase(itemType[0]))
					{
						objType=CMath.s_int(itemType[1]);
						break;
					}
			}
			final long extraFlag=getBitMask(codeStr1,1);
			final long wearFlag=getBitMask(codeStr1,2);

			Ability adjuster=CMClass.getAbility("Prop_HaveAdjuster");
			switch(objType)
			{
			case 2:
			case 3:
			case 4:
			case 10:
				if((codeStr2.indexOf('`')<=0)
				&&(nextLine(objV).indexOf('`')>=0))
					codeStr2=eatNextLine(objV);
				break;
			default:
				break;
			}
			boolean forgiveZeroes=false;
			if((codeStr2.indexOf('~')>=0)&&(codeStr2.lastIndexOf('~')>codeStr2.indexOf('~')))
			{
				final List<String> V=CMParms.parseSquiggles(codeStr2);
				if(V.size()==4)
				{
					forgiveZeroes=true;
					codeStr2="'"+(V.get(0))+"' "
							+"'"+(V.get(1))+"' "
							+"'"+(V.get(2))+"' "
							+"'"+(V.get(3))+"'";
				}
				else
					returnAnError(session,"Invalid object codeStr2 line: "+codeStr2+", item not aborted, but stuff will be wrong!",compileErrors,commands);
			}

			final String str1=CMParms.getBit(codeStr2,0);
			final String str2=CMParms.getBit(codeStr2,1);
			String str3=CMParms.getBit(codeStr2,2);
			final String str4=CMParms.getBit(codeStr2,3);
			final int val1=(int)getBitMask(codeStr2,0);
			final int val2=(int)getBitMask(codeStr2,1);
			final int val3=(int)getBitMask(codeStr2,2);
			final int val4=(int)getBitMask(codeStr2,3);
			Item I=null;
			switch(objType)
			{
			case 1:
				if (objectName.toUpperCase().indexOf("LANTERN") >= 0)
					I = CMClass.getBasicItem("GenLantern");
				else
					I = CMClass.getBasicItem("GenLightSource");
				((Light) I).setDuration(val3 * 80);
				break;
			case 2:
				I = CMClass.getMiscMagic("GenScroll");
				I.basePhyStats().setLevel(val1);
				I.setUsesRemaining(3);
				((SpellHolder) I).setSpellList(getSpell(str2, val2) + ";" + getSpell(str3, val3) + ";" + getSpell(str4, val4));
				break;
			case 3:
				I = CMClass.getMiscMagic("GenWand");
				I.basePhyStats().setLevel(val1);
				I.setUsesRemaining(val2);
				((Wand) I).setSpell(CMClass.getAbility(getSpell(str4, val4)));
				break;
			case 4:
				I = CMClass.getWeapon("GenStaff");
				I.basePhyStats().setLevel(val1);
				I.setUsesRemaining(val2);
				((Wand) I).setSpell(CMClass.getAbility(getSpell(str4, val4)));
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 5:
				I = CMClass.getWeapon("GenWeapon");
				doWeapon((Weapon) I, objectName, val1, str1, val2, val3, val4, str4);
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 6:
				I = CMClass.getWeapon("GenWeapon");
				doWeapon((Weapon) I, objectName, val1, str1, val2, val3, val4, str4);
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 7:
				I = CMClass.getWeapon("GenWeapon");
				doWeapon((Weapon) I, objectName, val1, str1, val2, val3, val4, str4);
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 8:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 9:
				if (objectName.toUpperCase().indexOf("SHIELD") >= 0)
					I = CMClass.getArmor("GenShield");
				else
					I = CMClass.getArmor("GenArmor");
				I.basePhyStats().setArmor((int) Math.round(CMath.div((val1 + val2 + val3 + val4 + 1), 4.0) + 1));
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 10:
				I = CMClass.getMiscMagic("GenPotion");
				I.basePhyStats().setLevel(val1);
				((Potion) I).setSpellList(getSpell(str2, val2) + ";" + getSpell(str3, val3) + ";" + getSpell(str4, val4));
				break;
			case 11:
				I = CMClass.getArmor("GenArmor");
				I.basePhyStats().setArmor(0);
				adjuster = CMClass.getAbility("Prop_WearAdjuster");
				break;
			case 12:
				I = CMClass.getBasicItem("GenItem");
				if (hasReadableContent(objectName))
					I = CMClass.getBasicItem("GenReadable");
				break;
			case 13:
				I = CMClass.getBasicItem("GenItem");
				if (hasReadableContent(objectName))
					I = CMClass.getBasicItem("GenReadable");
				break;
			case 14:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 15:
				if (CMLib.english().containsString(objectName, "belt") 
				|| CMLib.english().containsString(objectName, "bandolier") 
				|| CMLib.english().containsString(objectName, "sheath"))
					I = CMClass.getArmor("GenArmor");
				else
					I = CMClass.getBasicItem("GenContainer");
				((Container) I).setCapacity(val1);
				boolean lid = false;
				boolean open = true;
				boolean lock = false;
				boolean locked = false;
				if ((val2 & 1) == 1)
					lid = true;
				if ((val2 & 2) == 2)
				{
					lock = true;
					locked = true;
					open = false;
					lid = true;
					I.basePhyStats().setLevel(100);
				}
				if ((val2 & 4) == 4)
				{
					lid = true;
					open = false;
				}
				if ((val2 & 8) == 8)
				{
					lock = true;
					locked = true;
					open = false;
					lid = true;
				}
				((Container) I).setDoorsNLocks(lid, open, !open, lock, locked, locked);
				if (((Container) I).hasADoor() && ((Container) I).hasALock())
					((Container) I).setKeyName(areaName + "#" + val3);
				break;
			case 16:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 17:
				I = CMClass.getBasicItem("GenDrink");
				str3 = str3.toUpperCase().trim();
				if (((val3 > 0) && (val3 < 6)) 
				|| (str3.indexOf("BEER") >= 0) 
				|| (str3.indexOf("ALE") >= 0) 
				|| (str3.indexOf("BREW") >= 0) 
				|| (str3.indexOf("WINE") >= 0))
				{
					((Drink) I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
					I.addEffect(CMClass.getAbility("Poison_Beer"));
					((Drink) I).setLiquidHeld(val1 * 10);
					((Drink) I).setLiquidRemaining(val2);
				}
				else 
				if (str3.indexOf("FIREBREATHER") >= 0)
				{
					((Drink) I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
					I.addEffect(CMClass.getAbility("Poison_Firebreather"));
					((Drink) I).setLiquidHeld(val1 * 10);
					((Drink) I).setLiquidRemaining(val2);
				}
				else 
				if (str3.indexOf("LOCAL SPECIALTY") >= 0)
				{
					((Drink) I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
					I.addEffect(CMClass.getAbility("Poison_Liquor"));
					((Drink) I).setLiquidHeld(val1 * 10);
					((Drink) I).setLiquidRemaining(val2);
				}
				else 
				if (str3.indexOf("WHISKEY") >= 0)
				{
					((Drink) I).setLiquidType(RawMaterial.RESOURCE_LIQUOR);
					I.addEffect(CMClass.getAbility("Poison_Liquor"));
					((Drink) I).setLiquidHeld(val1 * 10);
					((Drink) I).setLiquidRemaining(val2);
				}
				else 
				if ((val4 > 0) || (str3.indexOf("POISON") >= 0))
				{
					((Drink) I).setLiquidType(RawMaterial.RESOURCE_POISON);
					I.addEffect(CMClass.getAbility("Poison"));
					((Drink) I).setLiquidHeld(val1 * 10);
					((Drink) I).setLiquidRemaining(val2);
				}
				else
				{
					((Drink) I).setLiquidHeld(val1 * 30);
					((Drink) I).setLiquidRemaining(val2 * 10);
				}
				break;
			case 18:
				I = CMClass.getBasicItem("GenKey");
				((DoorKey) I).setKey(areaName + objectID);
				break;
			case 19:
				I = CMClass.getBasicItem("GenFood");
				if (val4 > 0)
				{
					I = CMClass.getMiscMagic("GenPill");
					((Pill) I).setSpellList("Poison;");
				}
				((Food) I).setNourishment(20 * val1);
				break;
			case 20:
				I = CMClass.getBasicItem("StdCoins");
				((Coins) I).setNumberOfCoins(val1);
				((Coins) I).setDenomination(1.0);
				((Coins) I).setCurrency("");
				break;
			case 21:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 22:
				I = CMClass.getBasicItem("GenBoat");
				break;
			case 23:
				I = CMClass.getBasicItem("GenCorpse");
				break;
			case 24:
				I = CMClass.getBasicItem("GenCorpse");
				break;
			case 25:
				I = CMClass.getBasicItem("GenWater");
				CMLib.flags().setGettable(I, false);
				((Drink) I).setLiquidHeld(Integer.MAX_VALUE - 5000);
				((Drink) I).setLiquidRemaining(((Drink) I).liquidHeld());
				break;
			case 26:
				I = CMClass.getMiscMagic("GenPill");
				I.basePhyStats().setLevel(val1);
				((Pill) I).setSpellList(getSpell(str2, val2) + ";" + getSpell(str3, val3) + ";" + getSpell(str4, val4));
				break;
			case 27:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 28:
				I = CMClass.getBasicItem("GenReadable"); // don't use GemMaps
															// any more...
				break;
			case 29:
				I = CMClass.getBasicItem("GenItem");
				break;
			case 97:
				I = CMClass.getBasicItem("GenPortal");
				if ((str4.length() > 0) && (!str4.equals("0")))
				{
					Room R = getRoom(areaRooms, doneRooms, areaName, str4);
					if (R != null)
						I.setReadableText(R.roomID());
					else
					{
						for (final Enumeration<Room> e = CMLib.map().rooms(); e.hasMoreElements();)
						{
							R = e.nextElement();
							if (R.roomID().endsWith("#" + str4))
							{
								I.setReadableText(R.roomID());
								break;
							}
						}
					}
					if (I.readableText().length() == 0)
						I.setReadableText("#" + str4);
				}
				break;
			case 98:
				I = CMClass.getBasicItem("GenKey");
				((DoorKey) I).setKey(areaName + objectID);
				break;
			case 99:
				I = CMClass.getBasicItem("GenCorpse");
				break;
			case -1:
				I = CMClass.getBasicItem("GenWallpaper");
				break;
			default:
				I = CMClass.getBasicItem("GenItem");
				break;
			}

			if(!CMath.isSet(wearFlag,0))
				CMLib.flags().setGettable(I,false);
			if(CMath.isSet(wearFlag,1))
				I.setRawProperLocationBitmap(Wearable.WORN_LEFT_FINGER|Wearable.WORN_RIGHT_FINGER|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,2))
				I.setRawProperLocationBitmap(Wearable.WORN_NECK|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,3))
				I.setRawProperLocationBitmap(Wearable.WORN_TORSO|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,4))
				I.setRawProperLocationBitmap(Wearable.WORN_HEAD|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,5))
				I.setRawProperLocationBitmap(Wearable.WORN_LEGS|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,6))
				I.setRawProperLocationBitmap(Wearable.WORN_FEET|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,7))
				I.setRawProperLocationBitmap(Wearable.WORN_HANDS|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,8))
				I.setRawProperLocationBitmap(Wearable.WORN_ARMS|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,9))
				I.setRawProperLocationBitmap(Wearable.WORN_HELD|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,10))
				I.setRawProperLocationBitmap(Wearable.WORN_ABOUT_BODY|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,11))
				I.setRawProperLocationBitmap(Wearable.WORN_WAIST|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,12))
				I.setRawProperLocationBitmap(Wearable.WORN_LEFT_WRIST|Wearable.WORN_RIGHT_WRIST|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,13))
				I.setRawProperLocationBitmap(Wearable.WORN_WIELD|Wearable.WORN_HELD|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,14))
				I.setRawProperLocationBitmap(Wearable.WORN_HELD|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,15))
				I.setRawLogicalAnd(true);
			if(CMath.isSet(wearFlag,17))
				I.setRawProperLocationBitmap(Wearable.WORN_EARS|I.rawProperLocationBitmap());
			if(CMath.isSet(wearFlag,18)) // ankles
				I.setRawProperLocationBitmap(Wearable.WORN_FEET|I.rawProperLocationBitmap());

			// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			// the relation of this stuff is vital!  must follow properlocation setting
			// and the getttable setting ONLY!!!
			// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
			if((adjuster.ID().equals("Prop_HaveAdjuster"))
			&&(I.rawProperLocationBitmap()>0)
			)
			{
				adjuster=CMClass.getAbility("Prop_WearAdjuster");
				if(I.ID().equals("GenItem"))
				{
					final long wear=I.rawProperLocationBitmap();
					final boolean bool=I.rawLogicalAnd();
					final boolean gettable=CMLib.flags().isGettable(I);
					I=CMClass.getArmor("GenArmor");
					I.setRawProperLocationBitmap(wear);
					I.setRawLogicalAnd(bool);
					I.basePhyStats().setArmor(0);
					CMLib.flags().setGettable(I,gettable);
				}
			}

			Ability resister=CMClass.getAbility("Prop_HaveResister");
			Ability caster=CMClass.getAbility("Prop_HaveSpellCast");
			if(adjuster.ID().equals("Prop_WearAdjuster"))
			{
				resister=CMClass.getAbility("Prop_WearResister");
				caster=CMClass.getAbility("Prop_WearSpellCast");
			}
			if(CMParms.numBits(codeStr3)>2)
			{
				final int level=CMath.s_int(CMParms.getCleanBit(codeStr3,0).trim());
				I.basePhyStats().setLevel(level);
				I.basePhyStats().setWeight(CMath.s_int(CMParms.getCleanBit(codeStr3,1).trim()) / 10);
				if(I.basePhyStats().weight()<1)
					I.basePhyStats().setWeight(1);
				if(I instanceof Rideable)
					I.basePhyStats().setWeight(CMath.s_int(CMParms.getCleanBit(codeStr3,1).trim()) * 10);
				I.setBaseValue(CMath.s_int(CMParms.getCleanBit(codeStr3,2).trim()));
			}
			else
			{
				final int level=CMath.s_int(codeStr3);
				I.basePhyStats().setLevel(level);
			}

			I.setName(objectName);
			I.setDisplayText(objectDisplay);
			if(!objectDescription.trim().equalsIgnoreCase("OLDSTYLE"))
				I.setDescription(objectDescription);
			if((I instanceof Weapon)
			&&((objectName.toUpperCase().indexOf("TWO-HANDED")>=0)
			||(objectName.toUpperCase().indexOf("TWO HANDED")>=0)))
			{
				I.setRawLogicalAnd(true);
				I.setRawProperLocationBitmap(Wearable.WORN_HELD|I.rawProperLocationBitmap());
			}

			boolean materialchange=false;
			for (final String[] objDesc : objDescs)
			{
				if(objectDescription.equalsIgnoreCase(objDesc[0]))
				{
					I.setMaterial(CMath.s_int(objDesc[1]));
					materialchange=true;
					break;
				}
			}

			// correction for certain rings
			if((((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_CLOTH)
				||((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_PAPER))
			   &&(I.fitsOn(Wearable.WORN_LEFT_FINGER)))
			{
				I.setMaterial(RawMaterial.RESOURCE_SILVER);
				materialchange=true;
			}

			if(materialchange)
				I.setDescription("");

			if((I instanceof Container)&&(((Container)I).containTypes()==Container.CONTAIN_ANYTHING))
			{
				if(CMLib.english().containsString(objectName,"belt")
				||CMLib.english().containsString(objectName,"bandolier")
				||CMLib.english().containsString(objectName,"sheath"))
				{
					((Container)I).setContainTypes(Container.CONTAIN_ONEHANDWEAPONS);
					if(((Container)I).capacity()-I.basePhyStats().weight()<30)
						((Container)I).setCapacity(I.basePhyStats().weight()+30);
				}
				else
				if(CMLib.english().containsString(objectName,"boot")
				||CMLib.english().containsString(objectName,"bracer")
				||CMLib.english().containsString(objectName,"sheath"))
				{
					((Container)I).setContainTypes(Container.CONTAIN_DAGGERS);
					if(((Container)I).capacity()-I.basePhyStats().weight()<10)
						((Container)I).setCapacity(I.basePhyStats().weight()+10);
				}
			}

			if(CMath.isSet(extraFlag,0))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_GLOWING);

			//if((extraFlag&2)==2) coffeemud has no hummers
			if(CMath.isSet(extraFlag,2))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_DARK);

			if(CMath.isSet(extraFlag,4))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_EVIL);

			if(CMath.isSet(extraFlag,5))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_INVISIBLE);

			if(CMath.isSet(extraFlag,6))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_BONUS);

			if(CMath.isSet(extraFlag,7))
				CMLib.flags().setDroppable(I,false);

			if(CMath.isSet(extraFlag,8))
				I.addNonUninvokableEffect(CMClass.getAbility("Prayer_Bless"));

			final Ability prop_WearZapper = CMClass.getAbility("Prop_WearZapper");

			if(CMath.isSet(extraFlag,9))
				prop_WearZapper.setMiscText(prop_WearZapper.text()+" -good");

			if(CMath.isSet(extraFlag,10))
				prop_WearZapper.setMiscText(prop_WearZapper.text()+" -evil");

			if(CMath.isSet(extraFlag,11))
				prop_WearZapper.setMiscText(prop_WearZapper.text()+" -neutral");

			if(prop_WearZapper.text().length()>0)
				I.addNonUninvokableEffect(prop_WearZapper);

			if(CMath.isSet(extraFlag,12))
				CMLib.flags().setRemovable(I,false);

			//if(extraFlag&4096)==4096) coffeemud doesn't support rotting cargo

			if(CMath.isSet(extraFlag,14))
				CMLib.flags().setGettable(I,false);

			//if(extraFlag&16384)==16384) coffeemud doesn't support rotting cargo

			if(CMath.isSet(extraFlag,16))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_INVISIBLE);

			if(CMath.isSet(extraFlag,17))
				I.basePhyStats().setDisposition(I.basePhyStats().disposition()|PhyStats.IS_GOOD);

			if(CMath.isSet(extraFlag,18))
				if((I.material()&RawMaterial.MATERIAL_MASK)==RawMaterial.MATERIAL_METAL)
					I.setMaterial(RawMaterial.RESOURCE_GLASS);

			if(CMath.isSet(extraFlag,20))
				I.basePhyStats().setSensesMask(I.basePhyStats().sensesMask()|PhyStats.SENSE_UNLOCATABLE);

			//if(CMath.isSet(extraFlag,22))
			//nothing is unidentifiable

			// now all those funny tags
			while(objV.size()>0)
			{
				String codeLine=nextLine(objV).trim().toUpperCase();
				if(codeLine.equals("E"))
				{
					eatNextLine(objV);
					if((CMClass.getItem(I.ID())!=null)
					&&(I.description().equals(CMClass.getItem(I.ID()).description())))
					   I.setDescription("");
					else
					if(I.description().length()>0)
						I.setDescription((I.description()+"%0D"));
					eatLineSquiggle(objV);
					boolean squiggleFound=false;
					for(int y=0;y<objV.size();y++)
					{
						final String ts=objV.get(y);
						if(ts.indexOf('~')>=0)
						{
							squiggleFound=true;
							break;
						}
						if(ts.equals("A")
						   ||ts.equals("E")
						   ||ts.equals("L")
						   ||ts.equals("F"))
						{
							objV.add(y,"~");
							squiggleFound=true;
							break;
						}
					}
					if(!squiggleFound)
						objV.add("~");
					final String desc=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV));
					I.setDescription(I.description()+desc);
					if(I.ID().equals("GenReadable"))
						I.setReadableText(fixReadableContent(I.description()));
				}
				else
				if(codeLine.equals("L"))
				{
					eatNextLine(objV);
					// need to figure this one out.
					eatLine(objV);
				}
				else
				if(codeLine.startsWith("X "))
				{
					codeLine=eatLineSquiggle(objV);
					Behavior B=I.fetchBehavior("Sounder");
					if(B==null)
					{
						B=CMClass.getBehavior("Sounder");
						if(B!=null)
							I.addBehavior(B);
					}
					// no else please
					if(B!=null)
					{
						if(B.getParms().length()==0)
							B.setParms(codeLine.substring(1).trim());
						else
							B.setParms(B.getParms()+";"+codeLine.substring(1).trim());
					}
				}
				else
				if(codeLine.equals("A"))
				{
					eatNextLine(objV);
					final String codesLine=eatNextLine(objV);
					if(CMParms.numBits(codesLine)!=2)
						returnAnError(session,"Malformed 'A' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
					else
						applyItemApplyCode(codesLine,I, adjuster, caster, resister);
				}
				else
				if(codeLine.equals("F"))
				{
					eatNextLine(objV);
					final String codesLine=eatNextLine(objV);
					if(CMParms.numBits(codesLine)!=4)
						returnAnError(session,"Malformed 'F' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
					else
					{
						final String codeType=CMParms.getBit(codesLine,0);
						if(codeType.equals("V"))
						{
							final long res=getBitMask(codesLine,3);
							final long imm=getBitMask(codesLine,3);
							final String[] resistances={
								" teleport",
								" mind",
								" magic",
								" weapons",
								" blunt",
								" pierce",
								" slash",
								" fire",
								" cold",
								" elec",
								" acid",
								" poison",
								" evil",
								" holy",
								"",
								" mind",
								" disease",
								" gas"};
							for(int rei=0;rei<resistances.length;rei++)
							{
								if((CMath.isSet(res,rei))&&(resistances[rei].length()>0))
									resister.setMiscText(resister.text()+resistances[rei]+" -25%");
								else
								if((CMath.isSet(imm,rei))&&(resistances[rei].length()>0))
									resister.setMiscText(resister.text()+resistances[rei]+" -100%");
							}

						}
						else
						if(codeType.equals("A"))
						{
							int dis=0;
							int sense=0;
							final long codeBits=getBitMask(codesLine,3);
							if(CMath.isSet(codeBits,0))
								sense=sense|PhyStats.CAN_NOT_SEE;
							if(CMath.isSet(codeBits,1))
								dis=dis|PhyStats.IS_INVISIBLE;
							if(CMath.isSet(codeBits,2))
								sense=sense|PhyStats.CAN_SEE_EVIL;
							if(CMath.isSet(codeBits,3))
								sense=sense|PhyStats.CAN_SEE_INVISIBLE;
							if(CMath.isSet(codeBits,4))
								sense=sense|PhyStats.CAN_SEE_BONUS;
							if(CMath.isSet(codeBits,5))
								sense=sense|PhyStats.CAN_SEE_HIDDEN|PhyStats.CAN_SEE_SNEAKERS;
							if(CMath.isSet(codeBits,6))
								caster.setMiscText(caster.text()+("Spell_IronGrip")+";");
							if(CMath.isSet(codeBits,7))
								caster.setMiscText(caster.text()+("Prayer_Sanctuary")+";");
							if(CMath.isSet(codeBits,8))
								caster.setMiscText(caster.text()+("Spell_FaerieFire")+";");
							if(CMath.isSet(codeBits,9))
								sense=sense|PhyStats.CAN_SEE_INFRARED;
							if(CMath.isSet(codeBits,10))
								caster.setMiscText(caster.text()+("Prayer_Curse")+";");
							if(CMath.isSet(codeBits,11))
								caster.setMiscText(caster.text()+"Specialization_Weapon;");
							if(CMath.isSet(codeBits,12))
								caster.setMiscText(caster.text()+("Poison")+";");
							if(CMath.isSet(codeBits,13))
								caster.setMiscText(caster.text()+("Prayer_ProtEvil")+";");
							if(CMath.isSet(codeBits,14))
								caster.setMiscText(caster.text()+("Prayer_ProtGood")+";");
							if(CMath.isSet(codeBits,15))
								dis=dis|PhyStats.IS_SNEAKING;
							if(CMath.isSet(codeBits,16))
								caster.setMiscText(caster.text()+("Skill_Hide")+";");
							if(CMath.isSet(codeBits,17))
							{
								dis=dis|PhyStats.IS_SLEEPING;
								caster.setMiscText(caster.text()+("Spell_Sleep")+";");
							}
							//if(CMath.isSet(codeBits,18)) item cannot charm you
							//	caster.setMiscText(caster.text()+(new Poison().ID())+";");
							if(CMath.isSet(codeBits,19))
								dis=dis|PhyStats.IS_FLYING;
							if(CMath.isSet(codeBits,20))
								caster.setMiscText(caster.text()+("Spell_PassDoor")+";");
							if(CMath.isSet(codeBits,21))
								caster.setMiscText(caster.text()+("Spell_Haste")+";");
							if(CMath.isSet(codeBits,22))
								caster.setMiscText(caster.text()+("Prayer_Calm")+";");
							if(CMath.isSet(codeBits,23))
								caster.setMiscText(caster.text()+("Prayer_Plague")+";");
							if(CMath.isSet(codeBits,24))
								caster.setMiscText(caster.text()+("Spell_Awe")+";");
							if(CMath.isSet(codeBits,25))
								sense=sense|PhyStats.CAN_SEE_DARK;
							if(CMath.isSet(codeBits,26))
								caster.setMiscText(caster.text()+("Fighter_Berzerk")+";");
							if(CMath.isSet(codeBits,27))
								caster.setMiscText(caster.text()+("Regeneration")+";");
							if(CMath.isSet(codeBits,28))
								sense=sense|PhyStats.CAN_SEE_GOOD;
							if(CMath.isSet(codeBits,29))
								caster.setMiscText(caster.text()+("Spell_Slow")+";");
							if(sense>0)
								adjuster.setMiscText(adjuster.text()+" sen+"+sense);
							if(dis>0)
								adjuster.setMiscText(adjuster.text()+" dis+"+dis);
						}
						else
						{
							final long res=getBitMask(codesLine,3);
							final long imm=getBitMask(codesLine,3);
							final String[] resistances={
								" teleport",
								" mind",
								" magic",
								" weapons",
								" blunt",
								" pierce",
								" slash",
								" fire",
								" cold",
								" elec",
								" acid",
								" poison",
								" evil",
								" holy",
								"",
								" mind",
								" disease",
								" gas"};
							for(int rei=0;rei<resistances.length;rei++)
							{
								if((CMath.isSet(res,rei))&&(resistances[rei].length()>0))
									resister.setMiscText(resister.text()+resistances[rei]+" 25%");
								else
								if((CMath.isSet(imm,rei))&&(resistances[rei].length()>0))
									resister.setMiscText(resister.text()+resistances[rei]+" 100%");
							}

							if(CMath.isSet(res,14))
								caster.setMiscText(caster.text()+"Spell_ResistMagicMissiles;");
							//if(CMath.isSet(res,18)) no light resistance
							//if(CMath.isSet(res,18)) no sound resistance
						}


					}
				}
				else
				if(codeLine.startsWith(">"))
				{
					codeLine=eatLineSquiggle(objV);
					String scriptStuff="";
					if(!codeLine.substring(1).trim().toUpperCase().startsWith("IN_FILE_PROG"))
					{
						scriptStuff+=codeLine.substring(1).trim()+";";
						codeLine=nextLine(objV);
						while(codeLine.indexOf('~')<0)
						{
							scriptStuff+=codeLine.trim()+";";
							eatLine(objV);
							codeLine=nextLine(objV);
						}
						codeLine=eatLineSquiggle(objV).trim();
						scriptStuff+=codeLine+"~";
					}
					codeLine=scriptStuff;
					// nothing done with the script. :(
				}
				else
				if(codeLine.equals("|"))
				{
					eatNextLine(objV);
					// have no idea, but we skip it
				}
				else
				if((forgiveZeroes)
				&&(codeLine.length()>0)
				&&(CMath.isNumber(""+codeLine.charAt(0)))
				&&(CMParms.numBits(codeLine)>1))
				{
					eatNextLine(objV);
					// eos support
				}
				else
				if((forgiveZeroes)
				&&(codeLine.endsWith("~")))
				{
					eatNextLine(objV);
					// eos support
				}
				else
				if((codeLine.startsWith("#"))||(codeLine.length()==0))
				{
					eatNextLine(objV);
				}
				else
				if(codeLine.equals("EXTRA"))
				{
					eatNextLine(objV); // extra
					eatLineSquiggle(objV); // key word
					final String desc=CMLib.coffeeFilter().safetyFilter(eatLineSquiggle(objV)); // description
					I.setDescription(I.description()+desc);
					if(I.ID().equals("GenReadable"))
						I.setReadableText(fixReadableContent(I.description()));
				}
				else
				if(codeLine.equals("APPLY"))
				{
					eatNextLine(objV); // apply
					final String codesLine = eatNextLine(objV);
					if(CMParms.numBits(codesLine)!=2)
						returnAnError(session,"Malformed 'A' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
					else
						applyItemApplyCode(codesLine,I, adjuster, caster, resister);
				}
				else
				if(codeLine.startsWith("A "))
				{
					eatNextLine(objV); // apply
					final String codesLine = codeLine.substring(2).trim();
					if(CMParms.numBits(codesLine)!=2)
						returnAnError(session,"Malformed 'A' code for item "+objectID+", "+I.Name()+": "+codesLine+", area="+areaName,compileErrors,commands);
					else
						applyItemApplyCode(codesLine,I, adjuster, caster, resister);
				}
				else
				{
					eatNextLine(objV);
					returnAnError(session,"Unknown code for item "+objectID+", "+I.Name()+": "+codeLine+", area="+areaName,compileErrors,commands);
				}
			}
			if(adjuster.text().length()>0)
				I.addNonUninvokableEffect(adjuster);
			if(caster.text().length()>0)
				I.addNonUninvokableEffect(caster);
			if(resister.text().length()>0)
				I.addNonUninvokableEffect(resister);
			I.recoverPhyStats();
			I.text();
			I.recoverPhyStats();
			if(OfThisID.startsWith("#"))
			{
				areaItems.put(OfThisID.substring(1),I);
				doneItems.put(OfThisID.substring(1),I);
			}
			else
			{
				areaItems.put(OfThisID,I);
				doneItems.put(OfThisID,I);
			}
			return I;
		}
		return null;
	}