itss: Added ITSProtocol stub implementation.
[wine] / dlls / rasapi32 / rasapi.c
1 /*
2  * RASAPI32
3  *
4  * Copyright 1998,2001 Marcus Meissner
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdarg.h>
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "ras.h"
26 #include "wine/debug.h"
27
28 WINE_DEFAULT_DEBUG_CHANNEL(ras);
29
30 DWORD WINAPI RasConnectionNotificationA(HRASCONN hrasconn, HANDLE hEvent, DWORD dwFlags)
31 {
32     FIXME("(%p,%p,0x%08x),stub!\n",hrasconn,hEvent,dwFlags);
33     return 1;
34 }
35
36 DWORD WINAPI RasConnectionNotificationW(HRASCONN hrasconn, HANDLE hEvent, DWORD dwFlags)
37 {
38     FIXME("(%p,%p,0x%08x),stub!\n",hrasconn,hEvent,dwFlags);
39     return 1;
40 }
41
42 DWORD WINAPI RasCreatePhonebookEntryA(HWND hwnd, LPCSTR lpszPhonebook)
43 {
44     FIXME("(%p,%s),stub!\n",hwnd,debugstr_a(lpszPhonebook));
45     return 0;
46 }
47
48 DWORD WINAPI RasCreatePhonebookEntryW(HWND hwnd, LPCWSTR lpszPhonebook)
49 {
50     FIXME("(%p,%s),stub!\n",hwnd,debugstr_w(lpszPhonebook));
51     return 0;
52 }
53
54 DWORD WINAPI RasDeleteSubEntryA(LPCSTR lpszPhonebook, LPCSTR lpszEntry, DWORD dwSubEntryId)
55 {
56     FIXME("(%s,%s,0x%08x),stub!\n",debugstr_a(lpszPhonebook),
57           debugstr_a(lpszEntry),dwSubEntryId);
58     return 0;
59 }
60
61 DWORD WINAPI RasDeleteSubEntryW(LPCWSTR lpszPhonebook, LPCWSTR lpszEntry, DWORD dwSubEntryId)
62 {
63     FIXME("(%s,%s,0x%08x),stub!\n",debugstr_w(lpszPhonebook),
64           debugstr_w(lpszEntry),dwSubEntryId);
65     return 0;
66 }
67
68 DWORD WINAPI RasDialA(LPRASDIALEXTENSIONS lpRasDialExtensions, LPCSTR lpszPhonebook,
69                       LPRASDIALPARAMSA lpRasDialParams, DWORD dwNotifierType,
70                       LPVOID lpvNotifier, LPHRASCONN lphRasConn)
71 {
72     FIXME("(%p,%s,%p,0x%08x,%p,%p),stub!\n",lpRasDialExtensions,debugstr_a(lpszPhonebook),
73           lpRasDialParams,dwNotifierType,lpvNotifier,lphRasConn);
74     return 1;
75 }
76
77 DWORD WINAPI RasDialW(LPRASDIALEXTENSIONS lpRasDialExtensions, LPCWSTR lpszPhonebook,
78                       LPRASDIALPARAMSW lpRasDialParams, DWORD dwNotifierType,
79                       LPVOID lpvNotifier, LPHRASCONN lphRasConn)
80 {
81     FIXME("(%p,%s,%p,0x%08x,%p,%p),stub!\n",lpRasDialExtensions,debugstr_w(lpszPhonebook),
82           lpRasDialParams,dwNotifierType,lpvNotifier,lphRasConn);
83     return 1;
84 }
85
86 DWORD WINAPI RasEditPhonebookEntryA(HWND hwnd, LPCSTR lpszPhonebook, LPCSTR lpszEntryName)
87 {
88     FIXME("(%p,%s,%s),stub!\n",hwnd,debugstr_a(lpszPhonebook),debugstr_a(lpszEntryName));
89     return 0;
90 }
91
92 DWORD WINAPI RasEditPhonebookEntryW(HWND hwnd, LPCWSTR lpszPhonebook, LPCWSTR lpszEntryName)
93 {
94     FIXME("(%p,%s,%s),stub!\n",hwnd,debugstr_w(lpszPhonebook),debugstr_w(lpszEntryName));
95     return 0;
96 }
97
98 /**************************************************************************
99  *                 RasEnumConnectionsA                  [RASAPI32.544]
100  */
101 DWORD WINAPI RasEnumConnectionsA( LPRASCONNA rca, LPDWORD lpcb, LPDWORD lpcConnections) {
102         /* Remote Access Service stuff is done by underlying OS anyway */
103         FIXME("(%p,%p,%p),stub!\n",rca,lpcb,lpcConnections);
104         FIXME("RAS support is not implemented! Configure program to use LAN connection/winsock instead!\n");
105         *lpcConnections = 0; /* no RAS connections available */
106
107         return 0;
108 }
109
110 /**************************************************************************
111  *                 RasEnumConnectionsW                  [RASAPI32.545]
112  */
113 DWORD WINAPI RasEnumConnectionsW( LPRASCONNW rcw, LPDWORD lpcb, LPDWORD lpcConnections) {
114         /* Remote Access Service stuff is done by underlying OS anyway */
115         FIXME("(%p,%p,%p),stub!\n",rcw,lpcb,lpcConnections);
116         FIXME("RAS support is not implemented! Configure program to use LAN connection/winsock instead!\n");
117         *lpcConnections = 0; /* no RAS connections available */
118
119         return 0;
120 }
121
122 /**************************************************************************
123  *                 RasEnumEntriesA                              [RASAPI32.546]
124  */
125 DWORD WINAPI RasEnumEntriesA( LPCSTR Reserved, LPCSTR lpszPhoneBook,
126         LPRASENTRYNAMEA lpRasEntryName,
127         LPDWORD lpcb, LPDWORD lpcEntries)
128 {
129         FIXME("(%p,%s,%p,%p,%p),stub!\n",Reserved,debugstr_a(lpszPhoneBook),
130             lpRasEntryName,lpcb,lpcEntries);
131         *lpcEntries = 0;
132         return 0;
133 }
134
135 /**************************************************************************
136  *                 RasEnumEntriesW                              [RASAPI32.547]
137  */
138 DWORD WINAPI RasEnumEntriesW( LPCWSTR Reserved, LPCWSTR lpszPhoneBook,
139         LPRASENTRYNAMEW lpRasEntryName,
140         LPDWORD lpcb, LPDWORD lpcEntries)
141 {
142         FIXME("(%p,%s,%p,%p,%p),stub!\n",Reserved,debugstr_w(lpszPhoneBook),
143             lpRasEntryName,lpcb,lpcEntries);
144         *lpcEntries = 0;
145         return 0;
146 }
147
148 DWORD WINAPI RasGetConnectStatusA(HRASCONN hrasconn, LPRASCONNSTATUSA lprasconnstatus)
149 {
150     FIXME("(%p,%p),stub!\n",hrasconn,lprasconnstatus);
151     return 0;
152 }
153
154 DWORD WINAPI RasGetConnectStatusW(HRASCONN hrasconn, LPRASCONNSTATUSW lprasconnstatus)
155 {
156     FIXME("(%p,%p),stub!\n",hrasconn,lprasconnstatus);
157     return 0;
158 }
159
160 /**************************************************************************
161  *                 RasGetEntryDialParamsA                       [RASAPI32.550]
162  */
163 DWORD WINAPI RasGetEntryDialParamsA(
164         LPCSTR lpszPhoneBook, LPRASDIALPARAMSA lpRasDialParams,
165         LPBOOL lpfPassword)
166 {
167         FIXME("(%s,%p,%p),stub!\n",debugstr_a(lpszPhoneBook),
168             lpRasDialParams,lpfPassword);
169         return 0;
170 }
171
172 /**************************************************************************
173  *                 RasGetEntryDialParamsW           [RASAPI32.551]
174  */
175 DWORD WINAPI RasGetEntryDialParamsW(
176     LPCWSTR lpszPhoneBook, LPRASDIALPARAMSW lpRasDialParams,
177     LPBOOL lpfPassword)
178 {
179     FIXME("(%s,%p,%p),stub!\n",debugstr_w(lpszPhoneBook),
180             lpRasDialParams,lpfPassword);
181     return 0;
182 }
183
184 /**************************************************************************
185  *                 RasHangUpA                   [RASAPI32.556]
186  */
187 DWORD WINAPI RasHangUpA( HRASCONN hrasconn)
188 {
189         FIXME("(%p),stub!\n",hrasconn);
190         return 0;
191 }
192
193 /**************************************************************************
194  *                 RasHangUpW           [RASAPI32.557]
195  */
196 DWORD WINAPI RasHangUpW(HRASCONN hrasconn)
197 {
198     FIXME("(%p),stub!\n",hrasconn);
199     return 0;
200 }
201
202 /**************************************************************************
203  *                 RasDeleteEntryA              [RASAPI32.7]
204  */
205 DWORD WINAPI RasDeleteEntryA(LPCSTR a, LPCSTR b)
206 {
207         FIXME("(%s,%s),stub!\n",debugstr_a(a),debugstr_a(b));
208         return 0;
209 }
210
211 /**************************************************************************
212  *                 RasDeleteEntryW              [RASAPI32.8]
213  */
214 DWORD WINAPI RasDeleteEntryW(LPCWSTR a, LPCWSTR b)
215 {
216         FIXME("(%s,%s),stub!\n",debugstr_w(a),debugstr_w(b));
217         return 0;
218 }
219
220 /**************************************************************************
221  *                 RasEnumAutodialAddressesA    [RASAPI32.14]
222  */
223 DWORD WINAPI RasEnumAutodialAddressesA(LPSTR *a, LPDWORD b, LPDWORD c)
224 {
225         FIXME("(%p,%p,%p),stub!\n",a,b,c);
226         return 0;
227 }
228
229 /**************************************************************************
230  *                 RasEnumAutodialAddressesW    [RASAPI32.15]
231  */
232 DWORD WINAPI RasEnumAutodialAddressesW(LPWSTR *a, LPDWORD b, LPDWORD c)
233 {
234         FIXME("(%p,%p,%p),stub!\n",a,b,c);
235         return 0;
236 }
237
238 /**************************************************************************
239  *                 RasEnumDevicesA              [RASAPI32.19]
240  *
241  * Just return a virtual modem too see what other APIs programs will
242  * call with it.
243  */
244 DWORD WINAPI RasEnumDevicesA(LPRASDEVINFOA lpRasDevinfo, LPDWORD lpcb, LPDWORD lpcDevices)
245 {
246         FIXME("(%p,%p,%p),stub!\n",lpRasDevinfo,lpcb,lpcDevices);
247         if (*lpcb < sizeof(RASDEVINFOA)) {
248                 *lpcb = sizeof(RASDEVINFOA);
249                 return ERROR_BUFFER_TOO_SMALL;
250         }
251         /* honor dwSize ? */
252         strcpy(lpRasDevinfo->szDeviceType, RASDT_Modem);
253         strcpy(lpRasDevinfo->szDeviceName, "WINE virtmodem");
254         return 0;
255 }
256
257 /**************************************************************************
258  *                 RasEnumDevicesW              [RASAPI32.20]
259  */
260 DWORD WINAPI RasEnumDevicesW(LPRASDEVINFOW a, LPDWORD b, LPDWORD c)
261 {
262         FIXME("(%p,%p,%p),stub!\n",a,b,c);
263         return 0;
264 }
265
266 /**************************************************************************
267  *                 RasGetAutodialAddressA       [RASAPI32.24]
268  */
269 DWORD WINAPI RasGetAutodialAddressA(LPCSTR a, LPDWORD b, LPRASAUTODIALENTRYA c,
270                                         LPDWORD d, LPDWORD e)
271 {
272         FIXME("(%s,%p,%p,%p,%p),stub!\n",debugstr_a(a),b,c,d,e);
273         return 0;
274 }
275
276 /**************************************************************************
277  *                 RasGetAutodialAddressW       [RASAPI32.25]
278  */
279 DWORD WINAPI RasGetAutodialAddressW(LPCWSTR a, LPDWORD b, LPRASAUTODIALENTRYW c,
280                                         LPDWORD d, LPDWORD e)
281 {
282         FIXME("(%s,%p,%p,%p,%p),stub!\n",debugstr_w(a),b,c,d,e);
283         return 0;
284 }
285
286 /**************************************************************************
287  *                 RasGetAutodialEnableA        [RASAPI32.26]
288  */
289 DWORD WINAPI RasGetAutodialEnableA(DWORD a, LPBOOL b)
290 {
291         FIXME("(%x,%p),stub!\n",a,b);
292         return 0;
293 }
294
295 /**************************************************************************
296  *                 RasGetAutodialEnableW        [RASAPI32.27]
297  */
298 DWORD WINAPI RasGetAutodialEnableW(DWORD a, LPBOOL b)
299 {
300         FIXME("(%x,%p),stub!\n",a,b);
301         return 0;
302 }
303
304 /**************************************************************************
305  *                 RasGetAutodialParamA         [RASAPI32.28]
306  */
307 DWORD WINAPI RasGetAutodialParamA(DWORD dwKey, LPVOID lpvValue, LPDWORD lpdwcbValue)
308 {
309         FIXME("(%x,%p,%p),stub!\n",dwKey,lpvValue,lpdwcbValue);
310         return 0;
311 }
312
313 /**************************************************************************
314  *                 RasGetAutodialParamW         [RASAPI32.29]
315  */
316 DWORD WINAPI RasGetAutodialParamW(DWORD dwKey, LPVOID lpvValue, LPDWORD lpdwcbValue)
317 {
318         FIXME("(%x,%p,%p),stub!\n",dwKey,lpvValue,lpdwcbValue);
319         return 0;
320 }
321
322 /**************************************************************************
323  *                 RasSetAutodialAddressA       [RASAPI32.57]
324  */
325 DWORD WINAPI RasSetAutodialAddressA(LPCSTR a, DWORD b, LPRASAUTODIALENTRYA c,
326                                         DWORD d, DWORD e)
327 {
328         FIXME("(%s,%x,%p,%x,%x),stub!\n",debugstr_a(a),b,c,d,e);
329         return 0;
330 }
331
332 /**************************************************************************
333  *                 RasSetAutodialAddressW       [RASAPI32.58]
334  */
335 DWORD WINAPI RasSetAutodialAddressW(LPCWSTR a, DWORD b, LPRASAUTODIALENTRYW c,
336                                         DWORD d, DWORD e)
337 {
338         FIXME("(%s,%x,%p,%x,%x),stub!\n",debugstr_w(a),b,c,d,e);
339         return 0;
340 }
341
342 /**************************************************************************
343  *                 RasSetAutodialEnableA        [RASAPI32.59]
344  */
345 DWORD WINAPI RasSetAutodialEnableA(DWORD dwDialingLocation, BOOL fEnabled)
346 {
347         FIXME("(%x,%x),stub!\n",dwDialingLocation,fEnabled);
348         return 0;
349 }
350
351 /**************************************************************************
352  *                 RasSetAutodialEnableW        [RASAPI32.60]
353  */
354 DWORD WINAPI RasSetAutodialEnableW(DWORD dwDialingLocation, BOOL fEnabled)
355 {
356         FIXME("(%x,%x),stub!\n",dwDialingLocation,fEnabled);
357         return 0;
358 }
359
360 /**************************************************************************
361  *                 RasSetAutodialParamA [RASAPI32.61]
362  */
363 DWORD WINAPI RasSetAutodialParamA(DWORD a, LPVOID b, DWORD c)
364 {
365         FIXME("(%x,%p,%x),stub!\n",a,b,c);
366         return 0;
367 }
368
369 /**************************************************************************
370  *                 RasSetAutodialParamW [RASAPI32.62]
371  */
372 DWORD WINAPI RasSetAutodialParamW(DWORD a, LPVOID b, DWORD c)
373 {
374         FIXME("(%x,%p,%x),stub!\n",a,b,c);
375         return 0;
376 }
377
378 /**************************************************************************
379  *                 RasSetEntryPropertiesA       [RASAPI32.67]
380  */
381 DWORD WINAPI RasSetEntryPropertiesA(LPCSTR lpszPhonebook, LPCSTR lpszEntry,
382         LPRASENTRYA lpRasEntry, DWORD dwEntryInfoSize, LPBYTE lpbDeviceInfo,
383         DWORD dwDeviceInfoSize
384 ) {
385         FIXME("(%s,%s,%p,%d,%p,%d), stub!\n",
386                 debugstr_a(lpszPhonebook),debugstr_a(lpszEntry),
387                 lpRasEntry,dwEntryInfoSize,lpbDeviceInfo,dwDeviceInfoSize
388         );
389         FIXME("Rasentry:\n");
390         FIXME("\tdwfOptions %x\n",lpRasEntry->dwfOptions);
391         FIXME("\tszLocalPhoneNumber %s\n",debugstr_a(lpRasEntry->szLocalPhoneNumber));
392         return 0;
393 }
394
395 /**************************************************************************
396  *                 RasSetEntryPropertiesW       [RASAPI32.68]
397  */
398 DWORD WINAPI RasSetEntryPropertiesW(LPCWSTR lpszPhonebook, LPCWSTR lpszEntry,
399         LPRASENTRYW lpRasEntry, DWORD dwEntryInfoSize, LPBYTE lpbDeviceInfo,
400         DWORD dwDeviceInfoSize
401 ) {
402         FIXME("(%s,%s,%p,%d,%p,%d), stub!\n",
403                 debugstr_w(lpszPhonebook),debugstr_w(lpszEntry),
404                 lpRasEntry,dwEntryInfoSize,lpbDeviceInfo,dwDeviceInfoSize
405         );
406         return 0;
407 }
408
409 /**************************************************************************
410  *                 RasValidateEntryNameA        [RASAPI32.72]
411  */
412 DWORD WINAPI RasValidateEntryNameA(LPCSTR lpszPhonebook, LPCSTR lpszEntry) {
413         FIXME("(%s,%s), stub!\n",debugstr_a(lpszPhonebook),debugstr_a(lpszEntry));
414         return 0;
415 }
416
417 /**************************************************************************
418  *                 RasValidateEntryNameW        [RASAPI32.73]
419  */
420 DWORD WINAPI RasValidateEntryNameW(LPCWSTR lpszPhonebook, LPCWSTR lpszEntry) {
421         FIXME("(%s,%s), stub!\n",debugstr_w(lpszPhonebook),debugstr_w(lpszEntry));
422         return 0;
423 }
424
425 /**************************************************************************
426  *                 RasGetEntryPropertiesA       [RASAPI32.@]
427  */
428 DWORD WINAPI RasGetEntryPropertiesA(LPCSTR lpszPhonebook, LPCSTR lpszEntry, LPRASENTRYA lpRasEntry,
429         LPDWORD lpdwEntryInfoSize, LPBYTE lpbDeviceInfo, LPDWORD lpdwDeviceInfoSize
430 ) {
431         FIXME("(%s,%s,%p,%p,%p,%p), stub!\n", debugstr_a(lpszPhonebook), debugstr_a(lpszEntry), lpRasEntry,
432           lpdwEntryInfoSize, lpbDeviceInfo, lpdwDeviceInfoSize);
433         return 0;
434 }
435
436 /**************************************************************************
437  *                 RasGetEntryPropertiesW   [RASAPI32.@]
438  */
439 DWORD WINAPI RasGetEntryPropertiesW(LPCWSTR lpszPhonebook, LPCWSTR lpszEntry, LPRASENTRYW lpRasEntry,
440     LPDWORD lpdwEntryInfoSize, LPBYTE lpbDeviceInfo, LPDWORD lpdwDeviceInfoSize
441 ) {
442     FIXME("(%s,%s,%p,%p,%p,%p), stub!\n", debugstr_w(lpszPhonebook), debugstr_w(lpszEntry), lpRasEntry,
443           lpdwEntryInfoSize, lpbDeviceInfo, lpdwDeviceInfoSize);
444     return 0;
445 }
446
447 DWORD WINAPI RasGetErrorStringA(UINT uErrorValue, LPSTR lpszErrorString, DWORD cBufSize)
448 {
449     FIXME("(0x%08x,%p,0x%08x), stub!\n", uErrorValue, lpszErrorString, cBufSize);
450     return 1;
451 }
452
453 DWORD WINAPI RasGetErrorStringW(UINT uErrorValue, LPWSTR lpszErrorString, DWORD cBufSize)
454 {
455     FIXME("(0x%08x,%p,0x%08x), stub!\n", uErrorValue, lpszErrorString, cBufSize);
456     return 1;
457 }
458
459 DWORD WINAPI RasGetProjectionInfoA(HRASCONN hrasconn, RASPROJECTION rasprojection,
460                                    LPVOID lpprojection, LPDWORD lpcb)
461 {
462     FIXME("(%p,0x%08x,%p,%p), stub!\n", hrasconn, rasprojection, lpprojection, lpcb);
463     return 1;
464 }
465
466 DWORD WINAPI RasGetProjectionInfoW(HRASCONN hrasconn, RASPROJECTION rasprojection,
467                                    LPVOID lpprojection, LPDWORD lpcb)
468 {
469     FIXME("(%p,0x%08x,%p,%p), stub!\n", hrasconn, rasprojection, lpprojection, lpcb);
470     return 1;
471 }
472
473 DWORD WINAPI RasRenameEntryA(LPCSTR lpszPhonebook, LPCSTR lpszOldEntry, LPCSTR lpszNewEntry)
474 {
475     FIXME("(%s,%s,%s), stub!\n", debugstr_a(lpszPhonebook), debugstr_a(lpszOldEntry),
476           debugstr_a(lpszNewEntry));
477     return 0;
478 }
479
480 DWORD WINAPI RasRenameEntryW(LPCWSTR lpszPhonebook, LPCWSTR lpszOldEntry, LPCWSTR lpszNewEntry)
481 {
482     FIXME("(%s,%s,%s), stub!\n", debugstr_w(lpszPhonebook), debugstr_w(lpszOldEntry),
483           debugstr_w(lpszNewEntry));
484     return 0;
485 }
486
487 DWORD WINAPI RasSetEntryDialParamsA(LPCSTR lpszPhonebook, LPRASDIALPARAMSA lprasdialparams,
488                                     BOOL fRemovePassword)
489 {
490     FIXME("(%s,%p,0x%x), stub!\n", debugstr_a(lpszPhonebook), lprasdialparams, fRemovePassword);
491     return 0;
492 }
493
494 DWORD WINAPI RasSetEntryDialParamsW(LPCWSTR lpszPhonebook, LPRASDIALPARAMSW lprasdialparams,
495                                     BOOL fRemovePassword)
496 {
497     FIXME("(%s,%p,0x%x), stub!\n", debugstr_w(lpszPhonebook), lprasdialparams, fRemovePassword);
498     return 0;
499 }
500
501 DWORD WINAPI RasSetSubEntryPropertiesA(LPCSTR lpszPhonebook, LPCSTR lpszEntry, DWORD dwSubEntry,
502                                        LPRASSUBENTRYA lpRasSubEntry, DWORD dwcbRasSubEntry,
503                                        LPBYTE lpbDeviceConfig, DWORD dwcbDeviceConfig)
504 {
505     FIXME("(%s,%s,0x%08x,%p,0x%08x,%p,0x%08x), stub!\n", debugstr_a(lpszPhonebook),
506           debugstr_a(lpszEntry), dwSubEntry, lpRasSubEntry, dwcbRasSubEntry, lpbDeviceConfig,
507           dwcbDeviceConfig);
508     return 0;
509 }
510
511 DWORD WINAPI RasSetSubEntryPropertiesW(LPCWSTR lpszPhonebook, LPCWSTR lpszEntry, DWORD dwSubEntry,
512                                        LPRASSUBENTRYW lpRasSubEntry, DWORD dwcbRasSubEntry,
513                                        LPBYTE lpbDeviceConfig, DWORD dwcbDeviceConfig)
514 {
515     FIXME("(%s,%s,0x%08x,%p,0x%08x,%p,0x%08x), stub!\n", debugstr_w(lpszPhonebook),
516           debugstr_w(lpszEntry), dwSubEntry, lpRasSubEntry, dwcbRasSubEntry, lpbDeviceConfig,
517           dwcbDeviceConfig);
518     return 0;
519 }