1 | XUMF1H ;ISS/RAM - MFS Handler ;6/27/06 07:50
|
---|
2 | ;;8.0;KERNEL;**407**;Jul 10, 1995;Build 8
|
---|
3 | ;
|
---|
4 | ; This routine handles Master File HL7 messages.
|
---|
5 | ;
|
---|
6 | MAIN ; -- entry point
|
---|
7 | ;
|
---|
8 | N CNT,ERR,I,X,HLFS,HLCS,ERROR,HLRESLTA,IFN,IEN,MTPE,TYPE,ARRAY
|
---|
9 | N HDT,KEY,MID,REASON,VALUE,XREF,ALL,GROUP,PARAM,ROOT,SEG,QRD,XUMF
|
---|
10 | N QID,WHAT,WHO,HLSCS,CDSYS,EXIT,HLREP,NUMBER,Y,XXX,YYY,XIEN
|
---|
11 | N XUMFSDS,FDA,LIST,ERRCNT,PKV,MKEY,MKEY1,TYP,MFI,IMPLY
|
---|
12 | ;
|
---|
13 | D INIT,PROCESS,REPLY,EXIT
|
---|
14 | ;
|
---|
15 | Q
|
---|
16 | ;
|
---|
17 | INIT ; -- initialize
|
---|
18 | ;
|
---|
19 | K ^TMP("DILIST",$J),^TMP("DIERR",$J)
|
---|
20 | K ^TMP("HLS",$J),^TMP("HLA",$J)
|
---|
21 | K ^TMP("XUMF MFS",$J),^TMP("XUMF ERROR",$J)
|
---|
22 | ;
|
---|
23 | S XUMF=1,DUZ(0)="@"
|
---|
24 | ;
|
---|
25 | S (ERROR,CNT,TYPE,ARRAY,EXIT,ERRCNT)=0
|
---|
26 | S HLFS=HL("FS"),HLCS=$E(HL("ECH"))
|
---|
27 | S HLSCS=$E(HL("ECH"),4),HLREP=$E(HL("ECH"),2)
|
---|
28 | ;
|
---|
29 | Q
|
---|
30 | ;
|
---|
31 | PROCESS ; -- pull message text
|
---|
32 | ;
|
---|
33 | F X HLNEXT Q:HLQUIT'>0 D
|
---|
34 | .Q:$P(HLNODE,HLFS)=""
|
---|
35 | .Q:"^MSH^MSA^QRD^MFI^MFE^ZRT^"'[(U_$P(HLNODE,HLFS)_U)
|
---|
36 | .D @($P(HLNODE,HLFS))
|
---|
37 | I $D(LIST) D LIST
|
---|
38 | I $D(FDA) D UPDATE
|
---|
39 | I $D(IFN) D POST
|
---|
40 | ;
|
---|
41 | Q
|
---|
42 | ;
|
---|
43 | MSH ; -- MSH segment
|
---|
44 | ;
|
---|
45 | Q
|
---|
46 | ;
|
---|
47 | MSA ; -- MSA segment
|
---|
48 | ;
|
---|
49 | N CODE
|
---|
50 | ;
|
---|
51 | S CODE=$P(HLNODE,HLFS,2)
|
---|
52 | ;
|
---|
53 | I CODE="AE"!(CODE="AR") D
|
---|
54 | .S ERROR=ERROR_U_$P(HLNODE,HLFS,4)_U_$G(ERR)
|
---|
55 | .D EM^XUMFX(ERROR,.ERR)
|
---|
56 | ;
|
---|
57 | Q
|
---|
58 | ;
|
---|
59 | MFI ; -- MFI segment
|
---|
60 | ;
|
---|
61 | Q:ERROR
|
---|
62 | Q:EXIT
|
---|
63 | ;
|
---|
64 | Q
|
---|
65 | ;
|
---|
66 | MFE ; -- MFE SEGMENT
|
---|
67 | ;
|
---|
68 | Q:ERROR
|
---|
69 | Q:EXIT
|
---|
70 | ;
|
---|
71 | S PKV=$P(HLNODE,HLFS,5),MFI=$P(PKV,"@")
|
---|
72 | ;
|
---|
73 | I $D(LIST) D LIST K LIST,LISTVUID
|
---|
74 | I $D(FDA) D UPDATE K FDA
|
---|
75 | I $D(IFN),(IFN'=$O(^DIC(4.001,"MFID",MFI,0))) D POST
|
---|
76 | ;
|
---|
77 | K IFN,IEN,PRE,POST,VUID,IMPLY
|
---|
78 | K ^TMP("XUMF IMPLIED LOGIC",$J)
|
---|
79 | ;
|
---|
80 | I MFI="" S ERROR="1^MFI not resolved HLNODE: "_HLNODE Q
|
---|
81 | S IFN=$O(^DIC(4.001,"MFID",MFI,0))
|
---|
82 | I 'IFN S ERROR="1^IFN not resolved HLNODE: "_HLNODE Q
|
---|
83 | ;
|
---|
84 | S VUID=$P($P(PKV,"@",2),HLCS)
|
---|
85 | ;
|
---|
86 | Q:ARRAY
|
---|
87 | ;
|
---|
88 | D MFE^XUMF0(IFN,VUID,.IEN,.ERROR) Q:ERROR
|
---|
89 | ;
|
---|
90 | D MFE0
|
---|
91 | ;
|
---|
92 | ;Implied logic flag - must be set by MFE-Processing Logic field (#4)
|
---|
93 | S IMPLY=+$G(^TMP("XUMF IMPLIED LOGIC",$J))
|
---|
94 | S IMPLY("KILL")=0
|
---|
95 | K ^TMP("XUMF IMPLIED LOGIC",$J)
|
---|
96 | ;
|
---|
97 | I IEN D
|
---|
98 | .; clean multiple flag
|
---|
99 | .K:'$D(XIEN(IFN,IEN)) XIEN
|
---|
100 | .S XIEN(IFN,IEN)=$G(XIEN(IFN,IEN))+1
|
---|
101 | ;
|
---|
102 | Q
|
---|
103 | ;
|
---|
104 | ZRT ; -- data segments
|
---|
105 | ;
|
---|
106 | Q:ERROR
|
---|
107 | Q:EXIT
|
---|
108 | ;
|
---|
109 | I $G(ARRAY) D ARRAY Q
|
---|
110 | ;
|
---|
111 | N COL,X,Y,Z,DTYP,IDX,SEQ,DATA,NAME,VUID1,LIST1
|
---|
112 | N FIELD,SUBFILE,LKUP,REPEAT,CLEAN,TIMEZONE,WP
|
---|
113 | ;
|
---|
114 | S NAME=$P(HLNODE,HLFS,2)
|
---|
115 | ;
|
---|
116 | I 'IEN,NAME="Term" D STUB^XUMF0 Q
|
---|
117 | I 'IEN S ERROR="1^IEN not defined IFN: "_IFN_" VUID: "_VUID Q
|
---|
118 | ;
|
---|
119 | D ZRT0 Q:ERROR
|
---|
120 | ;
|
---|
121 | S IENS=IEN_","
|
---|
122 | ;
|
---|
123 | S IDX=$O(^DIC(4.001,+IFN,1,"B",NAME,0))
|
---|
124 | I 'IDX S ERROR="1^parameter "_NAME_" not defined IFN: "_IFN Q
|
---|
125 | S DATA=$G(^DIC(4.001,+IFN,1,+IDX,0))
|
---|
126 | S TYP=$P(DATA,U,3),TYP=$$GET1^DIQ(771.4,(+TYP_","),.01)
|
---|
127 | S FIELD=$P(DATA,U,2),SUBFILE=$P(DATA,U,4),MKEY=$P(DATA,U,6)
|
---|
128 | S LKUP=$P(DATA,U,7),TIMEZONE=$P(DATA,U,14),LIST1=$P(DATA,U,8)
|
---|
129 | S REPEAT=$P(DATA,U,11),CLEAN=$P(DATA,U,12),VUID1=$P(DATA,U,13)
|
---|
130 | S WP=$P(DATA,U,16)
|
---|
131 | ;
|
---|
132 | I WP D WP Q
|
---|
133 | ;
|
---|
134 | S VALUE=$$UNESC^XUMF0($P(HLNODE,HLFS,3),.HL)
|
---|
135 | S VALUE=$$DTYP^XUMFXP(VALUE,TYP,HLCS,0,TIMEZONE)
|
---|
136 | ;
|
---|
137 | I NAME="Status" D STATUS Q
|
---|
138 | ;
|
---|
139 | I 'SUBFILE D Q
|
---|
140 | .S VALUE=$$VAL^XUMF0(IFN,FIELD,VUID1,VALUE,IENS) Q:VALUE="^"
|
---|
141 | .S FDA(IFN,IENS,FIELD)=VALUE
|
---|
142 | ;
|
---|
143 | N IENS1
|
---|
144 | ;
|
---|
145 | I LIST1 D Q
|
---|
146 | .S VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
|
---|
147 | .I MKEY=NAME S ZKEY=VALUE ;S:VUID1'="" LISTVUID(SUBFILE)=1
|
---|
148 | .I '$D(ZKEY) S ERROR="1^ZKEY error "_SUBFILE_" VUID: "_VUID Q
|
---|
149 | .I ((ZKEY="")!(ZKEY=$C(34,34))) S LIST(SUBFILE)="" Q
|
---|
150 | .S LIST(SUBFILE,ZKEY,FIELD)=VALUE
|
---|
151 | .I IMPLY D IMPLY
|
---|
152 | ;
|
---|
153 | I CLEAN,$G(XIEN(IFN,IEN))'>1 D
|
---|
154 | .N ROOT,IDX
|
---|
155 | .S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
|
---|
156 | .S IDX=0 F S IDX=$O(@ROOT@(IDX)) Q:'IDX D
|
---|
157 | ..D
|
---|
158 | ...N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
|
---|
159 | ;
|
---|
160 | I MKEY=NAME Q:VALUE="" D
|
---|
161 | .N FDA,IEN
|
---|
162 | .
|
---|
163 | .S VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
|
---|
164 | .S FDA(SUBFILE,"?+1,"_IENS,.01)=VALUE
|
---|
165 | .D UPDATE^DIE(,"FDA","IEN","ERR")
|
---|
166 | .I $D(ERR) D Q
|
---|
167 | ..S ERROR="1^subfile update error SUBFILE#: "_SUBFILE
|
---|
168 | ..D EM(ERROR,.ERR) K ERR
|
---|
169 | .S IENS1=IEN(1)_","_IENS,MKEY(NAME)=IENS1
|
---|
170 | ;
|
---|
171 | I MKEY'="",MKEY'=NAME S IENS1=$G(MKEY(MKEY)) Q:IENS1=""
|
---|
172 | S:MKEY'=NAME VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
|
---|
173 | S:$D(IENS1) FDA(SUBFILE,IENS1,FIELD)=VALUE
|
---|
174 | I IMPLY D IMPLY
|
---|
175 | ;
|
---|
176 | Q
|
---|
177 | ;
|
---|
178 | IMPLY ; -- Implied value logic
|
---|
179 | N PREV,ARR
|
---|
180 | S ARR=$S(LIST1:"LIST",1:"FDA")
|
---|
181 | S PREV=$S(LIST1:ZKEY,1:IENS1)
|
---|
182 | I MKEY=NAME D Q
|
---|
183 | .I IMPLY("KILL") K IMPLY("PREV") S IMPLY("KILL")=0
|
---|
184 | .S IMPLY("PREV",PREV)=""
|
---|
185 | S PREV="" F S PREV=$O(IMPLY("PREV",PREV)) Q:PREV="" D
|
---|
186 | .S @ARR@(SUBFILE,PREV,FIELD)=VALUE
|
---|
187 | S IMPLY("KILL")=1
|
---|
188 | Q
|
---|
189 | ;
|
---|
190 | LIST ; -- process list
|
---|
191 | ;
|
---|
192 | N SUBFILE,ZKEY,FIELD,VALUE,IENS,CNT
|
---|
193 | ;
|
---|
194 | S IENS=IEN_","
|
---|
195 | ;
|
---|
196 | ;remove non-standard sub-records (not in message)
|
---|
197 | S SUBFILE=0
|
---|
198 | F S SUBFILE=$O(LIST(SUBFILE)) Q:'SUBFILE D
|
---|
199 | .N ROOT,IDX
|
---|
200 | .S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
|
---|
201 | .S IDX=0 F S IDX=$O(@ROOT@(IDX)) Q:'IDX D
|
---|
202 | ..S VALUE=$$GET1^DIQ(SUBFILE,IDX_","_IENS,.01,"I")
|
---|
203 | ..I '$D(LIST(SUBFILE,VALUE)) D
|
---|
204 | ...N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
|
---|
205 | ;
|
---|
206 | ;update sub-records
|
---|
207 | S SUBFILE=0
|
---|
208 | F S SUBFILE=$O(LIST(SUBFILE)) Q:'SUBFILE D
|
---|
209 | .S ZKEY="",CNT=0
|
---|
210 | .F S ZKEY=$O(LIST(SUBFILE,ZKEY)) Q:ZKEY="" D
|
---|
211 | ..N IDX,ROOT
|
---|
212 | ..S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
|
---|
213 | ..S IDX=$O(@ROOT@("B",ZKEY,0))
|
---|
214 | ..I $O(@ROOT@("B",ZKEY,IDX)) D DELLIST(IDX)
|
---|
215 | ..I 'IDX D ADDLIST Q
|
---|
216 | ..S FIELD=0
|
---|
217 | ..F S FIELD=$O(LIST(SUBFILE,ZKEY,FIELD)) Q:'FIELD D
|
---|
218 | ...N X S X=$$GET1^DIQ(SUBFILE,IDX_","_IENS,FIELD)
|
---|
219 | ...S VALUE=LIST(SUBFILE,ZKEY,FIELD)
|
---|
220 | ...Q:VALUE=X Q:(VALUE=""""&X="")
|
---|
221 | ...S FDA(SUBFILE,IDX_","_IENS,FIELD)=VALUE
|
---|
222 | ;
|
---|
223 | Q
|
---|
224 | ;
|
---|
225 | ADDLIST ; -- add new sub-record
|
---|
226 | ;
|
---|
227 | N FDA
|
---|
228 | ;
|
---|
229 | S CNT=$G(CNT)+1
|
---|
230 | S FIELD=0
|
---|
231 | F S FIELD=$O(LIST(SUBFILE,ZKEY,FIELD)) Q:'FIELD D
|
---|
232 | .S VALUE=LIST(SUBFILE,ZKEY,FIELD) Q:VALUE=""
|
---|
233 | .S FDA(SUBFILE,"+"_CNT_","_IENS,FIELD)=VALUE
|
---|
234 | ;
|
---|
235 | Q:'$D(FDA)
|
---|
236 | ;
|
---|
237 | D UPDATE^DIE(,"FDA",,"ERR")
|
---|
238 | I $D(ERR) D Q
|
---|
239 | .S ERROR="1^subfile update error SUBFILE#: "_SUBFILE
|
---|
240 | .D EM(ERROR,.ERR) K ERR
|
---|
241 | ;
|
---|
242 | Q
|
---|
243 | ;
|
---|
244 | DELLIST(IDX) ; -- delete duplicate
|
---|
245 | ;
|
---|
246 | F S IDX=$O(@ROOT@("B",ZKEY,IDX)) Q:'IDX D
|
---|
247 | .N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
|
---|
248 | ;
|
---|
249 | Q
|
---|
250 | ;
|
---|
251 | UPDATE ; -- FileMan update
|
---|
252 | ;
|
---|
253 | Q:ERROR
|
---|
254 | Q:EXIT
|
---|
255 | ;
|
---|
256 | D:$D(FDA) FILE^DIE(,"FDA","ERR")
|
---|
257 | I $D(ERR) D
|
---|
258 | .S ERROR="1^updating error"
|
---|
259 | .D EM(ERROR,.ERR) K ERR
|
---|
260 | ;
|
---|
261 | Q
|
---|
262 | ;
|
---|
263 | ARRAY ; -- query data stored in array (not filed)
|
---|
264 | ;
|
---|
265 | S ^TMP("XUMF ARRAY",$J,IFN,VUID,$P(HLNODE,HLFS,2))=$P(HLNODE,HLFS,3)
|
---|
266 | ;
|
---|
267 | Q
|
---|
268 | ;
|
---|
269 | ADD ; -- ADD-processing logic
|
---|
270 | ;
|
---|
271 | N X
|
---|
272 | ;
|
---|
273 | S X=$G(^DIC(4.001,+IFN,3)) X:X'="" X
|
---|
274 | ;
|
---|
275 | Q
|
---|
276 | ;
|
---|
277 | MFE0 ; -- MFE-processing logic
|
---|
278 | ;
|
---|
279 | N X
|
---|
280 | ;
|
---|
281 | S X=$G(^DIC(4.001,+IFN,4)) X:X'="" X
|
---|
282 | ;
|
---|
283 | Q
|
---|
284 | ;
|
---|
285 | ZRT0 ; -- ZRT-processing logic
|
---|
286 | ;
|
---|
287 | N X
|
---|
288 | ;
|
---|
289 | S X=$G(^DIC(4.001,+IFN,5)) X:X'="" X
|
---|
290 | ;
|
---|
291 | Q
|
---|
292 | ;
|
---|
293 | POST ; -- post-processing logic
|
---|
294 | ;
|
---|
295 | N X
|
---|
296 | ;
|
---|
297 | S X=$G(^DIC(4.001,+IFN,2)) X:X'="" X
|
---|
298 | ;
|
---|
299 | Q
|
---|
300 | ;
|
---|
301 | EXIT ; -- cleanup, and quit
|
---|
302 | ;
|
---|
303 | K ^TMP("DILIST",$J),^TMP("DIERR",$J),^TMP("HLS",$J),^TMP("HLA",$J)
|
---|
304 | ;
|
---|
305 | K ^TMP("XUMF MFS",$J),^TMP("XUMF ERROR",$J)
|
---|
306 | ;
|
---|
307 | Q
|
---|
308 | ;
|
---|
309 | REPLY ; -- MFK
|
---|
310 | ;
|
---|
311 | N X,I,I1,I2,CNT
|
---|
312 | ;
|
---|
313 | S CNT=1
|
---|
314 | S X="MSA"_HLFS_$S(ERROR:"AE",1:"AA")_HLFS_HL("MID")_HLFS_$P(ERROR,U,2)
|
---|
315 | S ^TMP("HLA",$J,CNT)=X
|
---|
316 | S CNT=CNT+1
|
---|
317 | ;
|
---|
318 | S I1="",I=0
|
---|
319 | F S I1=$O(^TMP("XUMF ERROR",$J,I1)) Q:'$L(I1) D
|
---|
320 | .S I2="" F S I2=$O(^TMP("XUMF ERROR",$J,I1,I2)) Q:'$L(I2) D
|
---|
321 | ..S X=$G(^(I2))
|
---|
322 | ..Q:'$L(X)
|
---|
323 | ..S I=I+1
|
---|
324 | ..S X="ERR"_HLFS_I_HLFS_$S($O(^TMP("XUMF ERROR",$J,I1))!$O(^TMP("XUMF ERROR",$J,I1,I2)):1,1:0)_HLFS_X
|
---|
325 | ..S ^TMP("HLA",$J,CNT)=X
|
---|
326 | ..S CNT=CNT+1
|
---|
327 | ;
|
---|
328 | D:ERROR EM^XUMF0
|
---|
329 | ;
|
---|
330 | D GENACK^HLMA1($G(HL("EID")),$G(HLMTIENS),$G(HL("EIDS")),"GM",1,.HLRESLT)
|
---|
331 | ;
|
---|
332 | ; check for error
|
---|
333 | ;I ($P($G(HLRESLT),U,3)'="") D Q
|
---|
334 | ;.S ERROR=1_U_$P(HLRESLT,HLFS,3)_U_$P(HLRESLT,HLFS,2)_U_$P(HLRESLT,U)
|
---|
335 | ;
|
---|
336 | ; successful call, message ID returned
|
---|
337 | ;S ERROR="0^"_$P($G(HLRESLT),U,1)
|
---|
338 | ;
|
---|
339 | Q
|
---|
340 | ;
|
---|
341 | EM(ERROR,ERR) ; -- error message
|
---|
342 | ;
|
---|
343 | N X,I,Y
|
---|
344 | ;
|
---|
345 | D MSG^DIALOG("AM",.X,80,,"ERR")
|
---|
346 | ;
|
---|
347 | S ERRCNT=ERRCNT+1
|
---|
348 | ;
|
---|
349 | S ^TMP("XUMF ERROR",$J,ERRCNT_".01")=""
|
---|
350 | S ^TMP("XUMF ERROR",$J,ERRCNT_".02")=""
|
---|
351 | S ^TMP("XUMF ERROR",$J,ERRCNT_".03")=$G(ERROR)
|
---|
352 | S ^TMP("XUMF ERROR",$J,ERRCNT_".04")=""
|
---|
353 | S ^TMP("XUMF ERROR",$J,ERRCNT_".05")="VUID: "_$G(VUID)_" IFN: "_$G(IFN)_" IEN: "_IEN
|
---|
354 | S ^TMP("XUMF ERROR",$J,ERRCNT_".06")=""
|
---|
355 | S X=.9 F S X=$O(X(X)) Q:'X D
|
---|
356 | .S ^TMP("XUMF ERROR",$J,ERRCNT_"."_X)=X(X)
|
---|
357 | ;
|
---|
358 | Q
|
---|
359 | ;
|
---|
360 | STATUS ;
|
---|
361 | ;
|
---|
362 | I VALUE=$P($$GETSTAT^XTID(IFN,,IEN_","),U) Q
|
---|
363 | ;
|
---|
364 | I SUBFILE="" S ERROR="1^status parameter error" Q
|
---|
365 | ;
|
---|
366 | N FDA
|
---|
367 | S FDA(SUBFILE,"?+1,"_IENS,.01)=$$NOW^XLFDT
|
---|
368 | S FDA(SUBFILE,"?+1,"_IENS,.02)=VALUE
|
---|
369 | D UPDATE^DIE(,"FDA",,"ERR")
|
---|
370 | I $D(ERR) D
|
---|
371 | .S ERROR="1^effective date and status error"
|
---|
372 | .D EM(ERROR,.ERR) K ERR
|
---|
373 | ;
|
---|
374 | Q
|
---|
375 | ;
|
---|
376 | WP ;
|
---|
377 | ;
|
---|
378 | N X,Y,A,I,CNT,X1,X2,ESC
|
---|
379 | D SEGPRSE^XUMFXHL7("HLNODE","X",HLFS,60)
|
---|
380 | ;
|
---|
381 | S CNT=1
|
---|
382 | S A(CNT)=X(2)
|
---|
383 | S I=0
|
---|
384 | F S I=$O(X(2,I)) Q:'I D
|
---|
385 | .S Y=X(2,I)
|
---|
386 | .I $E(Y,1)=" " D Q
|
---|
387 | ..S A(CNT)=A(CNT)_" "
|
---|
388 | ..Q:$P(Y," ",2)=""
|
---|
389 | ..S CNT=CNT+1
|
---|
390 | ..S A(CNT)=$P(Y," ",2,99)
|
---|
391 | .S X1=$P(Y," ",1)
|
---|
392 | .S X2=$P(Y," ",2,99)
|
---|
393 | .S A(CNT)=A(CNT)_X1_$S(X2="":"",1:" ")
|
---|
394 | .Q:X2=""
|
---|
395 | .S CNT=CNT+1
|
---|
396 | .S A(CNT)=X2
|
---|
397 | ;
|
---|
398 | D UNESCWP^XUMF0(.A,.HL)
|
---|
399 | ;
|
---|
400 | D WP^DIE(IFN,IENS,FIELD,"K","A","ERR")
|
---|
401 | ;
|
---|
402 | I $D(ERR) D
|
---|
403 | .S ERROR="1^wp field error"
|
---|
404 | .D EM(ERROR,.ERR) K ERR
|
---|
405 | ;
|
---|
406 | Q
|
---|
407 | ;
|
---|