XPDTA2 ;SFISC/RWF -  Build Actions for Kernel Files Cont. ;08/09/2001  12:36
 ;;8.0;KERNEL;**201,498,672**;Jul 10, 1995;Build 28
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
 ;^XTMP("XPDT",XPDA,"KRN",XPDFILE,DA) is the global root
 ;DA=ien in ^XTMP,XPDNM=package name, XPDA=package ien in ^XPD(9.6,
 ;
PAR1E1 ;PARAMETER DEFINITION file 8989.51: entry post
 N XP,XP1,XP2,XP3,XP4,VP,PN,PT,ROOT
 S ROOT=$NA(^XTMP("XPDT",XPDA,"KRN"))
 D PAR51(DA) ;Handle the entry from 8989.51
 S PT=$S($E($G(^XTV(8989.51,DA,1)))="P":$P(^(1),U,2),1:"") ;Data Type & Value - check if pointer in for loop
 S:PT]"" PT=$S(PT:$$GR^XPDTA(PT),1:"") ;PT=file # of pointed to file from parm def.
 ;Now find any entrys in 8989.5 to transport, because we point to them
 S XP=0,XP3=$P(^XPD(9.6,XPDA,0),U,2),VP=XP3_";DIC(9.4,",PN=$$PT^XPDTA("^DIC(9.4)",XP3)
 Q:'XP3  ;No package file link
 F  S XP=$O(^XTV(8989.5,"AC",DA,VP,XP)),XP1=0 Q:'XP  D  ;Instance
 . F  S XP1=$O(^XTV(8989.5,"AC",DA,VP,XP,XP1)) Q:'XP1  D  ;entry
 . . M ^XTMP("XPDT",XPDA,"KRN",8989.5,XP1)=^XTV(8989.5,XP1)
 . . S XP3=^XTV(8989.5,XP1,0),XP4=$G(^(1)) ;param def.
 . . S $P(@ROOT@(8989.5,XP1,0),U,2)=$$PT^XPDTA("^XTV(8989.51)",$P(XP3,U,2))
 . . I PT]"",XP4>0 S $P(@ROOT@(8989.5,XP1,1),U)=$$PT^XPDTA(PT,XP4) ;Data Type pointer - resolve
 . . Q  ;Will redo the ENT at other end.
 Q
 ;
PAR51(DA) ;Fix one 8989.51 entry in transport global
 ;Called from both PAR1E1 and PAR2E1
 N XP,XP1,XP2,XP3,VP,PN,ROOT
 S ROOT=$NA(^XTMP("XPDT",XPDA,"KRN"))
 ;Don't bring X-ref
 K @ROOT@(8989.51,DA,30,"B"),^("AG")
 S XP=0
 ;Entries in the file will be maintained by Toolkit patches.
 Q
 ;
PAR2E1 ;PARAMETER file 8989.52 entry post
 N XP1,XP2,XP3,ROOT
 S ROOT=$NA(^XTMP("XPDT",XPDA,"KRN"))
 ;Resolve USE INSTANCE OF
 S XP2=$P(^XTV(8989.52,DA,0),U,4),XP3="" I XP2 S XP3=$$PT^XPDTA($NA(^XTV(8989.51)),XP2)
 I $L(XP3) S $P(@ROOT@(8989.52,DA,0),U,4)=XP3
 ;Resolve PARAMETERS
 S XP1=0 K ^XTMP("XPDT",XPDA,"KRN",8989.52,DA,10,"B") ;Drop X-ref
 F  S XP1=$O(^XTV(8989.52,DA,10,XP1)),XP3="" Q:'XP1  D
 . S XP2=$P(^XTV(8989.52,DA,10,XP1,0),U,2)
 . I XP2 S XP3=$$PT^XPDTA($NA(^XTV(8989.51)),XP2)
 . I '$L(XP3) K @ROOT@(8989.52,DA,10,XP1)
 . S $P(^XTMP("XPDT",XPDA,"KRN",8989.52,DA,10,XP1,0),U,2)=XP3
 . ;Now to move the entries this points to.
 . I '$D(@ROOT@(8989.51,XP2)) M @ROOT@(8989.51,XP2)=^XTV(8989.51,XP2) D PAR51(XP2)
 . Q
 Q
XULM ;XULM LOCK DICTIONARY file 8993
 N XP1,XP2
 ;resolve PACKAGE
 S XP1=$P($G(^XTMP("XPDT",XPDA,"KRN",8993,DA,1)),U)
 S:XP1 $P(^XTMP("XPDT",XPDA,"KRN",8993,DA,1),U)=$$PT^XPDTA("^DIC(9.4)",XP1)
 ;kill X-ref
 K ^XTMP("XPDT",XPDA,"KRN",8993,2,"B"),^XTMP("XPDT",XPDA,"KRN",8993,3,"B"),^("C")
 Q
 ;
ENT ;ENTITY file 1.5
 N %,%1
 ;Loop thru ITEM multiple and resolve ENTITY (0;8)
 S %1=0 F  S %1=$O(^XTMP("XPDT",XPDA,"KRN",1.5,DA,1,%1)) Q:'%1  S %=$G(^(%1,0)) D:$P(%,U,8)
 . S $P(%,U,8)=$$PT^XPDTA("^DDE",$P(%,U,8)),^XTMP("XPDT",XPDA,"KRN",1.5,DA,1,%1,0)=%
 Q
 ;
POL ;POLICY file 1.6
 N %,%1,%2
 ;if link, kill everything and just process the MEMBERS(10)
 I XPDFL=2 D  G POLM
 .S %1=0 F  S %1=$O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1)) Q:'%1  K:%1'=10 ^(%)
 .Q
 ;resolve ATTRIBUTE FUNCTION (0;4) and RESULT FUNCTION (0;7)
 S %=^XTMP("XPDT",XPDA,"KRN",1.6,DA,0) D  S ^XTMP("XPDT",XPDA,"KRN",1.6,DA,0)=%
 .F %1=4,7 S %2=$P(%,U,%1),$P(%,U,%1)=$$PT^XPDTA("^DIAC(1.62)",%2)
 .Q
 ;resolve DENY OBLIGATION (7) and PERMIT OBLIGATION (8)
 F %1=7,8 S %=$G(^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1)) D:$L(%)
 .S %2=$P(%,U),$P(%,U)=$$PT^XPDTA("^DIAC(1.62)",%2)
 .S ^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1)=%
 .Q
 ;kill under TAGETS (2) ^("B"),^("AKEY")
 I $O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,2,0)) K ^("B"),^("AKEY")
 ;check if CONDITIONS (3) are sent, if yes then kill ^("B") and process
 I $O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,0)) K ^("B") D
 .;loop thru and resolve FUNCTION (0;2)
 .S %1=0 F  S %1=$O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,%1)) Q:'%1  S %=$G(^(%1,0)) D
 ..S %2=$P(%,U,2) Q:'%2
 ..S $P(%,U,2)=$$PT^XPDTA("^DIAC(1.62)",%2)
 ..S ^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,%1,0)=%
 .Q
POLM ;loop thru 10=MEMEBERS and resolve MEMBER (0;1), kill if it doesn't resolve
 Q:'$O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,0))
 ;kill under MEMBERS (10), "B"=name, "AC"=SEQUENCE
 K ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,"B"),^("AC")
 S %1=0 F  S %1=$O(^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1)) Q:'%1  S %=$G(^(%1,0)) D
 .S %2=$$PT^XPDTA("^DIAC(1.6)",+%)
 .;MEMBER must also be sent by itself, check "B" x-ref, save text on U node
 .I $L(%2),$D(^XPD(9.6,XPDA,"KRN",1.6,"NM","B",%2)) S ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1,U)=%2 Q
 .K ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1)
 .Q
 Q
 ;
POLE ;EVENT #1.61
 N %,%1,%2
 S %=^XTMP("XPDT",XPDA,"KRN",1.61,DA,0)
 ;resolve POLICY (0;5)
 S %1=$P(%,U,5) Q:'%1
 S %2=$$PT^XPDTA("^DIAC(1.6)",%1),$P(%,U,5)=%2,^XTMP("XPDT",XPDA,"KRN",1.61,DA,0)=%
 Q
 ;
POLF ;FUNCTION #1.62
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXPDTA2   4932     printed  Sep 23, 2025@19:40:37                                                                                                                                                                                                      Page 2
XPDTA2    ;SFISC/RWF -  Build Actions for Kernel Files Cont. ;08/09/2001  12:36
 +1       ;;8.0;KERNEL;**201,498,672**;Jul 10, 1995;Build 28
 +2       ;Per VHA Directive 2004-038, this routine should not be modified.
 +3        QUIT 
 +4       ;^XTMP("XPDT",XPDA,"KRN",XPDFILE,DA) is the global root
 +5       ;DA=ien in ^XTMP,XPDNM=package name, XPDA=package ien in ^XPD(9.6,
 +6       ;
PAR1E1    ;PARAMETER DEFINITION file 8989.51: entry post
 +1        NEW XP,XP1,XP2,XP3,XP4,VP,PN,PT,ROOT
 +2        SET ROOT=$NAME(^XTMP("XPDT",XPDA,"KRN"))
 +3       ;Handle the entry from 8989.51
           DO PAR51(DA)
 +4       ;Data Type & Value - check if pointer in for loop
           SET PT=$SELECT($EXTRACT($GET(^XTV(8989.51,DA,1)))="P":$PIECE(^(1),U,2),1:"")
 +5       ;PT=file # of pointed to file from parm def.
           if PT]""
               SET PT=$SELECT(PT:$$GR^XPDTA(PT),1:"")
 +6       ;Now find any entrys in 8989.5 to transport, because we point to them
 +7        SET XP=0
           SET XP3=$PIECE(^XPD(9.6,XPDA,0),U,2)
           SET VP=XP3_";DIC(9.4,"
           SET PN=$$PT^XPDTA("^DIC(9.4)",XP3)
 +8       ;No package file link
           if 'XP3
               QUIT 
 +9       ;Instance
           FOR 
               SET XP=$ORDER(^XTV(8989.5,"AC",DA,VP,XP))
               SET XP1=0
               if 'XP
                   QUIT 
               Begin DoDot:1
 +10      ;entry
                   FOR 
                       SET XP1=$ORDER(^XTV(8989.5,"AC",DA,VP,XP,XP1))
                       if 'XP1
                           QUIT 
                       Begin DoDot:2
 +11                       MERGE ^XTMP("XPDT",XPDA,"KRN",8989.5,XP1)=^XTV(8989.5,XP1)
 +12      ;param def.
                           SET XP3=^XTV(8989.5,XP1,0)
                           SET XP4=$GET(^(1))
 +13                       SET $PIECE(@ROOT@(8989.5,XP1,0),U,2)=$$PT^XPDTA("^XTV(8989.51)",$PIECE(XP3,U,2))
 +14      ;Data Type pointer - resolve
                           IF PT]""
                               IF XP4>0
                                   SET $PIECE(@ROOT@(8989.5,XP1,1),U)=$$PT^XPDTA(PT,XP4)
 +15      ;Will redo the ENT at other end.
                           QUIT 
                       End DoDot:2
               End DoDot:1
 +16       QUIT 
 +17      ;
PAR51(DA) ;Fix one 8989.51 entry in transport global
 +1       ;Called from both PAR1E1 and PAR2E1
 +2        NEW XP,XP1,XP2,XP3,VP,PN,ROOT
 +3        SET ROOT=$NAME(^XTMP("XPDT",XPDA,"KRN"))
 +4       ;Don't bring X-ref
 +5        KILL @ROOT@(8989.51,DA,30,"B"),^("AG")
 +6        SET XP=0
 +7       ;Entries in the file will be maintained by Toolkit patches.
 +8        QUIT 
 +9       ;
PAR2E1    ;PARAMETER file 8989.52 entry post
 +1        NEW XP1,XP2,XP3,ROOT
 +2        SET ROOT=$NAME(^XTMP("XPDT",XPDA,"KRN"))
 +3       ;Resolve USE INSTANCE OF
 +4        SET XP2=$PIECE(^XTV(8989.52,DA,0),U,4)
           SET XP3=""
           IF XP2
               SET XP3=$$PT^XPDTA($NAME(^XTV(8989.51)),XP2)
 +5        IF $LENGTH(XP3)
               SET $PIECE(@ROOT@(8989.52,DA,0),U,4)=XP3
 +6       ;Resolve PARAMETERS
 +7       ;Drop X-ref
           SET XP1=0
           KILL ^XTMP("XPDT",XPDA,"KRN",8989.52,DA,10,"B")
 +8        FOR 
               SET XP1=$ORDER(^XTV(8989.52,DA,10,XP1))
               SET XP3=""
               if 'XP1
                   QUIT 
               Begin DoDot:1
 +9                SET XP2=$PIECE(^XTV(8989.52,DA,10,XP1,0),U,2)
 +10               IF XP2
                       SET XP3=$$PT^XPDTA($NAME(^XTV(8989.51)),XP2)
 +11               IF '$LENGTH(XP3)
                       KILL @ROOT@(8989.52,DA,10,XP1)
 +12               SET $PIECE(^XTMP("XPDT",XPDA,"KRN",8989.52,DA,10,XP1,0),U,2)=XP3
 +13      ;Now to move the entries this points to.
 +14               IF '$DATA(@ROOT@(8989.51,XP2))
                       MERGE @ROOT@(8989.51,XP2)=^XTV(8989.51,XP2)
                       DO PAR51(XP2)
 +15               QUIT 
               End DoDot:1
 +16       QUIT 
XULM      ;XULM LOCK DICTIONARY file 8993
 +1        NEW XP1,XP2
 +2       ;resolve PACKAGE
 +3        SET XP1=$PIECE($GET(^XTMP("XPDT",XPDA,"KRN",8993,DA,1)),U)
 +4        if XP1
               SET $PIECE(^XTMP("XPDT",XPDA,"KRN",8993,DA,1),U)=$$PT^XPDTA("^DIC(9.4)",XP1)
 +5       ;kill X-ref
 +6        KILL ^XTMP("XPDT",XPDA,"KRN",8993,2,"B"),^XTMP("XPDT",XPDA,"KRN",8993,3,"B"),^("C")
 +7        QUIT 
 +8       ;
ENT       ;ENTITY file 1.5
 +1        NEW %,%1
 +2       ;Loop thru ITEM multiple and resolve ENTITY (0;8)
 +3        SET %1=0
           FOR 
               SET %1=$ORDER(^XTMP("XPDT",XPDA,"KRN",1.5,DA,1,%1))
               if '%1
                   QUIT 
               SET %=$GET(^(%1,0))
               if $PIECE(%,U,8)
                   Begin DoDot:1
 +4                    SET $PIECE(%,U,8)=$$PT^XPDTA("^DDE",$PIECE(%,U,8))
                       SET ^XTMP("XPDT",XPDA,"KRN",1.5,DA,1,%1,0)=%
                   End DoDot:1
 +5        QUIT 
 +6       ;
POL       ;POLICY file 1.6
 +1        NEW %,%1,%2
 +2       ;if link, kill everything and just process the MEMBERS(10)
 +3        IF XPDFL=2
               Begin DoDot:1
 +4                SET %1=0
                   FOR 
                       SET %1=$ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1))
                       if '%1
                           QUIT 
                       if %1'=10
                           KILL ^(%)
 +5                QUIT 
               End DoDot:1
               GOTO POLM
 +6       ;resolve ATTRIBUTE FUNCTION (0;4) and RESULT FUNCTION (0;7)
 +7        SET %=^XTMP("XPDT",XPDA,"KRN",1.6,DA,0)
           Begin DoDot:1
 +8            FOR %1=4,7
                   SET %2=$PIECE(%,U,%1)
                   SET $PIECE(%,U,%1)=$$PT^XPDTA("^DIAC(1.62)",%2)
 +9            QUIT 
           End DoDot:1
           SET ^XTMP("XPDT",XPDA,"KRN",1.6,DA,0)=%
 +10      ;resolve DENY OBLIGATION (7) and PERMIT OBLIGATION (8)
 +11       FOR %1=7,8
               SET %=$GET(^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1))
               if $LENGTH(%)
                   Begin DoDot:1
 +12                   SET %2=$PIECE(%,U)
                       SET $PIECE(%,U)=$$PT^XPDTA("^DIAC(1.62)",%2)
 +13                   SET ^XTMP("XPDT",XPDA,"KRN",1.6,DA,%1)=%
 +14                   QUIT 
                   End DoDot:1
 +15      ;kill under TAGETS (2) ^("B"),^("AKEY")
 +16       IF $ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,2,0))
               KILL ^("B"),^("AKEY")
 +17      ;check if CONDITIONS (3) are sent, if yes then kill ^("B") and process
 +18       IF $ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,0))
               KILL ^("B")
               Begin DoDot:1
 +19      ;loop thru and resolve FUNCTION (0;2)
 +20               SET %1=0
                   FOR 
                       SET %1=$ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,%1))
                       if '%1
                           QUIT 
                       SET %=$GET(^(%1,0))
                       Begin DoDot:2
 +21                       SET %2=$PIECE(%,U,2)
                           if '%2
                               QUIT 
 +22                       SET $PIECE(%,U,2)=$$PT^XPDTA("^DIAC(1.62)",%2)
 +23                       SET ^XTMP("XPDT",XPDA,"KRN",1.6,DA,3,%1,0)=%
                       End DoDot:2
 +24               QUIT 
               End DoDot:1
POLM      ;loop thru 10=MEMEBERS and resolve MEMBER (0;1), kill if it doesn't resolve
 +1        if '$ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,0))
               QUIT 
 +2       ;kill under MEMBERS (10), "B"=name, "AC"=SEQUENCE
 +3        KILL ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,"B"),^("AC")
 +4        SET %1=0
           FOR 
               SET %1=$ORDER(^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1))
               if '%1
                   QUIT 
               SET %=$GET(^(%1,0))
               Begin DoDot:1
 +5                SET %2=$$PT^XPDTA("^DIAC(1.6)",+%)
 +6       ;MEMBER must also be sent by itself, check "B" x-ref, save text on U node
 +7                IF $LENGTH(%2)
                       IF $DATA(^XPD(9.6,XPDA,"KRN",1.6,"NM","B",%2))
                           SET ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1,U)=%2
                           QUIT 
 +8                KILL ^XTMP("XPDT",XPDA,"KRN",1.6,DA,10,%1)
 +9                QUIT 
               End DoDot:1
 +10       QUIT 
 +11      ;
POLE      ;EVENT #1.61
 +1        NEW %,%1,%2
 +2        SET %=^XTMP("XPDT",XPDA,"KRN",1.61,DA,0)
 +3       ;resolve POLICY (0;5)
 +4        SET %1=$PIECE(%,U,5)
           if '%1
               QUIT 
 +5        SET %2=$$PT^XPDTA("^DIAC(1.6)",%1)
           SET $PIECE(%,U,5)=%2
           SET ^XTMP("XPDT",XPDA,"KRN",1.61,DA,0)=%
 +6        QUIT 
 +7       ;
POLF      ;FUNCTION #1.62
 +1        QUIT