(FILECREATED "19-Nov-84 17:48:09" {AZTEC}<TRILLIUM>BIRTHDAY84>RERELEASE>TRI-EDITITYPE.;2 32125  

      changes to:  (FNS EDIT.ITEM.TYPES GET.ITEM.TYPE.EDITOR.COMMAND.MENU)

      previous date: "17-Aug-84 22:42:54" {AZTEC}<TRILLIUM>BIRTHDAY84>RERELEASE>TRI-EDITITYPE.;1)


(PRETTYCOMPRINT TRI-EDITITYPECOMS)

(RPAQQ TRI-EDITITYPECOMS ((FNS COPY.ITEM.TYPE CREATE.ITEM.TYPE DEFINE.ITEM.TYPE DELETE.ITEM.TYPE 
			       EDIT.ITEM.TYPE EDIT.ITEM.TYPE.DESCRIPTION EDIT.ITEM.TYPES 
			       GET.DEFINE.ITEM.TYPE.COMMAND.MENU GET.ITEM.TYPE.EDITOR.COMMAND.MENU 
			       GRAPH.ITEM.TYPES MAKE.ITEMTYPE.DESCRIPTION.FROM.PROTOTYPE 
			       MAKE.ITEMTYPE.DESCRIPTION.LEAST.GENERAL 
			       MAKE.ITEMTYPE.DESCRIPTION.MOST.GENERAL 
			       MAKE.ITEMTYPE.DESCRIPTION.NO.PROTOTYPE 
			       MAKE.ITEMTYPE.DESCRIPTION.PROTOTYPE MAKE.PARAMETER.NAMES 
			       MAKE.SUBITEM.SPECS MAKE.SUBITEM.SPECS.FROM.PROTOTYPE 
			       MAKE.SUBITEM.SPECS.LEAST.GENERAL MISSING.ITYPE.FN MARK.ITEM.TYPE 
			       MODIFY.ITEM.TYPE PARAMETER.NAMES PRINT.ITEM.TYPE REDEFINE.ITEM.TYPE 
			       SPECIALIZE.ITEM.TYPE)
	(VARS (ITEM.TYPE.MENU)
	      (ITEM.TYPE.GRAPH.WINDOW)
	      (ITEM.TYPE.EDITOR.COMMAND.MENU))))
(DEFINEQ

(COPY.ITEM.TYPE
  [LAMBDA NIL                                                (* HaKo "16-Aug-84 14:56")
    (DECLARE (GLOBALVARS ITEM.TYPES))
    (PROG (ITYPE NEW.ITYPE NEW.DESCRIPTION)
          (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Indicate item type to be copied")
          (SETQ ITYPE (ACQUIRE.ITEM.TYPE))
          (COND
	    ((NULL ITYPE)
	      (RETURN)))
          (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Copying item type " ITYPE)
          (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Name of copy: ")
          (SETQ NEW.ITYPE (PROMPT.READ))
          (COND
	    ((NULL NEW.ITYPE)
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Copy command aborted"))
	    ((NOT (ATOM NEW.ITYPE))
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Name must be one word"))
	    ((MEMBER NEW.ITYPE ITEM.TYPES)
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "The name " NEW.ITYPE " is already in use"))
	    (T (SETQ NEW.DESCRIPTION (COPYALL (ITEM.TYPE.DESCRIPTION ITYPE)))
	       (SET.FIELDQ NEW.DESCRIPTION NAME NEW.ITYPE ITEM.TYPE)
	       (REGISTER.ITEM.TYPE NEW.ITYPE NEW.DESCRIPTION)
	       (MARK.ITEM.TYPE NEW.ITYPE T)
	       (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Item type " NEW.ITYPE " created")
	       (RETURN NEW.ITYPE])

(CREATE.ITEM.TYPE
  [LAMBDA NIL                                                (* HaKo "25-Jul-84 16:17")
    (DECLARE (GLOBALVARS ITEM.TYPES))
    (PROG (NEW.NAME NEW.DESCRIPTION)
          (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Creating new item.type with name: ")
          (SETQ NEW.NAME (PROMPT.READ))
          (COND
	    ((NULL NEW.NAME)
	      (RETURN))
	    ((NOT (ATOM NEW.NAME))
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Name must be one word")
	      (RETURN))
	    ((MEMBER NEW.NAME ITEM.TYPES)
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "The name " NEW.NAME " is already in use")
	      (RETURN))
	    (T (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
						  (COMMENT "English description of this item type")
						  (KIND (QUOTE COMPOSITE))
						  [PARAMETERS
						    (LIST (ITEM.CREATE PARAMETER (NAME (QUOTE 
											PLACEMENT))
								       (TYPE (LIST (QUOTE REGION)))
								       (COMMENT 
								      "The position of this item")
								       (DEFAULT (LIST 0 0 100 100)))
							  (ITEM.CREATE PARAMETER (NAME (QUOTE 
										      PARAMETER.2))
								       (TYPE (LIST (QUOTE CONSTANT)))
								       (COMMENT 
									"User defined parameters")
								       (DEFAULT (QUOTE FOO]
						  (SUBITEM.SPECS NIL)
						  (OTHER NIL)))
	       (REGISTER.ITEM.TYPE NEW.NAME NEW.DESCRIPTION)
	       (MARK.ITEM.TYPE NEW.NAME T)
	       (EDIT.ITEM.TYPE.DESCRIPTION NEW.NAME)
	       (RETURN NEW.NAME])

(DEFINE.ITEM.TYPE
  [LAMBDA NIL                                                (* HaKo "16-Aug-84 14:57")
    (DECLARE (SPECVARS FRAME)
	     (GLOBALVARS CURRENT.FRAME ITEM.TYPES))
    (PROG (EXAMPLE.ITEM PROTOTYPE.ITEM NEW.NAME OLD.ITYPE OLD.DESCRIPTION NEW.DESCRIPTION ITEMS 
			ANALYSIS.FN ANALYSIS.FN.NAME RESET.FN RESET.FN.NAME)
          (SETQ EXAMPLE.ITEM (ACQUIRE.ITEM CURRENT.FRAME "Indicate the example item"))
          (COND
	    ((NULL EXAMPLE.ITEM))
	    (T (SETQ PROTOTYPE.ITEM (ACQUIRE.ITEM CURRENT.FRAME "Indicate the prototype item"))
	       (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Defining new item type with name: ")
	       (SETQ NEW.NAME (PROMPT.READ))
	       (COND
		 ((NULL NEW.NAME)
		   (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS " ... create aborted.")
		   (RETURN))
		 ((NOT (ATOM NEW.NAME))
		   (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Name must be one word")
		   (RETURN))
		 ((MEMBER NEW.NAME ITEM.TYPES)
		   (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "The name " NEW.NAME " is already in use")
		   (RETURN))
		 (T (THINKING (RESET.ITEM EXAMPLE.ITEM)
			      (ANALYZE.ITEM EXAMPLE.ITEM)
			      [SETQ NEW.DESCRIPTION (COND
				  (PROTOTYPE.ITEM (MAKE.ITEMTYPE.DESCRIPTION.PROTOTYPE NEW.NAME 
										     EXAMPLE.ITEM 
										   PROTOTYPE.ITEM))
				  (T (MAKE.ITEMTYPE.DESCRIPTION.NO.PROTOTYPE NEW.NAME EXAMPLE.ITEM]
			      (RESET.ITEM EXAMPLE.ITEM)
			      (ANALYZE&COMPLETE.ITEM EXAMPLE.ITEM)
			      (REGISTER.ITEM.TYPE NEW.NAME NEW.DESCRIPTION)
			      (MARK.ITEM.TYPE NEW.NAME T)
			      (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Item type " NEW.NAME " created")
			      (UPDATE&DISPLAY.FRAME FRAME))
		    (RETURN NEW.NAME])

(DELETE.ITEM.TYPE
  [LAMBDA (DIALOG.NAME)                                      (* HaKo "16-Aug-84 14:57")
    (PROG ((ITYPE (ACQUIRE.ITEM.TYPE)))
          (COND
	    ((NULL ITYPE))
	    ((NOT (CONFIRM (CONCAT "Delete item type " ITYPE "?")))
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Delete item type command aborted"))
	    (T (UNREGISTER.ITEM.TYPE ITYPE)
	       (UNMARKASCHANGED ITYPE (QUOTE ITEMTYPES))
	       (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Item type " ITYPE " deleted"])

(EDIT.ITEM.TYPE
  [LAMBDA NIL                                                (* HK "15-JUL-82 16:02")
    (PROG ((ITYPE (ACQUIRE.ITEM.TYPE)))
          (COND
	    (ITYPE (EDIT.ITEM.TYPE.DESCRIPTION ITYPE)
		   (RETURN ITYPE])

(EDIT.ITEM.TYPE.DESCRIPTION
  [LAMBDA (ITYPE)                                            (* DAHJr " 5-DEC-83 12:23")
    (COND
      ((KEYDOWNP (QUOTE LSHIFT))
	(ITEM.TYPE.WINDOW.CREATE ITYPE))
      (T (PROG (STARTING.DESCRIPTION NEW.DESCRIPTION)
	       (SETQ STARTING.DESCRIPTION (ITEM.TYPE.DESCRIPTION ITYPE))
	       (SETQ NEW.DESCRIPTION (COPYALL STARTING.DESCRIPTION))
	       (SETQ NEW.DESCRIPTION (DEDIT.FORM NEW.DESCRIPTION))
	       (COND
		 ((NOT (EQUAL NEW.DESCRIPTION STARTING.DESCRIPTION))
		   (MODIFY.ITEM.TYPE ITYPE STARTING.DESCRIPTION NEW.DESCRIPTION)
		   (RETURN ITYPE))
		 (T (RETURN])

(EDIT.ITEM.TYPES
  [LAMBDA NIL                                                (* kkm "19-Nov-84 16:00")
                                                             (* DAHJr " 8-APR-83 12:12")
                                                             (* "Top level of the editor")
    (do (SELECTQ (MENU (GET.ITEM.TYPE.EDITOR.COMMAND.MENU))
		 (NIL NIL)
		 (CREATE.NEW.ITEM.TYPE (CREATE.ITEM.TYPE))
		 (COPY.ITEM.TYPE (COPY.ITEM.TYPE))
		 (EDIT.ITEM.TYPE (EDIT.ITEM.TYPE))
		 (DELETE.ITEM.TYPE (DELETE.ITEM.TYPE))
		 (SPECIALIZE.ITEM.TYPE (SPECIALIZE.ITEM.TYPE))
		 (PRINT.ITEM.TYPES (PRINT.ITEM.TYPES))
		 (COMPILE.ITEMTYPE.FNS (COMPILE.INTERNAL.FNS))
		 (GRAPH.ITEM.TYPES (GRAPH.ITEM.TYPES))
		 (QUIT (RETURN NIL))
		 (SHOULDNT])

(GET.DEFINE.ITEM.TYPE.COMMAND.MENU
  [LAMBDA NIL                                                (* edited: "22-Jun-84 17:42")
                                                             (* WHEN MENU CHANGES EVAL: (SETQ 
							     DEFINE.ITEM.TYPE.COMMAND.MENU NIL))
    (DECLARE (GLOBALVARS DEFINE.ITEM.TYPE.COMMAND.MENU))
    (OR DEFINE.ITEM.TYPE.COMMAND.MENU (SETQ DEFINE.ITEM.TYPE.COMMAND.MENU
	  (create MENU
		  ITEMS ←(QUOTE (LEAST.GENERAL FROM.PROTOTYPE MOST.GENERAL))
		  TITLE ← "Itemtype characterization"
		  CENTERFLG ← T
		  CHANGEOFFSETFLG ← T])

(GET.ITEM.TYPE.EDITOR.COMMAND.MENU
  [LAMBDA (FRAME)                                            (* kkm "19-Nov-84 16:00")
                                                             (* DAHJr "17-FEB-83 11:56")
    (DECLARE (GLOBALVARS ITEM.TYPE.EDITOR.COMMAND.MENU))
    (OR ITEM.TYPE.EDITOR.COMMAND.MENU (SETQ ITEM.TYPE.EDITOR.COMMAND.MENU
	  (create MENU
		  TITLE ← "Item type editor"
		  ITEMS ←(QUOTE (CREATE.NEW.ITEM.TYPE COPY.ITEM.TYPE SPECIALIZE.ITEM.TYPE 
						      EDIT.ITEM.TYPE DELETE.ITEM.TYPE 
						      PRINT.ITEM.TYPES COMPILE.ITEMTYPE.FNS 
						      GRAPH.ITEM.TYPES QUIT))
		  CENTERFLG ← T
		  CHANGEOFFSETFLG ← T])

(GRAPH.ITEM.TYPES
  [LAMBDA NIL                                                (* DAHJr "16-JAN-83 15:09")
    (DECLARE (GLOBALVARS ITEM.TYPE.GRAPH.WINDOW ITEM.TYPES))
    (COND
      [(OR (NULL ITEM.TYPE.GRAPH.WINDOW)
	   (WINDOWPROP ITEM.TYPE.GRAPH.WINDOW (QUOTE OBSOLETE)))
	(THINKING (PROG ((DESTINATIONS (for ITYPE in ITEM.TYPES join (LIST ITYPE 0)))
			 NODES ROOTS GRAPH)
		        (SETQ NODES (for ITYPE in ITEM.TYPES bind SONS
				       collect [SETQ SONS (INTERSECTION ITEM.TYPES
									(REVERSE (OFFSPRING ITYPE]
					       [for SON in SONS
						  do (LISTPUT DESTINATIONS SON
							      (ADD1 (LISTGET DESTINATIONS SON]
					       (create GRAPHNODE
						       NODEID ← ITYPE
						       NODELABEL ← ITYPE
						       TONODES ← SONS)))
		        (SETQ ROOTS (for ITYPE in ITEM.TYPES when (NEQ (LISTGET DESTINATIONS ITYPE)
								       1)
				       collect ITYPE))
		        (SETQ GRAPH (LAYOUTFOREST NODES (REVERSE ROOTS)
						  (QUOTE HORIZONTAL)
						  (QUOTE NOT/LEAVES)))
		        (SETQ ITEM.TYPE.GRAPH.WINDOW (SHOWGRAPH GRAPH ITEM.TYPE.GRAPH.WINDOW
								(QUOTE GRAPH.LEFTBUTTONFN)
								(QUOTE GRAPH.MIDDLEBUTTONFN)))
		        (WINDOWPROP ITEM.TYPE.GRAPH.WINDOW (QUOTE CURSORINFN)
				    (QUOTE GRAPH.WINDOW.CURSORINFN))
		        (RETURN T]
      (T (TOTOPW ITEM.TYPE.GRAPH.WINDOW)
	 NIL])

(MAKE.ITEMTYPE.DESCRIPTION.FROM.PROTOTYPE
  [LAMBDA (NEW.NAME EXAMPLE.ITEM PROTOTYPE.ITEM)             (* HaKo " 7-Aug-84 12:42")
    (PROG (ITEMS OLD.ITYPE OLD.DESCRIPTION OLD.PARAMETERS PROTOTYPE.BB PROTOTYPE.LEFT 
		 PROTOTYPE.BOTTOM PARAMETERS PLACEMENT.PARAMETER PTYPE TRANSLATE.FN PLACEMENT.NAME 
		 PNAME PTYPE TR.FN PLACEMENT.VALUE PLACEMENT.POSITION PDX PDY TRANSLATE.FN 
		 SUBITEM.SPECS NEW.DESCRIPTION DX DY)
          (SETQ ITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))
          (SETQ OLD.ITYPE (ITEM.TYPE PROTOTYPE.ITEM))
          (SETQ OLD.DESCRIPTION (ITEM.TYPE.DESCRIPTION OLD.ITYPE))
          (SETQ OLD.PARAMETERS (GET.FIELDQ OLD.DESCRIPTION PARAMETERS))
          (SETQ PROTOTYPE.BB (BOUNDING.BOX PROTOTYPE.ITEM))
          (SETQ PROTOTYPE.LEFT (fetch (REGION LEFT) of PROTOTYPE.BB))
          (SETQ PROTOTYPE.BOTTOM (fetch (REGION BOTTOM) of PROTOTYPE.BB))
          [SETQ PARAMETERS (for PARAMETER in OLD.PARAMETERS
			      collect (SETQ PNAME (GET.FIELDQ PARAMETER NAME))
				      (ITEM.CREATE PARAMETER (NAME PNAME)
						   (TYPE (COPYALL (GET.FIELDQ PARAMETER TYPE)))
						   (DEFAULT (COPYALL (GET.PARAM PROTOTYPE.ITEM PNAME))
							    )
						   (COMMENT (COPYALL (GET.FIELDQ PARAMETER COMMENT]
          [SETQ PLACEMENT.PARAMETER (for PARAMETER in OLD.PARAMETERS
				       thereis (SETQ PTYPE (GET.FIELDQ PARAMETER TYPE))
					       (SETQ TRANSLATE.FN (FUNCTION.FOR.PTYPE (CAR PTYPE)
										      (QUOTE 
											TRANSLATE]
          [COND
	    (PLACEMENT.PARAMETER (SETQ PLACEMENT.NAME (GET.FIELDQ PLACEMENT.PARAMETER NAME))
				 (SETQ PLACEMENT.VALUE (GET.PARAM PROTOTYPE.ITEM PLACEMENT.NAME))
				 (SETQ PLACEMENT.POSITION (APPLY* TRANSLATE.FN PLACEMENT.VALUE))
				 (SETQ DX (IDIFFERENCE (fetch (POSITION XCOORD) of PLACEMENT.POSITION)
						       PROTOTYPE.LEFT))
				 (SETQ DY (IDIFFERENCE (fetch (POSITION YCOORD) of PLACEMENT.POSITION)
						       PROTOTYPE.BOTTOM)))
	    (T (SETQ PLACEMENT.POSITION (create POSITION
						XCOORD ← 0
						YCOORD ← 0))
	       (SETQ PLACEMENT.PARAMETER (ITEM.CREATE PARAMETER (NAME (QUOTE PLACEMENT))
						      (TYPE (LIST (QUOTE POSITION)))
						      (DEFAULT PLACEMENT.POSITION)
						      (COMMENT "A reference point")))
	       (SETQ TRANSLATE.FN (FUNCTION.FOR.PTYPE (QUOTE POSITION)
						      (QUOTE TRANSLATE)))
	       (SETQ DX 0)
	       (SETQ DY 0)
	       (SETQ PARAMETERS (CONS PLACEMENT.PARAMETER PARAMETERS]
          (SETQ SUBITEM.SPECS (MAKE.SUBITEM.SPECS.FROM.PROTOTYPE PARAMETERS PLACEMENT.PARAMETER 
								 TRANSLATE.FN DX DY EXAMPLE.ITEM 
								 PROTOTYPE.ITEM))
          (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
					     (COMMENT (CONCAT "<A description of the item.type " 
							      NEW.NAME ">"))
					     (KIND (QUOTE COMPOSITE))
					     (PARAMETERS PARAMETERS)
					     (CLASSES (GET.FIELDQ OLD.DESCRIPTION CLASSES))
					     (SUBITEM.SPECS SUBITEM.SPECS)))
          (RETURN NEW.DESCRIPTION])

(MAKE.ITEMTYPE.DESCRIPTION.LEAST.GENERAL
  [LAMBDA (NEW.NAME EXAMPLE.ITEM)                            (* edited: "23-Jun-84 17:21")
    (DECLARE (SPECVARS OLD.DESCRIPTION))
    (PROG (EXAMPLE.BB EXAMPLE.LEFT EXAMPLE.BOTTOM PLACEMENT.POSITION PLACEMENT.PARAMETER PDX PDY 
		      SUBITEM.SPECS NEW.DESCRIPTION)
          (SETQ EXAMPLE.BB (BOUNDING.BOX EXAMPLE.ITEM))
          (SETQ EXAMPLE.LEFT (fetch (REGION LEFT) of EXAMPLE.BB))
          (SETQ EXAMPLE.BOTTOM (fetch (REGION BOTTOM) of EXAMPLE.BB))
          (SETQ PLACEMENT.POSITION (create POSITION
					   XCOORD ← 0
					   YCOORD ← 0))      (* OFFSET OF REFERENCE POSITION RELATIVE TO THE 
							     LEFT-BOTTOM OF THE BOUNDING BOX)
          (SETQ PLACEMENT.PARAMETER (ITEM.CREATE PARAMETER (NAME (QUOTE PLACEMENT))
						 (TYPE (LIST (QUOTE POSITION)))
						 (DEFAULT PLACEMENT.POSITION)
						 (COMMENT "A reference point")))
                                                             (* OFFSET FROM ORIGIN OF REFERENCE POSITION)
          (SETQ PDX (IPLUS (fetch (POSITION XCOORD) of PLACEMENT.POSITION)
			   EXAMPLE.LEFT))
          (SETQ PDY (IPLUS (fetch (POSITION YCOORD) of PLACEMENT.POSITION)
			   EXAMPLE.BOTTOM))
          (SETQ SUBITEM.SPECS (MAKE.SUBITEM.SPECS.LEAST.GENERAL EXAMPLE.ITEM PLACEMENT.PARAMETER PDX 
								PDY))
          (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
					     (COMMENT (CONCAT "<A description of the item.type " 
							      NEW.NAME ">"))
					     (KIND (QUOTE COMPOSITE))
					     (PARAMETERS (LIST PLACEMENT.PARAMETER))
					     (CLASSES (GET.FIELDQ OLD.DESCRIPTION CLASSES))
					     (SUBITEM.SPECS SUBITEM.SPECS)))
          (RETURN NEW.DESCRIPTION])

(MAKE.ITEMTYPE.DESCRIPTION.MOST.GENERAL
  [LAMBDA (NEW.NAME EXAMPLE.ITEM)                            (* HaKo "27-Jul-84 16:49")
    (PROG (ITEMS ITEM.NAMES PARAMETER.NAMES SUBITEM.SPECS ITEM ITYPE PARAMETERS NEW.DESCRIPTION)
          (SETQ ITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))    (* GETS A LIST OF (ITEM NAME))
          (SETQ ITEM.NAMES (MAKE.ITEM.NAMES ITEMS))          (* GETS A LIST OF (ITEM NAME 
							     (LIST OF (PARAMETER NAME))))
          (SETQ PARAMETER.NAMES (MAKE.PARAMETER.NAMES ITEM.NAMES))
          [SETQ SUBITEM.SPECS (for ITM in PARAMETER.NAMES
				 collect (SETQ ITEM (CAR ITM))
					 (SETQ ITYPE (ITEM.TYPE ITEM))
					 (BQUOTE (ITEM , ITYPE ,. (for PAR in (CADDR ITM)
								     collect
								      (LIST (GET.FIELDQ (CAR PAR)
											NAME)
									    (CDR PAR]
          [SETQ PARAMETERS (for ITM in PARAMETER.NAMES
			      join (for PAR in (CADDR ITM)
				      collect (ITEM.CREATE PARAMETER (NAME (CDR PAR))
							   (TYPE (COPYALL (GET.FIELDQ (CAR PAR)
										      TYPE)))
							   [DEFAULT
							     (COPYALL (GET.PARAM (CAR ITM)
										 (GET.FIELDQ
										   (CAR PAR)
										   NAME]
							   (COMMENT (COPYALL (GET.FIELDQ
									       (CAR PAR)
									       COMMENT]
          (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
					     (KIND (QUOTE COMPOSITE))
					     (COMMENT (CONCAT "<A description of the item.type " 
							      NEW.NAME ">"))
					     (PARAMETERS PARAMETERS)
					     (SUBITEM.SPECS SUBITEM.SPECS)))
          (RETURN NEW.DESCRIPTION])

(MAKE.ITEMTYPE.DESCRIPTION.NO.PROTOTYPE
  [LAMBDA (NEW.NAME EXAMPLE.ITEM)                            (* HaKo "27-Jul-84 16:49")
    (PROG (ITEMS ITEM.NAMES PARAMETER.NAMES SUBITEM.SPECS ITEM ITYPE PARAMETERS NEW.DESCRIPTION)
          (SETQ ITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))    (* GETS A LIST OF ITEM/NAME PAIRS)
          (SETQ ITEM.NAMES (MAKE.ITEM.NAMES ITEMS))          (* GETS A LIST OF (ITEM NAME 
							     (LIST OF PARAMETER/NAME PAIRS)))
          (SETQ PARAMETER.NAMES (MAKE.PARAMETER.NAMES ITEM.NAMES))
          [SETQ SUBITEM.SPECS (for ITM in PARAMETER.NAMES
				 collect (SETQ ITEM (CAR ITM))
					 (SETQ ITYPE (ITEM.TYPE ITEM))
					 (BQUOTE (ITEM , ITYPE ,. (for PAR in (CADDR ITM)
								     collect
								      (LIST (GET.FIELDQ (CAR PAR)
											NAME)
									    (CDR PAR]
          [SETQ PARAMETERS (for ITM in PARAMETER.NAMES
			      join (for PAR in (CADDR ITM)
				      collect (ITEM.CREATE PARAMETER (NAME (CDR PAR))
							   (TYPE (COPYALL (GET.FIELDQ (CAR PAR)
										      TYPE)))
							   [DEFAULT
							     (COPYALL (GET.PARAM (CAR ITM)
										 (GET.FIELDQ
										   (CAR PAR)
										   NAME]
							   (COMMENT (COPYALL (GET.FIELDQ
									       (CAR PAR)
									       COMMENT]
          (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
					     (KIND (QUOTE COMPOSITE))
					     (COMMENT (CONCAT "<A description of the item.type " 
							      NEW.NAME ">"))
					     (PARAMETERS PARAMETERS)
					     (SUBITEM.SPECS SUBITEM.SPECS)))
          (RETURN NEW.DESCRIPTION])

(MAKE.ITEMTYPE.DESCRIPTION.PROTOTYPE
  [LAMBDA (NEW.NAME EXAMPLE.ITEM PROTOTYPE.ITEM)             (* HaKo "27-Jul-84 16:50")
    (PROG (ITEMS OLD.ITYPE OLD.DESCRIPTION OLD.PARAMETERS PLACEMENT.PARAMETER PTYPE TRANSLATE.FN 
		 PLACEMENT.NAME PROTOTYPE.BB DX DY PNAME PTYPE TR.FN PLACEMENT.VALUE 
		 PLACEMENT.POSITION PARAMETERS PDX PDY TRANSLATE.FN SUBITEM.SPECS NEW.DESCRIPTION)
          (SETQ ITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))
          (SETQ OLD.ITYPE (ITEM.TYPE PROTOTYPE.ITEM))
          (SETQ OLD.DESCRIPTION (ITEM.TYPE.DESCRIPTION OLD.ITYPE))
          (SETQ OLD.PARAMETERS (GET.FIELDQ OLD.DESCRIPTION PARAMETERS))
          [SETQ PLACEMENT.PARAMETER (for PARAMETER in OLD.PARAMETERS
				       thereis (SETQ PTYPE (GET.FIELDQ PARAMETER TYPE))
					       (SETQ TRANSLATE.FN (FUNCTION.FOR.PTYPE (CAR PTYPE)
										      (QUOTE 
											TRANSLATE]
          (COND
	    (PLACEMENT.PARAMETER (SETQ PLACEMENT.NAME (GET.FIELDQ PLACEMENT.PARAMETER NAME))
				 (SETQ PROTOTYPE.BB (BOUNDING.BOX PROTOTYPE.ITEM))
				 (SETQ DX (fetch (REGION LEFT) of PROTOTYPE.BB))
				 (SETQ DY (fetch (REGION BOTTOM) of PROTOTYPE.BB)))
	    (T (SETQ DX 0)
	       (SETQ DY 0)))
          [SETQ PARAMETERS (for PARAMETER in OLD.PARAMETERS
			      collect (SETQ PNAME (GET.FIELDQ PARAMETER NAME))
				      (SETQ PTYPE (GET.FIELDQ PARAMETER TYPE))
				      [SETQ TR.FN (COND
					  ((NLISTP PTYPE)
					    NIL)
					  (T (FUNCTION.FOR.PTYPE (CAR PTYPE)
								 (QUOTE TRANSLATE]
				      (ITEM.CREATE PARAMETER (NAME PNAME)
						   (TYPE (COPYALL PTYPE))
						   [DEFAULT (COND
							      (TR.FN (APPLY* TR.FN (GET.PARAM 
										   PROTOTYPE.ITEM 
											    PNAME)
									     (MINUS DX)
									     (MINUS DY)))
							      (T (COPYALL (GET.PARAM PROTOTYPE.ITEM 
										     PNAME]
						   (COMMENT (COPYALL (GET.FIELDQ PARAMETER COMMENT]
          [COND
	    (PLACEMENT.PARAMETER (SETQ PLACEMENT.VALUE (GET.PARAM PROTOTYPE.ITEM PLACEMENT.NAME))
				 (SETQ PLACEMENT.POSITION (APPLY* TRANSLATE.FN PLACEMENT.VALUE)))
	    (T (SETQ PLACEMENT.POSITION (create POSITION
						XCOORD ← 0
						YCOORD ← 0))
	       (SETQ PLACEMENT.PARAMETER (ITEM.CREATE PARAMETER (NAME (QUOTE PLACEMENT))
						      (TYPE (LIST (QUOTE POSITION)))
						      (DEFAULT PLACEMENT.POSITION)
						      (COMMENT "A reference point")))
	       (SETQ PARAMETERS (CONS PLACEMENT.PARAMETER PARAMETERS))
	       (SETQ TRANSLATE.FN (FUNCTION.FOR.PTYPE (QUOTE POSITION)
						      (QUOTE TRANSLATE]
          (SETQ PDX (IDIFFERENCE (fetch (POSITION XCOORD) of PLACEMENT.POSITION)
				 DX))
          (SETQ PDY (IDIFFERENCE (fetch (POSITION YCOORD) of PLACEMENT.POSITION)
				 DY))
          (SETQ SUBITEM.SPECS (MAKE.SUBITEM.SPECS PARAMETERS PLACEMENT.PARAMETER TRANSLATE.FN PDX PDY 
						  EXAMPLE.ITEM PROTOTYPE.ITEM))
          (SETQ NEW.DESCRIPTION (ITEM.CREATE ITEM.TYPE (NAME NEW.NAME)
					     (COMMENT (CONCAT "<A description of the item.type " 
							      NEW.NAME ">"))
					     (KIND (QUOTE COMPOSITE))
					     (PARAMETERS PARAMETERS)
					     (CLASSES (GET.FIELDQ OLD.DESCRIPTION CLASSES))
					     (SUBITEM.SPECS SUBITEM.SPECS)))
          (RETURN NEW.DESCRIPTION])

(MAKE.PARAMETER.NAMES
  [LAMBDA (ITEM.NAMES)                                       (* DAHJr " 9-OCT-83 14:59")
                                                             (* RETURNS A LIST OF (ITEM NAME 
							     (LIST OF PARAMETER/NAME PAIRS)))
    (for AELEM in ITEM.NAMES bind ITEM ITYPE DESCRIPTION NAME (SIMPLE ←(EQ (LENGTH ITEM.NAMES)
									   1))
       collect (SETQ ITEM (CAR AELEM))
	       (SETQ ITYPE (ITEM.TYPE ITEM))
	       (SETQ DESCRIPTION (ITEM.TYPE.DESCRIPTION ITYPE))
	       (SETQ NAME (CDR AELEM))
	       (LIST ITEM NAME (for PARAMETER in (GET.FIELDQ DESCRIPTION PARAMETERS)
				  collect (CONS PARAMETER (COND
						  (SIMPLE (GET.FIELDQ PARAMETER NAME))
						  (T (MKATOM (CONCAT NAME (GET.FIELDQ PARAMETER NAME])

(MAKE.SUBITEM.SPECS
  [LAMBDA (PARAMETERS PLACEMENT.PARAMETER TRANSLATE.FN XOFFSET YOFFSET EXAMPLE.ITEM PROTOTYPE.ITEM)
                                                             (* HaKo "27-Jul-84 16:51")
    (PROG (ITEMS EXAMPLE.BB DX DY PLACEMENT.PARAMETER.NAME PNAME ITYPE DESCR PARS VALUE PTYPE TR.FN 
		 VALUE.EXPR AT.ORIGIN SAME.VALUE.PARAMETER)
          (SETQ ITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))
          (SETQ EXAMPLE.BB (BOUNDING.BOX EXAMPLE.ITEM))
          (SETQ DX (IDIFFERENCE XOFFSET (fetch (REGION LEFT) of EXAMPLE.BB)))
          (SETQ DY (IDIFFERENCE YOFFSET (fetch (REGION BOTTOM) of EXAMPLE.BB)))
          (SETQ PLACEMENT.PARAMETER.NAME (GET.FIELDQ PLACEMENT.PARAMETER NAME))
          (RETURN (for ITEM in ITEMS
		     collect
		      (SETQ ITYPE (ITEM.TYPE ITEM))
		      (SETQ DESCR (ITEM.TYPE.DESCRIPTION ITYPE))
		      (SETQ PARS (GET.FIELDQ DESCR PARAMETERS))
		      (BQUOTE (ITEM , ITYPE ,.
				    (for PAR in PARS
				       when [PROGN (SETQ PNAME (GET.FIELDQ PAR NAME))
						   (SETQ PTYPE (GET.FIELDQ PAR TYPE))
						   (SETQ VALUE (GET.PARAM ITEM PNAME))
						   [SETQ SAME.VALUE.PARAMETER
						     (for PARAMETER in PARAMETERS
							thereis (AND (EQUAL (GET.FIELDQ PARAMETER 
											TYPE)
									    PTYPE)
								     (EQUAL (GET.PARAM PROTOTYPE.ITEM
										       (GET.FIELDQ
											 PARAMETER 
											 NAME))
									    VALUE]
						   (OR SAME.VALUE.PARAMETER (SETQ VALUE
							 (LISTGET ITEM PNAME]
				       collect [SETQ VALUE.EXPR
						 (COND
						   (SAME.VALUE.PARAMETER (GET.FIELDQ 
									     SAME.VALUE.PARAMETER 
										     NAME))
						   (T [SETQ TR.FN (COND
							  ((NLISTP PTYPE)
							    NIL)
							  (T (FUNCTION.FOR.PTYPE (CAR PTYPE)
										 (QUOTE TRANSLATE]
						      (COND
							(TR.FN (SETQ AT.ORIGIN
								 (APPLY* TR.FN VALUE DX DY))
							       (LIST TR.FN (KWOTE AT.ORIGIN)
								     PLACEMENT.PARAMETER.NAME))
							(T (BQUOTE (COPY , (KWOTE (COPYALL VALUE]
					       (LIST PNAME VALUE.EXPR])

(MAKE.SUBITEM.SPECS.FROM.PROTOTYPE
  [LAMBDA (PARAMETERS PLACEMENT.PARAMETER TRANSLATE.FN XOFFSET YOFFSET EXAMPLE.ITEM PROTOTYPE.ITEM)
                                                             (* HaKo "27-Jul-84 17:16")
    (PROG (SUBITEMS EXAMPLE.BB DX DY PLACEMENT.PARAMETER.NAME PNAME ITYPE DESCR PARS VALUE PTYPE 
		    TR.FN VALUE.EXPR AT.ORIGIN SAME.VALUE.PARAMETER)
          (SETQ SUBITEMS (GET.FIELDQ EXAMPLE.ITEM SUBITEMS))
          (SETQ EXAMPLE.BB (BOUNDING.BOX EXAMPLE.ITEM))
          [SETQ DX (IMINUS (IPLUS XOFFSET (fetch (REGION LEFT) of EXAMPLE.BB]
          [SETQ DY (IMINUS (IPLUS YOFFSET (fetch (REGION BOTTOM) of EXAMPLE.BB]
          (SETQ PLACEMENT.PARAMETER.NAME (GET.FIELDQ PLACEMENT.PARAMETER NAME))
          (RETURN (for ITEM in SUBITEMS
		     collect
		      (SETQ ITYPE (ITEM.TYPE ITEM))
		      (SETQ DESCR (ITEM.TYPE.DESCRIPTION ITYPE))
		      (SETQ PARS (GET.FIELDQ DESCR PARAMETERS))
		      (BQUOTE (ITEM , ITYPE ,.
				    (for PAR in PARS
				       when [PROGN (SETQ PNAME (GET.FIELDQ PAR NAME))
						   (SETQ PTYPE (GET.FIELDQ PAR TYPE))
						   (SETQ VALUE (GET.PARAM ITEM PNAME))
						   [SETQ SAME.VALUE.PARAMETER
						     (for PARAMETER in PARAMETERS
							thereis (AND (EQUAL (GET.FIELDQ PARAMETER 
											TYPE)
									    PTYPE)
								     (EQUAL (GET.PARAM PROTOTYPE.ITEM
										       (GET.FIELDQ
											 PARAMETER 
											 NAME))
									    VALUE]
						   (OR SAME.VALUE.PARAMETER (SETQ VALUE
							 (GET.FIELD ITEM PNAME]
				       collect [SETQ VALUE.EXPR
						 (COND
						   (SAME.VALUE.PARAMETER (GET.FIELDQ 
									     SAME.VALUE.PARAMETER 
										     NAME))
						   (T [SETQ TR.FN (COND
							  ((NLISTP PTYPE)
							    NIL)
							  (T (FUNCTION.FOR.PTYPE (CAR PTYPE)
										 (QUOTE TRANSLATE]
						      (COND
							(TR.FN (SETQ AT.ORIGIN
								 (APPLY* TR.FN VALUE DX DY))
							       (LIST TR.FN (KWOTE AT.ORIGIN)
								     (LIST TRANSLATE.FN 
									 PLACEMENT.PARAMETER.NAME)))
							(T (BQUOTE (COPY , (KWOTE (COPYALL VALUE]
					       (LIST PNAME VALUE.EXPR])

(MAKE.SUBITEM.SPECS.LEAST.GENERAL
  [LAMBDA (EXAMPLE.ITEM PLACEMENT.PARAMETER XOFFSET YOFFSET)
                                                             (* HaKo "27-Jul-84 17:16")
    (PROG (EXAMPLE.BB PLACEMENT.PARAMETER.NAME DX DY ITYPE DESCR PARS PNAME PTYPE VALUE TR.FN 
		      VALUE.EXPR AT.ORIGIN)
          (SETQ PLACEMENT.PARAMETER.NAME (GET.FIELDQ PLACEMENT.PARAMETER NAME))
          (SETQ DX (MINUS XOFFSET))
          (SETQ DY (MINUS YOFFSET))
          (RETURN (for ITEM in (GET.FIELDQ EXAMPLE.ITEM SUBITEMS)
		     collect (SETQ ITYPE (ITEM.TYPE ITEM))
			     (SETQ DESCR (ITEM.TYPE.DESCRIPTION ITYPE))
			     (SETQ PARS (GET.FIELDQ DESCR PARAMETERS))
			     (BQUOTE (ITEM , ITYPE ,.
					   (for PAR in PARS when (PROGN (SETQ PNAME (GET.FIELDQ
									    PAR NAME))
									(SETQ PTYPE (GET.FIELDQ
									    PAR TYPE))
									(SETQ VALUE (GET.FIELD ITEM 
											    PNAME)))
					      collect [SETQ TR.FN (COND
							  ((NLISTP PTYPE)
							    NIL)
							  (T (FUNCTION.FOR.PTYPE (CAR PTYPE)
										 (QUOTE TRANSLATE]
						      [SETQ VALUE.EXPR
							(COND
							  (TR.FN (SETQ AT.ORIGIN
								   (APPLY* TR.FN VALUE DX DY))
								 (LIST TR.FN (KWOTE AT.ORIGIN)
								       PLACEMENT.PARAMETER.NAME))
							  (T (BQUOTE (COPY , (KWOTE (COPYALL VALUE]
						      (LIST PNAME VALUE.EXPR])

(MISSING.ITYPE.FN
  [LAMBDA (ITEM FNNAME)                                      (* HaKo "26-Jul-84 15:14")
    (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "No " FNNAME " function for item of type " (ITEM.TYPE
			 ITEM])

(MARK.ITEM.TYPE
  [LAMBDA (ITYPE NEW)                                        (* HaKo "16-Aug-84 14:58")
    (DECLARE (GLOBALVARS TRILLIUM.MARKFLG))
    (PROG ((TYPE (QUOTE ITEMTYPES)))
          (COND
	    ((NULL TRILLIUM.MARKFLG))
	    ((MARKASCHANGEDP ITYPE TYPE))
	    (T (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Marking item type " ITYPE " as changed")
	       (MARKASCHANGED ITYPE TYPE NEW])

(MODIFY.ITEM.TYPE
  [LAMBDA (ITYPE OLD.DESCRIPTION NEW.DESCRIPTION)            (* DAHJr " 9-OCT-83 16:03")
    (DECLARE (GLOBALVARS ITEM.TYPE.GRAPH.WINDOW))
    (THINKING (UNREGISTER.ITEM.TYPE ITYPE)
	      (REGISTER.ITEM.TYPE ITYPE NEW.DESCRIPTION)
	      (MARK.ITEM.TYPE ITYPE)
	      (COND
		[(OR (NULL ITEM.TYPE.GRAPH.WINDOW)
		     (EQUAL (OFFSPRING.OF.DESCRIPTION OLD.DESCRIPTION)
			    (OFFSPRING.OF.DESCRIPTION NEW.DESCRIPTION]
		(T (GRAY.WINDOW ITEM.TYPE.GRAPH.WINDOW)
		   (WINDOWPROP ITEM.TYPE.GRAPH.WINDOW (QUOTE OBSOLETE)
			       T])

(PARAMETER.NAMES
  [LAMBDA (DESCRIPTION)                                      (* DAHJr "23-JUN-83 17:43")
    (for PARAMETER in (CDR (GET.FIELDQ DESCRIPTION PARAMETERS ITEM.TYPE)) collect (GET.FIELDQ 
											PARAMETER 
											     NAME])

(PRINT.ITEM.TYPE
  [LAMBDA (ITYPE)                                            (* HaKo "16-Aug-84 14:58")
    (PROG (PARAMETER.NAMES FIELD.NAMES)
          (TRILLIUM.PRINTOUT ON TRILLIUM.DESCRIPTIONS "Item type: " ITYPE)
          (SETQ PARAMETER.NAMES (ITEM.TYPE.PARAMETER.NAMES ITYPE))
          (for PARAMETER.NAME in PARAMETER.NAMES do (TRILLIUM.PRINTOUT ON TRILLIUM.DESCRIPTIONS "  " 
								       PARAMETER.NAME))
          (RETURN])

(REDEFINE.ITEM.TYPE
  [LAMBDA (ITYPE NEW.DESCRIPTION)
    (UNINSTALL.ITEM.TYPE ITYPE)
    (SET.ITEM.TYPE.DESCRIPTION ITYPE NEW.DESCRIPTION)
    (INSTALL.ITEM.TYPE ITYPE])

(SPECIALIZE.ITEM.TYPE
  [LAMBDA NIL                                                (* HaKo "16-Aug-84 14:59")
    (DECLARE (GLOBALVARS ITEM.TYPES))
    (PROG (ITYPE NEW.ITYPE DESCRIPTION NEW.DESCRIPTION)
          (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Indicate item type to be specialized")
          (OR (SETQ ITYPE (ACQUIRE.ITEM.TYPE))
	      (RETURN))
          (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Specializing item type " ITYPE)
          (TRILLIUM.PRINTOUT ON PROMPTWINDOW "Name of new item type: ")
          (SETQ NEW.ITYPE (PROMPT.READ))
          (COND
	    ((NULL NEW.ITYPE)
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Specialize command aborted")
	      (RETURN))
	    ((NOT (ATOM NEW.ITYPE))
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "Name must be one word")
	      (RETURN))
	    ((MEMBER NEW.ITYPE ITEM.TYPES)
	      (TRILLIUM.PRINTOUT ON TRILLIUM.WARNINGS "The name " NEW.ITYPE " is already in use")
	      (RETURN))
	    (T (SETQ DESCRIPTION (ITEM.TYPE.DESCRIPTION ITYPE))
	       (SETQ NEW.DESCRIPTION (COPYALL DESCRIPTION))
	       (SET.FIELDQ NEW.DESCRIPTION NAME NEW.ITYPE ITEM.TYPE)
	       (SET.FIELDQ NEW.DESCRIPTION SUBITEM.SPECS [LIST (NCONC (LIST (QUOTE ITEM)
									    ITYPE)
								      (for PARAMETER
									 in (GET.FIELDQ DESCRIPTION 
										       PARAMETERS 
											ITEM.TYPE)
									 bind PNAME
									 collect (SETQ PNAME
										   (GET.FIELDQ 
											PARAMETER 
											     NAME))
										 (LIST PNAME PNAME]
			   ITEM.TYPE)
	       (REGISTER.ITEM.TYPE NEW.ITYPE NEW.DESCRIPTION)
	       (MARK.ITEM.TYPE NEW.ITYPE T)
	       (TRILLIUM.PRINTOUT ON TRILLIUM.TRACE "Item type " NEW.ITYPE " created")
	       (RETURN NEW.ITYPE])
)

(RPAQQ ITEM.TYPE.MENU NIL)

(RPAQQ ITEM.TYPE.GRAPH.WINDOW NIL)

(RPAQQ ITEM.TYPE.EDITOR.COMMAND.MENU NIL)
(DECLARE: DONTCOPY
  (FILEMAP (NIL (1201 31984 (COPY.ITEM.TYPE 1211 . 2441) (CREATE.ITEM.TYPE 2443 . 3925) (
DEFINE.ITEM.TYPE 3927 . 5620) (DELETE.ITEM.TYPE 5622 . 6120) (EDIT.ITEM.TYPE 6122 . 6359) (
EDIT.ITEM.TYPE.DESCRIPTION 6361 . 6981) (EDIT.ITEM.TYPES 6983 . 7785) (
GET.DEFINE.ITEM.TYPE.COMMAND.MENU 7787 . 8373) (GET.ITEM.TYPE.EDITOR.COMMAND.MENU 8375 . 9036) (
GRAPH.ITEM.TYPES 9038 . 10441) (MAKE.ITEMTYPE.DESCRIPTION.FROM.PROTOTYPE 10443 . 13458) (
MAKE.ITEMTYPE.DESCRIPTION.LEAST.GENERAL 13460 . 15211) (MAKE.ITEMTYPE.DESCRIPTION.MOST.GENERAL 15213
 . 16835) (MAKE.ITEMTYPE.DESCRIPTION.NO.PROTOTYPE 16837 . 18467) (MAKE.ITEMTYPE.DESCRIPTION.PROTOTYPE 
18469 . 21723) (MAKE.PARAMETER.NAMES 21725 . 22515) (MAKE.SUBITEM.SPECS 22517 . 24608) (
MAKE.SUBITEM.SPECS.FROM.PROTOTYPE 24610 . 26761) (MAKE.SUBITEM.SPECS.LEAST.GENERAL 26763 . 28140) (
MISSING.ITYPE.FN 28142 . 28364) (MARK.ITEM.TYPE 28366 . 28771) (MODIFY.ITEM.TYPE 28773 . 29338) (
PARAMETER.NAMES 29340 . 29605) (PRINT.ITEM.TYPE 29607 . 30071) (REDEFINE.ITEM.TYPE 30073 . 30247) (
SPECIALIZE.ITEM.TYPE 30249 . 31982)))))
STOP