From 600a8e1f61f45981513de16de8217eaf9c80f313 Mon Sep 17 00:00:00 2001 From: "Infineon\\StieberD" Date: Mon, 25 Mar 2024 15:15:48 -0700 Subject: [PATCH] added frameworks entities --- ..._EDITOR_METADATA_AGENT_API_FRAMEWORKS.json | 23 + ...DITOR_METADATA_APIROOT_API_FRAMEWORKS.json | 26 + ...ITOR_METADATA_CONTACTS_API_FRAMEWORKS.json | 40 + ...METADATA_DATABASE_SERVICES_FRAMEWORKS.json | 197 + ...OR_METADATA_ERROR_SERVICES_FRAMEWORKS.json | 65 + ...TADATA_HTTPCLIENT_SERVICES_FRAMEWORKS.json | 186 + ...TP_AUTHENTICATION_SERVICES_FRAMEWORKS.json | 102 + ...ETADATA_HTTP_JSON_SERVICES_FRAMEWORKS.json | 155 + ..._RESOURCE_MANAGER_SERVICES_FRAMEWORKS.json | 140 + ...ATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS.json | 444 + ...TOR_METADATA_HTTP_SERVICES_FRAMEWORKS.json | 592 + ..._METADATA_LOGGING_SERVICES_FRAMEWORKS.json | 99 + ...R_METADATA_MEMORY_SERVICES_FRAMEWORKS.json | 116 + ...P_EDITOR_METADATA_OATH_API_FRAMEWORKS.json | 23 + ...DITOR_METADATA_PICTURE_API_FRAMEWORKS.json | 27 + ...P_EDITOR_METADATA_PING_API_FRAMEWORKS.json | 26 + ...DITOR_METADATA_VERSION_API_FRAMEWORKS.json | 26 + ...R_METADATA_WEBACCOUNTS_API_FRAMEWORKS.json | 31 + ...ADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS.json | 68 + ...TP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT.json | 154 + ...ASRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES.json | 135 + ...SENV%003ASRP_HTTP_FRAMEWORK_RESOURCES.json | 863 + ...003ASRP_HTTP_FRAMEWORK_SERVER_ENABLED.json | 12 + .../SYSENV%003ASRP_HTTP_FRAMEWORK_SETUP.json | 37 + ...ASRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY.json | 31 + ..._FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK.json | 47 + ...HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE.json | 12 + ...EWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS.json | 12 + ...SYSENV%003ASRP_HTTP_FRAMEWORK_VERSION.json | 13 + ...SES%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json | 65 + ...EWS%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json | 216 + FRAMEWORKS/OIWIN/DBW_AUDIT_MANAGER.json | 968 + FRAMEWORKS/OIWIN/NDW_AUDIT_TRAIL.json | 1415 ++ FRAMEWORKS/OIWIN/NDW_AUDIT_VIEWER.json | 1378 ++ FRAMEWORKS/OIWIN/NDW_HTTP_DATEPICKER.json | 378 + .../OIWIN/NDW_HTTP_FRAMEWORK_SETUP.json | 19219 ++++++++++++++++ FRAMEWORKS/OIWIN/NDW_HTTP_LOGS.json | 3203 +++ .../OIWIN/NDW_HTTP_LOGS_ARCHIVE_DATE.json | 1246 + FRAMEWORKS/OIWIN/NDW_WEB_ACCOUNTS.json | 4826 ++++ FRAMEWORKS/POPUP/WEB_ACCOUNTS.json | 99 + FRAMEWORKS/STPROC/APIROOT_API.txt | 100 + FRAMEWORKS/STPROC/AUDIT_MANAGER.txt | 210 + FRAMEWORKS/STPROC/AUDIT_MANAGER_MFS.txt | 265 + FRAMEWORKS/STPROC/CONTACTS_API.txt | 284 + FRAMEWORKS/STPROC/DATABASE_SERVICES.txt | 1046 + .../STPROC/DBW_AUDIT_MANAGER_EVENTS.txt | 1204 + FRAMEWORKS/STPROC/ERROR_SERVICES.txt | 380 + FRAMEWORKS/STPROC/HTTPCLIENT_SERVICES.txt | 856 + FRAMEWORKS/STPROC/HTTP_ABORTED_SERVICE.txt | 38 + .../STPROC/HTTP_AUTHENTICATION_SERVICES.txt | 553 + FRAMEWORKS/STPROC/HTTP_CONTACTS_SERVICES.txt | 535 + FRAMEWORKS/STPROC/HTTP_DEBUGGER_SERVICE.txt | 31 + .../STPROC/HTTP_ENTRY_POINT_SERVICES.txt | 199 + FRAMEWORKS/STPROC/HTTP_JSON_SERVICES.txt | 909 + FRAMEWORKS/STPROC/HTTP_MCP.txt | 195 + FRAMEWORKS/STPROC/HTTP_PICTURE_SERVICES.txt | 252 + .../STPROC/HTTP_RESOURCE_MANAGER_SERVICES.txt | 582 + FRAMEWORKS/STPROC/HTTP_RESOURCE_SERVICES.txt | 1790 ++ FRAMEWORKS/STPROC/HTTP_SERVICES.txt | 3123 +++ FRAMEWORKS/STPROC/HTTP_USERS_SERVICES.txt | 256 + FRAMEWORKS/STPROC/HTTP_VERSION_SERVICES.txt | 162 + .../STPROC/HTTP_WEBACCOUNTS_SERVICES.txt | 251 + FRAMEWORKS/STPROC/LOGGING_SERVICES.txt | 506 + FRAMEWORKS/STPROC/MEMORY_SERVICES.txt | 408 + FRAMEWORKS/STPROC/NDW_AUDIT_TRAIL_EVENTS.txt | 1141 + FRAMEWORKS/STPROC/NDW_AUDIT_VIEWER_EVENTS.txt | 437 + .../STPROC/NDW_HTTP_DATEPICKER_EVENTS.txt | 290 + .../NDW_HTTP_FRAMEWORK_SETUP_EVENTS.txt | 2172 ++ .../NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS.txt | 199 + FRAMEWORKS/STPROC/NDW_HTTP_LOGS_EVENTS.txt | 1086 + FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt | 403 + FRAMEWORKS/STPROC/OATH_API.txt | 56 + FRAMEWORKS/STPROC/OAUTH_API.txt | 61 + FRAMEWORKS/STPROC/PICTURE_API.txt | 167 + FRAMEWORKS/STPROC/PING_API.txt | 82 + FRAMEWORKS/STPROC/SRP_BREADCRUMBBAR.txt | 1033 + FRAMEWORKS/STPROC/VERSION_API.txt | 81 + FRAMEWORKS/STPROC/WEBACCOUNTS_API.txt | 205 + FRAMEWORKS/STPROC/WEBACCOUNTS_SERVICES.txt | 204 + FRAMEWORKS/STPROC/WEB_ACCOUNTS_ACTIONS.txt | 226 + FRAMEWORKS/STPROCINS/ACTION_SETUP.txt | 133 + FRAMEWORKS/STPROCINS/API_SETUP.txt | 48 + FRAMEWORKS/STPROCINS/APP_INSERTS.txt | 252 + FRAMEWORKS/STPROCINS/CONTACTS_EQUATES.txt | 36 + FRAMEWORKS/STPROCINS/EVENT_SETUP.txt | 99 + .../HTTP_FRAMEWORK_SETUP_EQUATES.txt | 131 + FRAMEWORKS/STPROCINS/HTTP_INSERTS.txt | 28 + FRAMEWORKS/STPROCINS/HTTP_SERVICE_SETUP.txt | 54 + FRAMEWORKS/STPROCINS/INET_EQUATES.txt | 77 + FRAMEWORKS/STPROCINS/INVOICES_EQUATES.txt | 15 + FRAMEWORKS/STPROCINS/MENU_EQUATES.txt | 43 + FRAMEWORKS/STPROCINS/SECURITY_EQUATES.txt | 3 + FRAMEWORKS/STPROCINS/SERVICE_SETUP.txt | 43 + FRAMEWORKS/STPROCINS/SRPMAIL_INSERTS.txt | 42 + FRAMEWORKS/STPROCINS/WEB_ACCOUNTS_EQUATES.txt | 36 + 95 files changed, 59733 insertions(+) create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_AGENT_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_APIROOT_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_CONTACTS_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_DATABASE_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_ERROR_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTPCLIENT_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_AUTHENTICATION_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_JSON_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_MANAGER_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_LOGGING_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_MEMORY_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_OATH_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PICTURE_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PING_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_VERSION_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_API_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_RESOURCES.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SERVER_ENABLED.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SETUP.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS.json create mode 100644 FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_VERSION.json create mode 100644 FRAMEWORKS/APPROW/SYSREPOSRELEASES%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json create mode 100644 FRAMEWORKS/APPROW/SYSREPOSVIEWS%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json create mode 100644 FRAMEWORKS/OIWIN/DBW_AUDIT_MANAGER.json create mode 100644 FRAMEWORKS/OIWIN/NDW_AUDIT_TRAIL.json create mode 100644 FRAMEWORKS/OIWIN/NDW_AUDIT_VIEWER.json create mode 100644 FRAMEWORKS/OIWIN/NDW_HTTP_DATEPICKER.json create mode 100644 FRAMEWORKS/OIWIN/NDW_HTTP_FRAMEWORK_SETUP.json create mode 100644 FRAMEWORKS/OIWIN/NDW_HTTP_LOGS.json create mode 100644 FRAMEWORKS/OIWIN/NDW_HTTP_LOGS_ARCHIVE_DATE.json create mode 100644 FRAMEWORKS/OIWIN/NDW_WEB_ACCOUNTS.json create mode 100644 FRAMEWORKS/POPUP/WEB_ACCOUNTS.json create mode 100644 FRAMEWORKS/STPROC/APIROOT_API.txt create mode 100644 FRAMEWORKS/STPROC/AUDIT_MANAGER.txt create mode 100644 FRAMEWORKS/STPROC/AUDIT_MANAGER_MFS.txt create mode 100644 FRAMEWORKS/STPROC/CONTACTS_API.txt create mode 100644 FRAMEWORKS/STPROC/DATABASE_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/DBW_AUDIT_MANAGER_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/ERROR_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTPCLIENT_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_ABORTED_SERVICE.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_AUTHENTICATION_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_CONTACTS_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_DEBUGGER_SERVICE.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_ENTRY_POINT_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_JSON_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_MCP.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_PICTURE_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_RESOURCE_MANAGER_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_RESOURCE_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_USERS_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_VERSION_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/HTTP_WEBACCOUNTS_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/LOGGING_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/MEMORY_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/NDW_AUDIT_TRAIL_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_AUDIT_VIEWER_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_HTTP_DATEPICKER_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_HTTP_FRAMEWORK_SETUP_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_HTTP_LOGS_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt create mode 100644 FRAMEWORKS/STPROC/OATH_API.txt create mode 100644 FRAMEWORKS/STPROC/OAUTH_API.txt create mode 100644 FRAMEWORKS/STPROC/PICTURE_API.txt create mode 100644 FRAMEWORKS/STPROC/PING_API.txt create mode 100644 FRAMEWORKS/STPROC/SRP_BREADCRUMBBAR.txt create mode 100644 FRAMEWORKS/STPROC/VERSION_API.txt create mode 100644 FRAMEWORKS/STPROC/WEBACCOUNTS_API.txt create mode 100644 FRAMEWORKS/STPROC/WEBACCOUNTS_SERVICES.txt create mode 100644 FRAMEWORKS/STPROC/WEB_ACCOUNTS_ACTIONS.txt create mode 100644 FRAMEWORKS/STPROCINS/ACTION_SETUP.txt create mode 100644 FRAMEWORKS/STPROCINS/API_SETUP.txt create mode 100644 FRAMEWORKS/STPROCINS/APP_INSERTS.txt create mode 100644 FRAMEWORKS/STPROCINS/CONTACTS_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/EVENT_SETUP.txt create mode 100644 FRAMEWORKS/STPROCINS/HTTP_FRAMEWORK_SETUP_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/HTTP_INSERTS.txt create mode 100644 FRAMEWORKS/STPROCINS/HTTP_SERVICE_SETUP.txt create mode 100644 FRAMEWORKS/STPROCINS/INET_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/INVOICES_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/MENU_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/SECURITY_EQUATES.txt create mode 100644 FRAMEWORKS/STPROCINS/SERVICE_SETUP.txt create mode 100644 FRAMEWORKS/STPROCINS/SRPMAIL_INSERTS.txt create mode 100644 FRAMEWORKS/STPROCINS/WEB_ACCOUNTS_EQUATES.txt diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_AGENT_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_AGENT_API_FRAMEWORKS.json new file mode 100644 index 0000000..04e2ad6 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_AGENT_API_FRAMEWORKS.json @@ -0,0 +1,23 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*AGENT_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": "version.GET", + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_APIROOT_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_APIROOT_API_FRAMEWORKS.json new file mode 100644 index 0000000..d59265b --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_APIROOT_API_FRAMEWORKS.json @@ -0,0 +1,26 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*APIROOT_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "APIROOT.HEAD", + "<7,2>": "APIROOT.GET" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_CONTACTS_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_CONTACTS_API_FRAMEWORKS.json new file mode 100644 index 0000000..7876329 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_CONTACTS_API_FRAMEWORKS.json @@ -0,0 +1,40 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*CONTACTS_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "contacts.HEAD", + "<7,2>": "contacts.GET", + "<7,3>": "contacts.POST", + "<7,4>": "contacts.ID.HEAD", + "<7,5>": "contacts.ID.GET", + "<7,6>": "contacts.ID.PATCH", + "<7,7>": "contacts.ID.PUT", + "<7,8>": "contacts.ID.DELETE", + "<7,9>": "contacts.ID.first_name.HEAD", + "<7,10>": "contacts.ID.first_name.GET", + "<7,11>": "contacts.ID.first_name.PATCH", + "<7,12>": "contacts.ID.last_name.HEAD", + "<7,13>": "contacts.ID.last_name.GET", + "<7,14>": "contacts.ID.last_name.PATCH", + "<7,15>": "contacts.ID.first_name.PUT", + "<7,16>": "contacts.ID.last_name.PUT" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_DATABASE_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_DATABASE_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..ae29ceb --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_DATABASE_SERVICES_FRAMEWORKS.json @@ -0,0 +1,197 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*DATABASE_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "CalculateColumn", + "<7,2>": "ClearTableHandle", + "<7,3>": "DeleteDataRow", + "<7,4>": "GetKeyIDLock", + "<7,5>": "GetTableCommuter", + "<7,6>": "GetTableHandle", + "<7,7>": "GetTableNames", + "<7,8>": "GetTableProperties", + "<7,9>": "GetUserLocks", + "<7,10>": "IsKeyIDLocked", + "<7,11>": "IsKeyIDSelfLocked", + "<7,12>": "ReadDataRow", + "<7,13>": "ReleaseKeyIDLock", + "<7,14>": "SearchIndex", + "<7,15>": "SetTableAlias", + "<7,16>": "UnlockKeyID", + "<7,17>": "VerifyLH", + "<7,18>": "VerifyLHAll", + "<7,19>": "WriteDataRow" + }, + "<8>": { + "<8,1>": "", + "<8,2>": "TableName", + "<8,3>": { + "<8,3,1>": "TableName", + "<8,3,2>": "KeyID", + "<8,3,3>": "IgnoreSelfLock", + "<8,3,4>": "IgnoreMFSRoutines" + }, + "<8,4>": { + "<8,4,1>": "TableName", + "<8,4,2>": "KeyID", + "<8,4,3>": "IgnoreSelfLock" + }, + "<8,5>": "TableName", + "<8,6>": "TableName", + "<8,7>": { + "<8,7,1>": "ApplicationTablesOnly", + "<8,7,2>": "ExcludeDictionaries", + "<8,7,3>": "ExcludeIndexes" + }, + "<8,8>": "TableName", + "<8,9>": "", + "<8,10>": { + "<8,10,1>": "TableName", + "<8,10,2>": "KeyID", + "<8,10,3>": "IgnoreSelfLock" + }, + "<8,11>": { + "<8,11,1>": "TableName", + "<8,11,2>": "KeyID" + }, + "<8,12>": { + "<8,12,1>": "TableName", + "<8,12,2>": "KeyID", + "<8,12,3>": "NotExpired", + "<8,12,4>": "ExpirationDuration", + "<8,12,5>": "IgnoreMFSRoutines" + }, + "<8,13>": { + "<8,13,1>": "TableName", + "<8,13,2>": "KeyID" + }, + "<8,14>": { + "<8,14,1>": "TableName", + "<8,14,2>": "ColumnName", + "<8,14,3>": "SearchValue", + "<8,14,4>": "UpdateIndex" + }, + "<8,15>": { + "<8,15,1>": "TableName", + "<8,15,2>": "AliasName", + "<8,15,3>": "Volume", + "<8,15,4>": "DatabaseID" + }, + "<8,16>": { + "<8,16,1>": "TableName", + "<8,16,2>": "KeyID" + }, + "<8,17>": { + "<8,17,1>": "Tablenames", + "<8,17,2>": "SaveList" + }, + "<8,18>": "", + "<8,19>": { + "<8,19,1>": "TableName", + "<8,19,2>": "KeyID", + "<8,19,3>": "DataRow", + "<8,19,4>": "IgnoreSelfLock", + "<8,19,5>": "IgnoreMFSRoutines", + "<8,19,6>": "IgnoreAllLocks" + } + }, + "<9>": { + "<9,1>": "", + "<9,2>": "", + "<9,3>": { + "<9,3,1>": "", + "<9,3,2>": "", + "<9,3,3>": "", + "<9,3,4>": "" + }, + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "", + "<9,4,3>": "" + }, + "<9,5>": "", + "<9,6>": "", + "<9,7>": { + "<9,7,1>": "BOOLEAN", + "<9,7,2>": "BOOLEAN", + "<9,7,3>": "BOOLEAN" + }, + "<9,8>": "", + "<9,9>": "", + "<9,10>": { + "<9,10,1>": "", + "<9,10,2>": "", + "<9,10,3>": "BOOLEAN" + }, + "<9,11>": { + "<9,11,1>": "", + "<9,11,2>": "" + }, + "<9,12>": { + "<9,12,1>": "", + "<9,12,2>": "", + "<9,12,3>": "", + "<9,12,4>": "", + "<9,12,5>": "" + }, + "<9,13>": { + "<9,13,1>": "", + "<9,13,2>": "" + }, + "<9,14>": { + "<9,14,1>": "", + "<9,14,2>": "", + "<9,14,3>": "", + "<9,14,4>": "" + }, + "<9,15>": { + "<9,15,1>": "", + "<9,15,2>": "", + "<9,15,3>": "", + "<9,15,4>": "" + }, + "<9,16>": { + "<9,16,1>": "", + "<9,16,2>": "" + }, + "<9,17>": { + "<9,17,1>": "", + "<9,17,2>": "" + }, + "<9,18>": "", + "<9,19>": { + "<9,19,1>": "", + "<9,19,2>": "", + "<9,19,3>": "", + "<9,19,4>": "", + "<9,19,5>": "", + "<9,19,6>": "" + } + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_ERROR_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_ERROR_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..f429425 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_ERROR_SERVICES_FRAMEWORKS.json @@ -0,0 +1,65 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*ERROR_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "Set", + "<7,2>": "Add", + "<7,3>": "Clear", + "<7,4>": "GetMessage", + "<7,5>": "GetMessages", + "<7,6>": "HasError", + "<7,7>": "NoError", + "<7,8>": "DisplayError", + "<7,9>": "GetSource", + "<7,10>": "GetSources", + "<7,11>": "GetCode", + "<7,12>": "GetCodes", + "<7,13>": "GetStackTrace" + }, + "<8>": { + "<8,1>": "ErrorMessage", + "<8,2>": "ErrorMessage", + "<8,3>": "", + "<8,4>": "", + "<8,5>": "", + "<8,6>": "", + "<8,7>": "", + "<8,8>": "Justification" + }, + "<9>": { + "<9,1>": "", + "<9,2>": "", + "<9,3>": "", + "<9,4>": "", + "<9,5>": "", + "<9,6>": "", + "<9,7>": "", + "<9,8>": "" + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTPCLIENT_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTPCLIENT_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..2715676 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTPCLIENT_SERVICES_FRAMEWORKS.json @@ -0,0 +1,186 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTPCLIENT_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "SendHTTPRequestOLE", + "<7,2>": "SendHTTPRequest", + "<7,3>": "SetRequestHeaderFields", + "<7,4>": "SetRequestHeaderField", + "<7,5>": "GetRequestHeaderFields", + "<7,6>": "GetRequestHeaderField", + "<7,7>": "SetResponseHeaderField", + "<7,8>": "GetResponseHeaderFields", + "<7,9>": "GetResponseHeaderField", + "<7,10>": "GetCookies", + "<7,11>": "GetCookie", + "<7,12>": "SetResponseStatusCode", + "<7,13>": "GetResponseStatusCode", + "<7,14>": "SetResponseStatusPhrase", + "<7,15>": "GetResponseStatusPhrase", + "<7,16>": "SetResponseBody", + "<7,17>": "GetResponseBody", + "<7,18>": "SetTimeoutDuration", + "<7,19>": "GetTimeoutDuration", + "<7,20>": "ClearResponseSettings", + "<7,21>": "ClearRequestSettings" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "Method", + "<8,1,2>": "URL", + "<8,1,3>": "HeaderList", + "<8,1,4>": "Body", + "<8,1,5>": "ProxyUser", + "<8,1,6>": "ProxyPassword", + "<8,1,7>": "UseAsynchronous", + "<8,1,8>": "UseClientXMLHTTP", + "<8,1,9>": "ClientCertPath" + }, + "<8,2>": { + "<8,2,1>": "Method", + "<8,2,2>": "URL", + "<8,2,3>": "HeaderList", + "<8,2,4>": "Body", + "<8,2,5>": "ProxyUser", + "<8,2,6>": "ProxyPassword", + "<8,2,7>": "UseAsynchronous", + "<8,2,8>": "UseClientXMLHTTP", + "<8,2,9>": "ClientCertPath" + }, + "<8,3>": "HeaderList", + "<8,4>": { + "<8,4,1>": "Name", + "<8,4,2>": "Value" + }, + "<8,5>": "", + "<8,6>": "Name", + "<8,7>": { + "<8,7,1>": "Name", + "<8,7,2>": "Value" + }, + "<8,8>": "", + "<8,9>": { + "<8,9,1>": "Name", + "<8,9,2>": "Delimiter" + }, + "<8,10>": "Delimiter", + "<8,11>": { + "<8,11,1>": "Name", + "<8,11,2>": "IgnoreAttributes" + }, + "<8,12>": "Code", + "<8,13>": "", + "<8,14>": "Phrase", + "<8,15>": "", + "<8,16>": "Body", + "<8,17>": "", + "<8,18>": "TimeoutDuration" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "", + "<9,1,3>": "", + "<9,1,4>": "", + "<9,1,5>": "", + "<9,1,6>": "", + "<9,1,7>": "", + "<9,1,8>": "", + "<9,1,9>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "", + "<9,2,3>": "", + "<9,2,4>": "", + "<9,2,5>": "", + "<9,2,6>": "", + "<9,2,7>": "", + "<9,2,8>": "", + "<9,2,9>": "" + }, + "<9,3>": "", + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "" + }, + "<9,5>": "", + "<9,6>": "", + "<9,7>": { + "<9,7,1>": "", + "<9,7,2>": "" + }, + "<9,8>": "", + "<9,9>": { + "<9,9,1>": "RESPONSEHEADERNAMES", + "<9,9,2>": "" + }, + "<9,10>": "", + "<9,11>": { + "<9,11,1>": "", + "<9,11,2>": "BOOLEAN" + }, + "<9,12>": "", + "<9,13>": "", + "<9,14>": "", + "<9,15>": "", + "<9,16>": "", + "<9,17>": "", + "<9,18>": "" + }, + "<10>": { + "<10,1>": "BOOLEAN", + "<10,2>": "RESPONSEHEADERNAMES" + }, + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + }, + "<11,2>": { + "<11,2,1>": "Access-Control-Allow-Headers", + "<11,2,2>": "Access-Control-Allow-Methods", + "<11,2,3>": "Access-Control-Allow-Origin", + "<11,2,4>": "Allow", + "<11,2,5>": "Content-Encoding", + "<11,2,6>": "Content-Language", + "<11,2,7>": "Content-Length", + "<11,2,8>": "Content-Location", + "<11,2,9>": "Content-Disposition", + "<11,2,10>": "Content-Type", + "<11,2,11>": "Date", + "<11,2,12>": "Expires", + "<11,2,13>": "Last-Modified", + "<11,2,14>": "Link", + "<11,2,15>": "Location", + "<11,2,16>": "Retry-After", + "<11,2,17>": "Server", + "<11,2,18>": "Set-Cookie", + "<11,2,19>": "Transfer-Encoding", + "<11,2,20>": "Vary", + "<11,2,21>": "WWW-Authenticate" + } + }, + "<12>": { + "<12,1>": "0", + "<12,2>": "1" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_AUTHENTICATION_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_AUTHENTICATION_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..89afd10 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_AUTHENTICATION_SERVICES_FRAMEWORKS.json @@ -0,0 +1,102 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTP_AUTHENTICATION_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "AuthenticateRequest", + "<7,2>": "CleanUp", + "<7,3>": "GetWebAccountEnabledStatus", + "<7,4>": "GetWebAccountPassword", + "<7,5>": "ResetWebAccountPassword", + "<7,6>": "ValidateWebAccountPassword", + "<7,7>": "SetWebAccountPassword", + "<7,8>": "SetAuthenticatedAccountID", + "<7,9>": "GetAuthenticatedAccountID", + "<7,10>": "SetAuthenticatedPassword", + "<7,11>": "GetAuthenticatedPassword", + "<7,12>": "ContainmentActionNotification" + }, + "<8>": { + "<8,1>": "", + "<8,2>": "", + "<8,3>": "AccountID", + "<8,4>": { + "<8,4,1>": "AccountID", + "<8,4,2>": "CreateIfNew" + }, + "<8,5>": { + "<8,5,1>": "AccountID", + "<8,5,2>": "CurrentPassword" + }, + "<8,6>": { + "<8,6,1>": "AccountID", + "<8,6,2>": "Password", + "<8,6,3>": "CurrentOnly" + }, + "<8,7>": { + "<8,7,1>": "AccountID", + "<8,7,2>": "CurrentPassword", + "<8,7,3>": "NewPassword", + "<8,7,4>": "OverrideExpireDate" + }, + "<8,8>": "AccountID", + "<8,9>": "", + "<8,10>": "Password", + "<8,11>": "", + "<8,12>": "ActionDetails" + }, + "<9>": { + "<9,1>": "", + "<9,2>": "", + "<9,3>": "", + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "" + }, + "<9,5>": { + "<9,5,1>": "", + "<9,5,2>": "" + }, + "<9,6>": { + "<9,6,1>": "", + "<9,6,2>": "", + "<9,6,3>": "" + }, + "<9,7>": { + "<9,7,1>": "", + "<9,7,2>": "", + "<9,7,3>": "", + "<9,7,4>": "" + }, + "<9,8>": "", + "<9,9>": "", + "<9,10>": "", + "<9,11>": "", + "<9,12>": "" + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_JSON_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_JSON_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..a6bcab6 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_JSON_SERVICES_FRAMEWORKS.json @@ -0,0 +1,155 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTP_JSON_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "SetHALItem", + "<7,2>": "SetHALCollection", + "<7,3>": "SetHALCollectionEmbedded", + "<7,4>": "SetHALLinks", + "<7,5>": "SetHALEmbedded", + "<7,6>": "GetHALRootObj", + "<7,7>": "GetHAL", + "<7,8>": "GetSchemaRootObj", + "<7,9>": "SetSchemaMeta", + "<7,10>": "SetSchemaProperty", + "<7,11>": "GetSchema", + "<7,12>": "GetURLFromID", + "<7,13>": "GetIDFromURL" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "ItemURL", + "<8,1,2>": "ColumnNames", + "<8,1,3>": "ColumnValues", + "<8,1,4>": "DataTypes", + "<8,1,5>": "MVGroupNames" + }, + "<8,2>": { + "<8,2,1>": "CollectionURL", + "<8,2,2>": "ItemsURLs", + "<8,2,3>": "ItemsTitles" + }, + "<8,3>": { + "<8,3,1>": "CollectionURL", + "<8,3,2>": "ItemsURLs", + "<8,3,3>": "ColumnNames", + "<8,3,4>": "ColumnValues", + "<8,3,5>": "DataTypes", + "<8,3,6>": "MVGroupNames" + }, + "<8,4>": { + "<8,4,1>": "SelfURI", + "<8,4,2>": "HREFNames", + "<8,4,3>": "HREFURIs", + "<8,4,4>": "ChildNames", + "<8,4,5>": "hChildren", + "<8,4,6>": "Names", + "<8,4,7>": "Values" + }, + "<8,5>": "", + "<8,6>": "", + "<8,7>": "ItemArrayLabel", + "<8,8>": "", + "<8,9>": { + "<8,9,1>": "Title", + "<8,9,2>": "Description", + "<8,9,3>": "Type" + }, + "<8,10>": { + "<8,10,1>": "Name", + "<8,10,2>": "Title", + "<8,10,3>": "Type", + "<8,10,4>": "Format", + "<8,10,5>": "EnumList", + "<8,10,6>": "Required" + }, + "<8,11>": "", + "<8,12>": "ID", + "<8,13>": { + "<8,13,1>": "URL", + "<8,13,2>": "Array", + "<8,13,3>": "Table" + } + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "", + "<9,1,3>": "", + "<9,1,4>": "", + "<9,1,5>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "", + "<9,2,3>": "" + }, + "<9,3>": { + "<9,3,1>": "", + "<9,3,2>": "", + "<9,3,3>": "", + "<9,3,4>": "", + "<9,3,5>": "", + "<9,3,6>": "" + }, + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "", + "<9,4,3>": "", + "<9,4,4>": "", + "<9,4,5>": "", + "<9,4,6>": "", + "<9,4,7>": "" + }, + "<9,5>": "", + "<9,6>": "", + "<9,7>": "", + "<9,8>": "", + "<9,9>": { + "<9,9,1>": "", + "<9,9,2>": "", + "<9,9,3>": "" + }, + "<9,10>": { + "<9,10,1>": "", + "<9,10,2>": "", + "<9,10,3>": "", + "<9,10,4>": "", + "<9,10,5>": "", + "<9,10,6>": "" + }, + "<9,11>": "", + "<9,12>": "", + "<9,13>": { + "<9,13,1>": "", + "<9,13,2>": "", + "<9,13,3>": "" + } + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_MANAGER_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_MANAGER_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..c4777e7 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_MANAGER_SERVICES_FRAMEWORKS.json @@ -0,0 +1,140 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTP_RESOURCE_MANAGER_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "GetResourceProperty", + "<7,2>": "SetResourceProperty", + "<7,3>": "GetResourceChildren", + "<7,4>": "GetResourceSignature", + "<7,5>": "GetEndpointResourceKeyID", + "<7,6>": "GetResource", + "<7,7>": "SetResource", + "<7,8>": "IsValidEndpoint", + "<7,9>": "GetResourceList" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "URLEndpoint", + "<8,1,2>": "PropertyName" + }, + "<8,2>": { + "<8,2,1>": "URLEndpoint", + "<8,2,2>": "PropertyName", + "<8,2,3>": "PropertyValue" + }, + "<8,3>": { + "<8,3,1>": "URLEndpoint", + "<8,3,2>": "ChildType" + }, + "<8,4>": { + "<8,4,1>": "URLEndpoint", + "<8,4,2>": "Method" + }, + "<8,5>": { + "<8,5,1>": "URLEndpoint", + "<8,5,2>": "AllowNew" + }, + "<8,6>": "URLEndpoint", + "<8,7>": { + "<8,7,1>": "URLEndpoint", + "<8,7,2>": "PropertyArray" + }, + "<8,8>": "URLEndpoint" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "PROPERTIES" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "PROPERTIES", + "<9,2,3>": "" + }, + "<9,3>": { + "<9,3,1>": "", + "<9,3,2>": "CHILDREN" + }, + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "METHODS" + }, + "<9,5>": { + "<9,5,1>": "", + "<9,5,2>": "" + }, + "<9,6>": "", + "<9,7>": { + "<9,7,1>": "", + "<9,7,2>": "" + }, + "<9,8>": "" + }, + "<10>": { + "<10,1>": "BOOLEAN", + "<10,2>": "CLASSES", + "<10,3>": "PROPERTIES", + "<10,4>": "CHILDREN", + "<10,5>": "METHODS" + }, + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + }, + "<11,2>": { + "<11,2,1>": "APIROOT", + "<11,2,2>": "RESOURCE", + "<11,2,3>": "RESOURCE_ID", + "<11,2,4>": "PROPERTY" + }, + "<11,3>": { + "<11,3,1>": "CLASS", + "<11,3,2>": "DESCRIPTION", + "<11,3,3>": "EXCLUDE_LOGGING", + "<11,3,4>": "METHODS", + "<11,3,5>": "NAME", + "<11,3,6>": "RESOURCE", + "<11,3,7>": "TITLE", + "<11,3,8>": "QUERY_PARAMS" + }, + "<11,4>": { + "<11,4,1>": "ALL", + "<11,4,2>": "RESOURCE", + "<11,4,3>": "RESOURCE_ID", + "<11,4,4>": "PROPERTY" + }, + "<11,5>": { + "<11,5,1>": "GET", + "<11,5,2>": "POST", + "<11,5,3>": "PUT", + "<11,5,4>": "PATCH", + "<11,5,5>": "DELETE" + } + }, + "<12>": { + "<12,1>": "0", + "<12,2>": "1", + "<12,3>": "1", + "<12,4>": "1", + "<12,5>": "1" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..15f746f --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS.json @@ -0,0 +1,444 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTP_RESOURCE_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "GetObject", + "<7,2>": "GetObjects", + "<7,3>": "ParseResource", + "<7,4>": "AddProperty", + "<7,5>": "AddProperties", + "<7,6>": "AddSubProperty", + "<7,7>": "AddSubProperties", + "<7,8>": "AddSubResourceObject", + "<7,9>": "AddSubResourceObjects", + "<7,10>": "AddSubResource", + "<7,11>": "AddSubResources", + "<7,12>": "AddLinkRelation", + "<7,13>": "AddLinkRelations", + "<7,14>": "AddEmbeddedResources", + "<7,15>": "AddFormAction", + "<7,16>": "GetSerializedResource", + "<7,17>": "LoremIpsum", + "<7,18>": "GetURLTemplate", + "<7,19>": "GetDatabaseItem", + "<7,20>": "GetDatabaseItems", + "<7,21>": "DeleteDatabaseItem", + "<7,22>": "PutDatabaseItem", + "<7,23>": "PostDatabaseItem", + "<7,24>": "PatchDatabaseItem", + "<7,25>": "GetColumnNames", + "<7,26>": "GetColumnValues", + "<7,27>": "GetMVGroupNames" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "TableName", + "<8,1,2>": "KeyID", + "<8,1,3>": "ColumnNames", + "<8,1,4>": "PropertyNames", + "<8,1,5>": "DataTypes", + "<8,1,6>": "MVGroupNames", + "<8,1,7>": "NestedGroupNames", + "<8,1,8>": "BaseSelfRelURL", + "<8,1,9>": "KeyParts", + "<8,1,10>": "KeyDelimiter", + "<8,1,11>": "AllowKeyProperty" + }, + "<8,2>": { + "<8,2,1>": "TableName", + "<8,2,2>": "Filter", + "<8,2,3>": "ColumnNames", + "<8,2,4>": "PropertyNames", + "<8,2,5>": "DataTypes", + "<8,2,6>": "MVGroupNames", + "<8,2,7>": "NestedGroupNames", + "<8,2,8>": "BaseSelfRelURL", + "<8,2,9>": "KeyParts", + "<8,2,10>": "KeyDelimiter", + "<8,2,11>": "AllowKeyProperty" + }, + "<8,3>": "SerializedResource", + "<8,4>": { + "<8,4,1>": "ObjectHandle", + "<8,4,2>": "PropertyName", + "<8,4,3>": "PropertyValue", + "<8,4,4>": "DataType" + }, + "<8,5>": { + "<8,5,1>": "ObjectHandle", + "<8,5,2>": "PropertyNames", + "<8,5,3>": "PropertyValues", + "<8,5,4>": "DataTypes" + }, + "<8,6>": { + "<8,6,1>": "ObjectHandle", + "<8,6,2>": "PropertyName", + "<8,6,3>": "SubPropertyName", + "<8,6,4>": "SubPropertyValue", + "<8,6,5>": "DataType" + }, + "<8,7>": { + "<8,7,1>": "ObjectHandle", + "<8,7,2>": "PropertyName", + "<8,7,3>": "SubPropertyNames", + "<8,7,4>": "SubPropertyValues", + "<8,7,5>": "DataTypes" + }, + "<8,8>": { + "<8,8,1>": "ObjectHandle", + "<8,8,2>": "PropertyName", + "<8,8,3>": "SubResourceObjectHandle" + }, + "<8,9>": { + "<8,9,1>": "ObjectHandle", + "<8,9,2>": "PropertyName", + "<8,9,3>": "SubResourceObjectHandles" + }, + "<8,10>": { + "<8,10,1>": "ObjectHandle", + "<8,10,2>": "PropertyName", + "<8,10,3>": "SubResourcePropertyNames", + "<8,10,4>": "SubResourcePropertyValues", + "<8,10,5>": "DataTypes" + }, + "<8,11>": { + "<8,11,1>": "ObjectHandle", + "<8,11,2>": "PropertyName", + "<8,11,3>": "SubResourcePropertyNames", + "<8,11,4>": "SubResourcePropertyValuesArray", + "<8,11,5>": "DataTypes" + }, + "<8,12>": { + "<8,12,1>": "ObjectHandle", + "<8,12,2>": "Relation", + "<8,12,3>": "URL", + "<8,12,4>": "Title", + "<8,12,5>": "IsTemplate", + "<8,12,6>": "IgnoreResourceID", + "<8,12,7>": "IgnoreProperty", + "<8,12,8>": "IgnoreQueryParam" + }, + "<8,13>": { + "<8,13,1>": "ObjectHandle", + "<8,13,2>": "Relations", + "<8,13,3>": "URLs", + "<8,13,4>": "Titles", + "<8,13,5>": "IsTemplates", + "<8,13,6>": "IgnoreResourceIDs", + "<8,13,7>": "IgnoreProperties", + "<8,13,8>": "IgnoreQueryParams" + }, + "<8,14>": { + "<8,14,1>": "ObjectHandle", + "<8,14,2>": "EmbeddedResourceName", + "<8,14,3>": "EmbeddedResourceObjectHandles", + "<8,14,4>": "Singular" + }, + "<8,15>": { + "<8,15,1>": "ObjectHandle", + "<8,15,2>": "Name", + "<8,15,3>": "Method", + "<8,15,4>": "URL", + "<8,15,5>": "Title", + "<8,15,6>": "Fields", + "<8,15,7>": "FieldProperties" + }, + "<8,16>": { + "<8,16,1>": "ObjectHandle", + "<8,16,2>": "Style" + }, + "<8,17>": "", + "<8,18>": { + "<8,18,1>": "URL", + "<8,18,2>": "IgnoreResourceID", + "<8,18,3>": "IgnoreProperty", + "<8,18,4>": "IgnoreQueryParam" + }, + "<8,19>": { + "<8,19,1>": "TableName", + "<8,19,2>": "SelfURL", + "<8,19,3>": "KeyID", + "<8,19,4>": "ColumnNames", + "<8,19,5>": "ItemArrayLabel" + }, + "<8,20>": { + "<8,20,1>": "Filter", + "<8,20,2>": "TableName", + "<8,20,3>": "SelfURL", + "<8,20,4>": "ColumnNames", + "<8,20,5>": "ItemArrayLabel" + }, + "<8,21>": { + "<8,21,1>": "TableName", + "<8,21,2>": "KeyID" + }, + "<8,22>": { + "<8,22,1>": "TableName", + "<8,22,2>": "SelfURL", + "<8,22,3>": "KeyID", + "<8,22,4>": "AllowedColumnNames" + }, + "<8,23>": { + "<8,23,1>": "TableName", + "<8,23,2>": "SelfURL", + "<8,23,3>": "AllowedColumnNames" + }, + "<8,24>": { + "<8,24,1>": "TableName", + "<8,24,2>": "SelfURL", + "<8,24,3>": "KeyID", + "<8,24,4>": "AllowedColumnNames" + }, + "<8,25>": { + "<8,25,1>": "TableName", + "<8,25,2>": "ColumnNames", + "<8,25,3>": "AllowKeyProperty" + }, + "<8,26>": { + "<8,26,1>": "TableName", + "<8,26,2>": "ColumnNames", + "<8,26,3>": "KeyID" + }, + "<8,27>": { + "<8,27,1>": "TableName", + "<8,27,2>": "ColumnNames" + } + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "", + "<9,1,3>": "", + "<9,1,4>": "", + "<9,1,5>": "", + "<9,1,6>": "", + "<9,1,7>": "", + "<9,1,8>": "", + "<9,1,9>": "", + "<9,1,10>": "", + "<9,1,11>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "", + "<9,2,3>": "", + "<9,2,4>": "", + "<9,2,5>": "", + "<9,2,6>": "", + "<9,2,7>": "", + "<9,2,8>": "", + "<9,2,9>": "", + "<9,2,10>": "", + "<9,2,11>": "" + }, + "<9,3>": "", + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "", + "<9,4,3>": "", + "<9,4,4>": "ALLDATATYPES" + }, + "<9,5>": { + "<9,5,1>": "", + "<9,5,2>": "", + "<9,5,3>": "", + "<9,5,4>": "" + }, + "<9,6>": { + "<9,6,1>": "", + "<9,6,2>": "", + "<9,6,3>": "", + "<9,6,4>": "", + "<9,6,5>": "ALLDATATYPES" + }, + "<9,7>": { + "<9,7,1>": "", + "<9,7,2>": "", + "<9,7,3>": "", + "<9,7,4>": "", + "<9,7,5>": "" + }, + "<9,8>": { + "<9,8,1>": "", + "<9,8,2>": "", + "<9,8,3>": "" + }, + "<9,9>": { + "<9,9,1>": "", + "<9,9,2>": "", + "<9,9,3>": "" + }, + "<9,10>": { + "<9,10,1>": "", + "<9,10,2>": "", + "<9,10,3>": "", + "<9,10,4>": "", + "<9,10,5>": "" + }, + "<9,11>": { + "<9,11,1>": "", + "<9,11,2>": "", + "<9,11,3>": "", + "<9,11,4>": "", + "<9,11,5>": "" + }, + "<9,12>": { + "<9,12,1>": "", + "<9,12,2>": "", + "<9,12,3>": "", + "<9,12,4>": "", + "<9,12,5>": "BOOLEAN", + "<9,12,6>": "BOOLEAN", + "<9,12,7>": "BOOLEAN", + "<9,12,8>": "BOOLEAN" + }, + "<9,13>": { + "<9,13,1>": "", + "<9,13,2>": "", + "<9,13,3>": "", + "<9,13,4>": "", + "<9,13,5>": "", + "<9,13,6>": "BOOLEAN", + "<9,13,7>": "BOOLEAN", + "<9,13,8>": "BOOLEAN" + }, + "<9,14>": { + "<9,14,1>": "", + "<9,14,2>": "", + "<9,14,3>": "", + "<9,14,4>": "" + }, + "<9,15>": { + "<9,15,1>": "", + "<9,15,2>": "", + "<9,15,3>": "METHODS", + "<9,15,4>": "", + "<9,15,5>": "", + "<9,15,6>": "", + "<9,15,7>": "" + }, + "<9,16>": { + "<9,16,1>": "", + "<9,16,2>": "STYLES" + }, + "<9,17>": "", + "<9,18>": { + "<9,18,1>": "", + "<9,18,2>": "BOOLEAN", + "<9,18,3>": "BOOLEAN", + "<9,18,4>": "BOOLEAN" + }, + "<9,19>": { + "<9,19,1>": "", + "<9,19,2>": "", + "<9,19,3>": "", + "<9,19,4>": "", + "<9,19,5>": "" + }, + "<9,20>": { + "<9,20,1>": "", + "<9,20,2>": "", + "<9,20,3>": "", + "<9,20,4>": "", + "<9,20,5>": "" + }, + "<9,21>": { + "<9,21,1>": "", + "<9,21,2>": "" + }, + "<9,22>": { + "<9,22,1>": "", + "<9,22,2>": "", + "<9,22,3>": "", + "<9,22,4>": "" + }, + "<9,23>": { + "<9,23,1>": "", + "<9,23,2>": "", + "<9,23,3>": "" + }, + "<9,24>": { + "<9,24,1>": "", + "<9,24,2>": "", + "<9,24,3>": "", + "<9,24,4>": "" + }, + "<9,25>": { + "<9,25,1>": "", + "<9,25,2>": "", + "<9,25,3>": "" + }, + "<9,26>": { + "<9,26,1>": "", + "<9,26,2>": "", + "<9,26,3>": "" + }, + "<9,27>": { + "<9,27,1>": "", + "<9,27,2>": "" + } + }, + "<10>": { + "<10,1>": "BOOLEAN", + "<10,2>": "LAYOUT", + "<10,3>": "METHODS", + "<10,4>": "STYLES", + "<10,5>": "ALLDATATYPES" + }, + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + }, + "<11,2>": { + "<11,2,1>": "Array", + "<11,2,2>": "List" + }, + "<11,3>": { + "<11,3,1>": "GET", + "<11,3,2>": "POST", + "<11,3,3>": "PUT", + "<11,3,4>": "PATCH", + "<11,3,5>": "DELETE" + }, + "<11,4>": { + "<11,4,1>": "Fast", + "<11,4,2>": "Styled", + "<11,4,3>": "DropNulls" + }, + "<11,5>": { + "<11,5,1>": "String", + "<11,5,2>": "Number", + "<11,5,3>": "Boolean", + "<11,5,4>": "StringList", + "<11,5,5>": "NumberList", + "<11,5,6>": "BooleanList", + "<11,5,7>": "ObjectHandle" + } + }, + "<12>": { + "<12,1>": "0", + "<12,2>": "1", + "<12,3>": "1", + "<12,4>": "1", + "<12,5>": "1" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..5a48071 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_HTTP_SERVICES_FRAMEWORKS.json @@ -0,0 +1,592 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*HTTP_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "RunWebAPI", + "<7,2>": "RunHTTPService", + "<7,3>": "SetSelfURL", + "<7,4>": "GetSelfURL", + "<7,5>": "SetSessionID", + "<7,6>": "GetSessionID", + "<7,7>": "CreateLogFile", + "<7,8>": "SetOECGIRequest", + "<7,9>": "GetOECGIRequest", + "<7,10>": "SetOECGIProcErr", + "<7,11>": "GetOECGIProcErr", + "<7,12>": "SetHTTPQueryString", + "<7,13>": "SetHTTPPathInfo", + "<7,14>": "SetHTTPContentType", + "<7,15>": "SetHTTPContentLength", + "<7,16>": "SetHTTPGatewayInterface", + "<7,17>": "SetHTTPHTTPS", + "<7,18>": "SetHTTPAccept", + "<7,19>": "SetHTTPCookie", + "<7,20>": "SetHTTPFrom", + "<7,21>": "SetHTTPReferer", + "<7,22>": "SetHTTPUserAgent", + "<7,23>": "SetHTTPTranslated", + "<7,24>": "SetHTTPRemoteAddr", + "<7,25>": "SetHTTPRemoteHost", + "<7,26>": "SetHTTPRemoteIdent", + "<7,27>": "SetHTTPRemoteUser", + "<7,28>": "SetHTTPRequestMethod", + "<7,29>": "SetHTTPScriptName", + "<7,30>": "SetHTTPServerName", + "<7,31>": "SetHTTPServerPort", + "<7,32>": "SetHTTPServerProtocol", + "<7,33>": "SetHTTPServerSoftware", + "<7,34>": "SetHTTPServerURL", + "<7,35>": "SetHTTPNoURLDecode", + "<7,36>": "SetHTTPResponseIsBinary", + "<7,37>": "SetHTTPRegistrySettings", + "<7,38>": "SetHTTPOECGIVersion", + "<7,39>": "SetHTTPGetString", + "<7,40>": "SetHTTPPostString", + "<7,41>": "SetHTTPAdditionalValues", + "<7,42>": "GetHTTPQueryString", + "<7,43>": "GetHTTPPathInfo", + "<7,44>": "GetHTTPContentType", + "<7,45>": "GetHTTPContentLength", + "<7,46>": "GetHTTPGatewayInterface", + "<7,47>": "GetHTTPHTTPS", + "<7,48>": "GetHTTPAccept", + "<7,49>": "GetHTTPCookie", + "<7,50>": "GetHTTPFrom", + "<7,51>": "GetHTTPReferer", + "<7,52>": "GetHTTPUserAgent", + "<7,53>": "GetHTTPTranslated", + "<7,54>": "GetHTTPRemoteAddr", + "<7,55>": "GetHTTPRemoteHost", + "<7,56>": "GetHTTPRemoteIdent", + "<7,57>": "GetHTTPRemoteUser", + "<7,58>": "GetHTTPRequestMethod", + "<7,59>": "GetHTTPScriptName", + "<7,60>": "GetHTTPServerName", + "<7,61>": "GetHTTPServerPort", + "<7,62>": "GetHTTPServerProtocol", + "<7,63>": "GetHTTPServerSoftware", + "<7,64>": "GetHTTPServerURL", + "<7,65>": "GetHTTPNoURLDecode", + "<7,66>": "GetHTTPResponseIsBinary", + "<7,67>": "GetHTTPRegistrySettings", + "<7,68>": "GetHTTPOECGIVersion", + "<7,69>": "GetHTTPGetString", + "<7,70>": "GetHTTPPostString", + "<7,71>": "GetHTTPAdditionalValues", + "<7,72>": "SetRequestHeaderFields", + "<7,73>": "SetRequestHeaderField", + "<7,74>": "GetRequestHeaderFields", + "<7,75>": "GetRequestHeaderField", + "<7,76>": "SetQueryFields", + "<7,77>": "SetQueryField", + "<7,78>": "GetQueryField", + "<7,79>": "SetResponseHeaderField", + "<7,80>": "SetCookie", + "<7,81>": "GetResponseHeaderFields", + "<7,82>": "GetResponseHeaderField", + "<7,83>": "SetResponseStatus", + "<7,84>": "GetResponseStatus", + "<7,85>": "SetResponseBody", + "<7,86>": "GetResponseBody", + "<7,87>": "GetResponseBodyIsBinary", + "<7,88>": "GetResponse", + "<7,89>": "SetResponseError", + "<7,90>": "GetErrorResponse", + "<7,91>": "DecodePercentString", + "<7,92>": "ClearSettings", + "<7,93>": "GetHomeURL", + "<7,94>": "GetAPIRootURL", + "<7,95>": "GetCapturePath", + "<7,96>": "GetRealmValue", + "<7,97>": "GetEntryPointService", + "<7,98>": "GetVersion", + "<7,99>": "GetFullEndpointURL", + "<7,100>": "GetFlushCacheFlag", + "<7,101>": "GetEnableAuthenticationFlag", + "<7,102>": "GetEnableHTTPBasicAuthenticationFlag", + "<7,103>": "GetNewPasswordTimeToLive", + "<7,104>": "GetOldPasswordTimeToLive", + "<7,105>": "GetInvalidPasswordLimit", + "<7,106>": "GetContainmentAction", + "<7,107>": "SetServerEnabled", + "<7,108>": "GetServerEnabled", + "<7,109>": "SetTotalInvalidPasswordAttempts", + "<7,110>": "GetTotalInvalidPasswordAttempts", + "<7,111>": "GetNonAuthenticatedPaths", + "<7,112>": "URLRequiresAuthentication", + "<7,113>": "GetWhitelistedIPs", + "<7,114>": "IsIPWhitelisted", + "<7,115>": "GetWhitelistedIPsType", + "<7,116>": "GetBannedIPs", + "<7,117>": "IsIPBanned", + "<7,118>": "AddBannedIP", + "<7,119>": "RemoveBannedIP", + "<7,120>": "IsIPPermitted", + "<7,121>": "IPIsPermitted", + "<7,122>": "GetBestContentNegotiation", + "<7,123>": "GetAbortedService", + "<7,124>": "GetEnableLoggingFlag", + "<7,125>": "GetLogErrorsOnlyFlag", + "<7,126>": "GetDebuggerSetting", + "<7,127>": "GetDebuggerService", + "<7,128>": "GetAPICallProcedure", + "<7,129>": "GetWebAPI", + "<7,130>": "UpdateWebAPIs", + "<7,131>": "GetLocalAppKeyID", + "<7,132>": "GetEndpoint", + "<7,133>": "IsValidEndpoint", + "<7,134>": "SetSupportedEndpoints", + "<7,135>": "GetEndpointPattern" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "Method", + "<8,1,2>": "Endpoint" + }, + "<8,2>": { + "<8,2,1>": "HTTPService", + "<8,2,2>": "RemainingURL" + }, + "<8,3>": "SelfURL", + "<8,4>": "", + "<8,5>": "", + "<8,6>": "", + "<8,7>": { + "<8,7,1>": "LogType", + "<8,7,2>": "Data" + }, + "<8,8>": "Request", + "<8,9>": "", + "<8,10>": "ProcErr", + "<8,11>": "", + "<8,12>": "HTTPValue", + "<8,13>": "HTTPValue", + "<8,14>": "HTTPValue", + "<8,15>": "HTTPValue", + "<8,16>": "HTTPValue", + "<8,17>": "HTTPValue", + "<8,18>": "HTTPValue", + "<8,19>": "HTTPValue", + "<8,20>": "HTTPValue", + "<8,21>": "HTTPValue", + "<8,22>": "HTTPValue", + "<8,23>": "HTTPValue", + "<8,24>": "HTTPValue", + "<8,25>": "HTTPValue", + "<8,26>": "HTTPValue", + "<8,27>": "HTTPValue", + "<8,28>": "HTTPValue", + "<8,29>": "HTTPValue", + "<8,30>": "HTTPValue", + "<8,31>": "HTTPValue", + "<8,32>": "HTTPValue", + "<8,33>": "HTTPValue", + "<8,34>": "HTTPValue", + "<8,35>": "HTTPValue", + "<8,36>": "HTTPValue", + "<8,37>": "HTTPValue", + "<8,38>": "HTTPValue", + "<8,39>": "HTTPValue", + "<8,40>": "HTTPValue", + "<8,41>": "HTTPValue", + "<8,42>": "DecodePercentString", + "<8,43>": "DecodePercentString", + "<8,44>": "DecodePercentString", + "<8,45>": "DecodePercentString", + "<8,46>": "DecodePercentString", + "<8,47>": "DecodePercentString", + "<8,48>": "DecodePercentString", + "<8,49>": "DecodePercentString", + "<8,50>": "DecodePercentString", + "<8,51>": "DecodePercentString", + "<8,52>": "DecodePercentString", + "<8,53>": "DecodePercentString", + "<8,54>": "DecodePercentString", + "<8,55>": "DecodePercentString", + "<8,56>": "DecodePercentString", + "<8,57>": "DecodePercentString", + "<8,58>": "DecodePercentString", + "<8,59>": "DecodePercentString", + "<8,60>": "DecodePercentString", + "<8,61>": "DecodePercentString", + "<8,62>": "DecodePercentString", + "<8,63>": "DecodePercentString", + "<8,64>": "DecodePercentString", + "<8,65>": "DecodePercentString", + "<8,66>": "DecodePercentString", + "<8,67>": "DecodePercentString", + "<8,68>": "DecodePercentString", + "<8,69>": "DecodePercentString", + "<8,70>": "DecodePercentString", + "<8,71>": "DecodePercentString", + "<8,72>": "", + "<8,73>": { + "<8,73,1>": "Name", + "<8,73,2>": "Value" + }, + "<8,74>": "", + "<8,75>": "Name", + "<8,76>": "", + "<8,77>": { + "<8,77,1>": "Field", + "<8,77,2>": "Value" + }, + "<8,78>": "Field", + "<8,79>": { + "<8,79,1>": "Name", + "<8,79,2>": "Value", + "<8,79,3>": "Append" + }, + "<8,80>": { + "<8,80,1>": "Name", + "<8,80,2>": "Value", + "<8,80,3>": "Expires", + "<8,80,4>": "MaxAge", + "<8,80,5>": "Domain", + "<8,80,6>": "Path", + "<8,80,7>": "Secure", + "<8,80,8>": "HttpOnly", + "<8,80,9>": "Extension" + }, + "<8,81>": "", + "<8,82>": "Name", + "<8,83>": { + "<8,83,1>": "Code", + "<8,83,2>": "Phrase" + }, + "<8,84>": "", + "<8,85>": { + "<8,85,1>": "Body", + "<8,85,2>": "IsBinary", + "<8,85,3>": "ContentType" + }, + "<8,86>": "", + "<8,87>": "", + "<8,88>": "", + "<8,89>": { + "<8,89,1>": "TypeURL", + "<8,89,2>": "Title", + "<8,89,3>": "Status", + "<8,89,4>": "Detail", + "<8,89,5>": "InstanceURL", + "<8,89,6>": "PropertyNames", + "<8,89,7>": "PropertyValues" + }, + "<8,90>": "", + "<8,91>": "String", + "<8,92>": "", + "<8,93>": "", + "<8,94>": "FullURL", + "<8,95>": "", + "<8,96>": "", + "<8,97>": "", + "<8,98>": "", + "<8,99>": "", + "<8,100>": "", + "<8,101>": "", + "<8,102>": "", + "<8,103>": "", + "<8,104>": "", + "<8,105>": "", + "<8,106>": "", + "<8,107>": "ServerEnabled", + "<8,108>": "", + "<8,109>": "Attempts", + "<8,110>": "", + "<8,111>": "", + "<8,112>": "URL", + "<8,113>": "", + "<8,114>": "IP", + "<8,115>": "", + "<8,116>": "", + "<8,117>": "IP", + "<8,118>": "IP", + "<8,119>": "IP", + "<8,120>": "IP", + "<8,121>": "IP", + "<8,122>": { + "<8,122,1>": "RequestHeaderField", + "<8,122,2>": "ServerOptions" + }, + "<8,123>": "", + "<8,124>": "", + "<8,125>": "", + "<8,126>": "", + "<8,127>": "", + "<8,128>": "", + "<8,129>": { + "<8,129,1>": "Resource", + "<8,129,2>": "ReturnRepositoryKeyID" + }, + "<8,130>": { + "<8,130,1>": "ResourceList", + "<8,130,2>": "MakeLocal" + }, + "<8,131>": "BaseAppKeyID", + "<8,132>": "", + "<8,133>": "Endpoint", + "<8,134>": "", + "<8,135>": "Endpoint" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "" + }, + "<9,3>": "", + "<9,4>": "", + "<9,5>": "", + "<9,6>": "", + "<9,7>": { + "<9,7,1>": "LOGTYPES", + "<9,7,2>": "" + }, + "<9,8>": "", + "<9,9>": "", + "<9,10>": "", + "<9,11>": "", + "<9,12>": "", + "<9,13>": "", + "<9,14>": "", + "<9,15>": "", + "<9,16>": "", + "<9,17>": "", + "<9,18>": "", + "<9,19>": "", + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "", + "<9,26>": "", + "<9,27>": "", + "<9,28>": "", + "<9,29>": "", + "<9,30>": "", + "<9,31>": "", + "<9,32>": "", + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "", + "<9,37>": "", + "<9,38>": "", + "<9,39>": "", + "<9,40>": "", + "<9,41>": "", + "<9,42>": "", + "<9,43>": "", + "<9,44>": "", + "<9,45>": "", + "<9,46>": "", + "<9,47>": "", + "<9,48>": "", + "<9,49>": "", + "<9,50>": "", + "<9,51>": "", + "<9,52>": "", + "<9,53>": "", + "<9,54>": "", + "<9,55>": "", + "<9,56>": "", + "<9,57>": "", + "<9,58>": "", + "<9,59>": "", + "<9,60>": "", + "<9,61>": "", + "<9,62>": "", + "<9,63>": "", + "<9,64>": "", + "<9,65>": "", + "<9,66>": "", + "<9,67>": "", + "<9,68>": "", + "<9,69>": "", + "<9,70>": "", + "<9,71>": "", + "<9,72>": "", + "<9,73>": { + "<9,73,1>": "", + "<9,73,2>": "" + }, + "<9,74>": "", + "<9,75>": "", + "<9,76>": "", + "<9,77>": { + "<9,77,1>": "", + "<9,77,2>": "" + }, + "<9,78>": "", + "<9,79>": { + "<9,79,1>": "RESPONSEHEADERNAMES", + "<9,79,2>": "", + "<9,79,3>": "BOOLEAN" + }, + "<9,80>": { + "<9,80,1>": "", + "<9,80,2>": "", + "<9,80,3>": "", + "<9,80,4>": "", + "<9,80,5>": "", + "<9,80,6>": "", + "<9,80,7>": "BOOLEAN", + "<9,80,8>": "BOOLEAN", + "<9,80,9>": "" + }, + "<9,81>": "", + "<9,82>": "RESPONSEHEADERNAMES", + "<9,83>": { + "<9,83,1>": "", + "<9,83,2>": "" + }, + "<9,84>": "", + "<9,85>": { + "<9,85,1>": "", + "<9,85,2>": "", + "<9,85,3>": "" + }, + "<9,86>": "", + "<9,87>": "", + "<9,88>": "", + "<9,89>": { + "<9,89,1>": "", + "<9,89,2>": "", + "<9,89,3>": "", + "<9,89,4>": "", + "<9,89,5>": "", + "<9,89,6>": "", + "<9,89,7>": "" + }, + "<9,90>": "", + "<9,91>": "", + "<9,92>": "", + "<9,93>": "", + "<9,94>": "BOOLEAN", + "<9,95>": "", + "<9,96>": "", + "<9,97>": "", + "<9,98>": "", + "<9,99>": "", + "<9,100>": "", + "<9,101>": "", + "<9,102>": "", + "<9,103>": "", + "<9,104>": "", + "<9,105>": "", + "<9,106>": "", + "<9,107>": "BOOLEAN", + "<9,108>": "", + "<9,109>": "", + "<9,110>": "", + "<9,111>": "", + "<9,112>": "", + "<9,113>": "", + "<9,114>": "", + "<9,115>": "", + "<9,116>": "", + "<9,117>": "", + "<9,118>": "", + "<9,119>": "", + "<9,120>": "", + "<9,121>": "", + "<9,122>": { + "<9,122,1>": "CONTENTNEGOTIATIONFIELDS", + "<9,122,2>": "" + }, + "<9,123>": "", + "<9,124>": "", + "<9,125>": "", + "<9,126>": "", + "<9,127>": "", + "<9,128>": "", + "<9,129>": { + "<9,129,1>": "", + "<9,129,2>": "" + }, + "<9,130>": { + "<9,130,1>": "", + "<9,130,2>": "BOOLEAN" + }, + "<9,131>": "", + "<9,132>": "", + "<9,133>": "", + "<9,134>": "", + "<9,135>": "" + }, + "<10>": { + "<10,1>": "BOOLEAN", + "<10,2>": "RESPONSEHEADERNAMES", + "<10,3>": "CONTENTNEGOTIATIONFIELDS", + "<10,4>": "LOGTYPES" + }, + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + }, + "<11,2>": { + "<11,2,1>": "Access-Control-Allow-Headers", + "<11,2,2>": "Access-Control-Allow-Methods", + "<11,2,3>": "Access-Control-Allow-Origin", + "<11,2,4>": "Allow", + "<11,2,5>": "Content-Encoding", + "<11,2,6>": "Content-Language", + "<11,2,7>": "Content-Length", + "<11,2,8>": "Content-Location", + "<11,2,9>": "Content-Disposition", + "<11,2,10>": "Content-Type", + "<11,2,11>": "Date", + "<11,2,12>": "Expires", + "<11,2,13>": "Last-Modified", + "<11,2,14>": "Link", + "<11,2,15>": "Location", + "<11,2,16>": "Retry-After", + "<11,2,17>": "Server", + "<11,2,18>": "Set-Cookie", + "<11,2,19>": "Transfer-Encoding", + "<11,2,20>": "Vary", + "<11,2,21>": "WWW-Authenticate" + }, + "<11,3>": { + "<11,3,1>": "Accept", + "<11,3,2>": "Accept-Charset", + "<11,3,3>": "Accept-Encoding", + "<11,3,4>": "Accept-Language" + }, + "<11,4>": { + "<11,4,1>": "Request", + "<11,4,2>": "Response", + "<11,4,3>": "Aborted", + "<11,4,4>": "Debugger" + } + }, + "<12>": { + "<12,1>": "0", + "<12,2>": "1", + "<12,3>": "1", + "<12,4>": "1" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_LOGGING_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_LOGGING_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..bdb0fbc --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_LOGGING_SERVICES_FRAMEWORKS.json @@ -0,0 +1,99 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*LOGGING_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "NewLog", + "<7,2>": "AppendLog", + "<7,3>": "GetLogPath", + "<7,4>": "GetLogFileName", + "<7,5>": "GetLogFullPath", + "<7,6>": "GetRowDelimiter", + "<7,7>": "GetColumnDelimiter", + "<7,8>": "GetColumnHeaders", + "<7,9>": "GetColumnWidths", + "<7,10>": "GetQuoteValues", + "<7,11>": "CreateLogFile" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "LogPath", + "<8,1,2>": "LogFileName", + "<8,1,3>": "RowDelimiter", + "<8,1,4>": "ColumnDelimiter", + "<8,1,5>": "ColumnHeaders", + "<8,1,6>": "ColumnWidths", + "<8,1,7>": "QuoteValues", + "<8,1,8>": "ClearLog" + }, + "<8,2>": { + "<8,2,1>": "objLog", + "<8,2,2>": "LogData", + "<8,2,3>": "IncomingRowDelimiter", + "<8,2,4>": "IncomingColumnDelimiter", + "<8,2,5>": "IgnoreColumnHeaders" + }, + "<8,3>": "objLog", + "<8,4>": "objLog", + "<8,5>": "objLog", + "<8,6>": "objLog", + "<8,7>": "objLog", + "<8,8>": "objLog", + "<8,9>": "objLog", + "<8,10>": "objLog", + "<8,11>": "objLog" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "", + "<9,1,3>": "", + "<9,1,4>": "", + "<9,1,5>": "", + "<9,1,6>": "", + "<9,1,7>": "BOOLEAN", + "<9,1,8>": "BOOLEAN" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "", + "<9,2,3>": "", + "<9,2,4>": "", + "<9,2,5>": "" + }, + "<9,3>": "", + "<9,4>": "", + "<9,5>": "", + "<9,6>": "", + "<9,7>": "", + "<9,8>": "", + "<9,9>": "", + "<9,10>": "", + "<9,11>": "" + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_MEMORY_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_MEMORY_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..a02b571 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_MEMORY_SERVICES_FRAMEWORKS.json @@ -0,0 +1,116 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*MEMORY_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "KeyExists", + "<7,2>": "GetValue", + "<7,3>": "SetValue", + "<7,4>": "IsValueExpired", + "<7,5>": "IsValueCurrent", + "<7,6>": "RemoveKey", + "<7,7>": "CreateHashTable", + "<7,8>": "ReleaseHashTable", + "<7,9>": "ReleaseAllHashTables", + "<7,10>": "GetHandle" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "KeyID", + "<8,1,2>": "CacheName" + }, + "<8,2>": { + "<8,2,1>": "KeyID", + "<8,2,2>": "NotExpired", + "<8,2,3>": "ExpirationDuration", + "<8,2,4>": "CacheName" + }, + "<8,3>": { + "<8,3,1>": "KeyID", + "<8,3,2>": "Value", + "<8,3,3>": "CacheName" + }, + "<8,4>": { + "<8,4,1>": "KeyID", + "<8,4,2>": "ExpirationDuration", + "<8,4,3>": "ResetAge", + "<8,4,4>": "CacheName" + }, + "<8,5>": { + "<8,5,1>": "KeyID", + "<8,5,2>": "ExpirationDuration", + "<8,5,3>": "ResetAge", + "<8,5,4>": "CacheName" + }, + "<8,6>": { + "<8,6,1>": "KeyID", + "<8,6,2>": "CacheName" + }, + "<8,7>": "CacheName", + "<8,8>": "CacheName", + "<8,9>": "CacheName", + "<8,10>": "CacheName" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "", + "<9,2,3>": "", + "<9,2,4>": "" + }, + "<9,3>": { + "<9,3,1>": "", + "<9,3,2>": "", + "<9,3,3>": "" + }, + "<9,4>": { + "<9,4,1>": "", + "<9,4,2>": "", + "<9,4,3>": "", + "<9,4,4>": "" + }, + "<9,5>": { + "<9,5,1>": "", + "<9,5,2>": "", + "<9,5,3>": "", + "<9,5,4>": "" + }, + "<9,6>": { + "<9,6,1>": "", + "<9,6,2>": "" + }, + "<9,7>": "", + "<9,8>": "", + "<9,9>": "", + "<9,10>": "" + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_OATH_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_OATH_API_FRAMEWORKS.json new file mode 100644 index 0000000..faa5405 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_OATH_API_FRAMEWORKS.json @@ -0,0 +1,23 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*OATH_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": "oath.GET", + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PICTURE_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PICTURE_API_FRAMEWORKS.json new file mode 100644 index 0000000..a93a92c --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PICTURE_API_FRAMEWORKS.json @@ -0,0 +1,27 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*PICTURE_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "picture.GET", + "<7,2>": "picture.HEAD", + "<7,3>": "picture.PUT" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PING_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PING_API_FRAMEWORKS.json new file mode 100644 index 0000000..cc24ce5 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_PING_API_FRAMEWORKS.json @@ -0,0 +1,26 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*PING_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "ping.HEAD", + "<7,2>": "ping.GET" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_VERSION_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_VERSION_API_FRAMEWORKS.json new file mode 100644 index 0000000..9518a99 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_VERSION_API_FRAMEWORKS.json @@ -0,0 +1,26 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*VERSION_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "version.HEAD", + "<7,2>": "version.GET" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_API_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_API_FRAMEWORKS.json new file mode 100644 index 0000000..635a9d7 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_API_FRAMEWORKS.json @@ -0,0 +1,31 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*WEBACCOUNTS_API*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "API", + "<2>": "@API", + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "webaccounts.HEAD", + "<7,2>": "webaccounts.GET", + "<7,3>": "webaccounts.ID.HEAD", + "<7,4>": "webaccounts.ID.GET", + "<7,5>": "webaccounts.ID.password.HEAD", + "<7,6>": "webaccounts.ID.password.GET", + "<7,7>": "webaccounts.ID.password.PATCH" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": "", + "<12>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS.json new file mode 100644 index 0000000..8306ec8 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_EDITOR_METADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS.json @@ -0,0 +1,68 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_EDITOR_METADATA*WEBACCOUNTS_SERVICES*FRAMEWORKS" + }, + "body": { + "record1": { + "<1>": "SERVICE", + "<2>": { + "<2,1>": { + "<2,1,1>": "@Service", + "<2,1,2>": "@Params" + } + }, + "<3>": "1", + "<4>": "2", + "<5>": "1", + "<6>": "", + "<7>": { + "<7,1>": "GetWebAccounts", + "<7,2>": "SetWebAccounts", + "<7,3>": "ConvertMVWebAccountsToJSON", + "<7,4>": "ConvertJSONWebAccountsToMV" + }, + "<8>": { + "<8,1>": { + "<8,1,1>": "AccountID", + "<8,1,2>": "ReturnJSON" + }, + "<8,2>": { + "<8,2,1>": "AccountID", + "<8,2,2>": "WebAccountsRow" + }, + "<8,3>": { + "<8,3,1>": "AccountID", + "<8,3,2>": "mvWebAccounts", + "<8,3,3>": "itemURL" + }, + "<8,4>": "jsonWebAccounts" + }, + "<9>": { + "<9,1>": { + "<9,1,1>": "", + "<9,1,2>": "" + }, + "<9,2>": { + "<9,2,1>": "", + "<9,2,2>": "" + }, + "<9,3>": { + "<9,3,1>": "", + "<9,3,2>": "", + "<9,3,3>": "" + }, + "<9,4>": "" + }, + "<10>": "BOOLEAN", + "<11>": { + "<11,1>": { + "<11,1,1>": "True$", + "<11,1,2>": "False$" + } + }, + "<12>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT.json new file mode 100644 index 0000000..162e295 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT.json @@ -0,0 +1,154 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT" + }, + "body": { + "record1": { + "<1>": "", + "<2>": "function Archive-SRPHTTPLogs {", + "<3>": "param(", + "<4>": " [string]$OlderThanDateStr = \"\",", + "<5>": " [string]$LogPathSource = \"C:\\httplogs\",", + "<6>": " [string]$LogPathDest = \"c:\\httplogs\\archive\"", + "<7>": ")", + "<8>": "$progresspreference=\"SilentlyContinue\";", + "<9>": "", + "<10>": "#Uncomment this to simulate an error", + "<11>": "#Blah $Failed;", + "<12>": "", + "<13>": "if($OlderThanDateStr -ne \"\") {", + "<14>": " #Convert the supplied date to an object", + "<15>": " #Throws error if not a valid date", + "<16>": "", + "<17>": " try {", + "<18>": " $OlderThanDate = [datetime]$OlderThanDateStr;", + "<19>": " } catch {", + "<20>": " throw $_;", + "<21>": " return;", + "<22>": " }", + "<23>": "}", + "<24>": "", + "<25>": "#What files in $LogPathSource are considered to be log files?", + "<26>": "$LogExtension = \"*.log\";", + "<27>": "", + "<28>": "#Check the organized folder exists", + "<29>": "New-Item -Path $LogPathDest -ItemType \"directory\" -Force | Out-Null;", + "<30>": "", + "<31>": "#Get all the files to be organized", + "<32>": "$LogFiles = Get-ChildItem -Path $LogPathSource -Filter $LogExtension;", + "<33>": "", + "<34>": "#Store a hash table of dates from file names", + "<35>": "$LogDates = @{};", + "<36>": "", + "<37>": "#Loop through all the files and organize them by date", + "<38>": "ForEach($LogFile in $LogFiles) {", + "<39>": "", + "<40>": " $FileName = $LogFile.Name;", + "<41>": "", + "<42>": "\t#Doesn't work on Server 2008", + "<43>": " #$FileNameDate = [regex]::Match($FileName,'^(.*?)_').captures.groups[1].value;", + "<44>": "\t", + "<45>": "\t#Works in Server 2008", + "<46>": "\t$FileNameDate = $FileName.Split('_')[0];", + "<47>": "", + "<48>": " $FileNameDateObj = $Null;", + "<49>": "", + "<50>": " try {", + "<51>": " $FileNameDateObj = [datetime]$FileNameDate;", + "<52>": " } catch {", + "<53>": " #This was not a valid date so skip", + "<54>": " }", + "<55>": "", + "<56>": " if ($FileNameDateObj -ne $Null) {", + "<57>": " #This filename has a valid date", + "<58>": "", + "<59>": " #Is it within our range?", + "<60>": " if($FileNameDateObj -le $OlderThanDate) {", + "<61>": " #Yes, the file name is old enough to archive", + "<62>": "", + "<63>": "\t #Have we seen this date before?", + "<64>": " if ($LogDates[$FileNameDate] -eq $null) {", + "<65>": "\t\t #No, so create an array list and store it in the hash table under the date key", + "<66>": " #Write-Host \"Found logs for new date: $FileNameDate\";", + "<67>": " [System.Collections.ArrayList]$NewArray = @($FileName);", + "<68>": " $LogDates[$FileNameDate] = \t$NewArray;", + "<69>": " } else {", + "<70>": "\t\t # Yes, so add it to the array of filenames for that date", + "<71>": " # Write-Host \"Adding $FileNameDate\";", + "<72>": " $LogDates[$FileNameDate].Add($FileName) | Out-Null;", + "<73>": " }", + "<74>": "", + "<75>": " } else {", + "<76>": " #No, the file name is newer than our cut-off date", + "<77>": " }", + "<78>": "", + "<79>": " } else {", + "<80>": " #The file name did not have a valid date entry in the filename so skip", + "<81>": " }", + "<82>": "", + "<83>": "}", + "<84>": "", + "<85>": "#Loop through the hashtable of all the dates seen", + "<86>": "#and process the arraylist of files for that date", + "<87>": "ForEach($LogDate In $LogDates.keys) {", + "<88>": "", + "<89>": " #Write-Host \"Processing log dates $LogDate\";", + "<90>": "", + "<91>": " $LogFolderForDate = $LogPathDest + \"\\\" + $LogDate;", + "<92>": "", + "<93>": "\t#Make sure the organization folder exists", + "<94>": " New-Item -Path $LogFolderForDate -ItemType \"directory\" -Force | Out-Null;", + "<95>": "", + "<96>": " $LogFilesForDate = $LogDates[$LogDate];", + "<97>": "", + "<98>": "\t#Loop through all the files for that date", + "<99>": " ForEach ($LogFileName in $LogFilesForDate) {", + "<100>": "", + "<101>": " $Src = $LogPathSource + \"\\\" + $LogFileName;", + "<102>": " $Dst = $LogFolderForDate + \"\\\" + $LogFileName;", + "<103>": "", + "<104>": " #Write-Host \"Moving $Src to $Dst\";", + "<105>": " Move-Item -Path $Src -Destination $Dst -Force;", + "<106>": "", + "<107>": " }", + "<108>": "", + "<109>": "}", + "<110>": "", + "<111>": "#Loop through the hashtable of all the dates seen", + "<112>": "#and compress the files that were organized into folders", + "<113>": "ForEach($LogDate In $LogDates.keys) {", + "<114>": "", + "<115>": " #Figure out which archive date we want to compress", + "<116>": " $LogFolderForDate = $LogPathDest + \"\\\" + $LogDate;", + "<117>": "", + "<118>": " #The name of the zip file where the archived date should reside", + "<119>": " $LogFolderZipFile = $LogPathDest + \"\\\" + $LogDate + \".zip\"", + "<120>": "", + "<121>": " try {", + "<122>": " #Compress it, fail if any error", + "<123>": " Compress-Archive -Path $($LogFolderForDate + \"\\\" + $LogExtension) -DestinationPath $LogFolderZipFile -ErrorAction Stop", + "<124>": "", + "<125>": " #Remove the source log files", + "<126>": " Remove-Item -Path $LogFolderForDate -Recurse -Force", + "<127>": " } catch {", + "<128>": " throw $_;", + "<129>": " return", + "<130>": " }", + "<131>": " ", + "<132>": "}", + "<133>": "", + "<134>": "", + "<135>": "", + "<136>": "} #End Archive-SRPHTTPLogs", + "<137>": "", + "<138>": "try {", + "<139>": " Archive-SRPHTTPLogs -OlderThanDate '{{ArchiveOlderThanDate}}' -LogPathSource '{{ArchiveLogsFromFolder}}' -LogPathDest '{{ArchiveStorageFolder}}';", + "<140>": " Return \"OK\";", + "<141>": "} catch {", + "<142>": " Return \"ERROR`n\" + $_.ToString() ;", + "<143>": "}" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES.json new file mode 100644 index 0000000..c6b44ac --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES.json @@ -0,0 +1,135 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES" + }, + "body": { + "record1": { + "<1>": { + "<1,1>": "100", + "<1,2>": "101", + "<1,3>": "102", + "<1,4>": "200", + "<1,5>": "201", + "<1,6>": "202", + "<1,7>": "203", + "<1,8>": "204", + "<1,9>": "205", + "<1,10>": "206", + "<1,11>": "207", + "<1,12>": "208", + "<1,13>": "226", + "<1,14>": "300", + "<1,15>": "301", + "<1,16>": "302", + "<1,17>": "303", + "<1,18>": "304", + "<1,19>": "305", + "<1,20>": "306", + "<1,21>": "307", + "<1,22>": "308", + "<1,23>": "400", + "<1,24>": "401", + "<1,25>": "402", + "<1,26>": "403", + "<1,27>": "404", + "<1,28>": "405", + "<1,29>": "406", + "<1,30>": "407", + "<1,31>": "408", + "<1,32>": "409", + "<1,33>": "410", + "<1,34>": "411", + "<1,35>": "412", + "<1,36>": "413", + "<1,37>": "414", + "<1,38>": "415", + "<1,39>": "416", + "<1,40>": "417", + "<1,41>": "418", + "<1,42>": "421", + "<1,43>": "422", + "<1,44>": "423", + "<1,45>": "424", + "<1,46>": "426", + "<1,47>": "428", + "<1,48>": "429", + "<1,49>": "431", + "<1,50>": "500", + "<1,51>": "501", + "<1,52>": "502", + "<1,53>": "503", + "<1,54>": "504", + "<1,55>": "505", + "<1,56>": "506", + "<1,57>": "507", + "<1,58>": "508", + "<1,59>": "510", + "<1,60>": "511" + }, + "<2>": { + "<2,1>": "Continue", + "<2,2>": "Switching Protocols", + "<2,3>": "Processing (WebDAV; RFC 2518)", + "<2,4>": "OK", + "<2,5>": "Created", + "<2,6>": "Accepted", + "<2,7>": "Non-Authoritative Information (since HTTP/1.1)", + "<2,8>": "No Content", + "<2,9>": "Reset Content", + "<2,10>": "Partial Content (RFC 7233)", + "<2,11>": "Multi-Status (WebDAV; RFC 4918)", + "<2,12>": "Already Reported (WebDAV; RFC 5842)", + "<2,13>": "IM Used (RFC 3229)", + "<2,14>": "Multiple Choices", + "<2,15>": "Moved Permanently", + "<2,16>": "Found", + "<2,17>": "See Other (since HTTP/1.1)", + "<2,18>": "Not Modified (RFC 7232)", + "<2,19>": "Use Proxy (since HTTP/1.1)", + "<2,20>": "Switch Proxy", + "<2,21>": "Temporary Redirect (since HTTP/1.1)", + "<2,22>": "Permanent Redirect (RFC 7538)", + "<2,23>": "Bad Request", + "<2,24>": "Unauthorized (RFC 7235)", + "<2,25>": "Payment Required", + "<2,26>": "Forbidden", + "<2,27>": "Not Found", + "<2,28>": "Method Not Allowed", + "<2,29>": "Not Acceptable", + "<2,30>": "Proxy Authentication Required (RFC 7235)", + "<2,31>": "Request Timeout", + "<2,32>": "Conflict", + "<2,33>": "Gone", + "<2,34>": "Length Required", + "<2,35>": "Precondition Failed (RFC 7232)", + "<2,36>": "Payload Too Large (RFC 7231)", + "<2,37>": "URI Too Long (RFC 7231)", + "<2,38>": "Unsupported Media Type", + "<2,39>": "Range Not Satisfiable (RFC 7233)", + "<2,40>": "Expectation Failed", + "<2,41>": "I'm a teapot (RFC 2324)", + "<2,42>": "Misdirected Request (RFC 7540)", + "<2,43>": "Unprocessable Entity (WebDAV; RFC 4918)", + "<2,44>": "Locked (WebDAV; RFC 4918)", + "<2,45>": "Failed Dependency (WebDAV; RFC 4918)", + "<2,46>": "Upgrade Required", + "<2,47>": "Precondition Required (RFC 6585)", + "<2,48>": "Too Many Requests (RFC 6585)", + "<2,49>": "Request Header Fields Too Large (RFC 6585)", + "<2,50>": "Internal Server Error", + "<2,51>": "Not Implemented", + "<2,52>": "Bad Gateway", + "<2,53>": "Service Unavailable", + "<2,54>": "Gateway Timeout", + "<2,55>": "HTTP Version Not Supported", + "<2,56>": "Variant Also Negotiates (RFC 2295)", + "<2,57>": "Insufficient Storage (WebDAV; RFC 4918)", + "<2,58>": "Loop Detected (WebDAV; RFC 5842)", + "<2,59>": "Not Extended (RFC 2774)", + "<2,60>": "Network Authentication Required (RFC 6585)" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_RESOURCES.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_RESOURCES.json new file mode 100644 index 0000000..ec5ea28 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_RESOURCES.json @@ -0,0 +1,863 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_RESOURCES" + }, + "body": { + "record1": { + "<1>": { + "<1,1>": "1", + "<1,2>": "APIROOT", + "<1,3>": "api", + "<1,4>": { + "<1,4,1>": "Text", + "<1,4,2>": "" + }, + "<1,5>": "APIROOT", + "<1,6>": "", + "<1,7>": { + "<1,7,1>": "RGB{68, 68, 68}", + "<1,7,2>": "White" + }, + "<1,8>": { + "<1,8,1>": "Segoe UI", + "<1,8,2>": "-12", + "<1,8,3>": "400", + "<1,8,4>": "0", + "<1,8,5>": "0", + "<1,8,6>": "0", + "<1,8,7>": "1", + "<1,8,8>": "0", + "<1,8,9>": "0", + "<1,8,10>": "0", + "<1,8,11>": "0", + "<1,8,12>": "0" + }, + "<1,9>": { + "<1,9,1>": "Left", + "<1,9,2>": "Center" + }, + "<1,10>": "N", + "<1,11>": "None", + "<1,12>": "1", + "<1,13>": "24", + "<1,14>": "0", + "<1,15>": "1", + "<1,16>": "None", + "<1,17>": "Left", + "<1,18>": { + "<1,18,1>": "13", + "<1,18,2>": "13" + }, + "<1,19>": { + "<1,19,1>": { + "<1,19,1,1>": "DESCRIPTION", + "<1,19,1,2>": "This is the API entry point." + }, + "<1,19,2>": { + "<1,19,2,1>": "API_SIGNATURES", + "<1,19,2,2>": "APIROOT.GET" + }, + "<1,19,3>": { + "<1,19,3,1>": "EXCLUDE_LOGGING", + "<1,19,3,2>": "0" + }, + "<1,19,4>": { + "<1,19,4,1>": "METHODS", + "<1,19,4,2>": "GET" + }, + "<1,19,5>": { + "<1,19,5,1>": "QUERY_PARAMS", + "<1,19,5,2>": "" + }, + "<1,19,6>": { + "<1,19,6,1>": "TITLE", + "<1,19,6,2>": "API Entry Point" + } + } + }, + "<2>": { + "<2,1>": "2", + "<2,2>": "/webaccounts", + "<2,3>": "webaccounts", + "<2,4>": { + "<2,4,1>": "Text", + "<2,4,2>": "" + }, + "<2,5>": "RESOURCE", + "<2,6>": "", + "<2,7>": { + "<2,7,1>": "RGB{68, 68, 68}", + "<2,7,2>": "White" + }, + "<2,8>": { + "<2,8,1>": "Segoe UI", + "<2,8,2>": "-12", + "<2,8,3>": "400", + "<2,8,4>": "0", + "<2,8,5>": "0", + "<2,8,6>": "0", + "<2,8,7>": "1", + "<2,8,8>": "0", + "<2,8,9>": "0", + "<2,8,10>": "0", + "<2,8,11>": "0", + "<2,8,12>": "0" + }, + "<2,9>": { + "<2,9,1>": "Left", + "<2,9,2>": "Center" + }, + "<2,10>": "N", + "<2,11>": "None", + "<2,12>": "1", + "<2,13>": "24", + "<2,14>": "0", + "<2,15>": "1", + "<2,16>": "None", + "<2,17>": "Left", + "<2,18>": { + "<2,18,1>": "13", + "<2,18,2>": "13" + }, + "<2,19>": { + "<2,19,1>": { + "<2,19,1,1>": "DESCRIPTION", + "<2,19,1,2>": "Web accounts resource used by the authentication service." + }, + "<2,19,2>": { + "<2,19,2,1>": "API_SIGNATURES", + "<2,19,2,2>": "webaccounts.GET" + }, + "<2,19,3>": { + "<2,19,3,1>": "EXCLUDE_LOGGING", + "<2,19,3,2>": "0" + }, + "<2,19,4>": { + "<2,19,4,1>": "METHODS", + "<2,19,4,2>": "GET" + }, + "<2,19,5>": { + "<2,19,5,1>": "QUERY_PARAMS", + "<2,19,5,2>": "" + }, + "<2,19,6>": { + "<2,19,6,1>": "TITLE", + "<2,19,6,2>": "Web Accounts" + } + } + }, + "<3>": { + "<3,1>": "3", + "<3,2>": "/webaccounts/{accountID}", + "<3,3>": "{accountID}", + "<3,4>": { + "<3,4,1>": "Text", + "<3,4,2>": "" + }, + "<3,5>": "RESOURCE_ID", + "<3,6>": "", + "<3,7>": { + "<3,7,1>": "RGB{68, 68, 68}", + "<3,7,2>": "White" + }, + "<3,8>": { + "<3,8,1>": "Segoe UI", + "<3,8,2>": "-12", + "<3,8,3>": "400", + "<3,8,4>": "0", + "<3,8,5>": "0", + "<3,8,6>": "0", + "<3,8,7>": "1", + "<3,8,8>": "0", + "<3,8,9>": "0", + "<3,8,10>": "0", + "<3,8,11>": "0", + "<3,8,12>": "0" + }, + "<3,9>": { + "<3,9,1>": "Left", + "<3,9,2>": "Center" + }, + "<3,10>": "N", + "<3,11>": "None", + "<3,12>": "1", + "<3,13>": "24", + "<3,14>": "0", + "<3,15>": "1", + "<3,16>": "None", + "<3,17>": "Left", + "<3,18>": { + "<3,18,1>": "13", + "<3,18,2>": "13" + }, + "<3,19>": { + "<3,19,1>": { + "<3,19,1,1>": "DESCRIPTION", + "<3,19,1,2>": "Unique account ID for the web accounts resource." + }, + "<3,19,2>": { + "<3,19,2,1>": "API_SIGNATURES", + "<3,19,2,2>": "webaccounts.ID.GET" + }, + "<3,19,3>": { + "<3,19,3,1>": "EXCLUDE_LOGGING", + "<3,19,3,2>": "0" + }, + "<3,19,4>": { + "<3,19,4,1>": "METHODS", + "<3,19,4,2>": "GET" + }, + "<3,19,5>": { + "<3,19,5,1>": "QUERY_PARAMS", + "<3,19,5,2>": "" + }, + "<3,19,6>": { + "<3,19,6,1>": "TITLE", + "<3,19,6,2>": "Web Accounts ID" + } + } + }, + "<4>": { + "<4,1>": "4", + "<4,2>": "/webaccounts/{accountID}/password", + "<4,3>": "password", + "<4,4>": { + "<4,4,1>": "Text", + "<4,4,2>": "" + }, + "<4,5>": "PROPERTY", + "<4,6>": "", + "<4,7>": { + "<4,7,1>": "RGB{68, 68, 68}", + "<4,7,2>": "White" + }, + "<4,8>": { + "<4,8,1>": "Segoe UI", + "<4,8,2>": "-12", + "<4,8,3>": "400", + "<4,8,4>": "0", + "<4,8,5>": "0", + "<4,8,6>": "0", + "<4,8,7>": "1", + "<4,8,8>": "0", + "<4,8,9>": "0", + "<4,8,10>": "0", + "<4,8,11>": "0", + "<4,8,12>": "0" + }, + "<4,9>": { + "<4,9,1>": "Left", + "<4,9,2>": "Center" + }, + "<4,10>": "N", + "<4,11>": "None", + "<4,12>": "1", + "<4,13>": "24", + "<4,14>": "0", + "<4,15>": "1", + "<4,16>": "None", + "<4,17>": "Left", + "<4,18>": { + "<4,18,1>": "13", + "<4,18,2>": "13" + }, + "<4,19>": { + "<4,19,1>": { + "<4,19,1,1>": "DESCRIPTION", + "<4,19,1,2>": "Password property for the current web account." + }, + "<4,19,2>": { + "<4,19,2,1>": "API_SIGNATURES", + "<4,19,2,2>": "webaccounts.ID.password.GET,webaccounts.ID.password.PATCH" + }, + "<4,19,3>": { + "<4,19,3,1>": "EXCLUDE_LOGGING", + "<4,19,3,2>": "0" + }, + "<4,19,4>": { + "<4,19,4,1>": "METHODS", + "<4,19,4,2>": "GET,PATCH" + }, + "<4,19,5>": { + "<4,19,5,1>": "QUERY_PARAMS", + "<4,19,5,2>": "" + }, + "<4,19,6>": { + "<4,19,6,1>": "TITLE", + "<4,19,6,2>": "Web Accounts Password" + } + } + }, + "<5>": { + "<5,1>": "2", + "<5,2>": "/contacts", + "<5,3>": "contacts", + "<5,4>": { + "<5,4,1>": "Text", + "<5,4,2>": "" + }, + "<5,5>": "RESOURCE", + "<5,6>": "", + "<5,7>": { + "<5,7,1>": "RGB{68, 68, 68}", + "<5,7,2>": "White" + }, + "<5,8>": { + "<5,8,1>": "Segoe UI", + "<5,8,2>": "-12", + "<5,8,3>": "400", + "<5,8,4>": "0", + "<5,8,5>": "0", + "<5,8,6>": "0", + "<5,8,7>": "1", + "<5,8,8>": "0", + "<5,8,9>": "0", + "<5,8,10>": "0", + "<5,8,11>": "0", + "<5,8,12>": "0" + }, + "<5,9>": { + "<5,9,1>": "Left", + "<5,9,2>": "Center" + }, + "<5,10>": "N", + "<5,11>": "None", + "<5,12>": "1", + "<5,13>": "24", + "<5,14>": "0", + "<5,15>": "1", + "<5,16>": "None", + "<5,17>": "Left", + "<5,18>": { + "<5,18,1>": "13", + "<5,18,2>": "13" + }, + "<5,19>": { + "<5,19,1>": { + "<5,19,1,1>": "DESCRIPTION", + "<5,19,1,2>": "Sample contacts resource." + }, + "<5,19,2>": { + "<5,19,2,1>": "API_SIGNATURES", + "<5,19,2,2>": "contacts.POST,contacts.GET" + }, + "<5,19,3>": { + "<5,19,3,1>": "EXCLUDE_LOGGING", + "<5,19,3,2>": "0" + }, + "<5,19,4>": { + "<5,19,4,1>": "METHODS", + "<5,19,4,2>": "POST,GET" + }, + "<5,19,5>": { + "<5,19,5,1>": "QUERY_PARAMS", + "<5,19,5,2>": "first_name,last_name,state" + }, + "<5,19,6>": { + "<5,19,6,1>": "TITLE", + "<5,19,6,2>": "Contacts" + } + } + }, + "<6>": { + "<6,1>": "3", + "<6,2>": "/contacts/{contactID}", + "<6,3>": "{contactID}", + "<6,4>": { + "<6,4,1>": "Text", + "<6,4,2>": "" + }, + "<6,5>": "RESOURCE_ID", + "<6,6>": "", + "<6,7>": { + "<6,7,1>": "RGB{68, 68, 68}", + "<6,7,2>": "White" + }, + "<6,8>": { + "<6,8,1>": "Segoe UI", + "<6,8,2>": "-12", + "<6,8,3>": "400", + "<6,8,4>": "0", + "<6,8,5>": "0", + "<6,8,6>": "0", + "<6,8,7>": "1", + "<6,8,8>": "0", + "<6,8,9>": "0", + "<6,8,10>": "0", + "<6,8,11>": "0", + "<6,8,12>": "0" + }, + "<6,9>": { + "<6,9,1>": "Left", + "<6,9,2>": "Center" + }, + "<6,10>": "N", + "<6,11>": "None", + "<6,12>": "1", + "<6,13>": "24", + "<6,14>": "0", + "<6,15>": "1", + "<6,16>": "None", + "<6,17>": "Left", + "<6,18>": { + "<6,18,1>": "13", + "<6,18,2>": "13" + }, + "<6,19>": { + "<6,19,1>": { + "<6,19,1,1>": "DESCRIPTION", + "<6,19,1,2>": "Unique contact ID for the contacts resource." + }, + "<6,19,2>": { + "<6,19,2,1>": "API_SIGNATURES", + "<6,19,2,2>": "contacts.ID.PATCH,contacts.ID.PUT,contacts.ID.DELETE,contacts.ID.GET" + }, + "<6,19,3>": { + "<6,19,3,1>": "EXCLUDE_LOGGING", + "<6,19,3,2>": "0" + }, + "<6,19,4>": { + "<6,19,4,1>": "METHODS", + "<6,19,4,2>": "PATCH,PUT,DELETE,GET" + }, + "<6,19,5>": { + "<6,19,5,1>": "QUERY_PARAMS", + "<6,19,5,2>": "" + }, + "<6,19,6>": { + "<6,19,6,1>": "TITLE", + "<6,19,6,2>": "Contacts ID" + } + } + }, + "<7>": { + "<7,1>": "4", + "<7,2>": "/contacts/{contactID}/picture", + "<7,3>": "picture", + "<7,4>": { + "<7,4,1>": "Text", + "<7,4,2>": "" + }, + "<7,5>": "RESOURCE", + "<7,6>": "", + "<7,7>": { + "<7,7,1>": "RGB{68, 68, 68}", + "<7,7,2>": "White" + }, + "<7,8>": { + "<7,8,1>": "Segoe UI", + "<7,8,2>": "-12", + "<7,8,3>": "400", + "<7,8,4>": "0", + "<7,8,5>": "0", + "<7,8,6>": "0", + "<7,8,7>": "1", + "<7,8,8>": "0", + "<7,8,9>": "0", + "<7,8,10>": "0", + "<7,8,11>": "0", + "<7,8,12>": "0" + }, + "<7,9>": { + "<7,9,1>": "Left", + "<7,9,2>": "Center" + }, + "<7,10>": "N", + "<7,11>": "None", + "<7,12>": "1", + "<7,13>": "24", + "<7,14>": "0", + "<7,15>": "1", + "<7,16>": "None", + "<7,17>": "Left", + "<7,18>": { + "<7,18,1>": "13", + "<7,18,2>": "13" + }, + "<7,19>": { + "<7,19,1>": { + "<7,19,1,1>": "DESCRIPTION", + "<7,19,1,2>": "Picture resource that is associated with the contact." + }, + "<7,19,2>": { + "<7,19,2,1>": "API_SIGNATURES", + "<7,19,2,2>": "picture.PUT,picture.GET" + }, + "<7,19,3>": { + "<7,19,3,1>": "EXCLUDE_LOGGING", + "<7,19,3,2>": "0" + }, + "<7,19,4>": { + "<7,19,4,1>": "METHODS", + "<7,19,4,2>": "PUT,GET" + }, + "<7,19,5>": { + "<7,19,5,1>": "QUERY_PARAMS", + "<7,19,5,2>": "" + }, + "<7,19,6>": { + "<7,19,6,1>": "TITLE", + "<7,19,6,2>": "Contacts Picture" + } + } + }, + "<8>": { + "<8,1>": "4", + "<8,2>": "/contacts/{contactID}/first_name", + "<8,3>": "first_name", + "<8,4>": { + "<8,4,1>": "Text", + "<8,4,2>": "" + }, + "<8,5>": "PROPERTY", + "<8,6>": "", + "<8,7>": { + "<8,7,1>": "RGB{68, 68, 68}", + "<8,7,2>": "White" + }, + "<8,8>": { + "<8,8,1>": "Segoe UI", + "<8,8,2>": "-12", + "<8,8,3>": "400", + "<8,8,4>": "0", + "<8,8,5>": "0", + "<8,8,6>": "0", + "<8,8,7>": "1", + "<8,8,8>": "0", + "<8,8,9>": "0", + "<8,8,10>": "0", + "<8,8,11>": "0", + "<8,8,12>": "0" + }, + "<8,9>": { + "<8,9,1>": "Left", + "<8,9,2>": "Center" + }, + "<8,10>": "N", + "<8,11>": "None", + "<8,12>": "1", + "<8,13>": "24", + "<8,14>": "0", + "<8,15>": "1", + "<8,16>": "None", + "<8,17>": "Left", + "<8,18>": { + "<8,18,1>": "13", + "<8,18,2>": "13" + }, + "<8,19>": { + "<8,19,1>": { + "<8,19,1,1>": "DESCRIPTION", + "<8,19,1,2>": "First name property for the contact." + }, + "<8,19,2>": { + "<8,19,2,1>": "API_SIGNATURES", + "<8,19,2,2>": "contacts.ID.first_name.GET,contacts.ID.first_name.PUT" + }, + "<8,19,3>": { + "<8,19,3,1>": "EXCLUDE_LOGGING", + "<8,19,3,2>": "0" + }, + "<8,19,4>": { + "<8,19,4,1>": "METHODS", + "<8,19,4,2>": "GET,PUT" + }, + "<8,19,5>": { + "<8,19,5,1>": "QUERY_PARAMS", + "<8,19,5,2>": "" + }, + "<8,19,6>": { + "<8,19,6,1>": "TITLE", + "<8,19,6,2>": "Contacts First Name" + } + } + }, + "<9>": { + "<9,1>": "4", + "<9,2>": "/contacts/{contactID}/last_name", + "<9,3>": "last_name", + "<9,4>": { + "<9,4,1>": "Text", + "<9,4,2>": "" + }, + "<9,5>": "PROPERTY", + "<9,6>": "", + "<9,7>": { + "<9,7,1>": "RGB{68, 68, 68}", + "<9,7,2>": "White" + }, + "<9,8>": { + "<9,8,1>": "Segoe UI", + "<9,8,2>": "-12", + "<9,8,3>": "400", + "<9,8,4>": "0", + "<9,8,5>": "0", + "<9,8,6>": "0", + "<9,8,7>": "1", + "<9,8,8>": "0", + "<9,8,9>": "0", + "<9,8,10>": "0", + "<9,8,11>": "0", + "<9,8,12>": "0" + }, + "<9,9>": { + "<9,9,1>": "Left", + "<9,9,2>": "Center" + }, + "<9,10>": "N", + "<9,11>": "None", + "<9,12>": "1", + "<9,13>": "24", + "<9,14>": "0", + "<9,15>": "1", + "<9,16>": "None", + "<9,17>": "Left", + "<9,18>": { + "<9,18,1>": "13", + "<9,18,2>": "13" + }, + "<9,19>": { + "<9,19,1>": { + "<9,19,1,1>": "DESCRIPTION", + "<9,19,1,2>": "Last name property for the contact." + }, + "<9,19,2>": { + "<9,19,2,1>": "API_SIGNATURES", + "<9,19,2,2>": "contacts.ID.last_name.GET,contacts.ID.last_name.PUT" + }, + "<9,19,3>": { + "<9,19,3,1>": "EXCLUDE_LOGGING", + "<9,19,3,2>": "0" + }, + "<9,19,4>": { + "<9,19,4,1>": "METHODS", + "<9,19,4,2>": "GET,PUT" + }, + "<9,19,5>": { + "<9,19,5,1>": "QUERY_PARAMS", + "<9,19,5,2>": "" + }, + "<9,19,6>": { + "<9,19,6,1>": "TITLE", + "<9,19,6,2>": "Contacts Last Name" + } + } + }, + "<10>": { + "<10,1>": "2", + "<10,2>": "/version", + "<10,3>": "version", + "<10,4>": { + "<10,4,1>": "Text", + "<10,4,2>": "" + }, + "<10,5>": "RESOURCE", + "<10,6>": "", + "<10,7>": { + "<10,7,1>": "RGB{68, 68, 68}", + "<10,7,2>": "White" + }, + "<10,8>": { + "<10,8,1>": "Segoe UI", + "<10,8,2>": "-12", + "<10,8,3>": "400", + "<10,8,4>": "0", + "<10,8,5>": "0", + "<10,8,6>": "0", + "<10,8,7>": "1", + "<10,8,8>": "0", + "<10,8,9>": "0", + "<10,8,10>": "0", + "<10,8,11>": "0", + "<10,8,12>": "0" + }, + "<10,9>": { + "<10,9,1>": "Left", + "<10,9,2>": "Center" + }, + "<10,10>": "N", + "<10,11>": "None", + "<10,12>": "1", + "<10,13>": "24", + "<10,14>": "0", + "<10,15>": "1", + "<10,16>": "None", + "<10,17>": "Left", + "<10,18>": { + "<10,18,1>": "13", + "<10,18,2>": "13" + }, + "<10,19>": { + "<10,19,1>": { + "<10,19,1,1>": "DESCRIPTION", + "<10,19,1,2>": "Service that returns the version of the HTTP Framework." + }, + "<10,19,2>": { + "<10,19,2,1>": "API_SIGNATURES", + "<10,19,2,2>": "version.GET" + }, + "<10,19,3>": { + "<10,19,3,1>": "METHODS", + "<10,19,3,2>": "GET" + }, + "<10,19,4>": { + "<10,19,4,1>": "EXCLUDE_LOGGING", + "<10,19,4,2>": "0" + }, + "<10,19,5>": { + "<10,19,5,1>": "QUERY_PARAMS", + "<10,19,5,2>": "" + }, + "<10,19,6>": { + "<10,19,6,1>": "TITLE", + "<10,19,6,2>": "API Version" + } + } + }, + "<11>": { + "<11,1>": "2", + "<11,2>": "/ping", + "<11,3>": "ping", + "<11,4>": { + "<11,4,1>": "Text", + "<11,4,2>": "" + }, + "<11,5>": "RESOURCE", + "<11,6>": "", + "<11,7>": { + "<11,7,1>": "RGB{68, 68, 68}", + "<11,7,2>": "White" + }, + "<11,8>": { + "<11,8,1>": "Segoe UI", + "<11,8,2>": "-12", + "<11,8,3>": "400", + "<11,8,4>": "0", + "<11,8,5>": "0", + "<11,8,6>": "0", + "<11,8,7>": "1", + "<11,8,8>": "0", + "<11,8,9>": "0", + "<11,8,10>": "0", + "<11,8,11>": "0", + "<11,8,12>": "0" + }, + "<11,9>": { + "<11,9,1>": "Left", + "<11,9,2>": "Center" + }, + "<11,10>": "N", + "<11,11>": "None", + "<11,12>": "1", + "<11,13>": "24", + "<11,14>": "0", + "<11,15>": "1", + "<11,16>": "None", + "<11,17>": "Left", + "<11,18>": { + "<11,18,1>": "13", + "<11,18,2>": "13" + }, + "<11,19>": { + "<11,19,1>": { + "<11,19,1,1>": "DESCRIPTION", + "<11,19,1,2>": "Used to perform simple ping tests against the API server." + }, + "<11,19,2>": { + "<11,19,2,1>": "API_SIGNATURES", + "<11,19,2,2>": "ping.GET" + }, + "<11,19,3>": { + "<11,19,3,1>": "METHODS", + "<11,19,3,2>": "GET" + }, + "<11,19,4>": { + "<11,19,4,1>": "EXCLUDE_LOGGING", + "<11,19,4,2>": "0" + }, + "<11,19,5>": { + "<11,19,5,1>": "QUERY_PARAMS", + "<11,19,5,2>": "" + }, + "<11,19,6>": { + "<11,19,6,1>": "TITLE", + "<11,19,6,2>": "Ping Test API" + } + } + }, + "<12>": { + "<12,1>": "2", + "<12,2>": "/oauth", + "<12,3>": "oauth", + "<12,4>": { + "<12,4,1>": "Text", + "<12,4,2>": "" + }, + "<12,5>": "RESOURCE", + "<12,6>": "", + "<12,7>": { + "<12,7,1>": "RGB{68, 68, 68}", + "<12,7,2>": "White" + }, + "<12,8>": { + "<12,8,1>": "Segoe UI", + "<12,8,2>": "-12", + "<12,8,3>": "400", + "<12,8,4>": "0", + "<12,8,5>": "0", + "<12,8,6>": "0", + "<12,8,7>": "1", + "<12,8,8>": "0", + "<12,8,9>": "0", + "<12,8,10>": "0", + "<12,8,11>": "0", + "<12,8,12>": "0" + }, + "<12,9>": { + "<12,9,1>": "Left", + "<12,9,2>": "Center" + }, + "<12,10>": "N", + "<12,11>": "None", + "<12,12>": "1", + "<12,13>": "24", + "<12,14>": "0", + "<12,15>": "1", + "<12,16>": "None", + "<12,17>": "Left", + "<12,18>": { + "<12,18,1>": "13", + "<12,18,2>": "13" + }, + "<12,19>": { + "<12,19,1>": { + "<12,19,1,1>": "DESCRIPTION", + "<12,19,1,2>": "Open Authorization resource API handler." + }, + "<12,19,2>": { + "<12,19,2,1>": "API_SIGNATURES", + "<12,19,2,2>": "oauth.GET" + }, + "<12,19,3>": { + "<12,19,3,1>": "METHODS", + "<12,19,3,2>": "GET" + }, + "<12,19,4>": { + "<12,19,4,1>": "EXCLUDE_LOGGING", + "<12,19,4,2>": "0" + }, + "<12,19,5>": { + "<12,19,5,1>": "QUERY_PARAMS", + "<12,19,5,2>": "" + }, + "<12,19,6>": { + "<12,19,6,1>": "TITLE", + "<12,19,6,2>": "OpenAuthorization" + } + } + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SERVER_ENABLED.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SERVER_ENABLED.json new file mode 100644 index 0000000..027bdf3 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SERVER_ENABLED.json @@ -0,0 +1,12 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_SERVER_ENABLED" + }, + "body": { + "record1": { + "<1>": "1" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SETUP.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SETUP.json new file mode 100644 index 0000000..01e583b --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_SETUP.json @@ -0,0 +1,37 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_SETUP" + }, + "body": { + "record1": { + "<1>": "127.0.0.1", + "<2>": "/api", + "<3>": "c:\\httpLogs", + "<4>": "1", + "<5>": "Contacts", + "<6>": "HTTP_ENTRY_POINT_SERVICES", + "<7>": "1", + "<8>": { + "<8,1>": "/oauth", + "<8,2>": "/ping" + }, + "<9>": "HTTP_ABORTED_SERVICE", + "<10>": "1", + "<11>": "1", + "<12>": "HTTP_DEBUGGER_SERVICE", + "<13>": "0", + "<14>": "", + "<15>": "1", + "<16>": "72", + "<17>": "1", + "<18>": "3", + "<19>": "Quarantine Account", + "<20>": "Web API", + "<21>": "", + "<22>": "", + "<23>": "1" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY.json new file mode 100644 index 0000000..dbf386e --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY.json @@ -0,0 +1,31 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY" + }, + "body": { + "record1": { + "<1>": "", + "<2>": "#pragma precomp SRP_PreCompiler", + "<3>": "", + "<4>": "$insert APP_INSERTS", + "<5>": "$insert API_SETUP", + "<6>": "$insert HTTP_INSERTS", + "<7>": "", + "<8>": "GoToAPI else", + "<9>": " // The specific resource endpoint doesn't have a API handler yet.", + "<10>": " HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')", + "<11>": "end", + "<12>": "", + "<13>": "Return Response OR ''", + "<14>": "", + "<15>": "", + "<16>": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////", + "<17>": "// Endpoint Handlers", + "<18>": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////", + "<19>": "", + "<20>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK.json new file mode 100644 index 0000000..26f8fdd --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK.json @@ -0,0 +1,47 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK" + }, + "body": { + "record1": { + "<1>": "/***********************************************************************************************************************", + "<2>": "", + "<3>": " This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written", + "<4>": " permission from SRP Computer Solutions, Inc.", + "<5>": "", + "<6>": " Name : _API", + "<7>": "", + "<8>": " Description : API logic for the resource.", + "<9>": "", + "<10>": " Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:", + "<11>": "", + "<12>": " HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)", + "<13>": " APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).", + "<14>": " FullEndpointURL - The URL submitted by the client, including query params.", + "<15>": " FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.", + "<16>": " EndpointSegment - The URL endpoint segment.", + "<17>": " ParentURL - The URL path preceeding the current endpoint.", + "<18>": " CurrentAPI - The name of this stored procedure.", + "<19>": "", + "<20>": " Parameters :", + "<21>": " API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:", + "<22>": " - APIPattern must follow this structure [.ID.[]]", + "<23>": " - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.", + "<24>": " Examples:", + "<25>": " - .POST", + "<26>": " - .ID.PUT", + "<27>": " - .ID.firstName.GET", + "<28>": " Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API", + "<29>": " services do not rely upon anything being returned in the response. This is what the", + "<30>": " various services like SetResponseBody and SetResponseStatus services are for. A response", + "<31>": " value is only helpful if the developers want to use it for debug purposes.", + "<32>": "", + "<33>": " History : (Date, Initials, Notes)", + "<34>": " MM/DD/YY xxx Original programmer.", + "<35>": "", + "<36>": "***********************************************************************************************************************/" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE.json new file mode 100644 index 0000000..c71de89 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE.json @@ -0,0 +1,12 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE" + }, + "body": { + "record1": { + "<1>": "Function _API(@API)" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS.json new file mode 100644 index 0000000..055d34d --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS.json @@ -0,0 +1,12 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS" + }, + "body": { + "record1": { + "<1>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_VERSION.json b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_VERSION.json new file mode 100644 index 0000000..c614c5f --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSENV%003ASRP_HTTP_FRAMEWORK_VERSION.json @@ -0,0 +1,13 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "SRP_HTTP_FRAMEWORK_VERSION" + }, + "body": { + "record1": { + "<1>": "4.0.10.0", + "<2>": "02/08/2022 07:20AM" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSREPOSRELEASES%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json b/FRAMEWORKS/APPROW/SYSREPOSRELEASES%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json new file mode 100644 index 0000000..cdc2152 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSREPOSRELEASES%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json @@ -0,0 +1,65 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "FRAMEWORKS*SRP_HTTP_FRAMEWORK" + }, + "body": { + "record1": { + "<1>": "SRP HTTP Framework", + "<2>": "", + "<3>": "", + "<4>": "", + "<5>": "", + "<6>": "SRP_HTTP_FRAMEWORK", + "<7>": "2", + "<8>": "", + "<9>": "0", + "<10>": "C:\\Users\\dbakk\\Dropbox (SRP)\\SRP Team Folder\\SRP HTTP Framework\\4.0.10\\4.0.10.0\\SRP_HTTP_Framework_4.10.0.0_RDK_64", + "<11>": "", + "<12>": "", + "<13>": "", + "<14>": "", + "<15>": "", + "<16>": "", + "<17>": "", + "<18>": "", + "<19>": "19763", + "<20>": "0", + "<21>": "FRAMEWORKS", + "<22>": "", + "<23>": "", + "<24>": "", + "<25>": "", + "<26>": "", + "<27>": "", + "<28>": "", + "<29>": "", + "<30>": "", + "<31>": "", + "<32>": "", + "<33>": "", + "<34>": "", + "<35>": "", + "<36>": "0", + "<37>": "", + "<38>": "", + "<39>": "", + "<40>": "", + "<41>": "", + "<42>": "", + "<43>": "0", + "<44>": "", + "<45>": "", + "<46>": "", + "<47>": "1", + "<48>": { + "<48,1>": "0", + "<48,2>": "", + "<48,3>": "", + "<48,4>": "" + }, + "<49>": "0" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/APPROW/SYSREPOSVIEWS%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json b/FRAMEWORKS/APPROW/SYSREPOSVIEWS%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json new file mode 100644 index 0000000..53eba92 --- /dev/null +++ b/FRAMEWORKS/APPROW/SYSREPOSVIEWS%003AFRAMEWORKS_SRP_HTTP_FRAMEWORK.json @@ -0,0 +1,216 @@ +{ + "header": { + "version": 1, + "type": "record", + "approw-key": "FRAMEWORKS*SRP_HTTP_FRAMEWORK" + }, + "body": { + "record1": { + "<1>": "SRP HTTP FrameWork", + "<2>": "See JIRA Issue SRPFW-82", + "<3>": "", + "<4>": "FRAMEWORKS", + "<5>": "", + "<6>": "", + "<7>": { + "<7,1>": "FRAMEWORKS", + "<7,2>": "FRAMEWORKS", + "<7,3>": "FRAMEWORKS", + "<7,4>": "FRAMEWORKS", + "<7,5>": "FRAMEWORKS", + "<7,6>": "FRAMEWORKS", + "<7,7>": "FRAMEWORKS", + "<7,8>": "FRAMEWORKS", + "<7,9>": "FRAMEWORKS", + "<7,10>": "FRAMEWORKS", + "<7,11>": "FRAMEWORKS", + "<7,12>": "FRAMEWORKS", + "<7,13>": "FRAMEWORKS", + "<7,14>": "FRAMEWORKS", + "<7,15>": "SYSPROG", + "<7,16>": "" + }, + "<8>": "", + "<9>": "", + "<10>": "", + "<11>": { + "<11,1>": "Application Rows", + "<11,2>": "3-3:SYSENV:SRP_EDITOR_METADATA_AGENT_API_FRAMEWORKS", + "<11,3>": "3-3:SYSENV:SRP_EDITOR_METADATA_APIROOT_API_FRAMEWORKS", + "<11,4>": "3-3:SYSENV:SRP_EDITOR_METADATA_CONTACTS_API_FRAMEWORKS", + "<11,5>": "3-3:SYSENV:SRP_EDITOR_METADATA_DATABASE_SERVICES_FRAMEWORKS", + "<11,6>": "3-3:SYSENV:SRP_EDITOR_METADATA_ERROR_SERVICES_FRAMEWORKS", + "<11,7>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTPCLIENT_SERVICES_FRAMEWORKS", + "<11,8>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTP_AUTHENTICATION_SERVICES_FRAMEWORKS", + "<11,9>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTP_JSON_SERVICES_FRAMEWORKS", + "<11,10>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTP_RESOURCE_MANAGER_SERVICES_FRAMEWORKS", + "<11,11>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTP_RESOURCE_SERVICES_FRAMEWORKS", + "<11,12>": "3-3:SYSENV:SRP_EDITOR_METADATA_HTTP_SERVICES_FRAMEWORKS", + "<11,13>": "3-3:SYSENV:SRP_EDITOR_METADATA_LOGGING_SERVICES_FRAMEWORKS", + "<11,14>": "3-3:SYSENV:SRP_EDITOR_METADATA_MEMORY_SERVICES_FRAMEWORKS", + "<11,15>": "3-3:SYSENV:SRP_EDITOR_METADATA_NDW_WEB_ACCOUNTS_EVENTS_FRAMEWORKS", + "<11,16>": "3-3:SYSENV:SRP_EDITOR_METADATA_OATH_API_FRAMEWORKS", + "<11,17>": "3-3:SYSENV:SRP_EDITOR_METADATA_PICTURE_API_FRAMEWORKS", + "<11,18>": "3-3:SYSENV:SRP_EDITOR_METADATA_PING_API_FRAMEWORKS", + "<11,19>": "3-3:SYSENV:SRP_EDITOR_METADATA_VERSION_API_FRAMEWORKS", + "<11,20>": "3-3:SYSENV:SRP_EDITOR_METADATA_WEBACCOUNTS_API_FRAMEWORKS", + "<11,21>": "3-3:SYSENV:SRP_EDITOR_METADATA_WEBACCOUNTS_SERVICES_FRAMEWORKS", + "<11,22>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT", + "<11,23>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES", + "<11,24>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_RESOURCES", + "<11,25>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_SERVER_ENABLED", + "<11,26>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_SETUP", + "<11,27>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY", + "<11,28>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK", + "<11,29>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE", + "<11,30>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS", + "<11,31>": "3-3:SYSENV:SRP_HTTP_FRAMEWORK_VERSION", + "<11,32>": "3-3:SYSREPOSRELEASES:FRAMEWORKS_SRP_HTTP_FRAMEWORK", + "<11,33>": "3-3:SYSREPOSVIEWS:FRAMEWORKS_SRP_HTTP_FRAMEWORK", + "<11,34>": "Images", + "<11,35>": "2-2:BMP", + "<11,36>": "3-3:SRPHTTPCREATEAPIS", + "<11,37>": "3-3:SRPHTTPDATEFIELD", + "<11,38>": "3-3:SRPHTTPENTRYPOINT", + "<11,39>": "3-3:SRPHTTPINFO", + "<11,40>": "3-3:SRPHTTPPROPERTY", + "<11,41>": "3-3:SRPHTTPREMOVE", + "<11,42>": "3-3:SRPHTTPRENAME", + "<11,43>": "3-3:SRPHTTPRESOURCE", + "<11,44>": "3-3:SRPHTTPRESOURCEID", + "<11,45>": "3-3:SRPHTTPTREECOLLAPSED", + "<11,46>": "3-3:SRPHTTPTREEEXPANDED", + "<11,47>": "3-3:SRPHTTPTREETOPLEVELRESOURCES", + "<11,48>": "2-2:ICO", + "<11,49>": "3-3:SRP", + "<11,50>": "OpenInsight Form Executables", + "<11,51>": "3-3:NDW_HTTP_DATEPICKER", + "<11,52>": "3-3:NDW_HTTP_FRAMEWORK_SETUP", + "<11,53>": "3-3:NDW_HTTP_LOGS", + "<11,54>": "3-3:NDW_HTTP_LOGS_ARCHIVE_DATE", + "<11,55>": "3-3:NDW_WEB_ACCOUNTS", + "<11,56>": "OpenInsight Forms", + "<11,57>": "3-3:NDW_HTTP_DATEPICKER", + "<11,58>": "3-3:NDW_HTTP_FRAMEWORK_SETUP", + "<11,59>": "3-3:NDW_HTTP_LOGS", + "<11,60>": "3-3:NDW_HTTP_LOGS_ARCHIVE_DATE", + "<11,61>": "3-3:NDW_WEB_ACCOUNTS", + "<11,62>": "Popup Boxes", + "<11,63>": "3-3:WEB_ACCOUNTS", + "<11,64>": "Stored Procedure Debug Tables", + "<11,65>": "3-3:APIROOT_API", + "<11,66>": "3-3:CONTACTS_API", + "<11,67>": "3-3:DATABASE_SERVICES", + "<11,68>": "3-3:ERROR_SERVICES", + "<11,69>": "3-3:HTTPCLIENT_SERVICES", + "<11,70>": "3-3:HTTP_ABORTED_SERVICE", + "<11,71>": "3-3:HTTP_AUTHENTICATION_SERVICES", + "<11,72>": "3-3:HTTP_CONTACTS_SERVICES", + "<11,73>": "3-3:HTTP_DEBUGGER_SERVICE", + "<11,74>": "3-3:HTTP_ENTRY_POINT_SERVICES", + "<11,75>": "3-3:HTTP_JSON_SERVICES", + "<11,76>": "3-3:HTTP_MCP", + "<11,77>": "3-3:HTTP_PICTURE_SERVICES", + "<11,78>": "3-3:HTTP_RESOURCE_MANAGER_SERVICES", + "<11,79>": "3-3:HTTP_RESOURCE_SERVICES", + "<11,80>": "3-3:HTTP_SERVICES", + "<11,81>": "3-3:HTTP_VERSION_SERVICES", + "<11,82>": "3-3:HTTP_WEBACCOUNTS_SERVICES", + "<11,83>": "3-3:LOGGING_SERVICES", + "<11,84>": "3-3:MEMORY_SERVICES", + "<11,85>": "3-3:NDW_HTTP_DATEPICKER_EVENTS", + "<11,86>": "3-3:NDW_HTTP_FRAMEWORK_SETUP_EVENTS", + "<11,87>": "3-3:NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS", + "<11,88>": "3-3:NDW_HTTP_LOGS_EVENTS", + "<11,89>": "3-3:NDW_WEB_ACCOUNTS_EVENTS", + "<11,90>": "3-3:OAUTH_API", + "<11,91>": "3-3:PICTURE_API", + "<11,92>": "3-3:PING_API", + "<11,93>": "3-3:VERSION_API", + "<11,94>": "3-3:WEBACCOUNTS_API", + "<11,95>": "3-3:WEBACCOUNTS_SERVICES", + "<11,96>": "3-3:WEB_ACCOUNTS_ACTIONS", + "<11,97>": "Stored Procedure Executables", + "<11,98>": "3-3:APIROOT_API", + "<11,99>": "3-3:CONTACTS_API", + "<11,100>": "3-3:DATABASE_SERVICES", + "<11,101>": "3-3:ERROR_SERVICES", + "<11,102>": "3-3:HTTPCLIENT_SERVICES", + "<11,103>": "3-3:HTTP_ABORTED_SERVICE", + "<11,104>": "3-3:HTTP_AUTHENTICATION_SERVICES", + "<11,105>": "3-3:HTTP_CONTACTS_SERVICES", + "<11,106>": "3-3:HTTP_DEBUGGER_SERVICE", + "<11,107>": "3-3:HTTP_ENTRY_POINT_SERVICES", + "<11,108>": "3-3:HTTP_JSON_SERVICES", + "<11,109>": "3-3:HTTP_MCP", + "<11,110>": "3-3:HTTP_PICTURE_SERVICES", + "<11,111>": "3-3:HTTP_RESOURCE_MANAGER_SERVICES", + "<11,112>": "3-3:HTTP_RESOURCE_SERVICES", + "<11,113>": "3-3:HTTP_SERVICES", + "<11,114>": "3-3:HTTP_VERSION_SERVICES", + "<11,115>": "3-3:HTTP_WEBACCOUNTS_SERVICES", + "<11,116>": "3-3:LOGGING_SERVICES", + "<11,117>": "3-3:MEMORY_SERVICES", + "<11,118>": "3-3:NDW_HTTP_DATEPICKER_EVENTS", + "<11,119>": "3-3:NDW_HTTP_FRAMEWORK_SETUP_EVENTS", + "<11,120>": "3-3:NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS", + "<11,121>": "3-3:NDW_HTTP_LOGS_EVENTS", + "<11,122>": "3-3:NDW_WEB_ACCOUNTS_EVENTS", + "<11,123>": "3-3:OAUTH_API", + "<11,124>": "3-3:PICTURE_API", + "<11,125>": "3-3:PING_API", + "<11,126>": "3-3:SRP_PRECOMPILER", + "<11,127>": "3-3:VERSION_API", + "<11,128>": "3-3:WEBACCOUNTS_API", + "<11,129>": "3-3:WEBACCOUNTS_SERVICES", + "<11,130>": "3-3:WEB_ACCOUNTS_ACTIONS", + "<11,131>": "Stored Procedure Inserts", + "<11,132>": "3-3:ACTION_SETUP", + "<11,133>": "3-3:API_SETUP", + "<11,134>": "3-3:APP_INSERTS", + "<11,135>": "3-3:CONTACTS_EQUATES", + "<11,136>": "3-3:HTTP_FRAMEWORK_SETUP_EQUATES", + "<11,137>": "3-3:HTTP_INSERTS", + "<11,138>": "3-3:HTTP_SERVICE_SETUP", + "<11,139>": "3-3:INET_EQUATES", + "<11,140>": "3-3:RTI_LH_INFO_EQUATES", + "<11,141>": "3-3:SERVICE_SETUP", + "<11,142>": "3-3:SRPMAIL_INSERTS", + "<11,143>": "3-3:WEB_ACCOUNTS_EQUATES", + "<11,144>": "Stored Procedures", + "<11,145>": "3-3:APIROOT_API", + "<11,146>": "3-3:CONTACTS_API", + "<11,147>": "3-3:DATABASE_SERVICES", + "<11,148>": "3-3:ERROR_SERVICES", + "<11,149>": "3-3:HTTPCLIENT_SERVICES", + "<11,150>": "3-3:HTTP_ABORTED_SERVICE", + "<11,151>": "3-3:HTTP_AUTHENTICATION_SERVICES", + "<11,152>": "3-3:HTTP_CONTACTS_SERVICES", + "<11,153>": "3-3:HTTP_DEBUGGER_SERVICE", + "<11,154>": "3-3:HTTP_ENTRY_POINT_SERVICES", + "<11,155>": "3-3:HTTP_JSON_SERVICES", + "<11,156>": "3-3:HTTP_MCP", + "<11,157>": "3-3:HTTP_PICTURE_SERVICES", + "<11,158>": "3-3:HTTP_RESOURCE_MANAGER_SERVICES", + "<11,159>": "3-3:HTTP_RESOURCE_SERVICES", + "<11,160>": "3-3:HTTP_SERVICES", + "<11,161>": "3-3:HTTP_VERSION_SERVICES", + "<11,162>": "3-3:HTTP_WEBACCOUNTS_SERVICES", + "<11,163>": "3-3:LOGGING_SERVICES", + "<11,164>": "3-3:MEMORY_SERVICES", + "<11,165>": "3-3:NDW_HTTP_DATEPICKER_EVENTS", + "<11,166>": "3-3:NDW_HTTP_FRAMEWORK_SETUP_EVENTS", + "<11,167>": "3-3:NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS", + "<11,168>": "3-3:NDW_HTTP_LOGS_EVENTS", + "<11,169>": "3-3:NDW_WEB_ACCOUNTS_EVENTS", + "<11,170>": "3-3:OAUTH_API", + "<11,171>": "3-3:PICTURE_API", + "<11,172>": "3-3:PING_API", + "<11,173>": "3-3:VERSION_API", + "<11,174>": "3-3:WEBACCOUNTS_API", + "<11,175>": "3-3:WEBACCOUNTS_SERVICES", + "<11,176>": "3-3:WEB_ACCOUNTS_ACTIONS" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/DBW_AUDIT_MANAGER.json b/FRAMEWORKS/OIWIN/DBW_AUDIT_MANAGER.json new file mode 100644 index 0000000..d6c9ee2 --- /dev/null +++ b/FRAMEWORKS/OIWIN/DBW_AUDIT_MANAGER.json @@ -0,0 +1,968 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "7", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "DBW_AUDIT_MANAGER", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "132", + "<1,6>": "269", + "<1,7>": "-571", + "<1,8>": "-360", + "<1,9>": "Audit Manager", + "<1,10>": { + "<1,10,1>": "0x82CF0000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x2100", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "0", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "LSL2*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "READ" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "" + }, + "<1,18,2>": { + "<1,18,2,1>": "R", + "<1,18,2,2>": "EXECUTE", + "<1,18,2,3>": "LSL2*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<1,18,2,4>": { + "<1,18,2,4,1>": "@SELF", + "<1,18,2,4,2>": "WRITE" + }, + "<1,18,2,5>": "", + "<1,18,2,6>": "" + }, + "<1,18,3>": "" + }, + "<1,19>": { + "<1,19,1>": "READ", + "<1,19,2>": "WRITE", + "<1,19,3>": "" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "APP_INFO", + "<1,24>": { + "<1,24,1>": "0", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "0", + "<1,24,6>": "1" + }, + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": { + "<1,32,1>": "0x7FFFE", + "<1,32,2>": "0xF001E808" + }, + "<1,33>": "", + "<1,34>": "LSL2*IMAGE*ICO*LSL2", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0x20001", + "<1,37,2>": "0x10001" + }, + "<1,38>": { + "<1,38,1>": "1", + "<1,38,2>": "1" + }, + "<1,39>": "", + "<1,40>": "0", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "EDL_FIELD_TRACEABILITY", + "<1,2>": "", + "<1,3>": "EDITFIELD", + "<1,4>": "DBW_AUDIT_MANAGER", + "<1,5>": "42", + "<1,6>": "16", + "<1,7>": "124", + "<1,8>": "23", + "<1,9>": "AUDIT_MANAGER_SETTINGS", + "<1,10>": { + "<1,10,1>": "0x46000880", + "<1,10,2>": "0x200" + }, + "<1,11>": { + "<1,11,1>": "0x4", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "1", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "MS Sans Serif", + "<1,15,1,2>": "-11", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "1", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "APP_INFO", + "<1,24>": "ID", + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "0", + "<1,32>": { + "<1,32,1>": "0x7fffe", + "<1,32,2>": "0xc0016108" + }, + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + }, + "<2>": { + "<2,1>": "EDT_AUDIT_TABLES", + "<2,2>": "", + "<2,3>": "OLECONTROL.SRP.EditTable.1", + "<2,4>": "DBW_AUDIT_MANAGER", + "<2,5>": "19", + "<2,6>": "20", + "<2,7>": "-20", + "<2,8>": "-21", + "<2,9>": "SRP.EditTable.1", + "<2,10>": { + "<2,10,1>": "0x56000000", + "<2,10,2>": "0x0" + }, + "<2,11>": { + "<2,11,1>": "0xC000", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "2", + "<2,13>": "-2", + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Tahoma", + "<2,15,1,2>": "-11", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": "", + "<2,19>": "", + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "0", + "<2,26>": "0", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": { + "<2,32,1>": "0x7fffe", + "<2,32,2>": "0xf0016400" + }, + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": "0000000000000000", + "<2,37>": "" + }, + "<3>": { + "<3,1>": "OLE_TAB", + "<3,2>": "", + "<3,3>": "OLECONTROL.SRP.Tab.1", + "<3,4>": "DBW_AUDIT_MANAGER", + "<3,5>": "8", + "<3,6>": "7", + "<3,7>": "-8", + "<3,8>": "4", + "<3,9>": "SRP.Tab.1", + "<3,10>": { + "<3,10,1>": "0x56000000", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0x4000", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "3", + "<3,13>": "-2", + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Tahoma", + "<3,15,1,2>": "-11", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": "", + "<3,19>": "", + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "0", + "<3,26>": "0", + "<3,27>": "", + "<3,28>": "<>", + "<3,29>": "<>", + "<3,30>": "<>", + "<3,31>": "0", + "<3,32>": { + "<3,32,1>": "0x7fffe", + "<3,32,2>": "0xf0016400" + }, + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "010000000400000000000000FFFEFF205400610068006F006D006100FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000040000000000000001000000000000000100000000000000FFFEFF00FFFEFF044E006F006E00650000000000000000002B020000", + "<3,37>": "" + }, + "<4>": { + "<4,1>": "EDT_AUDIT_TBACK", + "<4,2>": "", + "<4,3>": "EDITTABLE", + "<4,4>": "DBW_AUDIT_MANAGER", + "<4,5>": "34", + "<4,6>": "24:1", + "<4,7>": "-66", + "<4,8>": "-303", + "<4,9>": "", + "<4,10>": { + "<4,10,1>": "0x560061D0", + "<4,10,2>": "0x200" + }, + "<4,11>": { + "<4,11,1>": "0xC000", + "<4,11,2>": "0x80000002" + }, + "<4,12>": "4", + "<4,13>": "-2", + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "MS Sans Serif", + "<4,15,1,2>": "-11", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "1", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "R", + "<4,18,1,2>": "EXECUTE", + "<4,18,1,3>": "SYSPROG*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<4,18,1,4>": { + "<4,18,1,4,1>": "CLICK.EDT_MFS_INFO", + "<4,18,1,4,2>": "@SELF", + "<4,18,1,4,3>": "@PARAM1", + "<4,18,1,4,4>": "@PARAM2", + "<4,18,1,4,5>": "@PARAM3" + }, + "<4,18,1,5>": "", + "<4,18,1,6>": "" + }, + "<4,18,2>": { + "<4,18,2,1>": "R", + "<4,18,2,2>": "EXECUTE", + "<4,18,2,3>": "SYSPROG*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<4,18,2,4>": { + "<4,18,2,4,1>": "DBLCLK.EDT_MFS_INFO", + "<4,18,2,4,2>": "@SELF", + "<4,18,2,4,3>": "@PARAM1", + "<4,18,2,4,4>": "@PARAM2", + "<4,18,2,4,5>": "@PARAM3", + "<4,18,2,4,6>": "@PARAM4" + }, + "<4,18,2,5>": "", + "<4,18,2,6>": "" + }, + "<4,18,3>": { + "<4,18,3,1>": "R", + "<4,18,3,2>": "EXECUTE", + "<4,18,3,3>": "SYSPROG*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<4,18,3,4>": { + "<4,18,3,4,1>": "GOTFOCUS.EDT_MFS_INFO", + "<4,18,3,4,2>": "@SELF", + "<4,18,3,4,3>": "@PARAM1", + "<4,18,3,4,4>": "@PARAM2", + "<4,18,3,4,5>": "@PARAM3", + "<4,18,3,4,6>": "@PARAM4" + }, + "<4,18,3,5>": "", + "<4,18,3,6>": "" + }, + "<4,18,4>": { + "<4,18,4,1>": "R", + "<4,18,4,2>": "EXECUTE", + "<4,18,4,3>": "SYSPROG*STPROCEXE**DBW_AUDIT_MANAGER_EVENTS", + "<4,18,4,4>": { + "<4,18,4,4,1>": "OPTIONS.EDT_MFS_INFO", + "<4,18,4,4,2>": "@SELF", + "<4,18,4,4,3>": "@PARAM1" + }, + "<4,18,4,5>": "", + "<4,18,4,6>": "" + }, + "<4,18,5>": "" + }, + "<4,19>": { + "<4,19,1>": "CLICK", + "<4,19,2>": "DBLCLK", + "<4,19,3>": "GOTFOCUS", + "<4,19,4>": "OPTIONS", + "<4,19,5>": "" + }, + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": { + "<4,23,1>": "APP_INFO", + "<4,23,2>": "APP_INFO", + "<4,23,3>": "APP_INFO", + "<4,23,4>": "APP_INFO", + "<4,23,5>": "APP_INFO", + "<4,23,6>": "APP_INFO", + "<4,23,7>": "APP_INFO" + }, + "<4,24>": { + "<4,24,1>": "TABLE_NAME", + "<4,24,2>": "MODIFIED_BY", + "<4,24,3>": "WRITE", + "<4,24,4>": "DELETE", + "<4,24,5>": "READ", + "<4,24,6>": "PROGRAM_TRACKER", + "<4,24,7>": "STATUS" + }, + "<4,25>": "0", + "<4,26>": "0", + "<4,27>": "", + "<4,28>": { + "<4,28,1>": "<>", + "<4,28,2>": "<>", + "<4,28,3>": "<>", + "<4,28,4>": "<>", + "<4,28,5>": "<>", + "<4,28,6>": "<>", + "<4,28,7>": "<>" + }, + "<4,29>": { + "<4,29,1>": "<>", + "<4,29,2>": "<>", + "<4,29,3>": "<>", + "<4,29,4>": "<>", + "<4,29,5>": "<>", + "<4,29,6>": "<>", + "<4,29,7>": "<>" + }, + "<4,30>": { + "<4,30,1>": "<>", + "<4,30,2>": "<>", + "<4,30,3>": "<>", + "<4,30,4>": "<>", + "<4,30,5>": "<>", + "<4,30,6>": "<>", + "<4,30,7>": "<>" + }, + "<4,31>": { + "<4,31,1>": "0", + "<4,31,2>": "0", + "<4,31,3>": "0", + "<4,31,4>": "0", + "<4,31,5>": "0", + "<4,31,6>": "0", + "<4,31,7>": "0" + }, + "<4,32>": { + "<4,32,1>": "0x7e27e", + "<4,32,2>": "0xc0016208" + }, + "<4,33>": "", + "<4,34>": "", + "<4,35>": { + "<4,35,1>": "", + "<4,35,2>": "" + }, + "<4,36>": "", + "<4,37>": "", + "<4,38>": "", + "<4,39>": { + "<4,39,1>": "80", + "<4,39,2>": "80", + "<4,39,3>": "80", + "<4,39,4>": "80", + "<4,39,5>": "80", + "<4,39,6>": "80", + "<4,39,7>": "80" + }, + "<4,40>": "7", + "<4,41>": { + "<4,41,1>": "0", + "<4,41,2>": "", + "<4,41,3>": "", + "<4,41,4>": "", + "<4,41,5>": "", + "<4,41,6>": "", + "<4,41,7>": "", + "<4,41,8>": "40" + }, + "<4,42>": { + "<4,42,1>": "16386", + "<4,42,2>": "16384", + "<4,42,3>": "16384", + "<4,42,4>": "16384", + "<4,42,5>": "16384", + "<4,42,6>": "16384", + "<4,42,7>": "16384" + }, + "<4,43>": { + "<4,43,1>": "172", + "<4,43,2>": "80", + "<4,43,3>": "80", + "<4,43,4>": "80", + "<4,43,5>": "80", + "<4,43,6>": "80", + "<4,43,7>": "80" + }, + "<4,44>": { + "<4,44,1>": "Table", + "<4,44,2>": "Mod. By", + "<4,44,3>": "Write", + "<4,44,4>": "Delete", + "<4,44,5>": "Read", + "<4,44,6>": "Tracker", + "<4,44,7>": "Status" + }, + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": { + "<4,51,1>": "", + "<4,51,2>": "", + "<4,51,3>": "", + "<4,51,4>": "", + "<4,51,5>": "", + "<4,51,6>": "", + "<4,51,7>": "" + }, + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": { + "<4,60,1>": "2", + "<4,60,2>": "18", + "<4,60,3>": "18", + "<4,60,4>": "18", + "<4,60,5>": "18", + "<4,60,6>": "18", + "<4,60,7>": "18" + } + }, + "<5>": { + "<5,1>": "EDT_STOREINFO", + "<5,2>": "", + "<5,3>": "EDITTABLE", + "<5,4>": "DBW_AUDIT_MANAGER", + "<5,5>": "33", + "<5,6>": "91:1", + "<5,7>": "191", + "<5,8>": "45", + "<5,9>": "", + "<5,10>": { + "<5,10,1>": "0x560061D9", + "<5,10,2>": "0x200" + }, + "<5,11>": { + "<5,11,1>": "0x60000", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "5", + "<5,13>": "-2", + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Tahoma", + "<5,15,1,2>": "-11", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": "", + "<5,19>": "", + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "0", + "<5,26>": "0", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "<>", + "<5,31>": "0", + "<5,32>": { + "<5,32,1>": "0x7e3fe", + "<5,32,2>": "0xc001ee08" + }, + "<5,33>": "", + "<5,34>": "", + "<5,35>": { + "<5,35,1>": "", + "<5,35,2>": "" + }, + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "80", + "<5,40>": "1", + "<5,41>": { + "<5,41,1>": "0", + "<5,41,2>": "", + "<5,41,3>": "", + "<5,41,4>": "", + "<5,41,5>": "", + "<5,41,6>": "", + "<5,41,7>": "", + "<5,41,8>": "40" + }, + "<5,42>": "16384", + "<5,43>": "150", + "<5,44>": "Stored Tables", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "", + "<5,56>": "", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "18" + }, + "<6>": { + "<6,1>": "EDT_MFS_TABLES", + "<6,2>": "", + "<6,3>": "EDITTABLE", + "<6,4>": "DBW_AUDIT_MANAGER", + "<6,5>": "36", + "<6,6>": "153:1", + "<6,7>": "231", + "<6,8>": "33", + "<6,9>": "", + "<6,10>": { + "<6,10,1>": "0x560061D9", + "<6,10,2>": "0x200" + }, + "<6,11>": { + "<6,11,1>": "0x60000", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "6", + "<6,13>": "-2", + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Tahoma", + "<6,15,1,2>": "-11", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": "", + "<6,19>": "", + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "0", + "<6,26>": "0", + "<6,27>": "", + "<6,28>": "<>", + "<6,29>": "<>", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": { + "<6,32,1>": "0x7e3fe", + "<6,32,2>": "0xc001ee08" + }, + "<6,33>": "", + "<6,34>": "", + "<6,35>": { + "<6,35,1>": "", + "<6,35,2>": "" + }, + "<6,36>": "", + "<6,37>": "", + "<6,38>": "", + "<6,39>": "80", + "<6,40>": "1", + "<6,41>": { + "<6,41,1>": "0", + "<6,41,2>": "", + "<6,41,3>": "", + "<6,41,4>": "", + "<6,41,5>": "", + "<6,41,6>": "", + "<6,41,7>": "", + "<6,41,8>": "40" + }, + "<6,42>": "16384", + "<6,43>": "191", + "<6,44>": "Attached Tables", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": "", + "<6,56>": "", + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "18" + }, + "<7>": { + "<7,1>": "OLE_SUBCLASS", + "<7,2>": "", + "<7,3>": "OLECONTROL.SRP.Subclass.1", + "<7,4>": "DBW_AUDIT_MANAGER", + "<7,5>": "112", + "<7,6>": "11", + "<7,7>": "83", + "<7,8>": "16", + "<7,9>": "SRP.Subclass.1", + "<7,10>": { + "<7,10,1>": "0x46000000", + "<7,10,2>": "0x0" + }, + "<7,11>": { + "<7,11,1>": "0x0", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "7", + "<7,13>": "-2", + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Tahoma", + "<7,15,1,2>": "-11", + "<7,15,1,3>": "400", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": "", + "<7,19>": "", + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "0", + "<7,26>": "0", + "<7,27>": "", + "<7,28>": "<>", + "<7,29>": "<>", + "<7,30>": "<>", + "<7,31>": "0", + "<7,32>": { + "<7,32,1>": "0x7fffe", + "<7,32,2>": "0xf0016800" + }, + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": "", + "<7,37>": "" + }, + "<8>": "" + }, + "record4": { + "<1>": { + "<1,1>": { + "<1,1,1>": "MENU", + "<1,1,2>": "1", + "<1,1,3>": "", + "<1,1,4>": "", + "<1,1,5>": "0", + "<1,1,6>": "0", + "<1,1,7>": "0", + "<1,1,8>": "0", + "<1,1,9>": "5", + "<1,1,10>": "", + "<1,1,11>": "0", + "<1,1,12>": "" + }, + "<1,2>": { + "<1,2,1>": "POPUP", + "<1,2,2>": "3", + "<1,2,3>": "", + "<1,2,4>": "&File", + "<1,2,5>": "0", + "<1,2,6>": "0", + "<1,2,7>": "0", + "<1,2,8>": "0", + "<1,2,9>": "", + "<1,2,10>": "", + "<1,2,11>": "0", + "<1,2,12>": "" + }, + "<1,3>": { + "<1,3,1>": "ITEM", + "<1,3,2>": "", + "<1,3,3>": "", + "<1,3,4>": "&Save\tCtrl+S", + "<1,3,5>": "0", + "<1,3,6>": "0", + "<1,3,7>": "0", + "<1,3,8>": "595", + "<1,3,9>": "", + "<1,3,10>": "", + "<1,3,11>": "0", + "<1,3,12>": "" + }, + "<1,4>": { + "<1,4,1>": "ITEM", + "<1,4,2>": "", + "<1,4,3>": "", + "<1,4,4>": "Save2\tF9", + "<1,4,5>": "0", + "<1,4,6>": "0", + "<1,4,7>": "1", + "<1,4,8>": "120", + "<1,4,9>": "", + "<1,4,10>": "", + "<1,4,11>": "0", + "<1,4,12>": "" + }, + "<1,5>": { + "<1,5,1>": "ITEM", + "<1,5,2>": "", + "<1,5,3>": "", + "<1,5,4>": "E&xit", + "<1,5,5>": "0", + "<1,5,6>": "0", + "<1,5,7>": "0", + "<1,5,8>": "0", + "<1,5,9>": "", + "<1,5,10>": "", + "<1,5,11>": "0", + "<1,5,12>": "" + } + }, + "<2>": { + "<2,1>": "", + "<2,2>": { + "<2,2,1>": { + "<2,2,1,1>": "E", + "<2,2,1,2>": "WRITE", + "<2,2,1,3>": "@WINDOW", + "<2,2,1,4>": "", + "<2,2,1,5>": "", + "<2,2,1,6>": "" + }, + "<2,2,2>": { + "<2,2,2,1>": "E", + "<2,2,2,2>": "WRITE", + "<2,2,2,3>": "@WINDOW", + "<2,2,2,4>": "", + "<2,2,2,5>": "", + "<2,2,2,6>": "" + }, + "<2,2,3>": { + "<2,2,3,1>": "E", + "<2,2,3,2>": "CLOSE", + "<2,2,3,3>": "@WINDOW", + "<2,2,3,4>": "", + "<2,2,3,5>": "", + "<2,2,3,6>": "" + }, + "<2,2,4>": "" + }, + "<2,3>": { + "<2,3,1>": "FILE.SAVE", + "<2,3,2>": "FILE.SAVE2", + "<2,3,3>": "FILE.EXIT", + "<2,3,4>": "" + }, + "<2,4>": "0" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_AUDIT_TRAIL.json b/FRAMEWORKS/OIWIN/NDW_AUDIT_TRAIL.json new file mode 100644 index 0000000..50b72ed --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_AUDIT_TRAIL.json @@ -0,0 +1,1415 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "13", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_AUDIT_TRAIL", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "104", + "<1,6>": "108", + "<1,7>": "-612", + "<1,8>": "-369", + "<1,9>": "Audit Trail", + "<1,10>": { + "<1,10,1>": "0x82CF0000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x6000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "0", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "CLEAR" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "" + }, + "<1,18,2>": { + "<1,18,2,1>": "R", + "<1,18,2,2>": "EXECUTE", + "<1,18,2,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<1,18,2,4>": { + "<1,18,2,4,1>": "@SELF", + "<1,18,2,4,2>": "CREATE", + "<1,18,2,4,3>": "@PARAM1" + }, + "<1,18,2,5>": "", + "<1,18,2,6>": "" + }, + "<1,18,3>": "" + }, + "<1,19>": { + "<1,19,1>": "CLEAR", + "<1,19,2>": "CREATE", + "<1,19,3>": "" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "0", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "0", + "<1,24,6>": "0" + }, + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": { + "<1,32,1>": "0x7FFFE", + "<1,32,2>": "0xF001E808" + }, + "<1,33>": "", + "<1,34>": "LSL2*IMAGE*ICO*LSL2", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0x20001", + "<1,37,2>": "0x10001" + }, + "<1,38>": { + "<1,38,1>": "1", + "<1,38,2>": "1" + }, + "<1,39>": "", + "<1,40>": "0", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "STA_TABLE", + "<1,2>": "", + "<1,3>": "STATIC", + "<1,4>": "NDW_AUDIT_TRAIL", + "<1,5>": "19", + "<1,6>": "23", + "<1,7>": "27", + "<1,8>": "15", + "<1,9>": "Table", + "<1,10>": { + "<1,10,1>": "0x56000000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x0", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "1", + "<1,13>": "-1", + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Tahoma", + "<1,15,1,2>": "-11", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "<>", + "<1,31>": "0", + "<1,32>": { + "<1,32,1>": "0x7fffe", + "<1,32,2>": "0xf0016c08" + }, + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + }, + "<2>": { + "<2,1>": "COB_TABLE", + "<2,2>": "", + "<2,3>": "COMBOBOX", + "<2,4>": "NDW_AUDIT_TRAIL", + "<2,5>": "51", + "<2,6>": "20", + "<2,7>": "208", + "<2,8>": "338", + "<2,9>": "", + "<2,10>": { + "<2,10,1>": "0x56000003", + "<2,10,2>": "0x0" + }, + "<2,11>": { + "<2,11,1>": "0x4", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "2", + "<2,13>": "-2", + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Tahoma", + "<2,15,1,2>": "-11", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": { + "<2,18,1>": { + "<2,18,1,1>": "R", + "<2,18,1,2>": "EXECUTE", + "<2,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<2,18,1,4>": { + "<2,18,1,4,1>": "@SELF", + "<2,18,1,4,2>": "CHANGED", + "<2,18,1,4,3>": "@PARAM1" + }, + "<2,18,1,5>": "", + "<2,18,1,6>": "" + }, + "<2,18,2>": { + "<2,18,2,1>": "R", + "<2,18,2,2>": "EXECUTE", + "<2,18,2,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<2,18,2,4>": { + "<2,18,2,4,1>": "@SELF", + "<2,18,2,4,2>": "GOTFOCUS" + }, + "<2,18,2,5>": "", + "<2,18,2,6>": "" + }, + "<2,18,3>": { + "<2,18,3,1>": "R", + "<2,18,3,2>": "EXECUTE", + "<2,18,3,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<2,18,3,4>": { + "<2,18,3,4,1>": "@SELF", + "<2,18,3,4,2>": "LOSTFOCUS" + }, + "<2,18,3,5>": "", + "<2,18,3,6>": "" + }, + "<2,18,4>": "" + }, + "<2,19>": { + "<2,19,1>": "CHANGED", + "<2,19,2>": "GOTFOCUS", + "<2,19,3>": "LOSTFOCUS", + "<2,19,4>": "" + }, + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "0", + "<2,26>": "0", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": { + "<2,32,1>": "0x7fffe", + "<2,32,2>": "0xf0016008" + }, + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": "", + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "" + }, + "<3>": { + "<3,1>": "STA_ID", + "<3,2>": "", + "<3,3>": "STATIC", + "<3,4>": "NDW_AUDIT_TRAIL", + "<3,5>": "269", + "<3,6>": "23", + "<3,7>": "12", + "<3,8>": "15", + "<3,9>": "ID", + "<3,10>": { + "<3,10,1>": "0x56000000", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0x0", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "3", + "<3,13>": "-1", + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Tahoma", + "<3,15,1,2>": "-11", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": "", + "<3,19>": "", + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "0", + "<3,26>": "0", + "<3,27>": "", + "<3,28>": "<>", + "<3,29>": "<>", + "<3,30>": "<>", + "<3,31>": "0", + "<3,32>": { + "<3,32,1>": "0x7fffe", + "<3,32,2>": "0xf0016c08" + }, + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "", + "<3,37>": "", + "<3,38>": "", + "<3,39>": "", + "<3,40>": "", + "<3,41>": "", + "<3,42>": "", + "<3,43>": "", + "<3,44>": "", + "<3,45>": "", + "<3,46>": "", + "<3,47>": "", + "<3,48>": "", + "<3,49>": "", + "<3,50>": "", + "<3,51>": "", + "<3,52>": "" + }, + "<4>": { + "<4,1>": "EDL_ID", + "<4,2>": "", + "<4,3>": "EDITFIELD", + "<4,4>": "NDW_AUDIT_TRAIL", + "<4,5>": "286", + "<4,6>": "20", + "<4,7>": "-74", + "<4,8>": "21", + "<4,9>": "", + "<4,10>": { + "<4,10,1>": "0x56000080", + "<4,10,2>": "0x200" + }, + "<4,11>": { + "<4,11,1>": "0x4000", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "4", + "<4,13>": "-2", + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Tahoma", + "<4,15,1,2>": "-11", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "R", + "<4,18,1,2>": "EXECUTE", + "<4,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<4,18,1,4>": { + "<4,18,1,4,1>": "@SELF", + "<4,18,1,4,2>": "GOTFOCUS" + }, + "<4,18,1,5>": "", + "<4,18,1,6>": "" + }, + "<4,18,2>": { + "<4,18,2,1>": "R", + "<4,18,2,2>": "EXECUTE", + "<4,18,2,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<4,18,2,4>": { + "<4,18,2,4,1>": "@SELF", + "<4,18,2,4,2>": "LOSTFOCUS" + }, + "<4,18,2,5>": "", + "<4,18,2,6>": "" + }, + "<4,18,3>": { + "<4,18,3,1>": "R", + "<4,18,3,2>": "EXECUTE", + "<4,18,3,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<4,18,3,4>": { + "<4,18,3,4,1>": "@SELF", + "<4,18,3,4,2>": "OPTIONS" + }, + "<4,18,3,5>": "", + "<4,18,3,6>": "" + }, + "<4,18,4>": "" + }, + "<4,19>": { + "<4,19,1>": "GOTFOCUS", + "<4,19,2>": "LOSTFOCUS", + "<4,19,3>": "OPTIONS", + "<4,19,4>": "" + }, + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "0", + "<4,26>": "0", + "<4,27>": "", + "<4,28>": "<>", + "<4,29>": "<>", + "<4,30>": "<>", + "<4,31>": "0", + "<4,32>": { + "<4,32,1>": "0x7fffe", + "<4,32,2>": "0xf0016408" + }, + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": "", + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "", + "<4,41>": "", + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "", + "<4,52>": "" + }, + "<5>": { + "<5,1>": "EDT_AUDIT_INFO", + "<5,2>": "", + "<5,3>": "OLECONTROL.SRP.EditTable.1", + "<5,4>": "NDW_AUDIT_TRAIL", + "<5,5>": "19", + "<5,6>": "50", + "<5,7>": "-20", + "<5,8>": "-54", + "<5,9>": "SRP.EditTable.1", + "<5,10>": { + "<5,10,1>": "0x56000000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0xC000", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "5", + "<5,13>": "-2", + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Tahoma", + "<5,15,1,2>": "-11", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": { + "<5,18,1>": { + "<5,18,1,1>": "R", + "<5,18,1,2>": "EXECUTE", + "<5,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<5,18,1,4>": { + "<5,18,1,4,1>": "@SELF", + "<5,18,1,4,2>": "@PARAM1", + "<5,18,1,4,3>": "@PARAM2", + "<5,18,1,4,4>": "@PARAM3", + "<5,18,1,4,5>": "@PARAM4", + "<5,18,1,4,6>": "@PARAM5", + "<5,18,1,4,7>": "@PARAM6" + }, + "<5,18,1,5>": "", + "<5,18,1,6>": "" + }, + "<5,18,2>": "" + }, + "<5,19>": { + "<5,19,1>": "OLE", + "<5,19,2>": "" + }, + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "0", + "<5,26>": "0", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "<>", + "<5,31>": "0", + "<5,32>": { + "<5,32,1>": "0x7fffe", + "<5,32,2>": "0xf0016400" + }, + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "0000000000000000", + "<5,37>": "" + }, + "<6>": { + "<6,1>": "PUB_RESTORE", + "<6,2>": "", + "<6,3>": "PUSHBUTTON", + "<6,4>": "NDW_AUDIT_TRAIL", + "<6,5>": "-184", + "<6,6>": "-38", + "<6,7>": "80", + "<6,8>": "25", + "<6,9>": "&Restore", + "<6,10>": { + "<6,10,1>": "0x5E002000", + "<6,10,2>": "0x0" + }, + "<6,11>": { + "<6,11,1>": "0x3100", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "6", + "<6,13>": "-2", + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Tahoma", + "<6,15,1,2>": "-11", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": { + "<6,18,1>": { + "<6,18,1,1>": "R", + "<6,18,1,2>": "EXECUTE", + "<6,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<6,18,1,4>": { + "<6,18,1,4,1>": "@SELF", + "<6,18,1,4,2>": "CLICK" + }, + "<6,18,1,5>": "", + "<6,18,1,6>": "" + }, + "<6,18,2>": "" + }, + "<6,19>": { + "<6,19,1>": "CLICK", + "<6,19,2>": "" + }, + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "0", + "<6,26>": "0", + "<6,27>": "", + "<6,28>": "<>", + "<6,29>": "<>", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": { + "<6,32,1>": "0x7fffe", + "<6,32,2>": "0xf0016008" + }, + "<6,33>": "", + "<6,34>": "", + "<6,35>": "", + "<6,36>": "", + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "1", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "" + }, + "<7>": { + "<7,1>": "PUB_VIEW", + "<7,2>": "", + "<7,3>": "PUSHBUTTON", + "<7,4>": "NDW_AUDIT_TRAIL", + "<7,5>": "-94", + "<7,6>": "-38", + "<7,7>": "80", + "<7,8>": "25", + "<7,9>": "&View Records", + "<7,10>": { + "<7,10,1>": "0x5E002000", + "<7,10,2>": "0x0" + }, + "<7,11>": { + "<7,11,1>": "0x3100", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "7", + "<7,13>": "-2", + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Tahoma", + "<7,15,1,2>": "-11", + "<7,15,1,3>": "400", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": { + "<7,18,1>": { + "<7,18,1,1>": "R", + "<7,18,1,2>": "EXECUTE", + "<7,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<7,18,1,4>": { + "<7,18,1,4,1>": "@SELF", + "<7,18,1,4,2>": "CLICK" + }, + "<7,18,1,5>": "", + "<7,18,1,6>": "" + }, + "<7,18,2>": "" + }, + "<7,19>": { + "<7,19,1>": "CLICK", + "<7,19,2>": "" + }, + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "0", + "<7,26>": "0", + "<7,27>": "", + "<7,28>": "<>", + "<7,29>": "<>", + "<7,30>": "<>", + "<7,31>": "0", + "<7,32>": { + "<7,32,1>": "0x7fffe", + "<7,32,2>": "0xf0016008" + }, + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": "", + "<7,37>": "", + "<7,38>": "", + "<7,39>": "", + "<7,40>": "1", + "<7,41>": "", + "<7,42>": "", + "<7,43>": "", + "<7,44>": "", + "<7,45>": "", + "<7,46>": "", + "<7,47>": "", + "<7,48>": "", + "<7,49>": "", + "<7,50>": "", + "<7,51>": "" + }, + "<8>": { + "<8,1>": "EDL_SIZE", + "<8,2>": "", + "<8,3>": "EDITFIELD", + "<8,4>": "NDW_AUDIT_TRAIL", + "<8,5>": "259", + "<8,6>": "331", + "<8,7>": "152", + "<8,8>": "20", + "<8,9>": "", + "<8,10>": { + "<8,10,1>": "0x46000080", + "<8,10,2>": "0x200" + }, + "<8,11>": { + "<8,11,1>": "0x0", + "<8,11,2>": "0x80000000" + }, + "<8,12>": "8", + "<8,13>": "-2", + "<8,14>": "0", + "<8,15>": { + "<8,15,1>": { + "<8,15,1,1>": "Tahoma", + "<8,15,1,2>": "-11", + "<8,15,1,3>": "400", + "<8,15,1,4>": "0", + "<8,15,1,5>": "0", + "<8,15,1,6>": "0", + "<8,15,1,7>": "0", + "<8,15,1,8>": "34", + "<8,15,1,9>": "0", + "<8,15,1,10>": "3", + "<8,15,1,11>": "2", + "<8,15,1,12>": "1", + "<8,15,1,13>": "0", + "<8,15,1,14>": "0" + } + }, + "<8,16>": "", + "<8,17>": "", + "<8,18>": "", + "<8,19>": "", + "<8,20>": "", + "<8,21>": "", + "<8,22>": "", + "<8,23>": "", + "<8,24>": "", + "<8,25>": "0", + "<8,26>": "0", + "<8,27>": "", + "<8,28>": "<>", + "<8,29>": "<>", + "<8,30>": "<>", + "<8,31>": "0", + "<8,32>": { + "<8,32,1>": "0x7fffe", + "<8,32,2>": "0xf0016808" + }, + "<8,33>": "", + "<8,34>": "", + "<8,35>": "", + "<8,36>": "", + "<8,37>": "", + "<8,38>": "", + "<8,39>": "", + "<8,40>": "", + "<8,41>": "", + "<8,42>": "", + "<8,43>": "", + "<8,44>": "", + "<8,45>": "", + "<8,46>": "", + "<8,47>": "", + "<8,48>": "", + "<8,49>": "", + "<8,50>": "", + "<8,51>": "", + "<8,52>": "" + }, + "<9>": { + "<9,1>": "OLE_SUBCLASS", + "<9,2>": "", + "<9,3>": "OLECONTROL.SRP.Subclass.1", + "<9,4>": "NDW_AUDIT_TRAIL", + "<9,5>": "211", + "<9,6>": "328", + "<9,7>": "101", + "<9,8>": "22", + "<9,9>": "SRP.Subclass.1", + "<9,10>": { + "<9,10,1>": "0x46000000", + "<9,10,2>": "0x0" + }, + "<9,11>": { + "<9,11,1>": "0x0", + "<9,11,2>": "0x80000000" + }, + "<9,12>": "9", + "<9,13>": "-2", + "<9,14>": "0", + "<9,15>": { + "<9,15,1>": { + "<9,15,1,1>": "Tahoma", + "<9,15,1,2>": "-11", + "<9,15,1,3>": "400", + "<9,15,1,4>": "0", + "<9,15,1,5>": "0", + "<9,15,1,6>": "0", + "<9,15,1,7>": "0", + "<9,15,1,8>": "34", + "<9,15,1,9>": "0", + "<9,15,1,10>": "3", + "<9,15,1,11>": "2", + "<9,15,1,12>": "1", + "<9,15,1,13>": "0", + "<9,15,1,14>": "0" + } + }, + "<9,16>": "", + "<9,17>": "", + "<9,18>": { + "<9,18,1>": { + "<9,18,1,1>": "R", + "<9,18,1,2>": "EXECUTE", + "<9,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<9,18,1,4>": { + "<9,18,1,4,1>": "@SELF", + "<9,18,1,4,2>": "@PARAM1", + "<9,18,1,4,3>": "@PARAM1", + "<9,18,1,4,4>": "@PARAM2", + "<9,18,1,4,5>": "@PARAM3", + "<9,18,1,4,6>": "@PARAM4", + "<9,18,1,4,7>": "@PARAM5" + }, + "<9,18,1,5>": "", + "<9,18,1,6>": "" + }, + "<9,18,2>": "" + }, + "<9,19>": { + "<9,19,1>": "OLE", + "<9,19,2>": "" + }, + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "0", + "<9,26>": "0", + "<9,27>": "", + "<9,28>": "<>", + "<9,29>": "<>", + "<9,30>": "<>", + "<9,31>": "0", + "<9,32>": { + "<9,32,1>": "0x7fffe", + "<9,32,2>": "0xf0016800" + }, + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "", + "<9,37>": "" + }, + "<10>": { + "<10,1>": "EDT_INFO_BAK", + "<10,2>": "", + "<10,3>": "EDITTABLE", + "<10,4>": "NDW_AUDIT_TRAIL", + "<10,5>": "26", + "<10,6>": "18:1", + "<10,7>": "161", + "<10,8>": "33", + "<10,9>": "", + "<10,10>": { + "<10,10,1>": "0x560061D9", + "<10,10,2>": "0x200" + }, + "<10,11>": { + "<10,11,1>": "0x60000", + "<10,11,2>": "0x80000000" + }, + "<10,12>": "10", + "<10,13>": "-2", + "<10,14>": "0", + "<10,15>": { + "<10,15,1>": { + "<10,15,1,1>": "Tahoma", + "<10,15,1,2>": "-11", + "<10,15,1,3>": "400", + "<10,15,1,4>": "0", + "<10,15,1,5>": "0", + "<10,15,1,6>": "0", + "<10,15,1,7>": "0", + "<10,15,1,8>": "34", + "<10,15,1,9>": "0", + "<10,15,1,10>": "3", + "<10,15,1,11>": "2", + "<10,15,1,12>": "1", + "<10,15,1,13>": "0", + "<10,15,1,14>": "0" + } + }, + "<10,16>": "", + "<10,17>": "", + "<10,18>": "", + "<10,19>": "", + "<10,20>": "", + "<10,21>": "", + "<10,22>": "", + "<10,23>": "", + "<10,24>": "", + "<10,25>": "0", + "<10,26>": "0", + "<10,27>": "", + "<10,28>": "<>", + "<10,29>": "<>", + "<10,30>": "<>", + "<10,31>": "0", + "<10,32>": { + "<10,32,1>": "0x7e27e", + "<10,32,2>": "0xc001ee08" + }, + "<10,33>": "", + "<10,34>": "", + "<10,35>": { + "<10,35,1>": "", + "<10,35,2>": "" + }, + "<10,36>": "", + "<10,37>": "", + "<10,38>": "", + "<10,39>": "80", + "<10,40>": "1", + "<10,41>": { + "<10,41,1>": "0", + "<10,41,2>": "", + "<10,41,3>": "", + "<10,41,4>": "", + "<10,41,5>": "", + "<10,41,6>": "", + "<10,41,7>": "", + "<10,41,8>": "40" + }, + "<10,42>": "16384", + "<10,43>": "120", + "<10,44>": "Record Key", + "<10,45>": "", + "<10,46>": "", + "<10,47>": "", + "<10,48>": "", + "<10,49>": "", + "<10,50>": "", + "<10,51>": "", + "<10,52>": "", + "<10,53>": "", + "<10,54>": "", + "<10,55>": "", + "<10,56>": "", + "<10,57>": "", + "<10,58>": "", + "<10,59>": "", + "<10,60>": "18" + }, + "<11>": { + "<11,1>": "EDT_SETTINGS", + "<11,2>": "", + "<11,3>": "EDITTABLE", + "<11,4>": "NDW_AUDIT_TRAIL", + "<11,5>": "28", + "<11,6>": "80:1", + "<11,7>": "403", + "<11,8>": "32", + "<11,9>": "", + "<11,10>": { + "<11,10,1>": "0x560061D9", + "<11,10,2>": "0x200" + }, + "<11,11>": { + "<11,11,1>": "0x60000", + "<11,11,2>": "0x80000000" + }, + "<11,12>": "11", + "<11,13>": "-2", + "<11,14>": "0", + "<11,15>": { + "<11,15,1>": { + "<11,15,1,1>": "Tahoma", + "<11,15,1,2>": "-11", + "<11,15,1,3>": "400", + "<11,15,1,4>": "0", + "<11,15,1,5>": "0", + "<11,15,1,6>": "0", + "<11,15,1,7>": "0", + "<11,15,1,8>": "34", + "<11,15,1,9>": "0", + "<11,15,1,10>": "3", + "<11,15,1,11>": "2", + "<11,15,1,12>": "1", + "<11,15,1,13>": "0", + "<11,15,1,14>": "0" + } + }, + "<11,16>": "", + "<11,17>": "", + "<11,18>": "", + "<11,19>": "", + "<11,20>": "", + "<11,21>": "", + "<11,22>": "", + "<11,23>": "", + "<11,24>": "", + "<11,25>": "0", + "<11,26>": "0", + "<11,27>": "", + "<11,28>": { + "<11,28,1>": "<>", + "<11,28,2>": "<>", + "<11,28,3>": "<>", + "<11,28,4>": "<>", + "<11,28,5>": "<>", + "<11,28,6>": "<>", + "<11,28,7>": "<>" + }, + "<11,29>": { + "<11,29,1>": "<>", + "<11,29,2>": "<>", + "<11,29,3>": "<>", + "<11,29,4>": "<>", + "<11,29,5>": "<>", + "<11,29,6>": "<>", + "<11,29,7>": "<>" + }, + "<11,30>": { + "<11,30,1>": "<>", + "<11,30,2>": "<>", + "<11,30,3>": "<>", + "<11,30,4>": "<>", + "<11,30,5>": "<>", + "<11,30,6>": "<>", + "<11,30,7>": "<>" + }, + "<11,31>": { + "<11,31,1>": "0", + "<11,31,2>": "0", + "<11,31,3>": "0", + "<11,31,4>": "0", + "<11,31,5>": "0", + "<11,31,6>": "0", + "<11,31,7>": "0" + }, + "<11,32>": { + "<11,32,1>": "0x7e27e", + "<11,32,2>": "0xc001ee08" + }, + "<11,33>": "", + "<11,34>": "", + "<11,35>": { + "<11,35,1>": "", + "<11,35,2>": "" + }, + "<11,36>": "", + "<11,37>": "", + "<11,38>": "", + "<11,39>": { + "<11,39,1>": "80", + "<11,39,2>": "80", + "<11,39,3>": "80", + "<11,39,4>": "80", + "<11,39,5>": "80", + "<11,39,6>": "80", + "<11,39,7>": "80" + }, + "<11,40>": "7", + "<11,41>": { + "<11,41,1>": "0", + "<11,41,2>": "", + "<11,41,3>": "", + "<11,41,4>": "", + "<11,41,5>": "", + "<11,41,6>": "", + "<11,41,7>": "", + "<11,41,8>": "40" + }, + "<11,42>": { + "<11,42,1>": "16384", + "<11,42,2>": "16384", + "<11,42,3>": "16384", + "<11,42,4>": "16384", + "<11,42,5>": "16384", + "<11,42,6>": "16384", + "<11,42,7>": "16384" + }, + "<11,43>": { + "<11,43,1>": "80", + "<11,43,2>": "80", + "<11,43,3>": "80", + "<11,43,4>": "80", + "<11,43,5>": "80", + "<11,43,6>": "80", + "<11,43,7>": "80" + }, + "<11,44>": { + "<11,44,1>": "Table", + "<11,44,2>": "Mod", + "<11,44,3>": "Write", + "<11,44,4>": "Delete", + "<11,44,5>": "Read", + "<11,44,6>": "Tracker", + "<11,44,7>": "Status" + }, + "<11,45>": "", + "<11,46>": "", + "<11,47>": "", + "<11,48>": "", + "<11,49>": "", + "<11,50>": "", + "<11,51>": { + "<11,51,1>": "", + "<11,51,2>": "", + "<11,51,3>": "", + "<11,51,4>": "", + "<11,51,5>": "", + "<11,51,6>": "", + "<11,51,7>": "" + }, + "<11,52>": "", + "<11,53>": "", + "<11,54>": "", + "<11,55>": "", + "<11,56>": "", + "<11,57>": "", + "<11,58>": "", + "<11,59>": "", + "<11,60>": { + "<11,60,1>": "18", + "<11,60,2>": "18", + "<11,60,3>": "18", + "<11,60,4>": "18", + "<11,60,5>": "18", + "<11,60,6>": "18", + "<11,60,7>": "18" + } + }, + "<12>": { + "<12,1>": "OLE_TAB", + "<12,2>": "", + "<12,3>": "OLECONTROL.SRP.Tab.1", + "<12,4>": "NDW_AUDIT_TRAIL", + "<12,5>": "8", + "<12,6>": "7", + "<12,7>": "-8", + "<12,8>": "3", + "<12,9>": "SRP.Tab.1", + "<12,10>": { + "<12,10,1>": "0x56000000", + "<12,10,2>": "0x0" + }, + "<12,11>": { + "<12,11,1>": "0x4000", + "<12,11,2>": "0x80000000" + }, + "<12,12>": "12", + "<12,13>": "-2", + "<12,14>": "0", + "<12,15>": { + "<12,15,1>": { + "<12,15,1,1>": "Tahoma", + "<12,15,1,2>": "-11", + "<12,15,1,3>": "400", + "<12,15,1,4>": "0", + "<12,15,1,5>": "0", + "<12,15,1,6>": "0", + "<12,15,1,7>": "0", + "<12,15,1,8>": "34", + "<12,15,1,9>": "0", + "<12,15,1,10>": "3", + "<12,15,1,11>": "2", + "<12,15,1,12>": "1", + "<12,15,1,13>": "0", + "<12,15,1,14>": "0" + } + }, + "<12,16>": "", + "<12,17>": "", + "<12,18>": "", + "<12,19>": "", + "<12,20>": "", + "<12,21>": "", + "<12,22>": "", + "<12,23>": "", + "<12,24>": "", + "<12,25>": "0", + "<12,26>": "0", + "<12,27>": "", + "<12,28>": "<>", + "<12,29>": "<>", + "<12,30>": "<>", + "<12,31>": "0", + "<12,32>": { + "<12,32,1>": "0x7fffe", + "<12,32,2>": "0xf0016400" + }, + "<12,33>": "", + "<12,34>": "", + "<12,35>": "", + "<12,36>": "010000000200000000000000FFFEFF205400610068006F006D006100FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000030000000000000001000000010000000100000000000000FFFEFF00FFFEFF044E006F006E00650000000000", + "<12,37>": "" + }, + "<13>": { + "<13,1>": "PUB_ALL_IDS", + "<13,2>": "", + "<13,3>": "PUSHBUTTON", + "<13,4>": "NDW_AUDIT_TRAIL", + "<13,5>": "542", + "<13,6>": "20", + "<13,7>": "50", + "<13,8>": "21", + "<13,9>": "All Keys", + "<13,10>": { + "<13,10,1>": "0x56002300", + "<13,10,2>": "0x0" + }, + "<13,11>": { + "<13,11,1>": "0x8", + "<13,11,2>": "0x80000000" + }, + "<13,12>": "13", + "<13,13>": "-2", + "<13,14>": "0", + "<13,15>": { + "<13,15,1>": { + "<13,15,1,1>": "Tahoma", + "<13,15,1,2>": "-11", + "<13,15,1,3>": "400", + "<13,15,1,4>": "0", + "<13,15,1,5>": "0", + "<13,15,1,6>": "0", + "<13,15,1,7>": "0", + "<13,15,1,8>": "34", + "<13,15,1,9>": "0", + "<13,15,1,10>": "3", + "<13,15,1,11>": "2", + "<13,15,1,12>": "1", + "<13,15,1,13>": "0", + "<13,15,1,14>": "0" + } + }, + "<13,16>": "", + "<13,17>": "", + "<13,18>": { + "<13,18,1>": { + "<13,18,1,1>": "R", + "<13,18,1,2>": "EXECUTE", + "<13,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_TRAIL_EVENTS", + "<13,18,1,4>": { + "<13,18,1,4,1>": "@SELF", + "<13,18,1,4,2>": "CLICK" + }, + "<13,18,1,5>": "", + "<13,18,1,6>": "" + }, + "<13,18,2>": "" + }, + "<13,19>": { + "<13,19,1>": "CLICK", + "<13,19,2>": "" + }, + "<13,20>": "", + "<13,21>": "", + "<13,22>": "", + "<13,23>": "", + "<13,24>": "", + "<13,25>": "0", + "<13,26>": "0", + "<13,27>": "", + "<13,28>": "<>", + "<13,29>": "<>", + "<13,30>": "<>", + "<13,31>": "0", + "<13,32>": { + "<13,32,1>": "0x7fffe", + "<13,32,2>": "0xf001ec08" + }, + "<13,33>": "", + "<13,34>": "", + "<13,35>": "", + "<13,36>": "", + "<13,37>": "", + "<13,38>": "", + "<13,39>": "", + "<13,40>": "1", + "<13,41>": "", + "<13,42>": "", + "<13,43>": "", + "<13,44>": "", + "<13,45>": "", + "<13,46>": "", + "<13,47>": "", + "<13,48>": "", + "<13,49>": "", + "<13,50>": "", + "<13,51>": "" + }, + "<14>": "" + }, + "record4": { + "<1>": "", + "<2>": { + "<2,1>": "", + "<2,2>": "", + "<2,3>": "", + "<2,4>": "0" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_AUDIT_VIEWER.json b/FRAMEWORKS/OIWIN/NDW_AUDIT_VIEWER.json new file mode 100644 index 0000000..fa927a5 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_AUDIT_VIEWER.json @@ -0,0 +1,1378 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "15", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_AUDIT_VIEWER", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "55", + "<1,6>": "86", + "<1,7>": "-718", + "<1,8>": "-450", + "<1,9>": "Audit Viewer", + "<1,10>": { + "<1,10,1>": "0x82CF0000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x6000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "0", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "CREATE", + "<1,18,1,4,3>": "@PARAM1" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "" + }, + "<1,18,2>": "" + }, + "<1,19>": { + "<1,19,1>": "CREATE", + "<1,19,2>": "" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "0", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "0", + "<1,24,6>": "0" + }, + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": { + "<1,32,1>": "0x7FFFE", + "<1,32,2>": "0xF001E808" + }, + "<1,33>": "", + "<1,34>": "LSL2*IMAGE*ICO*LSL2", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0x20001", + "<1,37,2>": "0x10001" + }, + "<1,38>": { + "<1,38,1>": "1", + "<1,38,2>": "1" + }, + "<1,39>": "", + "<1,40>": "0", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "EDL_WINDOW", + "<1,2>": "", + "<1,3>": "EDITFIELD", + "<1,4>": "NDW_AUDIT_VIEWER", + "<1,5>": "8", + "<1,6>": "416", + "<1,7>": "90", + "<1,8>": "20", + "<1,9>": "", + "<1,10>": { + "<1,10,1>": "0x46000000", + "<1,10,2>": "0x200" + }, + "<1,11>": { + "<1,11,1>": "0x4", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "1", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Tahoma", + "<1,15,1,2>": "-11", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "<>", + "<1,31>": "0", + "<1,32>": { + "<1,32,1>": "0x7fffe", + "<1,32,2>": "0xf0016008" + }, + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "" + }, + "<2>": { + "<2,1>": "EDL_AREC_ID", + "<2,2>": "", + "<2,3>": "EDITFIELD", + "<2,4>": "NDW_AUDIT_VIEWER", + "<2,5>": "107", + "<2,6>": "416", + "<2,7>": "83", + "<2,8>": "20", + "<2,9>": "", + "<2,10>": { + "<2,10,1>": "0x46000000", + "<2,10,2>": "0x200" + }, + "<2,11>": { + "<2,11,1>": "0x0", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "2", + "<2,13>": "-2", + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Tahoma", + "<2,15,1,2>": "-11", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": "", + "<2,19>": "", + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "0", + "<2,26>": "0", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": { + "<2,32,1>": "0x7fffe", + "<2,32,2>": "0xf0016808" + }, + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": "", + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "" + }, + "<3>": { + "<3,1>": "OLE_VIEWER", + "<3,2>": "", + "<3,3>": "OLECONTROL.SRP.Editor.1", + "<3,4>": "NDW_AUDIT_VIEWER", + "<3,5>": "17", + "<3,6>": "20", + "<3,7>": "-17", + "<3,8>": "-52", + "<3,9>": "SRP.Editor.1", + "<3,10>": { + "<3,10,1>": "0x56000000", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0xC000", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "3", + "<3,13>": "-2", + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Tahoma", + "<3,15,1,2>": "-11", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": { + "<3,18,1>": { + "<3,18,1,1>": "R", + "<3,18,1,2>": "EXECUTE", + "<3,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<3,18,1,4>": { + "<3,18,1,4,1>": "@SELF", + "<3,18,1,4,2>": "@PARAM1", + "<3,18,1,4,3>": "@PARAM2", + "<3,18,1,4,4>": "@PARAM3", + "<3,18,1,4,5>": "@PARAM4", + "<3,18,1,4,6>": "@PARAM5" + }, + "<3,18,1,5>": "", + "<3,18,1,6>": "" + }, + "<3,18,2>": "" + }, + "<3,19>": { + "<3,19,1>": "OLE", + "<3,19,2>": "" + }, + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "0", + "<3,26>": "0", + "<3,27>": "", + "<3,28>": "<>", + "<3,29>": "<>", + "<3,30>": "<>", + "<3,31>": "0", + "<3,32>": { + "<3,32,1>": "0x7fffe", + "<3,32,2>": "0xf0016400" + }, + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "00000100B24600001127000000000000", + "<3,37>": "" + }, + "<4>": { + "<4,1>": "PUB_RESTORE", + "<4,2>": "", + "<4,3>": "PUSHBUTTON", + "<4,4>": "NDW_AUDIT_VIEWER", + "<4,5>": "-268", + "<4,6>": "-33", + "<4,7>": "80", + "<4,8>": "25", + "<4,9>": "&Restore", + "<4,10>": { + "<4,10,1>": "0x56002000", + "<4,10,2>": "0x0" + }, + "<4,11>": { + "<4,11,1>": "0x3100", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "4", + "<4,13>": "-2", + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Tahoma", + "<4,15,1,2>": "-11", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "R", + "<4,18,1,2>": "EXECUTE", + "<4,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<4,18,1,4>": { + "<4,18,1,4,1>": "@SELF", + "<4,18,1,4,2>": "CLICK.PUB_RESTORE" + }, + "<4,18,1,5>": "", + "<4,18,1,6>": "" + }, + "<4,18,2>": "" + }, + "<4,19>": { + "<4,19,1>": "CLICK", + "<4,19,2>": "" + }, + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "0", + "<4,26>": "0", + "<4,27>": "", + "<4,28>": "<>", + "<4,29>": "<>", + "<4,30>": "<>", + "<4,31>": "0", + "<4,32>": { + "<4,32,1>": "0x7fffe", + "<4,32,2>": "0xf0016008" + }, + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": "", + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "1", + "<4,41>": "", + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "" + }, + "<5>": { + "<5,1>": "PUB_COMPARE", + "<5,2>": "", + "<5,3>": "PUSHBUTTON", + "<5,4>": "NDW_AUDIT_VIEWER", + "<5,5>": "-178", + "<5,6>": "-33", + "<5,7>": "81", + "<5,8>": "27", + "<5,9>": "Com&pare", + "<5,10>": { + "<5,10,1>": "0x56002000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0x3100", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "5", + "<5,13>": "-2", + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Tahoma", + "<5,15,1,2>": "-11", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": { + "<5,18,1>": { + "<5,18,1,1>": "R", + "<5,18,1,2>": "EXECUTE", + "<5,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<5,18,1,4>": { + "<5,18,1,4,1>": "@SELF", + "<5,18,1,4,2>": "CLICK.PUB_COMPARE" + }, + "<5,18,1,5>": "", + "<5,18,1,6>": "" + }, + "<5,18,2>": "" + }, + "<5,19>": { + "<5,19,1>": "CLICK", + "<5,19,2>": "" + }, + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "0", + "<5,26>": "0", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "<>", + "<5,31>": "0", + "<5,32>": { + "<5,32,1>": "0x7fffe", + "<5,32,2>": "0xf0016008" + }, + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "1", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "" + }, + "<6>": { + "<6,1>": "PUB_CANCEL", + "<6,2>": "", + "<6,3>": "PUSHBUTTON", + "<6,4>": "NDW_AUDIT_VIEWER", + "<6,5>": "-88", + "<6,6>": "-33", + "<6,7>": "80", + "<6,8>": "25", + "<6,9>": "&Cancel", + "<6,10>": { + "<6,10,1>": "0x56002000", + "<6,10,2>": "0x0" + }, + "<6,11>": { + "<6,11,1>": "0x3100", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "6", + "<6,13>": "-2", + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Tahoma", + "<6,15,1,2>": "-11", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": { + "<6,18,1>": { + "<6,18,1,1>": "E", + "<6,18,1,2>": "CLOSE", + "<6,18,1,3>": "@WINDOW", + "<6,18,1,4>": "", + "<6,18,1,5>": "", + "<6,18,1,6>": "" + }, + "<6,18,2>": "" + }, + "<6,19>": { + "<6,19,1>": "CLICK", + "<6,19,2>": "" + }, + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "0", + "<6,26>": "0", + "<6,27>": "", + "<6,28>": "<>", + "<6,29>": "<>", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": { + "<6,32,1>": "0x7fffe", + "<6,32,2>": "0xf0016008" + }, + "<6,33>": "", + "<6,34>": "", + "<6,35>": "", + "<6,36>": "", + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "1", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "" + }, + "<7>": { + "<7,1>": "OLE_ARCHIVE", + "<7,2>": "", + "<7,3>": "OLECONTROL.SRP.Editor.1", + "<7,4>": "NDW_AUDIT_VIEWER", + "<7,5>": "17", + "<7,6>": "20:1", + "<7,7>": "-423", + "<7,8>": "-53", + "<7,9>": "SRP.Editor.1", + "<7,10>": { + "<7,10,1>": "0x56000000", + "<7,10,2>": "0x0" + }, + "<7,11>": { + "<7,11,1>": "0xC000", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "7", + "<7,13>": "-2", + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Tahoma", + "<7,15,1,2>": "-11", + "<7,15,1,3>": "700", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": { + "<7,18,1>": { + "<7,18,1,1>": "R", + "<7,18,1,2>": "EXECUTE", + "<7,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<7,18,1,4>": { + "<7,18,1,4,1>": "@SELF", + "<7,18,1,4,2>": "@PARAM1", + "<7,18,1,4,3>": "@PARAM2", + "<7,18,1,4,4>": "@PARAM3", + "<7,18,1,4,5>": "@PARAM4", + "<7,18,1,4,6>": "@PARAM5" + }, + "<7,18,1,5>": "", + "<7,18,1,6>": "" + }, + "<7,18,2>": "" + }, + "<7,19>": { + "<7,19,1>": "OLE", + "<7,19,2>": "" + }, + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "0", + "<7,26>": "0", + "<7,27>": "", + "<7,28>": "<>", + "<7,29>": "<>", + "<7,30>": "<>", + "<7,31>": "0", + "<7,32>": { + "<7,32,1>": "0x7fffe", + "<7,32,2>": "0xf0016400" + }, + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": "00000100BB1C0000F726000000000000", + "<7,37>": "" + }, + "<8>": { + "<8,1>": "OLE_ORIGINAL", + "<8,2>": "", + "<8,3>": "OLECONTROL.SRP.Editor.1", + "<8,4>": "NDW_AUDIT_VIEWER", + "<8,5>": "320", + "<8,6>": "20:1", + "<8,7>": "-17", + "<8,8>": "-53", + "<8,9>": "SRP.Editor.1", + "<8,10>": { + "<8,10,1>": "0x56000000", + "<8,10,2>": "0x0" + }, + "<8,11>": { + "<8,11,1>": "0xC000", + "<8,11,2>": "0x80000000" + }, + "<8,12>": "8", + "<8,13>": "-2", + "<8,14>": "0", + "<8,15>": { + "<8,15,1>": { + "<8,15,1,1>": "Tahoma", + "<8,15,1,2>": "-11", + "<8,15,1,3>": "400", + "<8,15,1,4>": "0", + "<8,15,1,5>": "0", + "<8,15,1,6>": "0", + "<8,15,1,7>": "0", + "<8,15,1,8>": "34", + "<8,15,1,9>": "0", + "<8,15,1,10>": "3", + "<8,15,1,11>": "2", + "<8,15,1,12>": "1", + "<8,15,1,13>": "0", + "<8,15,1,14>": "0" + } + }, + "<8,16>": "", + "<8,17>": "", + "<8,18>": { + "<8,18,1>": { + "<8,18,1,1>": "R", + "<8,18,1,2>": "EXECUTE", + "<8,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<8,18,1,4>": { + "<8,18,1,4,1>": "@SELF", + "<8,18,1,4,2>": "@PARAM1", + "<8,18,1,4,3>": "@PARAM2", + "<8,18,1,4,4>": "@PARAM3", + "<8,18,1,4,5>": "@PARAM4", + "<8,18,1,4,6>": "@PARAM5" + }, + "<8,18,1,5>": "", + "<8,18,1,6>": "" + }, + "<8,18,2>": "" + }, + "<8,19>": { + "<8,19,1>": "OLE", + "<8,19,2>": "" + }, + "<8,20>": "", + "<8,21>": "", + "<8,22>": "", + "<8,23>": "", + "<8,24>": "", + "<8,25>": "0", + "<8,26>": "0", + "<8,27>": "", + "<8,28>": "<>", + "<8,29>": "<>", + "<8,30>": "<>", + "<8,31>": "0", + "<8,32>": { + "<8,32,1>": "0x7fffe", + "<8,32,2>": "0xf0016000" + }, + "<8,33>": "", + "<8,34>": "", + "<8,35>": "", + "<8,36>": "0000010061270000F726000000000000", + "<8,37>": "" + }, + "<9>": { + "<9,1>": "PUB_RETURN", + "<9,2>": "", + "<9,3>": "PUSHBUTTON", + "<9,4>": "NDW_AUDIT_VIEWER", + "<9,5>": "-178", + "<9,6>": "-33:1", + "<9,7>": "80", + "<9,8>": "25", + "<9,9>": "Re&turn", + "<9,10>": { + "<9,10,1>": "0x56002000", + "<9,10,2>": "0x0" + }, + "<9,11>": { + "<9,11,1>": "0x3100", + "<9,11,2>": "0x80000000" + }, + "<9,12>": "9", + "<9,13>": "-2", + "<9,14>": "0", + "<9,15>": { + "<9,15,1>": { + "<9,15,1,1>": "Tahoma", + "<9,15,1,2>": "-11", + "<9,15,1,3>": "400", + "<9,15,1,4>": "0", + "<9,15,1,5>": "0", + "<9,15,1,6>": "0", + "<9,15,1,7>": "0", + "<9,15,1,8>": "34", + "<9,15,1,9>": "0", + "<9,15,1,10>": "3", + "<9,15,1,11>": "2", + "<9,15,1,12>": "1", + "<9,15,1,13>": "0", + "<9,15,1,14>": "0" + } + }, + "<9,16>": "", + "<9,17>": "", + "<9,18>": { + "<9,18,1>": { + "<9,18,1,1>": "R", + "<9,18,1,2>": "EXECUTE", + "<9,18,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<9,18,1,4>": { + "<9,18,1,4,1>": "@SELF", + "<9,18,1,4,2>": "CLICK.PUB_RETURN" + }, + "<9,18,1,5>": "", + "<9,18,1,6>": "" + }, + "<9,18,2>": "" + }, + "<9,19>": { + "<9,19,1>": "CLICK", + "<9,19,2>": "" + }, + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "0", + "<9,26>": "0", + "<9,27>": "", + "<9,28>": "<>", + "<9,29>": "<>", + "<9,30>": "<>", + "<9,31>": "0", + "<9,32>": { + "<9,32,1>": "0x7fffe", + "<9,32,2>": "0xf0016008" + }, + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "", + "<9,37>": "", + "<9,38>": "", + "<9,39>": "", + "<9,40>": "1", + "<9,41>": "", + "<9,42>": "", + "<9,43>": "", + "<9,44>": "", + "<9,45>": "", + "<9,46>": "", + "<9,47>": "", + "<9,48>": "", + "<9,49>": "", + "<9,50>": "", + "<9,51>": "" + }, + "<10>": { + "<10,1>": "OLE_SUBCLASS", + "<10,2>": "", + "<10,3>": "OLECONTROL.SRP.Subclass.1", + "<10,4>": "NDW_AUDIT_VIEWER", + "<10,5>": "112", + "<10,6>": "11", + "<10,7>": "83", + "<10,8>": "16", + "<10,9>": "SRP.Subclass.1", + "<10,10>": { + "<10,10,1>": "0x46000000", + "<10,10,2>": "0x0" + }, + "<10,11>": { + "<10,11,1>": "0x0", + "<10,11,2>": "0x80000000" + }, + "<10,12>": "10", + "<10,13>": "-2", + "<10,14>": "0", + "<10,15>": { + "<10,15,1>": { + "<10,15,1,1>": "Tahoma", + "<10,15,1,2>": "-11", + "<10,15,1,3>": "400", + "<10,15,1,4>": "0", + "<10,15,1,5>": "0", + "<10,15,1,6>": "0", + "<10,15,1,7>": "0", + "<10,15,1,8>": "34", + "<10,15,1,9>": "0", + "<10,15,1,10>": "3", + "<10,15,1,11>": "2", + "<10,15,1,12>": "1", + "<10,15,1,13>": "0", + "<10,15,1,14>": "0" + } + }, + "<10,16>": "", + "<10,17>": "", + "<10,18>": "", + "<10,19>": "", + "<10,20>": "", + "<10,21>": "", + "<10,22>": "", + "<10,23>": "", + "<10,24>": "", + "<10,25>": "0", + "<10,26>": "0", + "<10,27>": "", + "<10,28>": "<>", + "<10,29>": "<>", + "<10,30>": "<>", + "<10,31>": "0", + "<10,32>": { + "<10,32,1>": "0x7fffe", + "<10,32,2>": "0xf0016800" + }, + "<10,33>": "", + "<10,34>": "", + "<10,35>": "", + "<10,36>": "", + "<10,37>": "" + }, + "<11>": "", + "<12>": { + "<12,1>": "STA_COLUMN", + "<12,2>": "", + "<12,3>": "STATIC", + "<12,4>": "NDW_AUDIT_VIEWER", + "<12,5>": "8", + "<12,6>": "421", + "<12,7>": "330", + "<12,8>": "17", + "<12,9>": "", + "<12,10>": { + "<12,10,1>": "0x56000000", + "<12,10,2>": "0x0" + }, + "<12,11>": { + "<12,11,1>": "0x10000", + "<12,11,2>": "0x80000000" + }, + "<12,12>": "11", + "<12,13>": "-1", + "<12,14>": "0", + "<12,15>": { + "<12,15,1>": { + "<12,15,1,1>": "Tahoma", + "<12,15,1,2>": "-11", + "<12,15,1,3>": "400", + "<12,15,1,4>": "0", + "<12,15,1,5>": "0", + "<12,15,1,6>": "0", + "<12,15,1,7>": "0", + "<12,15,1,8>": "34", + "<12,15,1,9>": "0", + "<12,15,1,10>": "3", + "<12,15,1,11>": "2", + "<12,15,1,12>": "1", + "<12,15,1,13>": "0", + "<12,15,1,14>": "0" + } + }, + "<12,16>": "", + "<12,17>": "", + "<12,18>": "", + "<12,19>": "", + "<12,20>": "", + "<12,21>": "", + "<12,22>": "", + "<12,23>": "", + "<12,24>": "", + "<12,25>": "0", + "<12,26>": "0", + "<12,27>": "", + "<12,28>": "<>", + "<12,29>": "<>", + "<12,30>": "<>", + "<12,31>": "0", + "<12,32>": { + "<12,32,1>": "0x7fffe", + "<12,32,2>": "0xf0016508" + }, + "<12,33>": "", + "<12,34>": "", + "<12,35>": "", + "<12,36>": "", + "<12,37>": "", + "<12,38>": "", + "<12,39>": "", + "<12,40>": "", + "<12,41>": "", + "<12,42>": "", + "<12,43>": "", + "<12,44>": "", + "<12,45>": "", + "<12,46>": "", + "<12,47>": "", + "<12,48>": "", + "<12,49>": "", + "<12,50>": "", + "<12,51>": "", + "<12,52>": "" + }, + "<13>": { + "<13,1>": "GRP_VIEWER", + "<13,2>": "", + "<13,3>": "GROUPBOX", + "<13,4>": "NDW_AUDIT_VIEWER", + "<13,5>": "8", + "<13,6>": "3", + "<13,7>": "-8", + "<13,8>": "-42", + "<13,9>": "Audit Record", + "<13,10>": { + "<13,10,1>": "0x56000000", + "<13,10,2>": "0x0" + }, + "<13,11>": { + "<13,11,1>": "0xC000", + "<13,11,2>": "0x80000000" + }, + "<13,12>": "12", + "<13,13>": "-1", + "<13,14>": "0", + "<13,15>": { + "<13,15,1>": { + "<13,15,1,1>": "Tahoma", + "<13,15,1,2>": "-11", + "<13,15,1,3>": "400", + "<13,15,1,4>": "0", + "<13,15,1,5>": "0", + "<13,15,1,6>": "0", + "<13,15,1,7>": "0", + "<13,15,1,8>": "34", + "<13,15,1,9>": "0", + "<13,15,1,10>": "3", + "<13,15,1,11>": "2", + "<13,15,1,12>": "1", + "<13,15,1,13>": "0", + "<13,15,1,14>": "0" + } + }, + "<13,16>": "", + "<13,17>": "", + "<13,18>": "", + "<13,19>": "", + "<13,20>": "", + "<13,21>": "", + "<13,22>": "", + "<13,23>": "", + "<13,24>": "", + "<13,25>": "0", + "<13,26>": "0", + "<13,27>": "", + "<13,28>": "<>", + "<13,29>": "<>", + "<13,30>": "<>", + "<13,31>": "0", + "<13,32>": { + "<13,32,1>": "0x7fffe", + "<13,32,2>": "0xf0016408" + }, + "<13,33>": "" + }, + "<14>": { + "<14,1>": "GRP_AUDIT", + "<14,2>": "", + "<14,3>": "GROUPBOX", + "<14,4>": "NDW_AUDIT_VIEWER", + "<14,5>": "8", + "<14,6>": "3:1", + "<14,7>": "-414", + "<14,8>": "-44", + "<14,9>": "Audit Record", + "<14,10>": { + "<14,10,1>": "0x56000000", + "<14,10,2>": "0x0" + }, + "<14,11>": { + "<14,11,1>": "0xC000", + "<14,11,2>": "0x80000000" + }, + "<14,12>": "13", + "<14,13>": "-1", + "<14,14>": "0", + "<14,15>": { + "<14,15,1>": { + "<14,15,1,1>": "Tahoma", + "<14,15,1,2>": "-11", + "<14,15,1,3>": "400", + "<14,15,1,4>": "0", + "<14,15,1,5>": "0", + "<14,15,1,6>": "0", + "<14,15,1,7>": "0", + "<14,15,1,8>": "34", + "<14,15,1,9>": "0", + "<14,15,1,10>": "3", + "<14,15,1,11>": "2", + "<14,15,1,12>": "1", + "<14,15,1,13>": "0", + "<14,15,1,14>": "0" + } + }, + "<14,16>": "", + "<14,17>": "", + "<14,18>": "", + "<14,19>": "", + "<14,20>": "", + "<14,21>": "", + "<14,22>": "", + "<14,23>": "", + "<14,24>": "", + "<14,25>": "0", + "<14,26>": "0", + "<14,27>": "", + "<14,28>": "<>", + "<14,29>": "<>", + "<14,30>": "<>", + "<14,31>": "0", + "<14,32>": { + "<14,32,1>": "0x7fffe", + "<14,32,2>": "0xf0016408" + }, + "<14,33>": "" + }, + "<15>": { + "<15,1>": "GRP_CURRENT", + "<15,2>": "", + "<15,3>": "GROUPBOX", + "<15,4>": "NDW_AUDIT_VIEWER", + "<15,5>": "311", + "<15,6>": "3:1", + "<15,7>": "-8", + "<15,8>": "-44", + "<15,9>": "Current Record", + "<15,10>": { + "<15,10,1>": "0x56000000", + "<15,10,2>": "0x0" + }, + "<15,11>": { + "<15,11,1>": "0xC000", + "<15,11,2>": "0x80000000" + }, + "<15,12>": "14", + "<15,13>": "-1", + "<15,14>": "0", + "<15,15>": { + "<15,15,1>": { + "<15,15,1,1>": "Tahoma", + "<15,15,1,2>": "-11", + "<15,15,1,3>": "400", + "<15,15,1,4>": "0", + "<15,15,1,5>": "0", + "<15,15,1,6>": "0", + "<15,15,1,7>": "0", + "<15,15,1,8>": "34", + "<15,15,1,9>": "0", + "<15,15,1,10>": "3", + "<15,15,1,11>": "2", + "<15,15,1,12>": "1", + "<15,15,1,13>": "0", + "<15,15,1,14>": "0" + } + }, + "<15,16>": "", + "<15,17>": "", + "<15,18>": "", + "<15,19>": "", + "<15,20>": "", + "<15,21>": "", + "<15,22>": "", + "<15,23>": "", + "<15,24>": "", + "<15,25>": "0", + "<15,26>": "0", + "<15,27>": "", + "<15,28>": "<>", + "<15,29>": "<>", + "<15,30>": "<>", + "<15,31>": "0", + "<15,32>": { + "<15,32,1>": "0x7fffe", + "<15,32,2>": "0xf0016408" + }, + "<15,33>": "" + }, + "<16>": "" + }, + "record4": { + "<1>": { + "<1,1>": { + "<1,1,1>": "MENU", + "<1,1,2>": "1", + "<1,1,3>": "", + "<1,1,4>": "", + "<1,1,5>": "0", + "<1,1,6>": "0", + "<1,1,7>": "0", + "<1,1,8>": "0", + "<1,1,9>": "6", + "<1,1,10>": "", + "<1,1,11>": "0", + "<1,1,12>": "" + }, + "<1,2>": { + "<1,2,1>": "POPUP", + "<1,2,2>": "4", + "<1,2,3>": "", + "<1,2,4>": "Editor", + "<1,2,5>": "0", + "<1,2,6>": "0", + "<1,2,7>": "1", + "<1,2,8>": "0", + "<1,2,9>": "", + "<1,2,10>": "", + "<1,2,11>": "0", + "<1,2,12>": "" + }, + "<1,3>": { + "<1,3,1>": "ITEM", + "<1,3,2>": "", + "<1,3,3>": "", + "<1,3,4>": "E&xpand Row\tCtrl+E", + "<1,3,5>": "0", + "<1,3,6>": "0", + "<1,3,7>": "1", + "<1,3,8>": "581", + "<1,3,9>": "", + "<1,3,10>": "", + "<1,3,11>": "0", + "<1,3,12>": "" + }, + "<1,4>": { + "<1,4,1>": "ITEM", + "<1,4,2>": "", + "<1,4,3>": "", + "<1,4,4>": "C&ollapse Row\tCtrl+Shift+E", + "<1,4,5>": "0", + "<1,4,6>": "0", + "<1,4,7>": "1", + "<1,4,8>": "837", + "<1,4,9>": "", + "<1,4,10>": "", + "<1,4,11>": "0", + "<1,4,12>": "" + }, + "<1,5>": { + "<1,5,1>": "ITEM", + "<1,5,2>": "", + "<1,5,3>": "", + "<1,5,4>": "Nex&t Difference\tCtrl+T", + "<1,5,5>": "0", + "<1,5,6>": "0", + "<1,5,7>": "1", + "<1,5,8>": "596", + "<1,5,9>": "", + "<1,5,10>": "", + "<1,5,11>": "0", + "<1,5,12>": "" + }, + "<1,6>": { + "<1,6,1>": "ITEM", + "<1,6,2>": "", + "<1,6,3>": "", + "<1,6,4>": "Next Difference 2\tF2", + "<1,6,5>": "0", + "<1,6,6>": "0", + "<1,6,7>": "1", + "<1,6,8>": "113", + "<1,6,9>": "", + "<1,6,10>": "", + "<1,6,11>": "0", + "<1,6,12>": "" + } + }, + "<2>": { + "<2,1>": "", + "<2,2>": { + "<2,2,1>": { + "<2,2,1,1>": "R", + "<2,2,1,2>": "EXECUTE", + "<2,2,1,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<2,2,1,4>": { + "<2,2,1,4,1>": "@SELF", + "<2,2,1,4,2>": "MENU.EXPAND_ROW" + }, + "<2,2,1,5>": "", + "<2,2,1,6>": "" + }, + "<2,2,2>": { + "<2,2,2,1>": "R", + "<2,2,2,2>": "EXECUTE", + "<2,2,2,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<2,2,2,4>": { + "<2,2,2,4,1>": "@SELF", + "<2,2,2,4,2>": "MENU.COLLAPSE_ROW" + }, + "<2,2,2,5>": "", + "<2,2,2,6>": "" + }, + "<2,2,3>": { + "<2,2,3,1>": "R", + "<2,2,3,2>": "EXECUTE", + "<2,2,3,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<2,2,3,4>": { + "<2,2,3,4,1>": "@SELF", + "<2,2,3,4,2>": "MENU.NEXT_DIFFERENCE" + }, + "<2,2,3,5>": "", + "<2,2,3,6>": "" + }, + "<2,2,4>": { + "<2,2,4,1>": "R", + "<2,2,4,2>": "EXECUTE", + "<2,2,4,3>": "LSL2*STPROCEXE**NDW_AUDIT_VIEWER_EVENTS", + "<2,2,4,4>": { + "<2,2,4,4,1>": "@SELF", + "<2,2,4,4,2>": "MENU.NEXT_DIFFERENCE" + }, + "<2,2,4,5>": "", + "<2,2,4,6>": "" + }, + "<2,2,5>": "" + }, + "<2,3>": { + "<2,3,1>": "EDITOR.EXPAND_ROW", + "<2,3,2>": "EDITOR.COLLAPSE_ROW", + "<2,3,3>": "EDITOR.NEXT_DIFFERENCE", + "<2,3,4>": "EDITOR.NEXT_DIFFERENCE_2", + "<2,3,5>": "" + }, + "<2,4>": "0" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_HTTP_DATEPICKER.json b/FRAMEWORKS/OIWIN/NDW_HTTP_DATEPICKER.json new file mode 100644 index 0000000..f303804 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_HTTP_DATEPICKER.json @@ -0,0 +1,378 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "2", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_HTTP_DATEPICKER", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "474", + "<1,6>": "180", + "<1,7>": "-171", + "<1,8>": "-170", + "<1,9>": "", + "<1,10>": { + "<1,10,1>": "0x82800000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x0", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "0", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "" + }, + "<1,18,2>": { + "<1,18,2,1>": "R", + "<1,18,2,2>": "EXECUTE", + "<1,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,2,4>": { + "<1,18,2,4,1>": "@SELF", + "<1,18,2,4,2>": "@EVENT", + "<1,18,2,4,3>": "@PARAM1", + "<1,18,2,4,4>": "@PARAM2", + "<1,18,2,4,5>": "@PARAM3", + "<1,18,2,4,6>": "@PARAM4", + "<1,18,2,4,7>": "@PARAM5", + "<1,18,2,4,8>": "@PARAM6" + }, + "<1,18,2,5>": "", + "<1,18,2,6>": "" + }, + "<1,18,3>": "" + }, + "<1,19>": { + "<1,19,1>": "CREATE", + "<1,19,2>": "INACTIVATED", + "<1,19,3>": "" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "0", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "0", + "<1,24,6>": "0" + }, + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": { + "<1,32,1>": "0x7FFFE", + "<1,32,2>": "0xF001E808" + }, + "<1,33>": "", + "<1,34>": "FRAMEWORKS*IMAGE*ICO*SRP", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0x10001", + "<1,37,2>": "0x10001" + }, + "<1,38>": { + "<1,38,1>": "1", + "<1,38,2>": "1" + }, + "<1,39>": "", + "<1,40>": "0", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": { + "<1,54,1>": "", + "<1,54,2>": "0" + } + } + }, + "record3": { + "<1>": { + "<1,1>": "OLE_DATEPICKER", + "<1,2>": "", + "<1,3>": "OLECONTROL.SRP.DatePicker.1", + "<1,4>": "NDW_HTTP_DATEPICKER", + "<1,5>": "0", + "<1,6>": "0", + "<1,7>": "173", + "<1,8>": "173", + "<1,9>": "SRP.DatePicker.1", + "<1,10>": { + "<1,10,1>": "0x56000000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0xC004", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "1", + "<1,13>": "-2", + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Tahoma", + "<1,15,1,2>": "-11", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "" + }, + "<1,18,2>": "" + }, + "<1,19>": { + "<1,19,1>": "OLE", + "<1,19,2>": "" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "0", + "<1,26>": "0", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "<>", + "<1,31>": "0", + "<1,32>": { + "<1,32,1>": "0x7fffe", + "<1,32,2>": "0xf0016400" + }, + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "" + }, + "<2>": { + "<2,1>": "PUB_OK", + "<2,2>": "", + "<2,3>": "PUSHBUTTON", + "<2,4>": "NDW_HTTP_DATEPICKER", + "<2,5>": "-102", + "<2,6>": "215", + "<2,7>": "80", + "<2,8>": "18", + "<2,9>": "&OK", + "<2,10>": { + "<2,10,1>": "0x56000000", + "<2,10,2>": "0x0" + }, + "<2,11>": { + "<2,11,1>": "0x1109", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "2", + "<2,13>": "-2", + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "MS Sans Serif", + "<2,15,1,2>": "-11", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "1", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": { + "<2,18,1>": { + "<2,18,1,1>": "R", + "<2,18,1,2>": "EXECUTE", + "<2,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,1,4>": { + "<2,18,1,4,1>": "@SELF", + "<2,18,1,4,2>": "@EVENT", + "<2,18,1,4,3>": "@PARAM1", + "<2,18,1,4,4>": "@PARAM2", + "<2,18,1,4,5>": "@PARAM3", + "<2,18,1,4,6>": "@PARAM4", + "<2,18,1,4,7>": "@PARAM5", + "<2,18,1,4,8>": "@PARAM6" + }, + "<2,18,1,5>": "", + "<2,18,1,6>": "" + }, + "<2,18,2>": "" + }, + "<2,19>": { + "<2,19,1>": "CLICK", + "<2,19,2>": "" + }, + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "0", + "<2,26>": "0", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": { + "<2,32,1>": "0x7fffe", + "<2,32,2>": "0xf0016088" + }, + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": "", + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "1", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "" + }, + "<3>": "" + }, + "record4": { + "<1>": { + "<1,1>": { + "<1,1,1>": "MENU", + "<1,1,2>": "1", + "<1,1,3>": "", + "<1,1,4>": "", + "<1,1,5>": "0", + "<1,1,6>": "0", + "<1,1,7>": "0", + "<1,1,8>": "0", + "<1,1,9>": "2", + "<1,1,10>": "", + "<1,1,11>": "0", + "<1,1,12>": "" + }, + "<1,2>": { + "<1,2,1>": "ITEM", + "<1,2,2>": "", + "<1,2,3>": "", + "<1,2,4>": "Close window\tEsc", + "<1,2,5>": "0", + "<1,2,6>": "0", + "<1,2,7>": "1", + "<1,2,8>": "27", + "<1,2,9>": "", + "<1,2,10>": "", + "<1,2,11>": "0", + "<1,2,12>": "" + } + }, + "<2>": { + "<2,1>": "", + "<2,2>": { + "<2,2,1>": { + "<2,2,1,1>": "E", + "<2,2,1,2>": "CLOSE", + "<2,2,1,3>": "@WINDOW", + "<2,2,1,4>": "", + "<2,2,1,5>": "", + "<2,2,1,6>": "" + }, + "<2,2,2>": "" + }, + "<2,3>": { + "<2,3,1>": "CLOSE_WINDOW", + "<2,3,2>": "" + }, + "<2,4>": "0" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_HTTP_FRAMEWORK_SETUP.json b/FRAMEWORKS/OIWIN/NDW_HTTP_FRAMEWORK_SETUP.json new file mode 100644 index 0000000..85d63d8 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_HTTP_FRAMEWORK_SETUP.json @@ -0,0 +1,19219 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "104", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_HTTP_FRAMEWORK_SETUP", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "230", + "<1,6>": "160", + "<1,7>": "-1102", + "<1,8>": "-666", + "<1,9>": "HTTP Framework Setup", + "<1,10>": { + "<1,10,1>": "0x82CF0000", + "<1,10,2>": "0x100" + }, + "<1,11>": { + "<1,11,1>": "0x8000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "", + "<1,13>": { + "<1,13,1>": "16053492", + "<1,13,2>": "16053492", + "<1,13,3>": "" + }, + "<1,14>": "", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "X", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "@WINDOW_EVENTS", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "", + "<1,18,1,7>": "", + "<1,18,1,8>": "", + "<1,18,1,9>": "", + "<1,18,1,10>": "", + "<1,18,1,11>": "", + "<1,18,1,12>": "", + "<1,18,1,13>": "", + "<1,18,1,14>": "", + "<1,18,1,15>": "COMMEVT", + "<1,18,1,16>": "0" + }, + "<1,18,2>": { + "<1,18,2,1>": "R", + "<1,18,2,2>": "EXECUTE", + "<1,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,2,4>": { + "<1,18,2,4,1>": "@SELF", + "<1,18,2,4,2>": "@EVENT", + "<1,18,2,4,3>": "@PARAM1", + "<1,18,2,4,4>": "@PARAM2", + "<1,18,2,4,5>": "@PARAM3", + "<1,18,2,4,6>": "@PARAM4", + "<1,18,2,4,7>": "@PARAM5", + "<1,18,2,4,8>": "@PARAM6" + }, + "<1,18,2,5>": "", + "<1,18,2,6>": "", + "<1,18,2,7>": "", + "<1,18,2,8>": "", + "<1,18,2,9>": "", + "<1,18,2,10>": "", + "<1,18,2,11>": "", + "<1,18,2,12>": "", + "<1,18,2,13>": "", + "<1,18,2,14>": "", + "<1,18,2,15>": "STPROC" + } + }, + "<1,19>": { + "<1,19,1>": "CREATE", + "<1,19,2>": "TIMER" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "", + "<1,24,6>": "0", + "<1,24,7>": "", + "<1,24,8>": "", + "<1,24,9>": "", + "<1,24,10>": "0", + "<1,24,11>": "0", + "<1,24,12>": "0", + "<1,24,13>": "0", + "<1,24,14>": "0", + "<1,24,15>": "0", + "<1,24,16>": "0", + "<1,24,17>": "0" + }, + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "FRAMEWORKS*IMAGE*ICO*SRP", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0X30001", + "<1,37,2>": "0X10001" + }, + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": { + "<1,62,1>": "0", + "<1,62,2>": "", + "<1,62,3>": "", + "<1,62,4>": "0", + "<1,62,5>": "0", + "<1,62,6>": "0", + "<1,62,7>": "", + "<1,62,8>": "0.50", + "<1,62,9>": "5.00", + "<1,62,10>": "0.00" + }, + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "0", + "<1,107>": "", + "<1,108>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "STA_HOME_URL", + "<1,2>": "", + "<1,3>": "STATIC", + "<1,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<1,5>": "179", + "<1,6>": "61", + "<1,7>": "68", + "<1,8>": "15", + "<1,9>": "Home URL:", + "<1,10>": { + "<1,10,1>": "0x56000000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x0", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "84", + "<1,13>": { + "<1,13,1>": "-1", + "<1,13,2>": "-1", + "<1,13,3>": "" + }, + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Segoe UI", + "<1,15,1,2>": "-12", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": "0", + "<1,63>": { + "<1,63,1>": "", + "<1,63,2>": "", + "<1,63,3>": "", + "<1,63,4>": "", + "<1,63,5>": "", + "<1,63,6>": "", + "<1,63,7>": "", + "<1,63,8>": "" + }, + "<1,64>": { + "<1,64,1>": "", + "<1,64,2>": "", + "<1,64,3>": "" + }, + "<1,65>": "-2", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "0", + "<1,91>": "0", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "", + "<1,107>": "", + "<1,108>": "" + }, + "<2>": { + "<2,1>": "EDL_HOME_URL", + "<2,2>": "", + "<2,3>": "EDITFIELD", + "<2,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<2,5>": "398", + "<2,6>": "58", + "<2,7>": "238", + "<2,8>": "23", + "<2,9>": "", + "<2,10>": { + "<2,10,1>": "0x56000080", + "<2,10,2>": "0x200" + }, + "<2,11>": { + "<2,11,1>": "0x4", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "1", + "<2,13>": { + "<2,13,1>": "-2", + "<2,13,2>": "-2", + "<2,13,3>": "" + }, + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Segoe UI", + "<2,15,1,2>": "-12", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": { + "<2,18,1>": { + "<2,18,1,1>": "R", + "<2,18,1,2>": "EXECUTE", + "<2,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,1,4>": { + "<2,18,1,4,1>": "@SELF", + "<2,18,1,4,2>": "@EVENT", + "<2,18,1,4,3>": "@PARAM1", + "<2,18,1,4,4>": "@PARAM2", + "<2,18,1,4,5>": "@PARAM3", + "<2,18,1,4,6>": "@PARAM4", + "<2,18,1,4,7>": "@PARAM5", + "<2,18,1,4,8>": "@PARAM6" + }, + "<2,18,1,5>": "", + "<2,18,1,6>": "", + "<2,18,1,7>": "", + "<2,18,1,8>": "", + "<2,18,1,9>": "", + "<2,18,1,10>": "", + "<2,18,1,11>": "", + "<2,18,1,12>": "", + "<2,18,1,13>": "", + "<2,18,1,14>": "", + "<2,18,1,15>": "STPROC" + } + }, + "<2,19>": "LOSTFOCUS", + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "", + "<2,26>": "", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": "", + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": { + "<2,36,1>": "0", + "<2,36,2>": "0" + }, + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "", + "<2,53>": "", + "<2,54>": "", + "<2,55>": "", + "<2,56>": "", + "<2,57>": "", + "<2,58>": "", + "<2,59>": "", + "<2,60>": "", + "<2,61>": "", + "<2,62>": "0", + "<2,63>": "", + "<2,64>": "", + "<2,65>": "", + "<2,66>": "", + "<2,67>": "", + "<2,68>": "", + "<2,69>": "", + "<2,70>": "", + "<2,71>": "", + "<2,72>": "", + "<2,73>": "", + "<2,74>": "", + "<2,75>": "", + "<2,76>": "", + "<2,77>": "", + "<2,78>": "", + "<2,79>": "", + "<2,80>": "", + "<2,81>": "", + "<2,82>": "", + "<2,83>": "", + "<2,84>": "", + "<2,85>": "", + "<2,86>": "", + "<2,87>": "", + "<2,88>": "", + "<2,89>": "", + "<2,90>": "", + "<2,91>": "", + "<2,92>": "", + "<2,93>": "", + "<2,94>": "", + "<2,95>": "", + "<2,96>": "", + "<2,97>": "", + "<2,98>": "", + "<2,99>": "", + "<2,100>": "", + "<2,101>": "", + "<2,102>": "", + "<2,103>": "", + "<2,104>": "", + "<2,105>": "", + "<2,106>": "", + "<2,107>": "", + "<2,108>": "" + }, + "<3>": { + "<3,1>": "STA_API_URL", + "<3,2>": "", + "<3,3>": "STATIC", + "<3,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<3,5>": "179", + "<3,6>": "91", + "<3,7>": "52", + "<3,8>": "15", + "<3,9>": "API URL:", + "<3,10>": { + "<3,10,1>": "0x56000000", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0x0", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "85", + "<3,13>": { + "<3,13,1>": "-1", + "<3,13,2>": "-1", + "<3,13,3>": "" + }, + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Segoe UI", + "<3,15,1,2>": "-12", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": "", + "<3,19>": "", + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "", + "<3,26>": "", + "<3,27>": "", + "<3,28>": "<>", + "<3,29>": "<>", + "<3,30>": "", + "<3,31>": "", + "<3,32>": "", + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "", + "<3,37>": "", + "<3,38>": "", + "<3,39>": "", + "<3,40>": "", + "<3,41>": "", + "<3,42>": "", + "<3,43>": "", + "<3,44>": "", + "<3,45>": "", + "<3,46>": "", + "<3,47>": "", + "<3,48>": "", + "<3,49>": "", + "<3,50>": "", + "<3,51>": "", + "<3,52>": "", + "<3,53>": "", + "<3,54>": "", + "<3,55>": "", + "<3,56>": "", + "<3,57>": "", + "<3,58>": "", + "<3,59>": "", + "<3,60>": "", + "<3,61>": "", + "<3,62>": "0", + "<3,63>": { + "<3,63,1>": "", + "<3,63,2>": "", + "<3,63,3>": "", + "<3,63,4>": "", + "<3,63,5>": "", + "<3,63,6>": "", + "<3,63,7>": "", + "<3,63,8>": "" + }, + "<3,64>": { + "<3,64,1>": "", + "<3,64,2>": "", + "<3,64,3>": "" + }, + "<3,65>": "-2", + "<3,66>": "", + "<3,67>": "", + "<3,68>": "", + "<3,69>": "", + "<3,70>": "", + "<3,71>": "", + "<3,72>": "", + "<3,73>": "", + "<3,74>": "", + "<3,75>": "", + "<3,76>": "", + "<3,77>": "", + "<3,78>": "", + "<3,79>": "", + "<3,80>": "", + "<3,81>": "", + "<3,82>": "", + "<3,83>": "", + "<3,84>": "", + "<3,85>": "", + "<3,86>": "", + "<3,87>": "", + "<3,88>": "", + "<3,89>": "", + "<3,90>": "0", + "<3,91>": "0", + "<3,92>": "", + "<3,93>": "", + "<3,94>": "", + "<3,95>": "", + "<3,96>": "", + "<3,97>": "", + "<3,98>": "", + "<3,99>": "", + "<3,100>": "", + "<3,101>": "", + "<3,102>": "", + "<3,103>": "", + "<3,104>": "", + "<3,105>": "", + "<3,106>": "", + "<3,107>": "", + "<3,108>": "" + }, + "<4>": { + "<4,1>": "EDL_API_URL", + "<4,2>": "", + "<4,3>": "EDITFIELD", + "<4,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<4,5>": "309", + "<4,6>": "88", + "<4,7>": "327", + "<4,8>": "23", + "<4,9>": "", + "<4,10>": { + "<4,10,1>": "0x56000080", + "<4,10,2>": "0x200" + }, + "<4,11>": { + "<4,11,1>": "0x0", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "2", + "<4,13>": { + "<4,13,1>": "-2", + "<4,13,2>": "-2", + "<4,13,3>": "" + }, + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Segoe UI", + "<4,15,1,2>": "-12", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "R", + "<4,18,1,2>": "EXECUTE", + "<4,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<4,18,1,4>": { + "<4,18,1,4,1>": "@SELF", + "<4,18,1,4,2>": "@EVENT", + "<4,18,1,4,3>": "@PARAM1", + "<4,18,1,4,4>": "@PARAM2", + "<4,18,1,4,5>": "@PARAM3", + "<4,18,1,4,6>": "@PARAM4", + "<4,18,1,4,7>": "@PARAM5", + "<4,18,1,4,8>": "@PARAM6" + }, + "<4,18,1,5>": "", + "<4,18,1,6>": "", + "<4,18,1,7>": "", + "<4,18,1,8>": "", + "<4,18,1,9>": "", + "<4,18,1,10>": "", + "<4,18,1,11>": "", + "<4,18,1,12>": "", + "<4,18,1,13>": "", + "<4,18,1,14>": "", + "<4,18,1,15>": "STPROC" + } + }, + "<4,19>": "LOSTFOCUS", + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "", + "<4,26>": "", + "<4,27>": "", + "<4,28>": "<>", + "<4,29>": "<>", + "<4,30>": "<>", + "<4,31>": "0", + "<4,32>": "", + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": { + "<4,36,1>": "0", + "<4,36,2>": "0" + }, + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "", + "<4,41>": "", + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "", + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": "", + "<4,61>": "", + "<4,62>": "0", + "<4,63>": "", + "<4,64>": "", + "<4,65>": "", + "<4,66>": "", + "<4,67>": "", + "<4,68>": "", + "<4,69>": "", + "<4,70>": "", + "<4,71>": "", + "<4,72>": "", + "<4,73>": "", + "<4,74>": "", + "<4,75>": "", + "<4,76>": "", + "<4,77>": "", + "<4,78>": "", + "<4,79>": "", + "<4,80>": "", + "<4,81>": "", + "<4,82>": "", + "<4,83>": "", + "<4,84>": "", + "<4,85>": "", + "<4,86>": "", + "<4,87>": "", + "<4,88>": "", + "<4,89>": "", + "<4,90>": "", + "<4,91>": "", + "<4,92>": "", + "<4,93>": "", + "<4,94>": "", + "<4,95>": "", + "<4,96>": "", + "<4,97>": "", + "<4,98>": "", + "<4,99>": "", + "<4,100>": "", + "<4,101>": "", + "<4,102>": "", + "<4,103>": "", + "<4,104>": "", + "<4,105>": "", + "<4,106>": "", + "<4,107>": "", + "<4,108>": "" + }, + "<5>": { + "<5,1>": "STA_REALM_VALUE", + "<5,2>": "", + "<5,3>": "STATIC", + "<5,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<5,5>": "179", + "<5,6>": "121", + "<5,7>": "78", + "<5,8>": "15", + "<5,9>": "Realm Value:", + "<5,10>": { + "<5,10,1>": "0x56000000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0x0", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "86", + "<5,13>": { + "<5,13,1>": "-1", + "<5,13,2>": "-1", + "<5,13,3>": "" + }, + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Segoe UI", + "<5,15,1,2>": "-12", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": "", + "<5,19>": "", + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "", + "<5,26>": "", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "", + "<5,31>": "", + "<5,32>": "", + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "", + "<5,56>": "", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "", + "<5,61>": "", + "<5,62>": "0", + "<5,63>": { + "<5,63,1>": "", + "<5,63,2>": "", + "<5,63,3>": "", + "<5,63,4>": "", + "<5,63,5>": "", + "<5,63,6>": "", + "<5,63,7>": "", + "<5,63,8>": "" + }, + "<5,64>": { + "<5,64,1>": "", + "<5,64,2>": "", + "<5,64,3>": "" + }, + "<5,65>": "-2", + "<5,66>": "", + "<5,67>": "", + "<5,68>": "", + "<5,69>": "", + "<5,70>": "", + "<5,71>": "", + "<5,72>": "", + "<5,73>": "", + "<5,74>": "", + "<5,75>": "", + "<5,76>": "", + "<5,77>": "", + "<5,78>": "", + "<5,79>": "", + "<5,80>": "", + "<5,81>": "", + "<5,82>": "", + "<5,83>": "", + "<5,84>": "", + "<5,85>": "", + "<5,86>": "", + "<5,87>": "", + "<5,88>": "", + "<5,89>": "", + "<5,90>": "0", + "<5,91>": "0", + "<5,92>": "", + "<5,93>": "", + "<5,94>": "", + "<5,95>": "", + "<5,96>": "", + "<5,97>": "", + "<5,98>": "", + "<5,99>": "", + "<5,100>": "", + "<5,101>": "", + "<5,102>": "", + "<5,103>": "", + "<5,104>": "", + "<5,105>": "", + "<5,106>": "", + "<5,107>": "", + "<5,108>": "" + }, + "<6>": { + "<6,1>": "EDL_REALM_VALUE", + "<6,2>": "", + "<6,3>": "EDITFIELD", + "<6,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<6,5>": "309", + "<6,6>": "118", + "<6,7>": "327", + "<6,8>": "23", + "<6,9>": "", + "<6,10>": { + "<6,10,1>": "0x56000080", + "<6,10,2>": "0x200" + }, + "<6,11>": { + "<6,11,1>": "0x0", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "3", + "<6,13>": { + "<6,13,1>": "-2", + "<6,13,2>": "-2", + "<6,13,3>": "" + }, + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Segoe UI", + "<6,15,1,2>": "-12", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": "", + "<6,19>": "", + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "", + "<6,26>": "", + "<6,27>": "", + "<6,28>": "<>", + "<6,29>": "<>", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": "", + "<6,33>": "", + "<6,34>": "", + "<6,35>": "", + "<6,36>": { + "<6,36,1>": "0", + "<6,36,2>": "0" + }, + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": "", + "<6,56>": "", + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "", + "<6,61>": "", + "<6,62>": "0", + "<6,63>": "", + "<6,64>": "", + "<6,65>": "", + "<6,66>": "", + "<6,67>": "", + "<6,68>": "", + "<6,69>": "", + "<6,70>": "", + "<6,71>": "", + "<6,72>": "", + "<6,73>": "", + "<6,74>": "", + "<6,75>": "", + "<6,76>": "", + "<6,77>": "", + "<6,78>": "", + "<6,79>": "", + "<6,80>": "", + "<6,81>": "", + "<6,82>": "", + "<6,83>": "", + "<6,84>": "", + "<6,85>": "", + "<6,86>": "", + "<6,87>": "", + "<6,88>": "", + "<6,89>": "", + "<6,90>": "", + "<6,91>": "", + "<6,92>": "", + "<6,93>": "", + "<6,94>": "", + "<6,95>": "", + "<6,96>": "", + "<6,97>": "", + "<6,98>": "", + "<6,99>": "", + "<6,100>": "", + "<6,101>": "", + "<6,102>": "", + "<6,103>": "", + "<6,104>": "", + "<6,105>": "", + "<6,106>": "", + "<6,107>": "", + "<6,108>": "" + }, + "<7>": { + "<7,1>": "CHB_ENABLE_LOGGING", + "<7,2>": "", + "<7,3>": "CHECKBOX", + "<7,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<7,5>": "179", + "<7,6>": "155", + "<7,7>": "106", + "<7,8>": "15", + "<7,9>": "Enable Logging?", + "<7,10>": { + "<7,10,1>": "0x56000103", + "<7,10,2>": "0x0" + }, + "<7,11>": { + "<7,11,1>": "0x0", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "4", + "<7,13>": { + "<7,13,1>": "-1", + "<7,13,2>": "-1", + "<7,13,3>": "" + }, + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Segoe UI", + "<7,15,1,2>": "-12", + "<7,15,1,3>": "400", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": { + "<7,18,1>": { + "<7,18,1,1>": "R", + "<7,18,1,2>": "EXECUTE", + "<7,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<7,18,1,4>": { + "<7,18,1,4,1>": "@SELF", + "<7,18,1,4,2>": "@EVENT", + "<7,18,1,4,3>": "@PARAM1", + "<7,18,1,4,4>": "@PARAM2", + "<7,18,1,4,5>": "@PARAM3", + "<7,18,1,4,6>": "@PARAM4", + "<7,18,1,4,7>": "@PARAM5", + "<7,18,1,4,8>": "@PARAM6" + }, + "<7,18,1,5>": "", + "<7,18,1,6>": "", + "<7,18,1,7>": "", + "<7,18,1,8>": "", + "<7,18,1,9>": "", + "<7,18,1,10>": "", + "<7,18,1,11>": "", + "<7,18,1,12>": "", + "<7,18,1,13>": "", + "<7,18,1,14>": "", + "<7,18,1,15>": "STPROC" + } + }, + "<7,19>": "CLICK", + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "", + "<7,26>": "", + "<7,27>": "", + "<7,28>": "", + "<7,29>": "", + "<7,30>": "", + "<7,31>": "", + "<7,32>": "", + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": "0", + "<7,37>": "", + "<7,38>": "", + "<7,39>": "", + "<7,40>": "", + "<7,41>": "", + "<7,42>": "", + "<7,43>": "", + "<7,44>": "", + "<7,45>": "", + "<7,46>": "", + "<7,47>": "", + "<7,48>": "", + "<7,49>": "", + "<7,50>": "", + "<7,51>": "", + "<7,52>": "", + "<7,53>": "", + "<7,54>": "", + "<7,55>": "", + "<7,56>": "", + "<7,57>": "", + "<7,58>": "", + "<7,59>": "", + "<7,60>": "", + "<7,61>": "", + "<7,62>": "0", + "<7,63>": { + "<7,63,1>": "", + "<7,63,2>": "", + "<7,63,3>": "", + "<7,63,4>": "", + "<7,63,5>": "", + "<7,63,6>": "", + "<7,63,7>": "", + "<7,63,8>": "" + }, + "<7,64>": { + "<7,64,1>": "", + "<7,64,2>": "", + "<7,64,3>": "" + }, + "<7,65>": "-2", + "<7,66>": "", + "<7,67>": "", + "<7,68>": "", + "<7,69>": "", + "<7,70>": "", + "<7,71>": "", + "<7,72>": "", + "<7,73>": "", + "<7,74>": "", + "<7,75>": "", + "<7,76>": "", + "<7,77>": "", + "<7,78>": "", + "<7,79>": "", + "<7,80>": "", + "<7,81>": "", + "<7,82>": "", + "<7,83>": "", + "<7,84>": "", + "<7,85>": "", + "<7,86>": "", + "<7,87>": "", + "<7,88>": "", + "<7,89>": "", + "<7,90>": "0", + "<7,91>": "0", + "<7,92>": "", + "<7,93>": "", + "<7,94>": "", + "<7,95>": "", + "<7,96>": "", + "<7,97>": "", + "<7,98>": "", + "<7,99>": "", + "<7,100>": "", + "<7,101>": "", + "<7,102>": "", + "<7,103>": "", + "<7,104>": "", + "<7,105>": "", + "<7,106>": "", + "<7,107>": "", + "<7,108>": "" + }, + "<8>": { + "<8,1>": "CHB_LOG_ERRORS_ONLY", + "<8,2>": "", + "<8,3>": "CHECKBOX", + "<8,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<8,5>": "310", + "<8,6>": "181", + "<8,7>": "100", + "<8,8>": "15", + "<8,9>": "Log Errors Only", + "<8,10>": { + "<8,10,1>": "0x56000103", + "<8,10,2>": "0x0" + }, + "<8,11>": { + "<8,11,1>": "0x0", + "<8,11,2>": "0x80000000" + }, + "<8,12>": "5", + "<8,13>": { + "<8,13,1>": "-1", + "<8,13,2>": "-1", + "<8,13,3>": "" + }, + "<8,14>": "0", + "<8,15>": { + "<8,15,1>": { + "<8,15,1,1>": "Segoe UI", + "<8,15,1,2>": "-12", + "<8,15,1,3>": "400", + "<8,15,1,4>": "0", + "<8,15,1,5>": "0", + "<8,15,1,6>": "0", + "<8,15,1,7>": "0", + "<8,15,1,8>": "34", + "<8,15,1,9>": "0", + "<8,15,1,10>": "3", + "<8,15,1,11>": "2", + "<8,15,1,12>": "1", + "<8,15,1,13>": "0", + "<8,15,1,14>": "0" + } + }, + "<8,16>": "", + "<8,17>": "", + "<8,18>": { + "<8,18,1>": { + "<8,18,1,1>": "R", + "<8,18,1,2>": "EXECUTE", + "<8,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<8,18,1,4>": { + "<8,18,1,4,1>": "@SELF", + "<8,18,1,4,2>": "@EVENT", + "<8,18,1,4,3>": "@PARAM1", + "<8,18,1,4,4>": "@PARAM2", + "<8,18,1,4,5>": "@PARAM3", + "<8,18,1,4,6>": "@PARAM4", + "<8,18,1,4,7>": "@PARAM5", + "<8,18,1,4,8>": "@PARAM6" + }, + "<8,18,1,5>": "", + "<8,18,1,6>": "", + "<8,18,1,7>": "", + "<8,18,1,8>": "", + "<8,18,1,9>": "", + "<8,18,1,10>": "", + "<8,18,1,11>": "", + "<8,18,1,12>": "", + "<8,18,1,13>": "", + "<8,18,1,14>": "", + "<8,18,1,15>": "STPROC" + } + }, + "<8,19>": "CLICK", + "<8,20>": "", + "<8,21>": "", + "<8,22>": "", + "<8,23>": "", + "<8,24>": "", + "<8,25>": "", + "<8,26>": "", + "<8,27>": "", + "<8,28>": "", + "<8,29>": "", + "<8,30>": "", + "<8,31>": "", + "<8,32>": "", + "<8,33>": "", + "<8,34>": "", + "<8,35>": "", + "<8,36>": "0", + "<8,37>": "", + "<8,38>": "", + "<8,39>": "", + "<8,40>": "", + "<8,41>": "", + "<8,42>": "", + "<8,43>": "", + "<8,44>": "", + "<8,45>": "", + "<8,46>": "", + "<8,47>": "", + "<8,48>": "", + "<8,49>": "", + "<8,50>": "", + "<8,51>": "", + "<8,52>": "", + "<8,53>": "", + "<8,54>": "", + "<8,55>": "", + "<8,56>": "", + "<8,57>": "", + "<8,58>": "", + "<8,59>": "", + "<8,60>": "", + "<8,61>": "", + "<8,62>": "0", + "<8,63>": { + "<8,63,1>": "", + "<8,63,2>": "", + "<8,63,3>": "", + "<8,63,4>": "", + "<8,63,5>": "", + "<8,63,6>": "", + "<8,63,7>": "", + "<8,63,8>": "" + }, + "<8,64>": { + "<8,64,1>": "", + "<8,64,2>": "", + "<8,64,3>": "" + }, + "<8,65>": "-2", + "<8,66>": "", + "<8,67>": "", + "<8,68>": "", + "<8,69>": "", + "<8,70>": "", + "<8,71>": "", + "<8,72>": "", + "<8,73>": "", + "<8,74>": "", + "<8,75>": "", + "<8,76>": "", + "<8,77>": "", + "<8,78>": "", + "<8,79>": "", + "<8,80>": "", + "<8,81>": "", + "<8,82>": "", + "<8,83>": "", + "<8,84>": "", + "<8,85>": "", + "<8,86>": "", + "<8,87>": "", + "<8,88>": "", + "<8,89>": "", + "<8,90>": "0", + "<8,91>": "0", + "<8,92>": "", + "<8,93>": "", + "<8,94>": "", + "<8,95>": "", + "<8,96>": "", + "<8,97>": "", + "<8,98>": "", + "<8,99>": "", + "<8,100>": "", + "<8,101>": "", + "<8,102>": "", + "<8,103>": "", + "<8,104>": "", + "<8,105>": "", + "<8,106>": "", + "<8,107>": "", + "<8,108>": "" + }, + "<9>": { + "<9,1>": "STA_CAPTURE_PATH", + "<9,2>": "", + "<9,3>": "STATIC", + "<9,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<9,5>": "197", + "<9,6>": "181", + "<9,7>": "78", + "<9,8>": "15", + "<9,9>": "Capture Path:", + "<9,10>": { + "<9,10,1>": "0x5E000000", + "<9,10,2>": "0x0" + }, + "<9,11>": { + "<9,11,1>": "0x0", + "<9,11,2>": "0x80000000" + }, + "<9,12>": "87", + "<9,13>": { + "<9,13,1>": "-1", + "<9,13,2>": "-1", + "<9,13,3>": "" + }, + "<9,14>": "0", + "<9,15>": { + "<9,15,1>": { + "<9,15,1,1>": "Segoe UI", + "<9,15,1,2>": "-12", + "<9,15,1,3>": "400", + "<9,15,1,4>": "0", + "<9,15,1,5>": "0", + "<9,15,1,6>": "0", + "<9,15,1,7>": "0", + "<9,15,1,8>": "34", + "<9,15,1,9>": "0", + "<9,15,1,10>": "3", + "<9,15,1,11>": "2", + "<9,15,1,12>": "1", + "<9,15,1,13>": "0", + "<9,15,1,14>": "0" + } + }, + "<9,16>": "", + "<9,17>": "", + "<9,18>": "", + "<9,19>": "", + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "", + "<9,26>": "", + "<9,27>": "", + "<9,28>": "<>", + "<9,29>": "<>", + "<9,30>": "", + "<9,31>": "", + "<9,32>": "", + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "", + "<9,37>": "", + "<9,38>": "", + "<9,39>": "", + "<9,40>": "", + "<9,41>": "", + "<9,42>": "", + "<9,43>": "", + "<9,44>": "", + "<9,45>": "", + "<9,46>": "", + "<9,47>": "", + "<9,48>": "", + "<9,49>": "", + "<9,50>": "", + "<9,51>": "", + "<9,52>": "", + "<9,53>": "", + "<9,54>": "", + "<9,55>": "", + "<9,56>": "", + "<9,57>": "", + "<9,58>": "", + "<9,59>": "", + "<9,60>": "", + "<9,61>": "", + "<9,62>": "0", + "<9,63>": { + "<9,63,1>": "", + "<9,63,2>": "", + "<9,63,3>": "", + "<9,63,4>": "", + "<9,63,5>": "", + "<9,63,6>": "", + "<9,63,7>": "", + "<9,63,8>": "" + }, + "<9,64>": { + "<9,64,1>": "", + "<9,64,2>": "", + "<9,64,3>": "" + }, + "<9,65>": "-2", + "<9,66>": "", + "<9,67>": "", + "<9,68>": "", + "<9,69>": "", + "<9,70>": "", + "<9,71>": "", + "<9,72>": "", + "<9,73>": "", + "<9,74>": "", + "<9,75>": "", + "<9,76>": "", + "<9,77>": "", + "<9,78>": "", + "<9,79>": "", + "<9,80>": "", + "<9,81>": "", + "<9,82>": "", + "<9,83>": "", + "<9,84>": "", + "<9,85>": "", + "<9,86>": "", + "<9,87>": "", + "<9,88>": "", + "<9,89>": "", + "<9,90>": "0", + "<9,91>": "0", + "<9,92>": "", + "<9,93>": "", + "<9,94>": "", + "<9,95>": "", + "<9,96>": "", + "<9,97>": "", + "<9,98>": "", + "<9,99>": "", + "<9,100>": "", + "<9,101>": "", + "<9,102>": "", + "<9,103>": "", + "<9,104>": "", + "<9,105>": "", + "<9,106>": "", + "<9,107>": "", + "<9,108>": "" + }, + "<10>": { + "<10,1>": "EDL_CAPTURE_PATH", + "<10,2>": "", + "<10,3>": "EDITFIELD", + "<10,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<10,5>": "197", + "<10,6>": "201", + "<10,7>": "439", + "<10,8>": "23", + "<10,9>": "", + "<10,10>": { + "<10,10,1>": "0x56000080", + "<10,10,2>": "0x200" + }, + "<10,11>": { + "<10,11,1>": "0x80000", + "<10,11,2>": "0x80000000" + }, + "<10,12>": "6", + "<10,13>": { + "<10,13,1>": "-2", + "<10,13,2>": "-2", + "<10,13,3>": "" + }, + "<10,14>": "0", + "<10,15>": { + "<10,15,1>": { + "<10,15,1,1>": "Segoe UI", + "<10,15,1,2>": "-12", + "<10,15,1,3>": "400", + "<10,15,1,4>": "0", + "<10,15,1,5>": "0", + "<10,15,1,6>": "0", + "<10,15,1,7>": "0", + "<10,15,1,8>": "34", + "<10,15,1,9>": "0", + "<10,15,1,10>": "3", + "<10,15,1,11>": "2", + "<10,15,1,12>": "1", + "<10,15,1,13>": "0", + "<10,15,1,14>": "0" + } + }, + "<10,16>": "", + "<10,17>": "", + "<10,18>": "", + "<10,19>": "", + "<10,20>": "", + "<10,21>": "", + "<10,22>": "", + "<10,23>": "", + "<10,24>": "", + "<10,25>": "", + "<10,26>": "", + "<10,27>": "", + "<10,28>": "<>", + "<10,29>": "<>", + "<10,30>": "<>", + "<10,31>": "0", + "<10,32>": "", + "<10,33>": "", + "<10,34>": "", + "<10,35>": "", + "<10,36>": { + "<10,36,1>": "0", + "<10,36,2>": "0" + }, + "<10,37>": "", + "<10,38>": "", + "<10,39>": "", + "<10,40>": "", + "<10,41>": "", + "<10,42>": "", + "<10,43>": "", + "<10,44>": "", + "<10,45>": "", + "<10,46>": "", + "<10,47>": "", + "<10,48>": "", + "<10,49>": "", + "<10,50>": "", + "<10,51>": "", + "<10,52>": "", + "<10,53>": "", + "<10,54>": "", + "<10,55>": "", + "<10,56>": "", + "<10,57>": "", + "<10,58>": "", + "<10,59>": "", + "<10,60>": "", + "<10,61>": "", + "<10,62>": "0", + "<10,63>": "", + "<10,64>": "", + "<10,65>": "", + "<10,66>": "", + "<10,67>": "", + "<10,68>": "", + "<10,69>": "", + "<10,70>": "", + "<10,71>": "", + "<10,72>": "", + "<10,73>": "", + "<10,74>": "", + "<10,75>": "", + "<10,76>": "", + "<10,77>": "", + "<10,78>": "", + "<10,79>": "", + "<10,80>": "", + "<10,81>": "", + "<10,82>": "", + "<10,83>": "", + "<10,84>": "", + "<10,85>": "", + "<10,86>": "", + "<10,87>": "", + "<10,88>": "", + "<10,89>": "", + "<10,90>": "", + "<10,91>": "", + "<10,92>": "", + "<10,93>": "", + "<10,94>": "", + "<10,95>": "", + "<10,96>": "", + "<10,97>": "", + "<10,98>": "", + "<10,99>": "", + "<10,100>": "", + "<10,101>": "", + "<10,102>": "", + "<10,103>": "", + "<10,104>": "", + "<10,105>": "", + "<10,106>": "", + "<10,107>": "", + "<10,108>": "" + }, + "<11>": { + "<11,1>": "STA_API_CALL_PROCEDURE", + "<11,2>": "", + "<11,3>": "STATIC", + "<11,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<11,5>": "179", + "<11,6>": "234", + "<11,7>": "106", + "<11,8>": "15", + "<11,9>": "API Call Procedure:", + "<11,10>": { + "<11,10,1>": "0x56000000", + "<11,10,2>": "0x0" + }, + "<11,11>": { + "<11,11,1>": "0x0", + "<11,11,2>": "0x80000000" + }, + "<11,12>": "88", + "<11,13>": { + "<11,13,1>": "-1", + "<11,13,2>": "-1", + "<11,13,3>": "" + }, + "<11,14>": "0", + "<11,15>": { + "<11,15,1>": { + "<11,15,1,1>": "Segoe UI", + "<11,15,1,2>": "-12", + "<11,15,1,3>": "400", + "<11,15,1,4>": "0", + "<11,15,1,5>": "0", + "<11,15,1,6>": "0", + "<11,15,1,7>": "0", + "<11,15,1,8>": "34", + "<11,15,1,9>": "0", + "<11,15,1,10>": "3", + "<11,15,1,11>": "2", + "<11,15,1,12>": "1", + "<11,15,1,13>": "0", + "<11,15,1,14>": "0" + } + }, + "<11,16>": "", + "<11,17>": "", + "<11,18>": "", + "<11,19>": "", + "<11,20>": "", + "<11,21>": "", + "<11,22>": "", + "<11,23>": "", + "<11,24>": "", + "<11,25>": "", + "<11,26>": "", + "<11,27>": "", + "<11,28>": "<>", + "<11,29>": "<>", + "<11,30>": "", + "<11,31>": "", + "<11,32>": "", + "<11,33>": "", + "<11,34>": "", + "<11,35>": "", + "<11,36>": "", + "<11,37>": "", + "<11,38>": "", + "<11,39>": "", + "<11,40>": "", + "<11,41>": "", + "<11,42>": "", + "<11,43>": "", + "<11,44>": "", + "<11,45>": "", + "<11,46>": "", + "<11,47>": "", + "<11,48>": "", + "<11,49>": "", + "<11,50>": "", + "<11,51>": "", + "<11,52>": "", + "<11,53>": "", + "<11,54>": "", + "<11,55>": "", + "<11,56>": "", + "<11,57>": "", + "<11,58>": "", + "<11,59>": "", + "<11,60>": "", + "<11,61>": "", + "<11,62>": "0", + "<11,63>": { + "<11,63,1>": "", + "<11,63,2>": "", + "<11,63,3>": "", + "<11,63,4>": "", + "<11,63,5>": "", + "<11,63,6>": "", + "<11,63,7>": "", + "<11,63,8>": "" + }, + "<11,64>": { + "<11,64,1>": "", + "<11,64,2>": "", + "<11,64,3>": "" + }, + "<11,65>": "-2", + "<11,66>": "", + "<11,67>": "", + "<11,68>": "", + "<11,69>": "", + "<11,70>": "", + "<11,71>": "", + "<11,72>": "", + "<11,73>": "", + "<11,74>": "", + "<11,75>": "", + "<11,76>": "", + "<11,77>": "", + "<11,78>": "", + "<11,79>": "", + "<11,80>": "", + "<11,81>": "", + "<11,82>": "", + "<11,83>": "", + "<11,84>": "", + "<11,85>": "", + "<11,86>": "", + "<11,87>": "", + "<11,88>": "", + "<11,89>": "", + "<11,90>": "0", + "<11,91>": "0", + "<11,92>": "", + "<11,93>": "", + "<11,94>": "", + "<11,95>": "", + "<11,96>": "", + "<11,97>": "", + "<11,98>": "", + "<11,99>": "", + "<11,100>": "", + "<11,101>": "", + "<11,102>": "", + "<11,103>": "", + "<11,104>": "", + "<11,105>": "", + "<11,106>": "", + "<11,107>": "", + "<11,108>": "" + }, + "<12>": { + "<12,1>": "COB_API_CALL_PROCEDURE", + "<12,2>": "", + "<12,3>": "COMBOBOX", + "<12,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<12,5>": "309", + "<12,6>": "231", + "<12,7>": "113", + "<12,8>": "60", + "<12,9>": "Web API", + "<12,10>": { + "<12,10,1>": "0x56000003", + "<12,10,2>": "0x0" + }, + "<12,11>": { + "<12,11,1>": "0x0", + "<12,11,2>": "0x80000C00" + }, + "<12,12>": "7", + "<12,13>": { + "<12,13,1>": "-2", + "<12,13,2>": "-2", + "<12,13,3>": "" + }, + "<12,14>": "0", + "<12,15>": { + "<12,15,1>": { + "<12,15,1,1>": "Segoe UI", + "<12,15,1,2>": "-12", + "<12,15,1,3>": "400", + "<12,15,1,4>": "0", + "<12,15,1,5>": "0", + "<12,15,1,6>": "0", + "<12,15,1,7>": "0", + "<12,15,1,8>": "34", + "<12,15,1,9>": "0", + "<12,15,1,10>": "3", + "<12,15,1,11>": "2", + "<12,15,1,12>": "1", + "<12,15,1,13>": "0", + "<12,15,1,14>": "0" + } + }, + "<12,16>": "", + "<12,17>": "", + "<12,18>": { + "<12,18,1>": { + "<12,18,1,1>": "R", + "<12,18,1,2>": "EXECUTE", + "<12,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<12,18,1,4>": { + "<12,18,1,4,1>": "@SELF", + "<12,18,1,4,2>": "@EVENT", + "<12,18,1,4,3>": "@PARAM1", + "<12,18,1,4,4>": "@PARAM2", + "<12,18,1,4,5>": "@PARAM3", + "<12,18,1,4,6>": "@PARAM4", + "<12,18,1,4,7>": "@PARAM5", + "<12,18,1,4,8>": "@PARAM6" + }, + "<12,18,1,5>": "", + "<12,18,1,6>": "", + "<12,18,1,7>": "", + "<12,18,1,8>": "", + "<12,18,1,9>": "", + "<12,18,1,10>": "", + "<12,18,1,11>": "", + "<12,18,1,12>": "", + "<12,18,1,13>": "", + "<12,18,1,14>": "", + "<12,18,1,15>": "STPROC" + } + }, + "<12,19>": "CHANGED", + "<12,20>": "", + "<12,21>": "", + "<12,22>": "", + "<12,23>": "", + "<12,24>": "", + "<12,25>": "", + "<12,26>": "", + "<12,27>": "", + "<12,28>": "<>", + "<12,29>": "<>", + "<12,30>": "<>", + "<12,31>": "0", + "<12,32>": "", + "<12,33>": "", + "<12,34>": "", + "<12,35>": { + "<12,35,1>": "HTTP Service", + "<12,35,2>": "Web API" + }, + "<12,36>": "", + "<12,37>": "", + "<12,38>": "", + "<12,39>": "", + "<12,40>": "", + "<12,41>": "", + "<12,42>": "", + "<12,43>": "", + "<12,44>": "", + "<12,45>": "", + "<12,46>": "", + "<12,47>": "", + "<12,48>": "", + "<12,49>": "", + "<12,50>": "", + "<12,51>": "", + "<12,52>": "", + "<12,53>": "", + "<12,54>": "", + "<12,55>": "", + "<12,56>": "", + "<12,57>": "", + "<12,58>": "", + "<12,59>": "", + "<12,60>": "", + "<12,61>": "", + "<12,62>": "0", + "<12,63>": "", + "<12,64>": { + "<12,64,1>": "", + "<12,64,2>": "", + "<12,64,3>": "" + }, + "<12,65>": "-2", + "<12,66>": { + "<12,66,1>": "", + "<12,66,2>": "", + "<12,66,3>": "" + }, + "<12,67>": "-2", + "<12,68>": "", + "<12,69>": "", + "<12,70>": "", + "<12,71>": "", + "<12,72>": "", + "<12,73>": "", + "<12,74>": "", + "<12,75>": "", + "<12,76>": "", + "<12,77>": "", + "<12,78>": "", + "<12,79>": "", + "<12,80>": "", + "<12,81>": "", + "<12,82>": "", + "<12,83>": "", + "<12,84>": "", + "<12,85>": "", + "<12,86>": "", + "<12,87>": "", + "<12,88>": "", + "<12,89>": "", + "<12,90>": "", + "<12,91>": "", + "<12,92>": "", + "<12,93>": "", + "<12,94>": "", + "<12,95>": "", + "<12,96>": "", + "<12,97>": "", + "<12,98>": "", + "<12,99>": "", + "<12,100>": "", + "<12,101>": "", + "<12,102>": "", + "<12,103>": "", + "<12,104>": "", + "<12,105>": "", + "<12,106>": "", + "<12,107>": "", + "<12,108>": "" + }, + "<13>": { + "<13,1>": "STA_ENTRY_POINT_SERVICE", + "<13,2>": "", + "<13,3>": "STATIC", + "<13,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<13,5>": "179", + "<13,6>": "264", + "<13,7>": "106", + "<13,8>": "15", + "<13,9>": "Entry Point Service:", + "<13,10>": { + "<13,10,1>": "0x56000000", + "<13,10,2>": "0x0" + }, + "<13,11>": { + "<13,11,1>": "0x0", + "<13,11,2>": "0x80000000" + }, + "<13,12>": "89", + "<13,13>": { + "<13,13,1>": "-1", + "<13,13,2>": "-1", + "<13,13,3>": "" + }, + "<13,14>": "0", + "<13,15>": { + "<13,15,1>": { + "<13,15,1,1>": "Segoe UI", + "<13,15,1,2>": "-12", + "<13,15,1,3>": "400", + "<13,15,1,4>": "0", + "<13,15,1,5>": "0", + "<13,15,1,6>": "0", + "<13,15,1,7>": "0", + "<13,15,1,8>": "34", + "<13,15,1,9>": "0", + "<13,15,1,10>": "3", + "<13,15,1,11>": "2", + "<13,15,1,12>": "1", + "<13,15,1,13>": "0", + "<13,15,1,14>": "0" + } + }, + "<13,16>": "", + "<13,17>": "", + "<13,18>": "", + "<13,19>": "", + "<13,20>": "", + "<13,21>": "", + "<13,22>": "", + "<13,23>": "", + "<13,24>": "", + "<13,25>": "", + "<13,26>": "", + "<13,27>": "", + "<13,28>": "<>", + "<13,29>": "<>", + "<13,30>": "", + "<13,31>": "", + "<13,32>": "", + "<13,33>": "", + "<13,34>": "", + "<13,35>": "", + "<13,36>": "", + "<13,37>": "", + "<13,38>": "", + "<13,39>": "", + "<13,40>": "", + "<13,41>": "", + "<13,42>": "", + "<13,43>": "", + "<13,44>": "", + "<13,45>": "", + "<13,46>": "", + "<13,47>": "", + "<13,48>": "", + "<13,49>": "", + "<13,50>": "", + "<13,51>": "", + "<13,52>": "", + "<13,53>": "", + "<13,54>": "", + "<13,55>": "", + "<13,56>": "", + "<13,57>": "", + "<13,58>": "", + "<13,59>": "", + "<13,60>": "", + "<13,61>": "", + "<13,62>": "0", + "<13,63>": { + "<13,63,1>": "", + "<13,63,2>": "", + "<13,63,3>": "", + "<13,63,4>": "", + "<13,63,5>": "", + "<13,63,6>": "", + "<13,63,7>": "", + "<13,63,8>": "" + }, + "<13,64>": { + "<13,64,1>": "", + "<13,64,2>": "", + "<13,64,3>": "" + }, + "<13,65>": "-2", + "<13,66>": "", + "<13,67>": "", + "<13,68>": "", + "<13,69>": "", + "<13,70>": "", + "<13,71>": "", + "<13,72>": "", + "<13,73>": "", + "<13,74>": "", + "<13,75>": "", + "<13,76>": "", + "<13,77>": "", + "<13,78>": "", + "<13,79>": "", + "<13,80>": "", + "<13,81>": "", + "<13,82>": "", + "<13,83>": "", + "<13,84>": "", + "<13,85>": "", + "<13,86>": "", + "<13,87>": "", + "<13,88>": "", + "<13,89>": "", + "<13,90>": "0", + "<13,91>": "0", + "<13,92>": "", + "<13,93>": "", + "<13,94>": "", + "<13,95>": "", + "<13,96>": "", + "<13,97>": "", + "<13,98>": "", + "<13,99>": "", + "<13,100>": "", + "<13,101>": "", + "<13,102>": "", + "<13,103>": "", + "<13,104>": "", + "<13,105>": "", + "<13,106>": "", + "<13,107>": "", + "<13,108>": "" + }, + "<14>": { + "<14,1>": "EDL_ENTRY_POINT_SERVICE", + "<14,2>": "", + "<14,3>": "EDITFIELD", + "<14,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<14,5>": "309", + "<14,6>": "261", + "<14,7>": "327", + "<14,8>": "23", + "<14,9>": "", + "<14,10>": { + "<14,10,1>": "0x56000080", + "<14,10,2>": "0x200" + }, + "<14,11>": { + "<14,11,1>": "0x0", + "<14,11,2>": "0x80000000" + }, + "<14,12>": "8", + "<14,13>": { + "<14,13,1>": "-2", + "<14,13,2>": "-2", + "<14,13,3>": "" + }, + "<14,14>": "0", + "<14,15>": { + "<14,15,1>": { + "<14,15,1,1>": "Segoe UI", + "<14,15,1,2>": "-12", + "<14,15,1,3>": "400", + "<14,15,1,4>": "0", + "<14,15,1,5>": "0", + "<14,15,1,6>": "0", + "<14,15,1,7>": "0", + "<14,15,1,8>": "34", + "<14,15,1,9>": "0", + "<14,15,1,10>": "3", + "<14,15,1,11>": "2", + "<14,15,1,12>": "1", + "<14,15,1,13>": "0", + "<14,15,1,14>": "0" + } + }, + "<14,16>": "", + "<14,17>": "", + "<14,18>": "", + "<14,19>": "", + "<14,20>": "", + "<14,21>": "", + "<14,22>": "", + "<14,23>": "", + "<14,24>": "", + "<14,25>": "", + "<14,26>": "", + "<14,27>": "", + "<14,28>": "<>", + "<14,29>": "<>", + "<14,30>": "<>", + "<14,31>": "0", + "<14,32>": "", + "<14,33>": "", + "<14,34>": "", + "<14,35>": "", + "<14,36>": { + "<14,36,1>": "0", + "<14,36,2>": "0" + }, + "<14,37>": "", + "<14,38>": "", + "<14,39>": "", + "<14,40>": "", + "<14,41>": "", + "<14,42>": "", + "<14,43>": "", + "<14,44>": "", + "<14,45>": "", + "<14,46>": "", + "<14,47>": "", + "<14,48>": "", + "<14,49>": "", + "<14,50>": "", + "<14,51>": "", + "<14,52>": "", + "<14,53>": "", + "<14,54>": "", + "<14,55>": "", + "<14,56>": "", + "<14,57>": "", + "<14,58>": "", + "<14,59>": "", + "<14,60>": "", + "<14,61>": "", + "<14,62>": "0", + "<14,63>": "", + "<14,64>": "", + "<14,65>": "", + "<14,66>": "", + "<14,67>": "", + "<14,68>": "", + "<14,69>": "", + "<14,70>": "", + "<14,71>": "", + "<14,72>": "", + "<14,73>": "", + "<14,74>": "", + "<14,75>": "", + "<14,76>": "", + "<14,77>": "", + "<14,78>": "", + "<14,79>": "", + "<14,80>": "", + "<14,81>": "", + "<14,82>": "", + "<14,83>": "", + "<14,84>": "", + "<14,85>": "", + "<14,86>": "", + "<14,87>": "", + "<14,88>": "", + "<14,89>": "", + "<14,90>": "", + "<14,91>": "", + "<14,92>": "", + "<14,93>": "", + "<14,94>": "", + "<14,95>": "", + "<14,96>": "", + "<14,97>": "", + "<14,98>": "", + "<14,99>": "", + "<14,100>": "", + "<14,101>": "", + "<14,102>": "", + "<14,103>": "", + "<14,104>": "", + "<14,105>": "", + "<14,106>": "", + "<14,107>": "", + "<14,108>": "" + }, + "<15>": { + "<15,1>": "STA_ABORTED_SERVICE", + "<15,2>": "", + "<15,3>": "STATIC", + "<15,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<15,5>": "179", + "<15,6>": "294", + "<15,7>": "106", + "<15,8>": "15", + "<15,9>": "Aborted Service:", + "<15,10>": { + "<15,10,1>": "0x56000000", + "<15,10,2>": "0x0" + }, + "<15,11>": { + "<15,11,1>": "0x0", + "<15,11,2>": "0x80000000" + }, + "<15,12>": "90", + "<15,13>": { + "<15,13,1>": "-1", + "<15,13,2>": "-1", + "<15,13,3>": "" + }, + "<15,14>": "0", + "<15,15>": { + "<15,15,1>": { + "<15,15,1,1>": "Segoe UI", + "<15,15,1,2>": "-12", + "<15,15,1,3>": "400", + "<15,15,1,4>": "0", + "<15,15,1,5>": "0", + "<15,15,1,6>": "0", + "<15,15,1,7>": "0", + "<15,15,1,8>": "34", + "<15,15,1,9>": "0", + "<15,15,1,10>": "3", + "<15,15,1,11>": "2", + "<15,15,1,12>": "1", + "<15,15,1,13>": "0", + "<15,15,1,14>": "0" + } + }, + "<15,16>": "", + "<15,17>": "", + "<15,18>": "", + "<15,19>": "", + "<15,20>": "", + "<15,21>": "", + "<15,22>": "", + "<15,23>": "", + "<15,24>": "", + "<15,25>": "", + "<15,26>": "", + "<15,27>": "", + "<15,28>": "<>", + "<15,29>": "<>", + "<15,30>": "", + "<15,31>": "", + "<15,32>": "", + "<15,33>": "", + "<15,34>": "", + "<15,35>": "", + "<15,36>": "", + "<15,37>": "", + "<15,38>": "", + "<15,39>": "", + "<15,40>": "", + "<15,41>": "", + "<15,42>": "", + "<15,43>": "", + "<15,44>": "", + "<15,45>": "", + "<15,46>": "", + "<15,47>": "", + "<15,48>": "", + "<15,49>": "", + "<15,50>": "", + "<15,51>": "", + "<15,52>": "", + "<15,53>": "", + "<15,54>": "", + "<15,55>": "", + "<15,56>": "", + "<15,57>": "", + "<15,58>": "", + "<15,59>": "", + "<15,60>": "", + "<15,61>": "", + "<15,62>": "0", + "<15,63>": { + "<15,63,1>": "", + "<15,63,2>": "", + "<15,63,3>": "", + "<15,63,4>": "", + "<15,63,5>": "", + "<15,63,6>": "", + "<15,63,7>": "", + "<15,63,8>": "" + }, + "<15,64>": { + "<15,64,1>": "", + "<15,64,2>": "", + "<15,64,3>": "" + }, + "<15,65>": "-2", + "<15,66>": "", + "<15,67>": "", + "<15,68>": "", + "<15,69>": "", + "<15,70>": "", + "<15,71>": "", + "<15,72>": "", + "<15,73>": "", + "<15,74>": "", + "<15,75>": "", + "<15,76>": "", + "<15,77>": "", + "<15,78>": "", + "<15,79>": "", + "<15,80>": "", + "<15,81>": "", + "<15,82>": "", + "<15,83>": "", + "<15,84>": "", + "<15,85>": "", + "<15,86>": "", + "<15,87>": "", + "<15,88>": "", + "<15,89>": "", + "<15,90>": "0", + "<15,91>": "0", + "<15,92>": "", + "<15,93>": "", + "<15,94>": "", + "<15,95>": "", + "<15,96>": "", + "<15,97>": "", + "<15,98>": "", + "<15,99>": "", + "<15,100>": "", + "<15,101>": "", + "<15,102>": "", + "<15,103>": "", + "<15,104>": "", + "<15,105>": "", + "<15,106>": "", + "<15,107>": "", + "<15,108>": "" + }, + "<16>": { + "<16,1>": "EDL_ABORTED_SERVICE", + "<16,2>": "", + "<16,3>": "EDITFIELD", + "<16,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<16,5>": "309", + "<16,6>": "291", + "<16,7>": "327", + "<16,8>": "23", + "<16,9>": "", + "<16,10>": { + "<16,10,1>": "0x56000080", + "<16,10,2>": "0x200" + }, + "<16,11>": { + "<16,11,1>": "0x0", + "<16,11,2>": "0x80000000" + }, + "<16,12>": "9", + "<16,13>": { + "<16,13,1>": "-2", + "<16,13,2>": "-2", + "<16,13,3>": "" + }, + "<16,14>": "0", + "<16,15>": { + "<16,15,1>": { + "<16,15,1,1>": "Segoe UI", + "<16,15,1,2>": "-12", + "<16,15,1,3>": "400", + "<16,15,1,4>": "0", + "<16,15,1,5>": "0", + "<16,15,1,6>": "0", + "<16,15,1,7>": "0", + "<16,15,1,8>": "34", + "<16,15,1,9>": "0", + "<16,15,1,10>": "3", + "<16,15,1,11>": "2", + "<16,15,1,12>": "1", + "<16,15,1,13>": "0", + "<16,15,1,14>": "0" + } + }, + "<16,16>": "", + "<16,17>": "", + "<16,18>": "", + "<16,19>": "", + "<16,20>": "", + "<16,21>": "", + "<16,22>": "", + "<16,23>": "", + "<16,24>": "", + "<16,25>": "", + "<16,26>": "", + "<16,27>": "", + "<16,28>": "<>", + "<16,29>": "<>", + "<16,30>": "<>", + "<16,31>": "0", + "<16,32>": "", + "<16,33>": "", + "<16,34>": "", + "<16,35>": "", + "<16,36>": { + "<16,36,1>": "0", + "<16,36,2>": "0" + }, + "<16,37>": "", + "<16,38>": "", + "<16,39>": "", + "<16,40>": "", + "<16,41>": "", + "<16,42>": "", + "<16,43>": "", + "<16,44>": "", + "<16,45>": "", + "<16,46>": "", + "<16,47>": "", + "<16,48>": "", + "<16,49>": "", + "<16,50>": "", + "<16,51>": "", + "<16,52>": "", + "<16,53>": "", + "<16,54>": "", + "<16,55>": "", + "<16,56>": "", + "<16,57>": "", + "<16,58>": "", + "<16,59>": "", + "<16,60>": "", + "<16,61>": "", + "<16,62>": "0", + "<16,63>": "", + "<16,64>": "", + "<16,65>": "", + "<16,66>": "", + "<16,67>": "", + "<16,68>": "", + "<16,69>": "", + "<16,70>": "", + "<16,71>": "", + "<16,72>": "", + "<16,73>": "", + "<16,74>": "", + "<16,75>": "", + "<16,76>": "", + "<16,77>": "", + "<16,78>": "", + "<16,79>": "", + "<16,80>": "", + "<16,81>": "", + "<16,82>": "", + "<16,83>": "", + "<16,84>": "", + "<16,85>": "", + "<16,86>": "", + "<16,87>": "", + "<16,88>": "", + "<16,89>": "", + "<16,90>": "", + "<16,91>": "", + "<16,92>": "", + "<16,93>": "", + "<16,94>": "", + "<16,95>": "", + "<16,96>": "", + "<16,97>": "", + "<16,98>": "", + "<16,99>": "", + "<16,100>": "", + "<16,101>": "", + "<16,102>": "", + "<16,103>": "", + "<16,104>": "", + "<16,105>": "", + "<16,106>": "", + "<16,107>": "", + "<16,108>": "" + }, + "<17>": { + "<17,1>": "STA_DEBUGGER_SETTING", + "<17,2>": "", + "<17,3>": "STATIC", + "<17,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<17,5>": "179", + "<17,6>": "324", + "<17,7>": "106", + "<17,8>": "15", + "<17,9>": "Debugger Setting:", + "<17,10>": { + "<17,10,1>": "0x56000000", + "<17,10,2>": "0x0" + }, + "<17,11>": { + "<17,11,1>": "0x0", + "<17,11,2>": "0x80000000" + }, + "<17,12>": "91", + "<17,13>": { + "<17,13,1>": "-1", + "<17,13,2>": "-1", + "<17,13,3>": "" + }, + "<17,14>": "0", + "<17,15>": { + "<17,15,1>": { + "<17,15,1,1>": "Segoe UI", + "<17,15,1,2>": "-12", + "<17,15,1,3>": "400", + "<17,15,1,4>": "0", + "<17,15,1,5>": "0", + "<17,15,1,6>": "0", + "<17,15,1,7>": "0", + "<17,15,1,8>": "34", + "<17,15,1,9>": "0", + "<17,15,1,10>": "3", + "<17,15,1,11>": "2", + "<17,15,1,12>": "1", + "<17,15,1,13>": "0", + "<17,15,1,14>": "0" + } + }, + "<17,16>": "", + "<17,17>": "", + "<17,18>": "", + "<17,19>": "", + "<17,20>": "", + "<17,21>": "", + "<17,22>": "", + "<17,23>": "", + "<17,24>": "", + "<17,25>": "", + "<17,26>": "", + "<17,27>": "", + "<17,28>": "<>", + "<17,29>": "<>", + "<17,30>": "", + "<17,31>": "", + "<17,32>": "", + "<17,33>": "", + "<17,34>": "", + "<17,35>": "", + "<17,36>": "", + "<17,37>": "", + "<17,38>": "", + "<17,39>": "", + "<17,40>": "", + "<17,41>": "", + "<17,42>": "", + "<17,43>": "", + "<17,44>": "", + "<17,45>": "", + "<17,46>": "", + "<17,47>": "", + "<17,48>": "", + "<17,49>": "", + "<17,50>": "", + "<17,51>": "", + "<17,52>": "", + "<17,53>": "", + "<17,54>": "", + "<17,55>": "", + "<17,56>": "", + "<17,57>": "", + "<17,58>": "", + "<17,59>": "", + "<17,60>": "", + "<17,61>": "", + "<17,62>": "0", + "<17,63>": { + "<17,63,1>": "", + "<17,63,2>": "", + "<17,63,3>": "", + "<17,63,4>": "", + "<17,63,5>": "", + "<17,63,6>": "", + "<17,63,7>": "", + "<17,63,8>": "" + }, + "<17,64>": { + "<17,64,1>": "", + "<17,64,2>": "", + "<17,64,3>": "" + }, + "<17,65>": "-2", + "<17,66>": "", + "<17,67>": "", + "<17,68>": "", + "<17,69>": "", + "<17,70>": "", + "<17,71>": "", + "<17,72>": "", + "<17,73>": "", + "<17,74>": "", + "<17,75>": "", + "<17,76>": "", + "<17,77>": "", + "<17,78>": "", + "<17,79>": "", + "<17,80>": "", + "<17,81>": "", + "<17,82>": "", + "<17,83>": "", + "<17,84>": "", + "<17,85>": "", + "<17,86>": "", + "<17,87>": "", + "<17,88>": "", + "<17,89>": "", + "<17,90>": "0", + "<17,91>": "0", + "<17,92>": "", + "<17,93>": "", + "<17,94>": "", + "<17,95>": "", + "<17,96>": "", + "<17,97>": "", + "<17,98>": "", + "<17,99>": "", + "<17,100>": "", + "<17,101>": "", + "<17,102>": "", + "<17,103>": "", + "<17,104>": "", + "<17,105>": "", + "<17,106>": "", + "<17,107>": "", + "<17,108>": "" + }, + "<18>": { + "<18,1>": "COB_DEBUGGER_SETTING", + "<18,2>": "", + "<18,3>": "COMBOBOX", + "<18,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<18,5>": "309", + "<18,6>": "321", + "<18,7>": "82", + "<18,8>": "60", + "<18,9>": "", + "<18,10>": { + "<18,10,1>": "0x56000003", + "<18,10,2>": "0x0" + }, + "<18,11>": { + "<18,11,1>": "0x0", + "<18,11,2>": "0x80000C00" + }, + "<18,12>": "10", + "<18,13>": { + "<18,13,1>": "-2", + "<18,13,2>": "-2", + "<18,13,3>": "" + }, + "<18,14>": "0", + "<18,15>": { + "<18,15,1>": { + "<18,15,1,1>": "Segoe UI", + "<18,15,1,2>": "-12", + "<18,15,1,3>": "400", + "<18,15,1,4>": "0", + "<18,15,1,5>": "0", + "<18,15,1,6>": "0", + "<18,15,1,7>": "0", + "<18,15,1,8>": "34", + "<18,15,1,9>": "0", + "<18,15,1,10>": "3", + "<18,15,1,11>": "2", + "<18,15,1,12>": "1", + "<18,15,1,13>": "0", + "<18,15,1,14>": "0" + } + }, + "<18,16>": "", + "<18,17>": "", + "<18,18>": { + "<18,18,1>": { + "<18,18,1,1>": "R", + "<18,18,1,2>": "EXECUTE", + "<18,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<18,18,1,4>": { + "<18,18,1,4,1>": "@SELF", + "<18,18,1,4,2>": "@EVENT", + "<18,18,1,4,3>": "@PARAM1", + "<18,18,1,4,4>": "@PARAM2", + "<18,18,1,4,5>": "@PARAM3", + "<18,18,1,4,6>": "@PARAM4", + "<18,18,1,4,7>": "@PARAM5", + "<18,18,1,4,8>": "@PARAM6" + }, + "<18,18,1,5>": "", + "<18,18,1,6>": "", + "<18,18,1,7>": "", + "<18,18,1,8>": "", + "<18,18,1,9>": "", + "<18,18,1,10>": "", + "<18,18,1,11>": "", + "<18,18,1,12>": "", + "<18,18,1,13>": "", + "<18,18,1,14>": "", + "<18,18,1,15>": "STPROC" + } + }, + "<18,19>": "CHANGED", + "<18,20>": "", + "<18,21>": "", + "<18,22>": "", + "<18,23>": "", + "<18,24>": "", + "<18,25>": "", + "<18,26>": "", + "<18,27>": "", + "<18,28>": "<>", + "<18,29>": "<>", + "<18,30>": "<>", + "<18,31>": "0", + "<18,32>": "", + "<18,33>": "", + "<18,34>": "", + "<18,35>": { + "<18,35,1>": "Disabled", + "<18,35,2>": "Enabled", + "<18,35,3>": "Intercept" + }, + "<18,36>": "", + "<18,37>": "", + "<18,38>": "", + "<18,39>": "", + "<18,40>": "", + "<18,41>": "", + "<18,42>": "", + "<18,43>": "", + "<18,44>": "", + "<18,45>": "", + "<18,46>": "", + "<18,47>": "", + "<18,48>": "", + "<18,49>": "", + "<18,50>": "", + "<18,51>": "", + "<18,52>": "", + "<18,53>": "", + "<18,54>": "", + "<18,55>": "", + "<18,56>": "", + "<18,57>": "", + "<18,58>": "", + "<18,59>": "", + "<18,60>": "", + "<18,61>": "", + "<18,62>": "0", + "<18,63>": "", + "<18,64>": { + "<18,64,1>": "", + "<18,64,2>": "", + "<18,64,3>": "" + }, + "<18,65>": "-2", + "<18,66>": { + "<18,66,1>": "", + "<18,66,2>": "", + "<18,66,3>": "" + }, + "<18,67>": "-2", + "<18,68>": "", + "<18,69>": "", + "<18,70>": "", + "<18,71>": "", + "<18,72>": "", + "<18,73>": "", + "<18,74>": "", + "<18,75>": "", + "<18,76>": "", + "<18,77>": "", + "<18,78>": "", + "<18,79>": "", + "<18,80>": "", + "<18,81>": "", + "<18,82>": "", + "<18,83>": "", + "<18,84>": "", + "<18,85>": "", + "<18,86>": "", + "<18,87>": "", + "<18,88>": "", + "<18,89>": "", + "<18,90>": "", + "<18,91>": "", + "<18,92>": "", + "<18,93>": "", + "<18,94>": "", + "<18,95>": "", + "<18,96>": "", + "<18,97>": "", + "<18,98>": "", + "<18,99>": "", + "<18,100>": "", + "<18,101>": "", + "<18,102>": "", + "<18,103>": "", + "<18,104>": "", + "<18,105>": "", + "<18,106>": "", + "<18,107>": "", + "<18,108>": "" + }, + "<19>": { + "<19,1>": "EDL_DEBUGGER_INTERCEPT", + "<19,2>": "", + "<19,3>": "EDITFIELD", + "<19,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<19,5>": "398", + "<19,6>": "321", + "<19,7>": "238", + "<19,8>": "23", + "<19,9>": "", + "<19,10>": { + "<19,10,1>": "0x56000080", + "<19,10,2>": "0x200" + }, + "<19,11>": { + "<19,11,1>": "0x80000", + "<19,11,2>": "0x80000000" + }, + "<19,12>": "11", + "<19,13>": { + "<19,13,1>": "-2", + "<19,13,2>": "-2", + "<19,13,3>": "" + }, + "<19,14>": "0", + "<19,15>": { + "<19,15,1>": { + "<19,15,1,1>": "Segoe UI", + "<19,15,1,2>": "-12", + "<19,15,1,3>": "400", + "<19,15,1,4>": "0", + "<19,15,1,5>": "0", + "<19,15,1,6>": "0", + "<19,15,1,7>": "0", + "<19,15,1,8>": "34", + "<19,15,1,9>": "0", + "<19,15,1,10>": "3", + "<19,15,1,11>": "2", + "<19,15,1,12>": "1", + "<19,15,1,13>": "0", + "<19,15,1,14>": "0" + } + }, + "<19,16>": "", + "<19,17>": "", + "<19,18>": "", + "<19,19>": "", + "<19,20>": "", + "<19,21>": "", + "<19,22>": "", + "<19,23>": "", + "<19,24>": "", + "<19,25>": "", + "<19,26>": "", + "<19,27>": "", + "<19,28>": "<>", + "<19,29>": "<>", + "<19,30>": "<>", + "<19,31>": "0", + "<19,32>": "", + "<19,33>": "", + "<19,34>": "", + "<19,35>": "", + "<19,36>": { + "<19,36,1>": "0", + "<19,36,2>": "0" + }, + "<19,37>": "", + "<19,38>": "", + "<19,39>": "", + "<19,40>": "", + "<19,41>": "", + "<19,42>": "", + "<19,43>": "", + "<19,44>": "", + "<19,45>": "", + "<19,46>": "", + "<19,47>": "", + "<19,48>": "", + "<19,49>": "", + "<19,50>": "", + "<19,51>": "", + "<19,52>": "", + "<19,53>": "", + "<19,54>": "", + "<19,55>": "", + "<19,56>": "", + "<19,57>": "", + "<19,58>": "", + "<19,59>": "", + "<19,60>": "", + "<19,61>": "", + "<19,62>": "0", + "<19,63>": "", + "<19,64>": "", + "<19,65>": "", + "<19,66>": "", + "<19,67>": "", + "<19,68>": "", + "<19,69>": "", + "<19,70>": "", + "<19,71>": "", + "<19,72>": "", + "<19,73>": "", + "<19,74>": "", + "<19,75>": "", + "<19,76>": "", + "<19,77>": "", + "<19,78>": "", + "<19,79>": "", + "<19,80>": "", + "<19,81>": "", + "<19,82>": "", + "<19,83>": "", + "<19,84>": "", + "<19,85>": "", + "<19,86>": "", + "<19,87>": "", + "<19,88>": "", + "<19,89>": "", + "<19,90>": "", + "<19,91>": "", + "<19,92>": "", + "<19,93>": "", + "<19,94>": "", + "<19,95>": "", + "<19,96>": "", + "<19,97>": "", + "<19,98>": "", + "<19,99>": "", + "<19,100>": "", + "<19,101>": "", + "<19,102>": "", + "<19,103>": "", + "<19,104>": "", + "<19,105>": "", + "<19,106>": "", + "<19,107>": "", + "<19,108>": "" + }, + "<20>": { + "<20,1>": "CHB_FLUSH_CACHE", + "<20,2>": "", + "<20,3>": "CHECKBOX", + "<20,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<20,5>": "178", + "<20,6>": "358", + "<20,7>": "88", + "<20,8>": "15", + "<20,9>": "Flush Cache?", + "<20,10>": { + "<20,10,1>": "0x56000103", + "<20,10,2>": "0x0" + }, + "<20,11>": { + "<20,11,1>": "0x0", + "<20,11,2>": "0x80000000" + }, + "<20,12>": "12", + "<20,13>": { + "<20,13,1>": "-1", + "<20,13,2>": "-1", + "<20,13,3>": "" + }, + "<20,14>": "0", + "<20,15>": { + "<20,15,1>": { + "<20,15,1,1>": "Segoe UI", + "<20,15,1,2>": "-12", + "<20,15,1,3>": "400", + "<20,15,1,4>": "0", + "<20,15,1,5>": "0", + "<20,15,1,6>": "0", + "<20,15,1,7>": "0", + "<20,15,1,8>": "34", + "<20,15,1,9>": "0", + "<20,15,1,10>": "3", + "<20,15,1,11>": "2", + "<20,15,1,12>": "1", + "<20,15,1,13>": "0", + "<20,15,1,14>": "0" + } + }, + "<20,16>": "", + "<20,17>": "", + "<20,18>": "", + "<20,19>": "", + "<20,20>": "", + "<20,21>": "", + "<20,22>": "", + "<20,23>": "", + "<20,24>": "", + "<20,25>": "", + "<20,26>": "", + "<20,27>": "", + "<20,28>": "", + "<20,29>": "", + "<20,30>": "", + "<20,31>": "", + "<20,32>": "", + "<20,33>": "", + "<20,34>": "", + "<20,35>": "", + "<20,36>": "0", + "<20,37>": "", + "<20,38>": "", + "<20,39>": "", + "<20,40>": "", + "<20,41>": "", + "<20,42>": "", + "<20,43>": "", + "<20,44>": "", + "<20,45>": "", + "<20,46>": "", + "<20,47>": "", + "<20,48>": "", + "<20,49>": "", + "<20,50>": "", + "<20,51>": "", + "<20,52>": "", + "<20,53>": "", + "<20,54>": "", + "<20,55>": "", + "<20,56>": "", + "<20,57>": "", + "<20,58>": "", + "<20,59>": "", + "<20,60>": "", + "<20,61>": "", + "<20,62>": "0", + "<20,63>": { + "<20,63,1>": "", + "<20,63,2>": "", + "<20,63,3>": "", + "<20,63,4>": "", + "<20,63,5>": "", + "<20,63,6>": "", + "<20,63,7>": "", + "<20,63,8>": "" + }, + "<20,64>": { + "<20,64,1>": "", + "<20,64,2>": "", + "<20,64,3>": "" + }, + "<20,65>": "-2", + "<20,66>": "", + "<20,67>": "", + "<20,68>": "", + "<20,69>": "", + "<20,70>": "", + "<20,71>": "", + "<20,72>": "", + "<20,73>": "", + "<20,74>": "", + "<20,75>": "", + "<20,76>": "", + "<20,77>": "", + "<20,78>": "", + "<20,79>": "", + "<20,80>": "", + "<20,81>": "", + "<20,82>": "", + "<20,83>": "", + "<20,84>": "", + "<20,85>": "", + "<20,86>": "", + "<20,87>": "", + "<20,88>": "", + "<20,89>": "", + "<20,90>": "0", + "<20,91>": "0", + "<20,92>": "", + "<20,93>": "", + "<20,94>": "", + "<20,95>": "", + "<20,96>": "", + "<20,97>": "", + "<20,98>": "", + "<20,99>": "", + "<20,100>": "", + "<20,101>": "", + "<20,102>": "", + "<20,103>": "", + "<20,104>": "", + "<20,105>": "", + "<20,106>": "", + "<20,107>": "", + "<20,108>": "" + }, + "<21>": { + "<21,1>": "PUB_SERVER_STATUS", + "<21,2>": "", + "<21,3>": "PUSHBUTTON", + "<21,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<21,5>": "178", + "<21,6>": "384", + "<21,7>": "100", + "<21,8>": "23", + "<21,9>": "Disable Server", + "<21,10>": { + "<21,10,1>": "0x56002300", + "<21,10,2>": "0x0" + }, + "<21,11>": { + "<21,11,1>": "0x0", + "<21,11,2>": "0x80000000" + }, + "<21,12>": "13", + "<21,13>": { + "<21,13,1>": "16053492", + "<21,13,2>": "16053492", + "<21,13,3>": "0" + }, + "<21,14>": "0", + "<21,15>": { + "<21,15,1>": { + "<21,15,1,1>": "Segoe UI", + "<21,15,1,2>": "-11", + "<21,15,1,3>": "400", + "<21,15,1,4>": "0", + "<21,15,1,5>": "0", + "<21,15,1,6>": "0", + "<21,15,1,7>": "0", + "<21,15,1,8>": "34", + "<21,15,1,9>": "0", + "<21,15,1,10>": "3", + "<21,15,1,11>": "2", + "<21,15,1,12>": "1", + "<21,15,1,13>": "0", + "<21,15,1,14>": "0" + } + }, + "<21,16>": "", + "<21,17>": "", + "<21,18>": { + "<21,18,1>": { + "<21,18,1,1>": "R", + "<21,18,1,2>": "EXECUTE", + "<21,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<21,18,1,4>": { + "<21,18,1,4,1>": "@SELF", + "<21,18,1,4,2>": "@EVENT", + "<21,18,1,4,3>": "@PARAM1", + "<21,18,1,4,4>": "@PARAM2", + "<21,18,1,4,5>": "@PARAM3", + "<21,18,1,4,6>": "@PARAM4", + "<21,18,1,4,7>": "@PARAM5", + "<21,18,1,4,8>": "@PARAM6" + }, + "<21,18,1,5>": "", + "<21,18,1,6>": "", + "<21,18,1,7>": "", + "<21,18,1,8>": "", + "<21,18,1,9>": "", + "<21,18,1,10>": "", + "<21,18,1,11>": "", + "<21,18,1,12>": "", + "<21,18,1,13>": "", + "<21,18,1,14>": "", + "<21,18,1,15>": "STPROC" + } + }, + "<21,19>": "CLICK", + "<21,20>": "", + "<21,21>": "", + "<21,22>": "", + "<21,23>": "", + "<21,24>": "", + "<21,25>": "", + "<21,26>": "", + "<21,27>": "", + "<21,28>": "", + "<21,29>": "", + "<21,30>": "", + "<21,31>": "", + "<21,32>": "", + "<21,33>": "", + "<21,34>": "", + "<21,35>": "", + "<21,36>": "", + "<21,37>": "", + "<21,38>": "", + "<21,39>": "", + "<21,40>": "1", + "<21,41>": { + "<21,41,1>": "", + "<21,41,2>": "-1" + }, + "<21,42>": "", + "<21,43>": "", + "<21,44>": "", + "<21,45>": "", + "<21,46>": "", + "<21,47>": "", + "<21,48>": "", + "<21,49>": "", + "<21,50>": "", + "<21,51>": "", + "<21,52>": "", + "<21,53>": "", + "<21,54>": "", + "<21,55>": "", + "<21,56>": "", + "<21,57>": "", + "<21,58>": "", + "<21,59>": "", + "<21,60>": "", + "<21,61>": "", + "<21,62>": "0", + "<21,63>": "", + "<21,64>": { + "<21,64,1>": "-2", + "<21,64,2>": "-2", + "<21,64,3>": "0" + }, + "<21,65>": "-2", + "<21,66>": "", + "<21,67>": "", + "<21,68>": "", + "<21,69>": "", + "<21,70>": "", + "<21,71>": "", + "<21,72>": "", + "<21,73>": "", + "<21,74>": "", + "<21,75>": "", + "<21,76>": "", + "<21,77>": "", + "<21,78>": "", + "<21,79>": "", + "<21,80>": "", + "<21,81>": "", + "<21,82>": "", + "<21,83>": "", + "<21,84>": "", + "<21,85>": "", + "<21,86>": "", + "<21,87>": "", + "<21,88>": "", + "<21,89>": "", + "<21,90>": "0", + "<21,91>": "0", + "<21,92>": "", + "<21,93>": "", + "<21,94>": "", + "<21,95>": "", + "<21,96>": "", + "<21,97>": "", + "<21,98>": "", + "<21,99>": "", + "<21,100>": "", + "<21,101>": "", + "<21,102>": "", + "<21,103>": "", + "<21,104>": "", + "<21,105>": "", + "<21,106>": "", + "<21,107>": "", + "<21,108>": "" + }, + "<22>": { + "<22,1>": "OLE_PIC_SERVER_STATUS", + "<22,2>": "", + "<22,3>": "OLECONTROL.SRP.Picture.1", + "<22,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<22,5>": "309", + "<22,6>": "384", + "<22,7>": "327", + "<22,8>": "23", + "<22,9>": "SRP.Picture.1", + "<22,10>": { + "<22,10,1>": "0x56000000", + "<22,10,2>": "0x0" + }, + "<22,11>": { + "<22,11,1>": "0x0", + "<22,11,2>": "0x80000000" + }, + "<22,12>": "14", + "<22,13>": { + "<22,13,1>": "-2", + "<22,13,2>": "-2", + "<22,13,3>": "" + }, + "<22,14>": "0", + "<22,15>": { + "<22,15,1>": { + "<22,15,1,1>": "Segoe UI", + "<22,15,1,2>": "-12", + "<22,15,1,3>": "400", + "<22,15,1,4>": "0", + "<22,15,1,5>": "0", + "<22,15,1,6>": "0", + "<22,15,1,7>": "0", + "<22,15,1,8>": "34", + "<22,15,1,9>": "0", + "<22,15,1,10>": "3", + "<22,15,1,11>": "2", + "<22,15,1,12>": "1", + "<22,15,1,13>": "0", + "<22,15,1,14>": "0" + } + }, + "<22,16>": "", + "<22,17>": "", + "<22,18>": "", + "<22,19>": "", + "<22,20>": "", + "<22,21>": "", + "<22,22>": "", + "<22,23>": "", + "<22,24>": "", + "<22,25>": "", + "<22,26>": "", + "<22,27>": "", + "<22,28>": "", + "<22,29>": "", + "<22,30>": "", + "<22,31>": "", + "<22,32>": "", + "<22,33>": "", + "<22,34>": "", + "<22,35>": "", + "<22,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF0258005000FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0F53006500720076006500720020005300740061007400750073003A002000FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<22,37>": "", + "<22,38>": "", + "<22,39>": "", + "<22,40>": "", + "<22,41>": "", + "<22,42>": "", + "<22,43>": "", + "<22,44>": "", + "<22,45>": "", + "<22,46>": "", + "<22,47>": "", + "<22,48>": "", + "<22,49>": "", + "<22,50>": "", + "<22,51>": "", + "<22,52>": "", + "<22,53>": "", + "<22,54>": "", + "<22,55>": { + "<22,55,1>": "OLE.Animated", + "<22,55,2>": "OLE.AnimationDelay", + "<22,55,3>": "OLE.AutoLoadDropFile", + "<22,55,4>": "OLE.BackgroundColor", + "<22,55,5>": "OLE.BorderAlignment", + "<22,55,6>": "OLE.BorderType", + "<22,55,7>": "OLE.Caption", + "<22,55,8>": "OLE.CaptionColor", + "<22,55,9>": "OLE.CaptionHorzAlign", + "<22,55,10>": "OLE.CaptionHorzOffset", + "<22,55,11>": "OLE.CaptionVertAlign", + "<22,55,12>": "OLE.CaptionVertOffset", + "<22,55,13>": "OLE.ControlPart", + "<22,55,14>": "OLE.FontBold", + "<22,55,15>": "OLE.FontItalic", + "<22,55,16>": "OLE.FontName", + "<22,55,17>": "OLE.FontSize", + "<22,55,18>": "OLE.FontUnderlined", + "<22,55,19>": "OLE.Frame", + "<22,55,20>": "OLE.FrameCount", + "<22,55,21>": "OLE.HorzAlign", + "<22,55,22>": "OLE.Image", + "<22,55,23>": "OLE.ImageHorzOffset", + "<22,55,24>": "OLE.ImageVertOffset", + "<22,55,25>": "OLE.Layout", + "<22,55,26>": "OLE.ResizeUsingGDIPlus", + "<22,55,27>": "OLE.TransparentColor", + "<22,55,28>": "OLE.VertAlign", + "<22,55,29>": "OLE.Zoom" + }, + "<22,56>": { + "<22,56,1>": "0", + "<22,56,2>": "50", + "<22,56,3>": "0", + "<22,56,4>": "None", + "<22,56,5>": "All", + "<22,56,6>": "XP", + "<22,56,7>": "Server Status: ", + "<22,56,8>": "None", + "<22,56,9>": "Center", + "<22,56,10>": "0", + "<22,56,11>": "Center", + "<22,56,12>": "0", + "<22,56,13>": "None", + "<22,56,14>": "0", + "<22,56,15>": "0", + "<22,56,16>": "Segoe UI", + "<22,56,17>": "8", + "<22,56,18>": "0", + "<22,56,19>": "1", + "<22,56,20>": "1", + "<22,56,21>": "Center", + "<22,56,22>": "", + "<22,56,23>": "0", + "<22,56,24>": "0", + "<22,56,25>": "Clip", + "<22,56,26>": "1", + "<22,56,27>": "Auto", + "<22,56,28>": "Center", + "<22,56,29>": "1" + }, + "<22,57>": "", + "<22,58>": "", + "<22,59>": "", + "<22,60>": "", + "<22,61>": "", + "<22,62>": "", + "<22,63>": "", + "<22,64>": "", + "<22,65>": "", + "<22,66>": "", + "<22,67>": "", + "<22,68>": "", + "<22,69>": "", + "<22,70>": "", + "<22,71>": "", + "<22,72>": "", + "<22,73>": "", + "<22,74>": "", + "<22,75>": "", + "<22,76>": "", + "<22,77>": "", + "<22,78>": "", + "<22,79>": "", + "<22,80>": "", + "<22,81>": "", + "<22,82>": "", + "<22,83>": "", + "<22,84>": "", + "<22,85>": "", + "<22,86>": "", + "<22,87>": "", + "<22,88>": "", + "<22,89>": "", + "<22,90>": "", + "<22,91>": "", + "<22,92>": "", + "<22,93>": "", + "<22,94>": "", + "<22,95>": "", + "<22,96>": "", + "<22,97>": "", + "<22,98>": "", + "<22,99>": "", + "<22,100>": "", + "<22,101>": "", + "<22,102>": "", + "<22,103>": "", + "<22,104>": "", + "<22,105>": "", + "<22,106>": "", + "<22,107>": "", + "<22,108>": "" + }, + "<23>": { + "<23,1>": "CHB_ENABLE_AUTHENTICATION", + "<23,2>": "", + "<23,3>": "CHECKBOX", + "<23,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<23,5>": "179", + "<23,6>": "61:1", + "<23,7>": "141", + "<23,8>": "15", + "<23,9>": "Enable Authentication?", + "<23,10>": { + "<23,10,1>": "0x56000103", + "<23,10,2>": "0x0" + }, + "<23,11>": { + "<23,11,1>": "0x0", + "<23,11,2>": "0x80000000" + }, + "<23,12>": "15", + "<23,13>": { + "<23,13,1>": "-1", + "<23,13,2>": "-1", + "<23,13,3>": "" + }, + "<23,14>": "0", + "<23,15>": { + "<23,15,1>": { + "<23,15,1,1>": "Segoe UI", + "<23,15,1,2>": "-12", + "<23,15,1,3>": "400", + "<23,15,1,4>": "0", + "<23,15,1,5>": "0", + "<23,15,1,6>": "0", + "<23,15,1,7>": "0", + "<23,15,1,8>": "34", + "<23,15,1,9>": "0", + "<23,15,1,10>": "3", + "<23,15,1,11>": "2", + "<23,15,1,12>": "1", + "<23,15,1,13>": "0", + "<23,15,1,14>": "0" + } + }, + "<23,16>": "", + "<23,17>": "", + "<23,18>": { + "<23,18,1>": { + "<23,18,1,1>": "R", + "<23,18,1,2>": "EXECUTE", + "<23,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<23,18,1,4>": { + "<23,18,1,4,1>": "@SELF", + "<23,18,1,4,2>": "@EVENT", + "<23,18,1,4,3>": "@PARAM1", + "<23,18,1,4,4>": "@PARAM2", + "<23,18,1,4,5>": "@PARAM3", + "<23,18,1,4,6>": "@PARAM4", + "<23,18,1,4,7>": "@PARAM5", + "<23,18,1,4,8>": "@PARAM6" + }, + "<23,18,1,5>": "", + "<23,18,1,6>": "", + "<23,18,1,7>": "", + "<23,18,1,8>": "", + "<23,18,1,9>": "", + "<23,18,1,10>": "", + "<23,18,1,11>": "", + "<23,18,1,12>": "", + "<23,18,1,13>": "", + "<23,18,1,14>": "", + "<23,18,1,15>": "STPROC" + } + }, + "<23,19>": "CLICK", + "<23,20>": "", + "<23,21>": "", + "<23,22>": "", + "<23,23>": "", + "<23,24>": "", + "<23,25>": "", + "<23,26>": "", + "<23,27>": "", + "<23,28>": "", + "<23,29>": "", + "<23,30>": "", + "<23,31>": "", + "<23,32>": "", + "<23,33>": "", + "<23,34>": "", + "<23,35>": "", + "<23,36>": "0", + "<23,37>": "", + "<23,38>": "", + "<23,39>": "", + "<23,40>": "", + "<23,41>": "", + "<23,42>": "", + "<23,43>": "", + "<23,44>": "", + "<23,45>": "", + "<23,46>": "", + "<23,47>": "", + "<23,48>": "", + "<23,49>": "", + "<23,50>": "", + "<23,51>": "", + "<23,52>": "", + "<23,53>": "", + "<23,54>": "", + "<23,55>": "", + "<23,56>": "", + "<23,57>": "", + "<23,58>": "", + "<23,59>": "", + "<23,60>": "", + "<23,61>": "", + "<23,62>": "0", + "<23,63>": { + "<23,63,1>": "", + "<23,63,2>": "", + "<23,63,3>": "", + "<23,63,4>": "", + "<23,63,5>": "", + "<23,63,6>": "", + "<23,63,7>": "", + "<23,63,8>": "" + }, + "<23,64>": { + "<23,64,1>": "", + "<23,64,2>": "", + "<23,64,3>": "" + }, + "<23,65>": "-2", + "<23,66>": "", + "<23,67>": "", + "<23,68>": "", + "<23,69>": "", + "<23,70>": "", + "<23,71>": "", + "<23,72>": "", + "<23,73>": "", + "<23,74>": "", + "<23,75>": "", + "<23,76>": "", + "<23,77>": "", + "<23,78>": "", + "<23,79>": "", + "<23,80>": "", + "<23,81>": "", + "<23,82>": "", + "<23,83>": "", + "<23,84>": "", + "<23,85>": "", + "<23,86>": "", + "<23,87>": "", + "<23,88>": "", + "<23,89>": "", + "<23,90>": "0", + "<23,91>": "0", + "<23,92>": "", + "<23,93>": "", + "<23,94>": "", + "<23,95>": "", + "<23,96>": "", + "<23,97>": "", + "<23,98>": "", + "<23,99>": "", + "<23,100>": "", + "<23,101>": "", + "<23,102>": "", + "<23,103>": "", + "<23,104>": "", + "<23,105>": "", + "<23,106>": "", + "<23,107>": "", + "<23,108>": "" + }, + "<24>": { + "<24,1>": "CHB_ENABLE_HTTP_BASIC_AUTHENTICATION", + "<24,2>": "", + "<24,3>": "CHECKBOX", + "<24,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<24,5>": "197", + "<24,6>": "87:1", + "<24,7>": "204", + "<24,8>": "15", + "<24,9>": "Enable HTTP Basic Authentication?", + "<24,10>": { + "<24,10,1>": "0x56000103", + "<24,10,2>": "0x0" + }, + "<24,11>": { + "<24,11,1>": "0x0", + "<24,11,2>": "0x80000000" + }, + "<24,12>": "16", + "<24,13>": { + "<24,13,1>": "-1", + "<24,13,2>": "-1", + "<24,13,3>": "" + }, + "<24,14>": "0", + "<24,15>": { + "<24,15,1>": { + "<24,15,1,1>": "Segoe UI", + "<24,15,1,2>": "-12", + "<24,15,1,3>": "400", + "<24,15,1,4>": "0", + "<24,15,1,5>": "0", + "<24,15,1,6>": "0", + "<24,15,1,7>": "0", + "<24,15,1,8>": "34", + "<24,15,1,9>": "0", + "<24,15,1,10>": "3", + "<24,15,1,11>": "2", + "<24,15,1,12>": "1", + "<24,15,1,13>": "0", + "<24,15,1,14>": "0" + } + }, + "<24,16>": "", + "<24,17>": "", + "<24,18>": { + "<24,18,1>": { + "<24,18,1,1>": "R", + "<24,18,1,2>": "EXECUTE", + "<24,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<24,18,1,4>": { + "<24,18,1,4,1>": "@SELF", + "<24,18,1,4,2>": "@EVENT", + "<24,18,1,4,3>": "@PARAM1", + "<24,18,1,4,4>": "@PARAM2", + "<24,18,1,4,5>": "@PARAM3", + "<24,18,1,4,6>": "@PARAM4", + "<24,18,1,4,7>": "@PARAM5", + "<24,18,1,4,8>": "@PARAM6" + }, + "<24,18,1,5>": "", + "<24,18,1,6>": "", + "<24,18,1,7>": "", + "<24,18,1,8>": "", + "<24,18,1,9>": "", + "<24,18,1,10>": "", + "<24,18,1,11>": "", + "<24,18,1,12>": "", + "<24,18,1,13>": "", + "<24,18,1,14>": "", + "<24,18,1,15>": "STPROC" + } + }, + "<24,19>": "CLICK", + "<24,20>": "", + "<24,21>": "", + "<24,22>": "", + "<24,23>": "", + "<24,24>": "", + "<24,25>": "", + "<24,26>": "", + "<24,27>": "", + "<24,28>": "", + "<24,29>": "", + "<24,30>": "", + "<24,31>": "", + "<24,32>": "", + "<24,33>": "", + "<24,34>": "", + "<24,35>": "", + "<24,36>": "0", + "<24,37>": "", + "<24,38>": "", + "<24,39>": "", + "<24,40>": "", + "<24,41>": "", + "<24,42>": "", + "<24,43>": "", + "<24,44>": "", + "<24,45>": "", + "<24,46>": "", + "<24,47>": "", + "<24,48>": "", + "<24,49>": "", + "<24,50>": "", + "<24,51>": "", + "<24,52>": "", + "<24,53>": "", + "<24,54>": "", + "<24,55>": "", + "<24,56>": "", + "<24,57>": "", + "<24,58>": "", + "<24,59>": "", + "<24,60>": "", + "<24,61>": "", + "<24,62>": "0", + "<24,63>": { + "<24,63,1>": "", + "<24,63,2>": "", + "<24,63,3>": "", + "<24,63,4>": "", + "<24,63,5>": "", + "<24,63,6>": "", + "<24,63,7>": "", + "<24,63,8>": "" + }, + "<24,64>": { + "<24,64,1>": "", + "<24,64,2>": "", + "<24,64,3>": "" + }, + "<24,65>": "-2", + "<24,66>": "", + "<24,67>": "", + "<24,68>": "", + "<24,69>": "", + "<24,70>": "", + "<24,71>": "", + "<24,72>": "", + "<24,73>": "", + "<24,74>": "", + "<24,75>": "", + "<24,76>": "", + "<24,77>": "", + "<24,78>": "", + "<24,79>": "", + "<24,80>": "", + "<24,81>": "", + "<24,82>": "", + "<24,83>": "", + "<24,84>": "", + "<24,85>": "", + "<24,86>": "", + "<24,87>": "", + "<24,88>": "", + "<24,89>": "", + "<24,90>": "0", + "<24,91>": "0", + "<24,92>": "", + "<24,93>": "", + "<24,94>": "", + "<24,95>": "", + "<24,96>": "", + "<24,97>": "", + "<24,98>": "", + "<24,99>": "", + "<24,100>": "", + "<24,101>": "", + "<24,102>": "", + "<24,103>": "", + "<24,104>": "", + "<24,105>": "", + "<24,106>": "", + "<24,107>": "", + "<24,108>": "" + }, + "<25>": { + "<25,1>": "STA_NEW_PASSWORD_TIME_TO_LIVE", + "<25,2>": "", + "<25,3>": "STATIC", + "<25,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<25,5>": "216", + "<25,6>": "113:1", + "<25,7>": "150", + "<25,8>": "15", + "<25,9>": "New Password Time to Live:", + "<25,10>": { + "<25,10,1>": "0x56000000", + "<25,10,2>": "0x0" + }, + "<25,11>": { + "<25,11,1>": "0x0", + "<25,11,2>": "0x80000000" + }, + "<25,12>": "92", + "<25,13>": { + "<25,13,1>": "-1", + "<25,13,2>": "-1", + "<25,13,3>": "" + }, + "<25,14>": "0", + "<25,15>": { + "<25,15,1>": { + "<25,15,1,1>": "Segoe UI", + "<25,15,1,2>": "-12", + "<25,15,1,3>": "400", + "<25,15,1,4>": "0", + "<25,15,1,5>": "0", + "<25,15,1,6>": "0", + "<25,15,1,7>": "0", + "<25,15,1,8>": "34", + "<25,15,1,9>": "0", + "<25,15,1,10>": "3", + "<25,15,1,11>": "2", + "<25,15,1,12>": "1", + "<25,15,1,13>": "0", + "<25,15,1,14>": "0" + } + }, + "<25,16>": "", + "<25,17>": "", + "<25,18>": "", + "<25,19>": "", + "<25,20>": "", + "<25,21>": "", + "<25,22>": "", + "<25,23>": "", + "<25,24>": "", + "<25,25>": "", + "<25,26>": "", + "<25,27>": "", + "<25,28>": "<>", + "<25,29>": "<>", + "<25,30>": "", + "<25,31>": "", + "<25,32>": "", + "<25,33>": "", + "<25,34>": "", + "<25,35>": "", + "<25,36>": "", + "<25,37>": "", + "<25,38>": "", + "<25,39>": "", + "<25,40>": "", + "<25,41>": "", + "<25,42>": "", + "<25,43>": "", + "<25,44>": "", + "<25,45>": "", + "<25,46>": "", + "<25,47>": "", + "<25,48>": "", + "<25,49>": "", + "<25,50>": "", + "<25,51>": "", + "<25,52>": "", + "<25,53>": "", + "<25,54>": "", + "<25,55>": "", + "<25,56>": "", + "<25,57>": "", + "<25,58>": "", + "<25,59>": "", + "<25,60>": "", + "<25,61>": "", + "<25,62>": "0", + "<25,63>": { + "<25,63,1>": "", + "<25,63,2>": "", + "<25,63,3>": "", + "<25,63,4>": "", + "<25,63,5>": "", + "<25,63,6>": "", + "<25,63,7>": "", + "<25,63,8>": "" + }, + "<25,64>": { + "<25,64,1>": "", + "<25,64,2>": "", + "<25,64,3>": "" + }, + "<25,65>": "-2", + "<25,66>": "", + "<25,67>": "", + "<25,68>": "", + "<25,69>": "", + "<25,70>": "", + "<25,71>": "", + "<25,72>": "", + "<25,73>": "", + "<25,74>": "", + "<25,75>": "", + "<25,76>": "", + "<25,77>": "", + "<25,78>": "", + "<25,79>": "", + "<25,80>": "", + "<25,81>": "", + "<25,82>": "", + "<25,83>": "", + "<25,84>": "", + "<25,85>": "", + "<25,86>": "", + "<25,87>": "", + "<25,88>": "", + "<25,89>": "", + "<25,90>": "0", + "<25,91>": "0", + "<25,92>": "", + "<25,93>": "", + "<25,94>": "", + "<25,95>": "", + "<25,96>": "", + "<25,97>": "", + "<25,98>": "", + "<25,99>": "", + "<25,100>": "", + "<25,101>": "", + "<25,102>": "", + "<25,103>": "", + "<25,104>": "", + "<25,105>": "", + "<25,106>": "", + "<25,107>": "", + "<25,108>": "" + }, + "<26>": { + "<26,1>": "EDL_NEW_PASSWORD_TIME_TO_LIVE", + "<26,2>": "", + "<26,3>": "EDITFIELD", + "<26,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<26,5>": "408", + "<26,6>": "110:1", + "<26,7>": "228", + "<26,8>": "23", + "<26,9>": "", + "<26,10>": { + "<26,10,1>": "0x56000080", + "<26,10,2>": "0x200" + }, + "<26,11>": { + "<26,11,1>": "0x0", + "<26,11,2>": "0x80000000" + }, + "<26,12>": "17", + "<26,13>": { + "<26,13,1>": "-2", + "<26,13,2>": "-2", + "<26,13,3>": "" + }, + "<26,14>": "0", + "<26,15>": { + "<26,15,1>": { + "<26,15,1,1>": "Segoe UI", + "<26,15,1,2>": "-12", + "<26,15,1,3>": "400", + "<26,15,1,4>": "0", + "<26,15,1,5>": "0", + "<26,15,1,6>": "0", + "<26,15,1,7>": "0", + "<26,15,1,8>": "34", + "<26,15,1,9>": "0", + "<26,15,1,10>": "3", + "<26,15,1,11>": "2", + "<26,15,1,12>": "1", + "<26,15,1,13>": "0", + "<26,15,1,14>": "0" + } + }, + "<26,16>": "", + "<26,17>": "", + "<26,18>": "", + "<26,19>": "", + "<26,20>": "", + "<26,21>": "", + "<26,22>": "", + "<26,23>": "", + "<26,24>": "", + "<26,25>": "", + "<26,26>": "", + "<26,27>": "", + "<26,28>": "(MD0)", + "<26,29>": "MD0", + "<26,30>": "<>", + "<26,31>": "0", + "<26,32>": "", + "<26,33>": "", + "<26,34>": "", + "<26,35>": "", + "<26,36>": { + "<26,36,1>": "0", + "<26,36,2>": "0" + }, + "<26,37>": "", + "<26,38>": "", + "<26,39>": "", + "<26,40>": "", + "<26,41>": "", + "<26,42>": "", + "<26,43>": "", + "<26,44>": "", + "<26,45>": "", + "<26,46>": "", + "<26,47>": "", + "<26,48>": "", + "<26,49>": "", + "<26,50>": "", + "<26,51>": "", + "<26,52>": "", + "<26,53>": "", + "<26,54>": "", + "<26,55>": "", + "<26,56>": "", + "<26,57>": "", + "<26,58>": "", + "<26,59>": "", + "<26,60>": "", + "<26,61>": "", + "<26,62>": "0", + "<26,63>": "", + "<26,64>": "", + "<26,65>": "", + "<26,66>": "", + "<26,67>": "", + "<26,68>": "", + "<26,69>": "", + "<26,70>": "", + "<26,71>": "", + "<26,72>": "", + "<26,73>": "", + "<26,74>": "", + "<26,75>": "", + "<26,76>": "", + "<26,77>": "", + "<26,78>": "", + "<26,79>": "", + "<26,80>": "", + "<26,81>": "", + "<26,82>": "", + "<26,83>": "", + "<26,84>": "", + "<26,85>": "", + "<26,86>": "", + "<26,87>": "", + "<26,88>": "", + "<26,89>": "", + "<26,90>": "", + "<26,91>": "", + "<26,92>": "", + "<26,93>": "", + "<26,94>": "", + "<26,95>": "", + "<26,96>": "", + "<26,97>": "", + "<26,98>": "", + "<26,99>": "", + "<26,100>": "", + "<26,101>": "", + "<26,102>": "", + "<26,103>": "", + "<26,104>": "", + "<26,105>": "", + "<26,106>": "", + "<26,107>": "", + "<26,108>": "" + }, + "<27>": { + "<27,1>": "STA_OLD_PASSWORD_TIME_TO_LIVE", + "<27,2>": "", + "<27,3>": "STATIC", + "<27,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<27,5>": "216", + "<27,6>": "143:1", + "<27,7>": "148", + "<27,8>": "15", + "<27,9>": "Old Password Time to Live:", + "<27,10>": { + "<27,10,1>": "0x56000000", + "<27,10,2>": "0x0" + }, + "<27,11>": { + "<27,11,1>": "0x0", + "<27,11,2>": "0x80000000" + }, + "<27,12>": "93", + "<27,13>": { + "<27,13,1>": "-1", + "<27,13,2>": "-1", + "<27,13,3>": "" + }, + "<27,14>": "0", + "<27,15>": { + "<27,15,1>": { + "<27,15,1,1>": "Segoe UI", + "<27,15,1,2>": "-12", + "<27,15,1,3>": "400", + "<27,15,1,4>": "0", + "<27,15,1,5>": "0", + "<27,15,1,6>": "0", + "<27,15,1,7>": "0", + "<27,15,1,8>": "34", + "<27,15,1,9>": "0", + "<27,15,1,10>": "3", + "<27,15,1,11>": "2", + "<27,15,1,12>": "1", + "<27,15,1,13>": "0", + "<27,15,1,14>": "0" + } + }, + "<27,16>": "", + "<27,17>": "", + "<27,18>": "", + "<27,19>": "", + "<27,20>": "", + "<27,21>": "", + "<27,22>": "", + "<27,23>": "", + "<27,24>": "", + "<27,25>": "", + "<27,26>": "", + "<27,27>": "", + "<27,28>": "<>", + "<27,29>": "<>", + "<27,30>": "", + "<27,31>": "", + "<27,32>": "", + "<27,33>": "", + "<27,34>": "", + "<27,35>": "", + "<27,36>": "", + "<27,37>": "", + "<27,38>": "", + "<27,39>": "", + "<27,40>": "", + "<27,41>": "", + "<27,42>": "", + "<27,43>": "", + "<27,44>": "", + "<27,45>": "", + "<27,46>": "", + "<27,47>": "", + "<27,48>": "", + "<27,49>": "", + "<27,50>": "", + "<27,51>": "", + "<27,52>": "", + "<27,53>": "", + "<27,54>": "", + "<27,55>": "", + "<27,56>": "", + "<27,57>": "", + "<27,58>": "", + "<27,59>": "", + "<27,60>": "", + "<27,61>": "", + "<27,62>": "0", + "<27,63>": { + "<27,63,1>": "", + "<27,63,2>": "", + "<27,63,3>": "", + "<27,63,4>": "", + "<27,63,5>": "", + "<27,63,6>": "", + "<27,63,7>": "", + "<27,63,8>": "" + }, + "<27,64>": { + "<27,64,1>": "", + "<27,64,2>": "", + "<27,64,3>": "" + }, + "<27,65>": "-2", + "<27,66>": "", + "<27,67>": "", + "<27,68>": "", + "<27,69>": "", + "<27,70>": "", + "<27,71>": "", + "<27,72>": "", + "<27,73>": "", + "<27,74>": "", + "<27,75>": "", + "<27,76>": "", + "<27,77>": "", + "<27,78>": "", + "<27,79>": "", + "<27,80>": "", + "<27,81>": "", + "<27,82>": "", + "<27,83>": "", + "<27,84>": "", + "<27,85>": "", + "<27,86>": "", + "<27,87>": "", + "<27,88>": "", + "<27,89>": "", + "<27,90>": "0", + "<27,91>": "0", + "<27,92>": "", + "<27,93>": "", + "<27,94>": "", + "<27,95>": "", + "<27,96>": "", + "<27,97>": "", + "<27,98>": "", + "<27,99>": "", + "<27,100>": "", + "<27,101>": "", + "<27,102>": "", + "<27,103>": "", + "<27,104>": "", + "<27,105>": "", + "<27,106>": "", + "<27,107>": "", + "<27,108>": "" + }, + "<28>": { + "<28,1>": "EDL_OLD_PASSWORD_TIME_TO_LIVE", + "<28,2>": "", + "<28,3>": "EDITFIELD", + "<28,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<28,5>": "408", + "<28,6>": "140:1", + "<28,7>": "228", + "<28,8>": "23", + "<28,9>": "", + "<28,10>": { + "<28,10,1>": "0x56000080", + "<28,10,2>": "0x200" + }, + "<28,11>": { + "<28,11,1>": "0x0", + "<28,11,2>": "0x80000000" + }, + "<28,12>": "18", + "<28,13>": { + "<28,13,1>": "-2", + "<28,13,2>": "-2", + "<28,13,3>": "" + }, + "<28,14>": "0", + "<28,15>": { + "<28,15,1>": { + "<28,15,1,1>": "Segoe UI", + "<28,15,1,2>": "-12", + "<28,15,1,3>": "400", + "<28,15,1,4>": "0", + "<28,15,1,5>": "0", + "<28,15,1,6>": "0", + "<28,15,1,7>": "0", + "<28,15,1,8>": "34", + "<28,15,1,9>": "0", + "<28,15,1,10>": "3", + "<28,15,1,11>": "2", + "<28,15,1,12>": "1", + "<28,15,1,13>": "0", + "<28,15,1,14>": "0" + } + }, + "<28,16>": "", + "<28,17>": "", + "<28,18>": "", + "<28,19>": "", + "<28,20>": "", + "<28,21>": "", + "<28,22>": "", + "<28,23>": "", + "<28,24>": "", + "<28,25>": "", + "<28,26>": "", + "<28,27>": "", + "<28,28>": "(MD0)", + "<28,29>": "MD0", + "<28,30>": "<>", + "<28,31>": "0", + "<28,32>": "", + "<28,33>": "", + "<28,34>": "", + "<28,35>": "", + "<28,36>": { + "<28,36,1>": "0", + "<28,36,2>": "0" + }, + "<28,37>": "", + "<28,38>": "", + "<28,39>": "", + "<28,40>": "", + "<28,41>": "", + "<28,42>": "", + "<28,43>": "", + "<28,44>": "", + "<28,45>": "", + "<28,46>": "", + "<28,47>": "", + "<28,48>": "", + "<28,49>": "", + "<28,50>": "", + "<28,51>": "", + "<28,52>": "", + "<28,53>": "", + "<28,54>": "", + "<28,55>": "", + "<28,56>": "", + "<28,57>": "", + "<28,58>": "", + "<28,59>": "", + "<28,60>": "", + "<28,61>": "", + "<28,62>": "0", + "<28,63>": "", + "<28,64>": "", + "<28,65>": "", + "<28,66>": "", + "<28,67>": "", + "<28,68>": "", + "<28,69>": "", + "<28,70>": "", + "<28,71>": "", + "<28,72>": "", + "<28,73>": "", + "<28,74>": "", + "<28,75>": "", + "<28,76>": "", + "<28,77>": "", + "<28,78>": "", + "<28,79>": "", + "<28,80>": "", + "<28,81>": "", + "<28,82>": "", + "<28,83>": "", + "<28,84>": "", + "<28,85>": "", + "<28,86>": "", + "<28,87>": "", + "<28,88>": "", + "<28,89>": "", + "<28,90>": "", + "<28,91>": "", + "<28,92>": "", + "<28,93>": "", + "<28,94>": "", + "<28,95>": "", + "<28,96>": "", + "<28,97>": "", + "<28,98>": "", + "<28,99>": "", + "<28,100>": "", + "<28,101>": "", + "<28,102>": "", + "<28,103>": "", + "<28,104>": "", + "<28,105>": "", + "<28,106>": "", + "<28,107>": "", + "<28,108>": "" + }, + "<29>": { + "<29,1>": "STA_INVALID_PASSWORD_LIMIT", + "<29,2>": "", + "<29,3>": "STATIC", + "<29,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<29,5>": "216", + "<29,6>": "173:1", + "<29,7>": "122", + "<29,8>": "15", + "<29,9>": "Invalid Password Limit:", + "<29,10>": { + "<29,10,1>": "0x56000000", + "<29,10,2>": "0x0" + }, + "<29,11>": { + "<29,11,1>": "0x0", + "<29,11,2>": "0x80000000" + }, + "<29,12>": "94", + "<29,13>": { + "<29,13,1>": "-1", + "<29,13,2>": "-1", + "<29,13,3>": "" + }, + "<29,14>": "0", + "<29,15>": { + "<29,15,1>": { + "<29,15,1,1>": "Segoe UI", + "<29,15,1,2>": "-12", + "<29,15,1,3>": "400", + "<29,15,1,4>": "0", + "<29,15,1,5>": "0", + "<29,15,1,6>": "0", + "<29,15,1,7>": "0", + "<29,15,1,8>": "34", + "<29,15,1,9>": "0", + "<29,15,1,10>": "3", + "<29,15,1,11>": "2", + "<29,15,1,12>": "1", + "<29,15,1,13>": "0", + "<29,15,1,14>": "0" + } + }, + "<29,16>": "", + "<29,17>": "", + "<29,18>": "", + "<29,19>": "", + "<29,20>": "", + "<29,21>": "", + "<29,22>": "", + "<29,23>": "", + "<29,24>": "", + "<29,25>": "", + "<29,26>": "", + "<29,27>": "", + "<29,28>": "<>", + "<29,29>": "<>", + "<29,30>": "", + "<29,31>": "", + "<29,32>": "", + "<29,33>": "", + "<29,34>": "", + "<29,35>": "", + "<29,36>": "", + "<29,37>": "", + "<29,38>": "", + "<29,39>": "", + "<29,40>": "", + "<29,41>": "", + "<29,42>": "", + "<29,43>": "", + "<29,44>": "", + "<29,45>": "", + "<29,46>": "", + "<29,47>": "", + "<29,48>": "", + "<29,49>": "", + "<29,50>": "", + "<29,51>": "", + "<29,52>": "", + "<29,53>": "", + "<29,54>": "", + "<29,55>": "", + "<29,56>": "", + "<29,57>": "", + "<29,58>": "", + "<29,59>": "", + "<29,60>": "", + "<29,61>": "", + "<29,62>": "0", + "<29,63>": { + "<29,63,1>": "", + "<29,63,2>": "", + "<29,63,3>": "", + "<29,63,4>": "", + "<29,63,5>": "", + "<29,63,6>": "", + "<29,63,7>": "", + "<29,63,8>": "" + }, + "<29,64>": { + "<29,64,1>": "", + "<29,64,2>": "", + "<29,64,3>": "" + }, + "<29,65>": "-2", + "<29,66>": "", + "<29,67>": "", + "<29,68>": "", + "<29,69>": "", + "<29,70>": "", + "<29,71>": "", + "<29,72>": "", + "<29,73>": "", + "<29,74>": "", + "<29,75>": "", + "<29,76>": "", + "<29,77>": "", + "<29,78>": "", + "<29,79>": "", + "<29,80>": "", + "<29,81>": "", + "<29,82>": "", + "<29,83>": "", + "<29,84>": "", + "<29,85>": "", + "<29,86>": "", + "<29,87>": "", + "<29,88>": "", + "<29,89>": "", + "<29,90>": "0", + "<29,91>": "0", + "<29,92>": "", + "<29,93>": "", + "<29,94>": "", + "<29,95>": "", + "<29,96>": "", + "<29,97>": "", + "<29,98>": "", + "<29,99>": "", + "<29,100>": "", + "<29,101>": "", + "<29,102>": "", + "<29,103>": "", + "<29,104>": "", + "<29,105>": "", + "<29,106>": "", + "<29,107>": "", + "<29,108>": "" + }, + "<30>": { + "<30,1>": "EDL_INVALID_PASSWORD_LIMIT", + "<30,2>": "", + "<30,3>": "EDITFIELD", + "<30,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<30,5>": "408", + "<30,6>": "170:1", + "<30,7>": "228", + "<30,8>": "23", + "<30,9>": "", + "<30,10>": { + "<30,10,1>": "0x56000080", + "<30,10,2>": "0x200" + }, + "<30,11>": { + "<30,11,1>": "0x0", + "<30,11,2>": "0x80000000" + }, + "<30,12>": "19", + "<30,13>": { + "<30,13,1>": "-2", + "<30,13,2>": "-2", + "<30,13,3>": "" + }, + "<30,14>": "0", + "<30,15>": { + "<30,15,1>": { + "<30,15,1,1>": "Segoe UI", + "<30,15,1,2>": "-12", + "<30,15,1,3>": "400", + "<30,15,1,4>": "0", + "<30,15,1,5>": "0", + "<30,15,1,6>": "0", + "<30,15,1,7>": "0", + "<30,15,1,8>": "34", + "<30,15,1,9>": "0", + "<30,15,1,10>": "3", + "<30,15,1,11>": "2", + "<30,15,1,12>": "1", + "<30,15,1,13>": "0", + "<30,15,1,14>": "0" + } + }, + "<30,16>": "", + "<30,17>": "", + "<30,18>": "", + "<30,19>": "", + "<30,20>": "", + "<30,21>": "", + "<30,22>": "", + "<30,23>": "", + "<30,24>": "", + "<30,25>": "", + "<30,26>": "", + "<30,27>": "", + "<30,28>": "(MD0)", + "<30,29>": "MD0", + "<30,30>": "<>", + "<30,31>": "0", + "<30,32>": "", + "<30,33>": "", + "<30,34>": "", + "<30,35>": "", + "<30,36>": { + "<30,36,1>": "0", + "<30,36,2>": "0" + }, + "<30,37>": "", + "<30,38>": "", + "<30,39>": "", + "<30,40>": "", + "<30,41>": "", + "<30,42>": "", + "<30,43>": "", + "<30,44>": "", + "<30,45>": "", + "<30,46>": "", + "<30,47>": "", + "<30,48>": "", + "<30,49>": "", + "<30,50>": "", + "<30,51>": "", + "<30,52>": "", + "<30,53>": "", + "<30,54>": "", + "<30,55>": "", + "<30,56>": "", + "<30,57>": "", + "<30,58>": "", + "<30,59>": "", + "<30,60>": "", + "<30,61>": "", + "<30,62>": "0", + "<30,63>": "", + "<30,64>": "", + "<30,65>": "", + "<30,66>": "", + "<30,67>": "", + "<30,68>": "", + "<30,69>": "", + "<30,70>": "", + "<30,71>": "", + "<30,72>": "", + "<30,73>": "", + "<30,74>": "", + "<30,75>": "", + "<30,76>": "", + "<30,77>": "", + "<30,78>": "", + "<30,79>": "", + "<30,80>": "", + "<30,81>": "", + "<30,82>": "", + "<30,83>": "", + "<30,84>": "", + "<30,85>": "", + "<30,86>": "", + "<30,87>": "", + "<30,88>": "", + "<30,89>": "", + "<30,90>": "", + "<30,91>": "", + "<30,92>": "", + "<30,93>": "", + "<30,94>": "", + "<30,95>": "", + "<30,96>": "", + "<30,97>": "", + "<30,98>": "", + "<30,99>": "", + "<30,100>": "", + "<30,101>": "", + "<30,102>": "", + "<30,103>": "", + "<30,104>": "", + "<30,105>": "", + "<30,106>": "", + "<30,107>": "", + "<30,108>": "" + }, + "<31>": { + "<31,1>": "STA_TOTAL_INVALID_PASSWORD_ATTEMPTS", + "<31,2>": "", + "<31,3>": "STATIC", + "<31,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<31,5>": "216", + "<31,6>": "203:1", + "<31,7>": "174", + "<31,8>": "15", + "<31,9>": "Total Invalid Password Attempts:", + "<31,10>": { + "<31,10,1>": "0x56000000", + "<31,10,2>": "0x0" + }, + "<31,11>": { + "<31,11,1>": "0x0", + "<31,11,2>": "0x80000000" + }, + "<31,12>": "95", + "<31,13>": { + "<31,13,1>": "-1", + "<31,13,2>": "-1", + "<31,13,3>": "" + }, + "<31,14>": "0", + "<31,15>": { + "<31,15,1>": { + "<31,15,1,1>": "Segoe UI", + "<31,15,1,2>": "-12", + "<31,15,1,3>": "400", + "<31,15,1,4>": "0", + "<31,15,1,5>": "0", + "<31,15,1,6>": "0", + "<31,15,1,7>": "0", + "<31,15,1,8>": "34", + "<31,15,1,9>": "0", + "<31,15,1,10>": "3", + "<31,15,1,11>": "2", + "<31,15,1,12>": "1", + "<31,15,1,13>": "0", + "<31,15,1,14>": "0" + } + }, + "<31,16>": "", + "<31,17>": "", + "<31,18>": "", + "<31,19>": "", + "<31,20>": "", + "<31,21>": "", + "<31,22>": "", + "<31,23>": "", + "<31,24>": "", + "<31,25>": "", + "<31,26>": "", + "<31,27>": "", + "<31,28>": "<>", + "<31,29>": "<>", + "<31,30>": "", + "<31,31>": "", + "<31,32>": "", + "<31,33>": "", + "<31,34>": "", + "<31,35>": "", + "<31,36>": "", + "<31,37>": "", + "<31,38>": "", + "<31,39>": "", + "<31,40>": "", + "<31,41>": "", + "<31,42>": "", + "<31,43>": "", + "<31,44>": "", + "<31,45>": "", + "<31,46>": "", + "<31,47>": "", + "<31,48>": "", + "<31,49>": "", + "<31,50>": "", + "<31,51>": "", + "<31,52>": "", + "<31,53>": "", + "<31,54>": "", + "<31,55>": "", + "<31,56>": "", + "<31,57>": "", + "<31,58>": "", + "<31,59>": "", + "<31,60>": "", + "<31,61>": "", + "<31,62>": "0", + "<31,63>": { + "<31,63,1>": "", + "<31,63,2>": "", + "<31,63,3>": "", + "<31,63,4>": "", + "<31,63,5>": "", + "<31,63,6>": "", + "<31,63,7>": "", + "<31,63,8>": "" + }, + "<31,64>": { + "<31,64,1>": "", + "<31,64,2>": "", + "<31,64,3>": "" + }, + "<31,65>": "-2", + "<31,66>": "", + "<31,67>": "", + "<31,68>": "", + "<31,69>": "", + "<31,70>": "", + "<31,71>": "", + "<31,72>": "", + "<31,73>": "", + "<31,74>": "", + "<31,75>": "", + "<31,76>": "", + "<31,77>": "", + "<31,78>": "", + "<31,79>": "", + "<31,80>": "", + "<31,81>": "", + "<31,82>": "", + "<31,83>": "", + "<31,84>": "", + "<31,85>": "", + "<31,86>": "", + "<31,87>": "", + "<31,88>": "", + "<31,89>": "", + "<31,90>": "0", + "<31,91>": "0", + "<31,92>": "", + "<31,93>": "", + "<31,94>": "", + "<31,95>": "", + "<31,96>": "", + "<31,97>": "", + "<31,98>": "", + "<31,99>": "", + "<31,100>": "", + "<31,101>": "", + "<31,102>": "", + "<31,103>": "", + "<31,104>": "", + "<31,105>": "", + "<31,106>": "", + "<31,107>": "", + "<31,108>": "" + }, + "<32>": { + "<32,1>": "EDL_TOTAL_INVALID_PASSWORD_ATTEMPTS", + "<32,2>": "", + "<32,3>": "EDITFIELD", + "<32,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<32,5>": "408", + "<32,6>": "200:1", + "<32,7>": "176", + "<32,8>": "23", + "<32,9>": "", + "<32,10>": { + "<32,10,1>": "0x56000080", + "<32,10,2>": "0x200" + }, + "<32,11>": { + "<32,11,1>": "0x80000", + "<32,11,2>": "0x80000000" + }, + "<32,12>": "20", + "<32,13>": { + "<32,13,1>": "-2", + "<32,13,2>": "-2", + "<32,13,3>": "" + }, + "<32,14>": "8421504", + "<32,15>": { + "<32,15,1>": { + "<32,15,1,1>": "Segoe UI", + "<32,15,1,2>": "-12", + "<32,15,1,3>": "400", + "<32,15,1,4>": "0", + "<32,15,1,5>": "0", + "<32,15,1,6>": "0", + "<32,15,1,7>": "0", + "<32,15,1,8>": "34", + "<32,15,1,9>": "0", + "<32,15,1,10>": "3", + "<32,15,1,11>": "2", + "<32,15,1,12>": "1", + "<32,15,1,13>": "0", + "<32,15,1,14>": "0" + } + }, + "<32,16>": "", + "<32,17>": "", + "<32,18>": "", + "<32,19>": "", + "<32,20>": "", + "<32,21>": "", + "<32,22>": "", + "<32,23>": "", + "<32,24>": "", + "<32,25>": "", + "<32,26>": "", + "<32,27>": "", + "<32,28>": "(MD0)", + "<32,29>": "MD0", + "<32,30>": "<>", + "<32,31>": "0", + "<32,32>": "", + "<32,33>": "", + "<32,34>": "", + "<32,35>": "", + "<32,36>": { + "<32,36,1>": "0", + "<32,36,2>": "0" + }, + "<32,37>": "", + "<32,38>": "", + "<32,39>": "", + "<32,40>": "", + "<32,41>": "", + "<32,42>": "", + "<32,43>": "", + "<32,44>": "", + "<32,45>": "", + "<32,46>": "", + "<32,47>": "", + "<32,48>": "", + "<32,49>": "", + "<32,50>": "", + "<32,51>": "", + "<32,52>": "", + "<32,53>": "", + "<32,54>": "", + "<32,55>": "", + "<32,56>": "", + "<32,57>": "", + "<32,58>": "", + "<32,59>": "", + "<32,60>": "", + "<32,61>": "", + "<32,62>": "0", + "<32,63>": "", + "<32,64>": "", + "<32,65>": "", + "<32,66>": "", + "<32,67>": "", + "<32,68>": "", + "<32,69>": "", + "<32,70>": "", + "<32,71>": "", + "<32,72>": "", + "<32,73>": "", + "<32,74>": "", + "<32,75>": "", + "<32,76>": "", + "<32,77>": "", + "<32,78>": "", + "<32,79>": "", + "<32,80>": "", + "<32,81>": "", + "<32,82>": "", + "<32,83>": "", + "<32,84>": "", + "<32,85>": "", + "<32,86>": "", + "<32,87>": "", + "<32,88>": "", + "<32,89>": "", + "<32,90>": "", + "<32,91>": "", + "<32,92>": "", + "<32,93>": "", + "<32,94>": "", + "<32,95>": "", + "<32,96>": "", + "<32,97>": "", + "<32,98>": "", + "<32,99>": "", + "<32,100>": "", + "<32,101>": "", + "<32,102>": "", + "<32,103>": "", + "<32,104>": "", + "<32,105>": "", + "<32,106>": "", + "<32,107>": "", + "<32,108>": "" + }, + "<33>": { + "<33,1>": "PUB_RESET_TOTAL_INVALID_PASSWORD_ATTEMPTS", + "<33,2>": "", + "<33,3>": "PUSHBUTTON", + "<33,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<33,5>": "591", + "<33,6>": "200:1", + "<33,7>": "45", + "<33,8>": "23", + "<33,9>": "Reset", + "<33,10>": { + "<33,10,1>": "0x56002300", + "<33,10,2>": "0x0" + }, + "<33,11>": { + "<33,11,1>": "0x0", + "<33,11,2>": "0x80000000" + }, + "<33,12>": "21", + "<33,13>": { + "<33,13,1>": "16053492", + "<33,13,2>": "16053492", + "<33,13,3>": "0" + }, + "<33,14>": "0", + "<33,15>": { + "<33,15,1>": { + "<33,15,1,1>": "Segoe UI", + "<33,15,1,2>": "-11", + "<33,15,1,3>": "400", + "<33,15,1,4>": "0", + "<33,15,1,5>": "0", + "<33,15,1,6>": "0", + "<33,15,1,7>": "0", + "<33,15,1,8>": "34", + "<33,15,1,9>": "0", + "<33,15,1,10>": "3", + "<33,15,1,11>": "2", + "<33,15,1,12>": "1", + "<33,15,1,13>": "0", + "<33,15,1,14>": "0" + } + }, + "<33,16>": "", + "<33,17>": "", + "<33,18>": { + "<33,18,1>": { + "<33,18,1,1>": "R", + "<33,18,1,2>": "EXECUTE", + "<33,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<33,18,1,4>": { + "<33,18,1,4,1>": "@SELF", + "<33,18,1,4,2>": "@EVENT", + "<33,18,1,4,3>": "@PARAM1", + "<33,18,1,4,4>": "@PARAM2", + "<33,18,1,4,5>": "@PARAM3", + "<33,18,1,4,6>": "@PARAM4", + "<33,18,1,4,7>": "@PARAM5", + "<33,18,1,4,8>": "@PARAM6" + }, + "<33,18,1,5>": "", + "<33,18,1,6>": "", + "<33,18,1,7>": "", + "<33,18,1,8>": "", + "<33,18,1,9>": "", + "<33,18,1,10>": "", + "<33,18,1,11>": "", + "<33,18,1,12>": "", + "<33,18,1,13>": "", + "<33,18,1,14>": "", + "<33,18,1,15>": "STPROC" + } + }, + "<33,19>": "CLICK", + "<33,20>": "", + "<33,21>": "", + "<33,22>": "", + "<33,23>": "", + "<33,24>": "", + "<33,25>": "", + "<33,26>": "", + "<33,27>": "", + "<33,28>": "", + "<33,29>": "", + "<33,30>": "", + "<33,31>": "", + "<33,32>": "", + "<33,33>": "", + "<33,34>": "", + "<33,35>": "", + "<33,36>": "", + "<33,37>": "", + "<33,38>": "", + "<33,39>": "", + "<33,40>": "1", + "<33,41>": { + "<33,41,1>": "", + "<33,41,2>": "-1" + }, + "<33,42>": "", + "<33,43>": "", + "<33,44>": "", + "<33,45>": "", + "<33,46>": "", + "<33,47>": "", + "<33,48>": "", + "<33,49>": "", + "<33,50>": "", + "<33,51>": "", + "<33,52>": "", + "<33,53>": "", + "<33,54>": "", + "<33,55>": "", + "<33,56>": "", + "<33,57>": "", + "<33,58>": "", + "<33,59>": "", + "<33,60>": "", + "<33,61>": "", + "<33,62>": "0", + "<33,63>": "", + "<33,64>": { + "<33,64,1>": "-2", + "<33,64,2>": "-2", + "<33,64,3>": "0" + }, + "<33,65>": "-2", + "<33,66>": "", + "<33,67>": "", + "<33,68>": "", + "<33,69>": "", + "<33,70>": "", + "<33,71>": "", + "<33,72>": "", + "<33,73>": "", + "<33,74>": "", + "<33,75>": "", + "<33,76>": "", + "<33,77>": "", + "<33,78>": "", + "<33,79>": "", + "<33,80>": "", + "<33,81>": "", + "<33,82>": "", + "<33,83>": "", + "<33,84>": "", + "<33,85>": "", + "<33,86>": "", + "<33,87>": "", + "<33,88>": "", + "<33,89>": "", + "<33,90>": "0", + "<33,91>": "0", + "<33,92>": "", + "<33,93>": "", + "<33,94>": "", + "<33,95>": "", + "<33,96>": "", + "<33,97>": "", + "<33,98>": "", + "<33,99>": "", + "<33,100>": "", + "<33,101>": "", + "<33,102>": "", + "<33,103>": "", + "<33,104>": "", + "<33,105>": "", + "<33,106>": "", + "<33,107>": "", + "<33,108>": "" + }, + "<34>": { + "<34,1>": "STA_CONTAINMENT_ACTION", + "<34,2>": "", + "<34,3>": "STATIC", + "<34,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<34,5>": "216", + "<34,6>": "233:1", + "<34,7>": "112", + "<34,8>": "15", + "<34,9>": "Containment Action:", + "<34,10>": { + "<34,10,1>": "0x56000000", + "<34,10,2>": "0x0" + }, + "<34,11>": { + "<34,11,1>": "0x0", + "<34,11,2>": "0x80000000" + }, + "<34,12>": "96", + "<34,13>": { + "<34,13,1>": "-1", + "<34,13,2>": "-1", + "<34,13,3>": "" + }, + "<34,14>": "0", + "<34,15>": { + "<34,15,1>": { + "<34,15,1,1>": "Segoe UI", + "<34,15,1,2>": "-12", + "<34,15,1,3>": "400", + "<34,15,1,4>": "0", + "<34,15,1,5>": "0", + "<34,15,1,6>": "0", + "<34,15,1,7>": "0", + "<34,15,1,8>": "34", + "<34,15,1,9>": "0", + "<34,15,1,10>": "3", + "<34,15,1,11>": "2", + "<34,15,1,12>": "1", + "<34,15,1,13>": "0", + "<34,15,1,14>": "0" + } + }, + "<34,16>": "", + "<34,17>": "", + "<34,18>": "", + "<34,19>": "", + "<34,20>": "", + "<34,21>": "", + "<34,22>": "", + "<34,23>": "", + "<34,24>": "", + "<34,25>": "", + "<34,26>": "", + "<34,27>": "", + "<34,28>": "<>", + "<34,29>": "<>", + "<34,30>": "", + "<34,31>": "", + "<34,32>": "", + "<34,33>": "", + "<34,34>": "", + "<34,35>": "", + "<34,36>": "", + "<34,37>": "", + "<34,38>": "", + "<34,39>": "", + "<34,40>": "", + "<34,41>": "", + "<34,42>": "", + "<34,43>": "", + "<34,44>": "", + "<34,45>": "", + "<34,46>": "", + "<34,47>": "", + "<34,48>": "", + "<34,49>": "", + "<34,50>": "", + "<34,51>": "", + "<34,52>": "", + "<34,53>": "", + "<34,54>": "", + "<34,55>": "", + "<34,56>": "", + "<34,57>": "", + "<34,58>": "", + "<34,59>": "", + "<34,60>": "", + "<34,61>": "", + "<34,62>": "0", + "<34,63>": { + "<34,63,1>": "", + "<34,63,2>": "", + "<34,63,3>": "", + "<34,63,4>": "", + "<34,63,5>": "", + "<34,63,6>": "", + "<34,63,7>": "", + "<34,63,8>": "" + }, + "<34,64>": { + "<34,64,1>": "", + "<34,64,2>": "", + "<34,64,3>": "" + }, + "<34,65>": "-2", + "<34,66>": "", + "<34,67>": "", + "<34,68>": "", + "<34,69>": "", + "<34,70>": "", + "<34,71>": "", + "<34,72>": "", + "<34,73>": "", + "<34,74>": "", + "<34,75>": "", + "<34,76>": "", + "<34,77>": "", + "<34,78>": "", + "<34,79>": "", + "<34,80>": "", + "<34,81>": "", + "<34,82>": "", + "<34,83>": "", + "<34,84>": "", + "<34,85>": "", + "<34,86>": "", + "<34,87>": "", + "<34,88>": "", + "<34,89>": "", + "<34,90>": "0", + "<34,91>": "0", + "<34,92>": "", + "<34,93>": "", + "<34,94>": "", + "<34,95>": "", + "<34,96>": "", + "<34,97>": "", + "<34,98>": "", + "<34,99>": "", + "<34,100>": "", + "<34,101>": "", + "<34,102>": "", + "<34,103>": "", + "<34,104>": "", + "<34,105>": "", + "<34,106>": "", + "<34,107>": "", + "<34,108>": "" + }, + "<35>": { + "<35,1>": "COB_CONTAINMENT_ACTION", + "<35,2>": "", + "<35,3>": "COMBOBOX", + "<35,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<35,5>": "408", + "<35,6>": "230:1", + "<35,7>": "228", + "<35,8>": "60", + "<35,9>": "Quarantine Account", + "<35,10>": { + "<35,10,1>": "0x56000003", + "<35,10,2>": "0x0" + }, + "<35,11>": { + "<35,11,1>": "0x0", + "<35,11,2>": "0x80000C00" + }, + "<35,12>": "22", + "<35,13>": { + "<35,13,1>": "-2", + "<35,13,2>": "-2", + "<35,13,3>": "" + }, + "<35,14>": "0", + "<35,15>": { + "<35,15,1>": { + "<35,15,1,1>": "Segoe UI", + "<35,15,1,2>": "-12", + "<35,15,1,3>": "400", + "<35,15,1,4>": "0", + "<35,15,1,5>": "0", + "<35,15,1,6>": "0", + "<35,15,1,7>": "0", + "<35,15,1,8>": "34", + "<35,15,1,9>": "0", + "<35,15,1,10>": "3", + "<35,15,1,11>": "2", + "<35,15,1,12>": "1", + "<35,15,1,13>": "0", + "<35,15,1,14>": "0" + } + }, + "<35,16>": "", + "<35,17>": "", + "<35,18>": { + "<35,18,1>": { + "<35,18,1,1>": "R", + "<35,18,1,2>": "EXECUTE", + "<35,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<35,18,1,4>": { + "<35,18,1,4,1>": "@SELF", + "<35,18,1,4,2>": "@EVENT", + "<35,18,1,4,3>": "@PARAM1", + "<35,18,1,4,4>": "@PARAM2", + "<35,18,1,4,5>": "@PARAM3", + "<35,18,1,4,6>": "@PARAM4", + "<35,18,1,4,7>": "@PARAM5", + "<35,18,1,4,8>": "@PARAM6" + }, + "<35,18,1,5>": "", + "<35,18,1,6>": "", + "<35,18,1,7>": "", + "<35,18,1,8>": "", + "<35,18,1,9>": "", + "<35,18,1,10>": "", + "<35,18,1,11>": "", + "<35,18,1,12>": "", + "<35,18,1,13>": "", + "<35,18,1,14>": "", + "<35,18,1,15>": "STPROC" + } + }, + "<35,19>": "CHANGED", + "<35,20>": "", + "<35,21>": "", + "<35,22>": "", + "<35,23>": "", + "<35,24>": "", + "<35,25>": "", + "<35,26>": "", + "<35,27>": "", + "<35,28>": "<>", + "<35,29>": "<>", + "<35,30>": "<>", + "<35,31>": "0", + "<35,32>": "", + "<35,33>": "", + "<35,34>": "", + "<35,35>": { + "<35,35,1>": "Quarantine Account", + "<35,35,2>": "Disable Server" + }, + "<35,36>": "", + "<35,37>": "", + "<35,38>": "", + "<35,39>": "", + "<35,40>": "", + "<35,41>": "", + "<35,42>": "", + "<35,43>": "", + "<35,44>": "", + "<35,45>": "", + "<35,46>": "", + "<35,47>": "", + "<35,48>": "", + "<35,49>": "", + "<35,50>": "", + "<35,51>": "", + "<35,52>": "", + "<35,53>": "", + "<35,54>": "", + "<35,55>": "", + "<35,56>": "", + "<35,57>": "", + "<35,58>": "", + "<35,59>": "", + "<35,60>": "", + "<35,61>": "", + "<35,62>": "0", + "<35,63>": "", + "<35,64>": { + "<35,64,1>": "", + "<35,64,2>": "", + "<35,64,3>": "" + }, + "<35,65>": "-2", + "<35,66>": { + "<35,66,1>": "", + "<35,66,2>": "", + "<35,66,3>": "" + }, + "<35,67>": "-2", + "<35,68>": "", + "<35,69>": "", + "<35,70>": "", + "<35,71>": "", + "<35,72>": "", + "<35,73>": "", + "<35,74>": "", + "<35,75>": "", + "<35,76>": "", + "<35,77>": "", + "<35,78>": "", + "<35,79>": "", + "<35,80>": "", + "<35,81>": "", + "<35,82>": "", + "<35,83>": "", + "<35,84>": "", + "<35,85>": "", + "<35,86>": "", + "<35,87>": "", + "<35,88>": "", + "<35,89>": "", + "<35,90>": "", + "<35,91>": "", + "<35,92>": "", + "<35,93>": "", + "<35,94>": "", + "<35,95>": "", + "<35,96>": "", + "<35,97>": "", + "<35,98>": "", + "<35,99>": "", + "<35,100>": "", + "<35,101>": "", + "<35,102>": "", + "<35,103>": "", + "<35,104>": "", + "<35,105>": "", + "<35,106>": "", + "<35,107>": "", + "<35,108>": "" + }, + "<36>": { + "<36,1>": "STA_NON_AUTHENTICATED_PATHS", + "<36,2>": "", + "<36,3>": "STATIC", + "<36,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<36,5>": "197", + "<36,6>": "268:1", + "<36,7>": "143", + "<36,8>": "15", + "<36,9>": "Non-Authenticated Paths:", + "<36,10>": { + "<36,10,1>": "0x56000000", + "<36,10,2>": "0x0" + }, + "<36,11>": { + "<36,11,1>": "0x0", + "<36,11,2>": "0x80000000" + }, + "<36,12>": "97", + "<36,13>": { + "<36,13,1>": "-1", + "<36,13,2>": "-1", + "<36,13,3>": "" + }, + "<36,14>": "0", + "<36,15>": { + "<36,15,1>": { + "<36,15,1,1>": "Segoe UI", + "<36,15,1,2>": "-12", + "<36,15,1,3>": "400", + "<36,15,1,4>": "0", + "<36,15,1,5>": "0", + "<36,15,1,6>": "0", + "<36,15,1,7>": "0", + "<36,15,1,8>": "34", + "<36,15,1,9>": "0", + "<36,15,1,10>": "3", + "<36,15,1,11>": "2", + "<36,15,1,12>": "1", + "<36,15,1,13>": "0", + "<36,15,1,14>": "0" + } + }, + "<36,16>": "", + "<36,17>": "", + "<36,18>": "", + "<36,19>": "", + "<36,20>": "", + "<36,21>": "", + "<36,22>": "", + "<36,23>": "", + "<36,24>": "", + "<36,25>": "", + "<36,26>": "", + "<36,27>": "", + "<36,28>": "<>", + "<36,29>": "<>", + "<36,30>": "", + "<36,31>": "", + "<36,32>": "", + "<36,33>": "", + "<36,34>": "", + "<36,35>": "", + "<36,36>": "", + "<36,37>": "", + "<36,38>": "", + "<36,39>": "", + "<36,40>": "", + "<36,41>": "", + "<36,42>": "", + "<36,43>": "", + "<36,44>": "", + "<36,45>": "", + "<36,46>": "", + "<36,47>": "", + "<36,48>": "", + "<36,49>": "", + "<36,50>": "", + "<36,51>": "", + "<36,52>": "", + "<36,53>": "", + "<36,54>": "", + "<36,55>": "", + "<36,56>": "", + "<36,57>": "", + "<36,58>": "", + "<36,59>": "", + "<36,60>": "", + "<36,61>": "", + "<36,62>": "0", + "<36,63>": { + "<36,63,1>": "", + "<36,63,2>": "", + "<36,63,3>": "", + "<36,63,4>": "", + "<36,63,5>": "", + "<36,63,6>": "", + "<36,63,7>": "", + "<36,63,8>": "" + }, + "<36,64>": { + "<36,64,1>": "", + "<36,64,2>": "", + "<36,64,3>": "" + }, + "<36,65>": "-2", + "<36,66>": "", + "<36,67>": "", + "<36,68>": "", + "<36,69>": "", + "<36,70>": "", + "<36,71>": "", + "<36,72>": "", + "<36,73>": "", + "<36,74>": "", + "<36,75>": "", + "<36,76>": "", + "<36,77>": "", + "<36,78>": "", + "<36,79>": "", + "<36,80>": "", + "<36,81>": "", + "<36,82>": "", + "<36,83>": "", + "<36,84>": "", + "<36,85>": "", + "<36,86>": "", + "<36,87>": "", + "<36,88>": "", + "<36,89>": "", + "<36,90>": "0", + "<36,91>": "0", + "<36,92>": "", + "<36,93>": "", + "<36,94>": "", + "<36,95>": "", + "<36,96>": "", + "<36,97>": "", + "<36,98>": "", + "<36,99>": "", + "<36,100>": "", + "<36,101>": "", + "<36,102>": "", + "<36,103>": "", + "<36,104>": "", + "<36,105>": "", + "<36,106>": "", + "<36,107>": "", + "<36,108>": "" + }, + "<37>": { + "<37,1>": "OLE_EDT_NON_AUTHENTICATED_PATHS", + "<37,2>": "", + "<37,3>": "OLECONTROL.SRP.EditTable.1", + "<37,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<37,5>": "197", + "<37,6>": "288:1", + "<37,7>": "439", + "<37,8>": "92", + "<37,9>": "SRP.EditTable.1", + "<37,10>": { + "<37,10,1>": "0x56000000", + "<37,10,2>": "0x0" + }, + "<37,11>": { + "<37,11,1>": "0x0", + "<37,11,2>": "0x80000000" + }, + "<37,12>": "23", + "<37,13>": { + "<37,13,1>": "-2", + "<37,13,2>": "-2", + "<37,13,3>": "" + }, + "<37,14>": "0", + "<37,15>": { + "<37,15,1>": { + "<37,15,1,1>": "Segoe UI", + "<37,15,1,2>": "-12", + "<37,15,1,3>": "400", + "<37,15,1,4>": "0", + "<37,15,1,5>": "0", + "<37,15,1,6>": "0", + "<37,15,1,7>": "0", + "<37,15,1,8>": "34", + "<37,15,1,9>": "0", + "<37,15,1,10>": "3", + "<37,15,1,11>": "2", + "<37,15,1,12>": "1", + "<37,15,1,13>": "0", + "<37,15,1,14>": "0" + } + }, + "<37,16>": "", + "<37,17>": "", + "<37,18>": "", + "<37,19>": "", + "<37,20>": "", + "<37,21>": "", + "<37,22>": "", + "<37,23>": "", + "<37,24>": "", + "<37,25>": "", + "<37,26>": "", + "<37,27>": "", + "<37,28>": "", + "<37,29>": "", + "<37,30>": "", + "<37,31>": "", + "<37,32>": "", + "<37,33>": "", + "<37,34>": "", + "<37,35>": "", + "<37,36>": "0000000000000000", + "<37,37>": "", + "<37,38>": "", + "<37,39>": "", + "<37,40>": "", + "<37,41>": "", + "<37,42>": "", + "<37,43>": "", + "<37,44>": "", + "<37,45>": "", + "<37,46>": "", + "<37,47>": "", + "<37,48>": "", + "<37,49>": "", + "<37,50>": "", + "<37,51>": "", + "<37,52>": "", + "<37,53>": "", + "<37,54>": "", + "<37,55>": { + "<37,55,1>": "OLE.AllowXPTheme", + "<37,55,2>": "OLE.BlankRowManagement", + "<37,55,3>": "OLE.ComboDropDown", + "<37,55,4>": "OLE.DblClickToEdit", + "<37,55,5>": "OLE.EditContextMenu", + "<37,55,6>": "OLE.EditSelection", + "<37,55,7>": "OLE.EditText", + "<37,55,8>": "OLE.Focus", + "<37,55,9>": "OLE.HeaderRowCount", + "<37,55,10>": "OLE.Modified", + "<37,55,11>": "OLE.PassEnterKey", + "<37,55,12>": "OLE.ScrollBarsVisible", + "<37,55,13>": "OLE.SingleEscape", + "<37,55,14>": "OLE.TextRenderStyle" + }, + "<37,56>": { + "<37,56,1>": "0", + "<37,56,2>": "0|0", + "<37,56,3>": "0", + "<37,56,4>": "1", + "<37,56,5>": "1", + "<37,56,6>": "0|0", + "<37,56,7>": "", + "<37,56,8>": "0", + "<37,56,9>": "1", + "<37,56,10>": "0", + "<37,56,11>": "0", + "<37,56,12>": "Auto|Auto", + "<37,56,13>": "0", + "<37,56,14>": "EditField|Ellipses" + }, + "<37,57>": "", + "<37,58>": "", + "<37,59>": "", + "<37,60>": "", + "<37,61>": "", + "<37,62>": "", + "<37,63>": "", + "<37,64>": "", + "<37,65>": "", + "<37,66>": "", + "<37,67>": "", + "<37,68>": "", + "<37,69>": "", + "<37,70>": "", + "<37,71>": "", + "<37,72>": "", + "<37,73>": "", + "<37,74>": "", + "<37,75>": "", + "<37,76>": "", + "<37,77>": "", + "<37,78>": "", + "<37,79>": "", + "<37,80>": "", + "<37,81>": "", + "<37,82>": "", + "<37,83>": "", + "<37,84>": "", + "<37,85>": "", + "<37,86>": "", + "<37,87>": "", + "<37,88>": "", + "<37,89>": "", + "<37,90>": "", + "<37,91>": "", + "<37,92>": "", + "<37,93>": "", + "<37,94>": "", + "<37,95>": "", + "<37,96>": "", + "<37,97>": "", + "<37,98>": "", + "<37,99>": "", + "<37,100>": "", + "<37,101>": "", + "<37,102>": "", + "<37,103>": "", + "<37,104>": "", + "<37,105>": "", + "<37,106>": "", + "<37,107>": "", + "<37,108>": "" + }, + "<38>": { + "<38,1>": "STA_WHITELISTED_IPS", + "<38,2>": "", + "<38,3>": "STATIC", + "<38,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<38,5>": "197", + "<38,6>": "390:1", + "<38,7>": "82", + "<38,8>": "15", + "<38,9>": "Whitelisted IPs:", + "<38,10>": { + "<38,10,1>": "0x56000000", + "<38,10,2>": "0x0" + }, + "<38,11>": { + "<38,11,1>": "0x0", + "<38,11,2>": "0x80000000" + }, + "<38,12>": "98", + "<38,13>": { + "<38,13,1>": "-1", + "<38,13,2>": "-1", + "<38,13,3>": "" + }, + "<38,14>": "0", + "<38,15>": { + "<38,15,1>": { + "<38,15,1,1>": "Segoe UI", + "<38,15,1,2>": "-12", + "<38,15,1,3>": "400", + "<38,15,1,4>": "0", + "<38,15,1,5>": "0", + "<38,15,1,6>": "0", + "<38,15,1,7>": "0", + "<38,15,1,8>": "34", + "<38,15,1,9>": "0", + "<38,15,1,10>": "3", + "<38,15,1,11>": "2", + "<38,15,1,12>": "1", + "<38,15,1,13>": "0", + "<38,15,1,14>": "0" + } + }, + "<38,16>": "", + "<38,17>": "", + "<38,18>": "", + "<38,19>": "", + "<38,20>": "", + "<38,21>": "", + "<38,22>": "", + "<38,23>": "", + "<38,24>": "", + "<38,25>": "", + "<38,26>": "", + "<38,27>": "", + "<38,28>": "<>", + "<38,29>": "<>", + "<38,30>": "", + "<38,31>": "", + "<38,32>": "", + "<38,33>": "", + "<38,34>": "", + "<38,35>": "", + "<38,36>": "", + "<38,37>": "", + "<38,38>": "", + "<38,39>": "", + "<38,40>": "", + "<38,41>": "", + "<38,42>": "", + "<38,43>": "", + "<38,44>": "", + "<38,45>": "", + "<38,46>": "", + "<38,47>": "", + "<38,48>": "", + "<38,49>": "", + "<38,50>": "", + "<38,51>": "", + "<38,52>": "", + "<38,53>": "", + "<38,54>": "", + "<38,55>": "", + "<38,56>": "", + "<38,57>": "", + "<38,58>": "", + "<38,59>": "", + "<38,60>": "", + "<38,61>": "", + "<38,62>": "0", + "<38,63>": { + "<38,63,1>": "", + "<38,63,2>": "", + "<38,63,3>": "", + "<38,63,4>": "", + "<38,63,5>": "", + "<38,63,6>": "", + "<38,63,7>": "", + "<38,63,8>": "" + }, + "<38,64>": { + "<38,64,1>": "", + "<38,64,2>": "", + "<38,64,3>": "" + }, + "<38,65>": "-2", + "<38,66>": "", + "<38,67>": "", + "<38,68>": "", + "<38,69>": "", + "<38,70>": "", + "<38,71>": "", + "<38,72>": "", + "<38,73>": "", + "<38,74>": "", + "<38,75>": "", + "<38,76>": "", + "<38,77>": "", + "<38,78>": "", + "<38,79>": "", + "<38,80>": "", + "<38,81>": "", + "<38,82>": "", + "<38,83>": "", + "<38,84>": "", + "<38,85>": "", + "<38,86>": "", + "<38,87>": "", + "<38,88>": "", + "<38,89>": "", + "<38,90>": "0", + "<38,91>": "0", + "<38,92>": "", + "<38,93>": "", + "<38,94>": "", + "<38,95>": "", + "<38,96>": "", + "<38,97>": "", + "<38,98>": "", + "<38,99>": "", + "<38,100>": "", + "<38,101>": "", + "<38,102>": "", + "<38,103>": "", + "<38,104>": "", + "<38,105>": "", + "<38,106>": "", + "<38,107>": "", + "<38,108>": "" + }, + "<39>": { + "<39,1>": "OLE_EDT_WHITELISTED_IPS", + "<39,2>": "", + "<39,3>": "OLECONTROL.SRP.EditTable.1", + "<39,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<39,5>": "197", + "<39,6>": "410:1", + "<39,7>": "439", + "<39,8>": "74", + "<39,9>": "SRP.EditTable.1", + "<39,10>": { + "<39,10,1>": "0x56000000", + "<39,10,2>": "0x0" + }, + "<39,11>": { + "<39,11,1>": "0x0", + "<39,11,2>": "0x80000000" + }, + "<39,12>": "24", + "<39,13>": { + "<39,13,1>": "-2", + "<39,13,2>": "-2", + "<39,13,3>": "" + }, + "<39,14>": "0", + "<39,15>": { + "<39,15,1>": { + "<39,15,1,1>": "Segoe UI", + "<39,15,1,2>": "-12", + "<39,15,1,3>": "400", + "<39,15,1,4>": "0", + "<39,15,1,5>": "0", + "<39,15,1,6>": "0", + "<39,15,1,7>": "0", + "<39,15,1,8>": "34", + "<39,15,1,9>": "0", + "<39,15,1,10>": "3", + "<39,15,1,11>": "2", + "<39,15,1,12>": "1", + "<39,15,1,13>": "0", + "<39,15,1,14>": "0" + } + }, + "<39,16>": "", + "<39,17>": "", + "<39,18>": "", + "<39,19>": "", + "<39,20>": "", + "<39,21>": "", + "<39,22>": "", + "<39,23>": "", + "<39,24>": "", + "<39,25>": "", + "<39,26>": "", + "<39,27>": "", + "<39,28>": "", + "<39,29>": "", + "<39,30>": "", + "<39,31>": "", + "<39,32>": "", + "<39,33>": "", + "<39,34>": "", + "<39,35>": "", + "<39,36>": "0000000000000000", + "<39,37>": "", + "<39,38>": "", + "<39,39>": "", + "<39,40>": "", + "<39,41>": "", + "<39,42>": "", + "<39,43>": "", + "<39,44>": "", + "<39,45>": "", + "<39,46>": "", + "<39,47>": "", + "<39,48>": "", + "<39,49>": "", + "<39,50>": "", + "<39,51>": "", + "<39,52>": "", + "<39,53>": "", + "<39,54>": "", + "<39,55>": { + "<39,55,1>": "OLE.AllowXPTheme", + "<39,55,2>": "OLE.BlankRowManagement", + "<39,55,3>": "OLE.ComboDropDown", + "<39,55,4>": "OLE.DblClickToEdit", + "<39,55,5>": "OLE.EditContextMenu", + "<39,55,6>": "OLE.EditSelection", + "<39,55,7>": "OLE.EditText", + "<39,55,8>": "OLE.Focus", + "<39,55,9>": "OLE.HeaderRowCount", + "<39,55,10>": "OLE.Modified", + "<39,55,11>": "OLE.PassEnterKey", + "<39,55,12>": "OLE.ScrollBarsVisible", + "<39,55,13>": "OLE.SingleEscape", + "<39,55,14>": "OLE.TextRenderStyle" + }, + "<39,56>": { + "<39,56,1>": "0", + "<39,56,2>": "0|0", + "<39,56,3>": "0", + "<39,56,4>": "1", + "<39,56,5>": "1", + "<39,56,6>": "0|0", + "<39,56,7>": "", + "<39,56,8>": "0", + "<39,56,9>": "1", + "<39,56,10>": "0", + "<39,56,11>": "0", + "<39,56,12>": "Auto|Auto", + "<39,56,13>": "0", + "<39,56,14>": "EditField|Ellipses" + }, + "<39,57>": "", + "<39,58>": "", + "<39,59>": "", + "<39,60>": "", + "<39,61>": "", + "<39,62>": "", + "<39,63>": "", + "<39,64>": "", + "<39,65>": "", + "<39,66>": "", + "<39,67>": "", + "<39,68>": "", + "<39,69>": "", + "<39,70>": "", + "<39,71>": "", + "<39,72>": "", + "<39,73>": "", + "<39,74>": "", + "<39,75>": "", + "<39,76>": "", + "<39,77>": "", + "<39,78>": "", + "<39,79>": "", + "<39,80>": "", + "<39,81>": "", + "<39,82>": "", + "<39,83>": "", + "<39,84>": "", + "<39,85>": "", + "<39,86>": "", + "<39,87>": "", + "<39,88>": "", + "<39,89>": "", + "<39,90>": "", + "<39,91>": "", + "<39,92>": "", + "<39,93>": "", + "<39,94>": "", + "<39,95>": "", + "<39,96>": "", + "<39,97>": "", + "<39,98>": "", + "<39,99>": "", + "<39,100>": "", + "<39,101>": "", + "<39,102>": "", + "<39,103>": "", + "<39,104>": "", + "<39,105>": "", + "<39,106>": "", + "<39,107>": "", + "<39,108>": "" + }, + "<40>": { + "<40,1>": "RAG_WHITELISTED_IPS", + "<40,2>": "", + "<40,3>": "RADIOGROUP", + "<40,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<40,5>": "197", + "<40,6>": "484:1", + "<40,7>": "338", + "<40,8>": "18", + "<40,9>": "", + "<40,10>": { + "<40,10,1>": "0x56000000", + "<40,10,2>": "0x0" + }, + "<40,11>": { + "<40,11,1>": "0x210", + "<40,11,2>": "0x80000000" + }, + "<40,12>": "25", + "<40,13>": { + "<40,13,1>": "-1", + "<40,13,2>": "-1", + "<40,13,3>": "" + }, + "<40,14>": "0", + "<40,15>": { + "<40,15,1>": { + "<40,15,1,1>": "Segoe UI", + "<40,15,1,2>": "-12", + "<40,15,1,3>": "400", + "<40,15,1,4>": "0", + "<40,15,1,5>": "0", + "<40,15,1,6>": "0", + "<40,15,1,7>": "0", + "<40,15,1,8>": "34", + "<40,15,1,9>": "0", + "<40,15,1,10>": "3", + "<40,15,1,11>": "2", + "<40,15,1,12>": "1", + "<40,15,1,13>": "0", + "<40,15,1,14>": "0" + } + }, + "<40,16>": "", + "<40,17>": "", + "<40,18>": "", + "<40,19>": "", + "<40,20>": "", + "<40,21>": "", + "<40,22>": "", + "<40,23>": "", + "<40,24>": "", + "<40,25>": "", + "<40,26>": "", + "<40,27>": "", + "<40,28>": "", + "<40,29>": "", + "<40,30>": "", + "<40,31>": "", + "<40,32>": "", + "<40,33>": "", + "<40,34>": "", + "<40,35>": { + "<40,35,1>": "1", + "<40,35,2>": "2" + }, + "<40,36>": "1", + "<40,37>": "", + "<40,38>": "", + "<40,39>": "", + "<40,40>": "", + "<40,41>": "", + "<40,42>": "", + "<40,43>": "", + "<40,44>": { + "<40,44,1>": "Only allow Whitelisted IPs", + "<40,44,2>": "Always allow Whitelisted IPs" + }, + "<40,45>": "", + "<40,46>": "", + "<40,47>": "", + "<40,48>": "", + "<40,49>": "", + "<40,50>": "", + "<40,51>": "", + "<40,52>": "", + "<40,53>": "", + "<40,54>": "", + "<40,55>": "", + "<40,56>": "", + "<40,57>": "", + "<40,58>": "", + "<40,59>": "", + "<40,60>": "", + "<40,61>": "", + "<40,62>": "0", + "<40,63>": "", + "<40,64>": { + "<40,64,1>": "", + "<40,64,2>": "", + "<40,64,3>": "" + }, + "<40,65>": "-2", + "<40,66>": "", + "<40,67>": "", + "<40,68>": "", + "<40,69>": "", + "<40,70>": "", + "<40,71>": "", + "<40,72>": "", + "<40,73>": "", + "<40,74>": "", + "<40,75>": "", + "<40,76>": "", + "<40,77>": "", + "<40,78>": "", + "<40,79>": "", + "<40,80>": "", + "<40,81>": "", + "<40,82>": "", + "<40,83>": "", + "<40,84>": "", + "<40,85>": "", + "<40,86>": "", + "<40,87>": "", + "<40,88>": "", + "<40,89>": "", + "<40,90>": "0", + "<40,91>": "0", + "<40,92>": "", + "<40,93>": "", + "<40,94>": "", + "<40,95>": "", + "<40,96>": "", + "<40,97>": "", + "<40,98>": "", + "<40,99>": "", + "<40,100>": "", + "<40,101>": "", + "<40,102>": "", + "<40,103>": "", + "<40,104>": "", + "<40,105>": "", + "<40,106>": "", + "<40,107>": "", + "<40,108>": "" + }, + "<41>": { + "<41,1>": "STA_BANNED_IPS", + "<41,2>": "", + "<41,3>": "STATIC", + "<41,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<41,5>": "197", + "<41,6>": "511:1", + "<41,7>": "82", + "<41,8>": "15", + "<41,9>": "Banned IPs:", + "<41,10>": { + "<41,10,1>": "0x56000000", + "<41,10,2>": "0x0" + }, + "<41,11>": { + "<41,11,1>": "0x0", + "<41,11,2>": "0x80000000" + }, + "<41,12>": "99", + "<41,13>": { + "<41,13,1>": "-1", + "<41,13,2>": "-1", + "<41,13,3>": "" + }, + "<41,14>": "0", + "<41,15>": { + "<41,15,1>": { + "<41,15,1,1>": "Segoe UI", + "<41,15,1,2>": "-12", + "<41,15,1,3>": "400", + "<41,15,1,4>": "0", + "<41,15,1,5>": "0", + "<41,15,1,6>": "0", + "<41,15,1,7>": "0", + "<41,15,1,8>": "34", + "<41,15,1,9>": "0", + "<41,15,1,10>": "3", + "<41,15,1,11>": "2", + "<41,15,1,12>": "1", + "<41,15,1,13>": "0", + "<41,15,1,14>": "0" + } + }, + "<41,16>": "", + "<41,17>": "", + "<41,18>": "", + "<41,19>": "", + "<41,20>": "", + "<41,21>": "", + "<41,22>": "", + "<41,23>": "", + "<41,24>": "", + "<41,25>": "", + "<41,26>": "", + "<41,27>": "", + "<41,28>": "<>", + "<41,29>": "<>", + "<41,30>": "", + "<41,31>": "", + "<41,32>": "", + "<41,33>": "", + "<41,34>": "", + "<41,35>": "", + "<41,36>": "", + "<41,37>": "", + "<41,38>": "", + "<41,39>": "", + "<41,40>": "", + "<41,41>": "", + "<41,42>": "", + "<41,43>": "", + "<41,44>": "", + "<41,45>": "", + "<41,46>": "", + "<41,47>": "", + "<41,48>": "", + "<41,49>": "", + "<41,50>": "", + "<41,51>": "", + "<41,52>": "", + "<41,53>": "", + "<41,54>": "", + "<41,55>": "", + "<41,56>": "", + "<41,57>": "", + "<41,58>": "", + "<41,59>": "", + "<41,60>": "", + "<41,61>": "", + "<41,62>": "0", + "<41,63>": { + "<41,63,1>": "", + "<41,63,2>": "", + "<41,63,3>": "", + "<41,63,4>": "", + "<41,63,5>": "", + "<41,63,6>": "", + "<41,63,7>": "", + "<41,63,8>": "" + }, + "<41,64>": { + "<41,64,1>": "", + "<41,64,2>": "", + "<41,64,3>": "" + }, + "<41,65>": "-2", + "<41,66>": "", + "<41,67>": "", + "<41,68>": "", + "<41,69>": "", + "<41,70>": "", + "<41,71>": "", + "<41,72>": "", + "<41,73>": "", + "<41,74>": "", + "<41,75>": "", + "<41,76>": "", + "<41,77>": "", + "<41,78>": "", + "<41,79>": "", + "<41,80>": "", + "<41,81>": "", + "<41,82>": "", + "<41,83>": "", + "<41,84>": "", + "<41,85>": "", + "<41,86>": "", + "<41,87>": "", + "<41,88>": "", + "<41,89>": "", + "<41,90>": "0", + "<41,91>": "0", + "<41,92>": "", + "<41,93>": "", + "<41,94>": "", + "<41,95>": "", + "<41,96>": "", + "<41,97>": "", + "<41,98>": "", + "<41,99>": "", + "<41,100>": "", + "<41,101>": "", + "<41,102>": "", + "<41,103>": "", + "<41,104>": "", + "<41,105>": "", + "<41,106>": "", + "<41,107>": "", + "<41,108>": "" + }, + "<42>": { + "<42,1>": "OLE_EDT_BANNED_IPS", + "<42,2>": "", + "<42,3>": "OLECONTROL.SRP.EditTable.1", + "<42,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<42,5>": "197", + "<42,6>": "531:1", + "<42,7>": "439", + "<42,8>": "74", + "<42,9>": "SRP.EditTable.1", + "<42,10>": { + "<42,10,1>": "0x56000000", + "<42,10,2>": "0x0" + }, + "<42,11>": { + "<42,11,1>": "0x0", + "<42,11,2>": "0x80000000" + }, + "<42,12>": "26", + "<42,13>": { + "<42,13,1>": "-2", + "<42,13,2>": "-2", + "<42,13,3>": "" + }, + "<42,14>": "0", + "<42,15>": { + "<42,15,1>": { + "<42,15,1,1>": "Segoe UI", + "<42,15,1,2>": "-12", + "<42,15,1,3>": "400", + "<42,15,1,4>": "0", + "<42,15,1,5>": "0", + "<42,15,1,6>": "0", + "<42,15,1,7>": "0", + "<42,15,1,8>": "34", + "<42,15,1,9>": "0", + "<42,15,1,10>": "3", + "<42,15,1,11>": "2", + "<42,15,1,12>": "1", + "<42,15,1,13>": "0", + "<42,15,1,14>": "0" + } + }, + "<42,16>": "", + "<42,17>": "", + "<42,18>": "", + "<42,19>": "", + "<42,20>": "", + "<42,21>": "", + "<42,22>": "", + "<42,23>": "", + "<42,24>": "", + "<42,25>": "", + "<42,26>": "", + "<42,27>": "", + "<42,28>": "", + "<42,29>": "", + "<42,30>": "", + "<42,31>": "", + "<42,32>": "", + "<42,33>": "", + "<42,34>": "", + "<42,35>": "", + "<42,36>": "0000000000000000", + "<42,37>": "", + "<42,38>": "", + "<42,39>": "", + "<42,40>": "", + "<42,41>": "", + "<42,42>": "", + "<42,43>": "", + "<42,44>": "", + "<42,45>": "", + "<42,46>": "", + "<42,47>": "", + "<42,48>": "", + "<42,49>": "", + "<42,50>": "", + "<42,51>": "", + "<42,52>": "", + "<42,53>": "", + "<42,54>": "", + "<42,55>": { + "<42,55,1>": "OLE.AllowXPTheme", + "<42,55,2>": "OLE.BlankRowManagement", + "<42,55,3>": "OLE.ComboDropDown", + "<42,55,4>": "OLE.DblClickToEdit", + "<42,55,5>": "OLE.EditContextMenu", + "<42,55,6>": "OLE.EditSelection", + "<42,55,7>": "OLE.EditText", + "<42,55,8>": "OLE.Focus", + "<42,55,9>": "OLE.HeaderRowCount", + "<42,55,10>": "OLE.Modified", + "<42,55,11>": "OLE.PassEnterKey", + "<42,55,12>": "OLE.ScrollBarsVisible", + "<42,55,13>": "OLE.SingleEscape", + "<42,55,14>": "OLE.TextRenderStyle" + }, + "<42,56>": { + "<42,56,1>": "0", + "<42,56,2>": "0|0", + "<42,56,3>": "0", + "<42,56,4>": "1", + "<42,56,5>": "1", + "<42,56,6>": "0|0", + "<42,56,7>": "", + "<42,56,8>": "0", + "<42,56,9>": "1", + "<42,56,10>": "0", + "<42,56,11>": "0", + "<42,56,12>": "Auto|Auto", + "<42,56,13>": "0", + "<42,56,14>": "EditField|Ellipses" + }, + "<42,57>": "", + "<42,58>": "", + "<42,59>": "", + "<42,60>": "", + "<42,61>": "", + "<42,62>": "", + "<42,63>": "", + "<42,64>": "", + "<42,65>": "", + "<42,66>": "", + "<42,67>": "", + "<42,68>": "", + "<42,69>": "", + "<42,70>": "", + "<42,71>": "", + "<42,72>": "", + "<42,73>": "", + "<42,74>": "", + "<42,75>": "", + "<42,76>": "", + "<42,77>": "", + "<42,78>": "", + "<42,79>": "", + "<42,80>": "", + "<42,81>": "", + "<42,82>": "", + "<42,83>": "", + "<42,84>": "", + "<42,85>": "", + "<42,86>": "", + "<42,87>": "", + "<42,88>": "", + "<42,89>": "", + "<42,90>": "", + "<42,91>": "", + "<42,92>": "", + "<42,93>": "", + "<42,94>": "", + "<42,95>": "", + "<42,96>": "", + "<42,97>": "", + "<42,98>": "", + "<42,99>": "", + "<42,100>": "", + "<42,101>": "", + "<42,102>": "", + "<42,103>": "", + "<42,104>": "", + "<42,105>": "", + "<42,106>": "", + "<42,107>": "", + "<42,108>": "" + }, + "<43>": { + "<43,1>": "OLE_TRE_RESOURCES", + "<43,2>": "", + "<43,3>": "OLECONTROL.SRP.Tree.1", + "<43,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<43,5>": "189", + "<43,6>": "94:2", + "<43,7>": "-239", + "<43,8>": "-106", + "<43,9>": "SRP.Tree.1", + "<43,10>": { + "<43,10,1>": "0x56000000", + "<43,10,2>": "0x0" + }, + "<43,11>": { + "<43,11,1>": "0xC000", + "<43,11,2>": "0x80000000" + }, + "<43,12>": "27", + "<43,13>": { + "<43,13,1>": "-2", + "<43,13,2>": "-2", + "<43,13,3>": "" + }, + "<43,14>": "0", + "<43,15>": { + "<43,15,1>": { + "<43,15,1,1>": "Segoe UI", + "<43,15,1,2>": "-12", + "<43,15,1,3>": "400", + "<43,15,1,4>": "0", + "<43,15,1,5>": "0", + "<43,15,1,6>": "0", + "<43,15,1,7>": "0", + "<43,15,1,8>": "34", + "<43,15,1,9>": "0", + "<43,15,1,10>": "3", + "<43,15,1,11>": "2", + "<43,15,1,12>": "1", + "<43,15,1,13>": "0", + "<43,15,1,14>": "0" + } + }, + "<43,16>": "", + "<43,17>": "", + "<43,18>": { + "<43,18,1>": { + "<43,18,1,1>": "X", + "<43,18,1,2>": "EXECUTE", + "<43,18,1,3>": "OBJ_CALL_EVENT", + "<43,18,1,4>": { + "<43,18,1,4,1>": "@SELF", + "<43,18,1,4,2>": "@EVENT", + "<43,18,1,4,3>": "@PARAM1", + "<43,18,1,4,4>": "@PARAM2", + "<43,18,1,4,5>": "@PARAM3", + "<43,18,1,4,6>": "@PARAM4", + "<43,18,1,4,7>": "@PARAM5", + "<43,18,1,4,8>": "@PARAM6" + }, + "<43,18,1,5>": "", + "<43,18,1,6>": "", + "<43,18,1,7>": "", + "<43,18,1,8>": "", + "<43,18,1,9>": "", + "<43,18,1,10>": "", + "<43,18,1,11>": "", + "<43,18,1,12>": "", + "<43,18,1,13>": "", + "<43,18,1,14>": "", + "<43,18,1,15>": "COMM", + "<43,18,1,16>": "0" + } + }, + "<43,19>": "OLE", + "<43,20>": "", + "<43,21>": "", + "<43,22>": "", + "<43,23>": "", + "<43,24>": "", + "<43,25>": "", + "<43,26>": "", + "<43,27>": "", + "<43,28>": "", + "<43,29>": "", + "<43,30>": "", + "<43,31>": "", + "<43,32>": "", + "<43,33>": "", + "<43,34>": "", + "<43,35>": "", + "<43,36>": "0100000000000000", + "<43,37>": "", + "<43,38>": "", + "<43,39>": "", + "<43,40>": "", + "<43,41>": "", + "<43,42>": "", + "<43,43>": "", + "<43,44>": "", + "<43,45>": "", + "<43,46>": "", + "<43,47>": "", + "<43,48>": "", + "<43,49>": "", + "<43,50>": "", + "<43,51>": "", + "<43,52>": "", + "<43,53>": "", + "<43,54>": "", + "<43,55>": "OLE.Border", + "<43,56>": "XP", + "<43,57>": "", + "<43,58>": "", + "<43,59>": "", + "<43,60>": "", + "<43,61>": "", + "<43,62>": "", + "<43,63>": "", + "<43,64>": "", + "<43,65>": "", + "<43,66>": "", + "<43,67>": "", + "<43,68>": "", + "<43,69>": "", + "<43,70>": "", + "<43,71>": "", + "<43,72>": "", + "<43,73>": "", + "<43,74>": "", + "<43,75>": "", + "<43,76>": "", + "<43,77>": "", + "<43,78>": "", + "<43,79>": "", + "<43,80>": "", + "<43,81>": "", + "<43,82>": "", + "<43,83>": "", + "<43,84>": "", + "<43,85>": "", + "<43,86>": "", + "<43,87>": "", + "<43,88>": "", + "<43,89>": "", + "<43,90>": "", + "<43,91>": "", + "<43,92>": "", + "<43,93>": "", + "<43,94>": "", + "<43,95>": "", + "<43,96>": "", + "<43,97>": "", + "<43,98>": "", + "<43,99>": "", + "<43,100>": "", + "<43,101>": "", + "<43,102>": "", + "<43,103>": "", + "<43,104>": "", + "<43,105>": "", + "<43,106>": "", + "<43,107>": "", + "<43,108>": "" + }, + "<44>": { + "<44,1>": "STA_RESOURCE_TITLE", + "<44,2>": "", + "<44,3>": "STATIC", + "<44,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<44,5>": "-209", + "<44,6>": "91:2", + "<44,7>": "25", + "<44,8>": "15", + "<44,9>": "Title:", + "<44,10>": { + "<44,10,1>": "0x56000000", + "<44,10,2>": "0x0" + }, + "<44,11>": { + "<44,11,1>": "0x1000", + "<44,11,2>": "0x80000000" + }, + "<44,12>": "100", + "<44,13>": { + "<44,13,1>": "-1", + "<44,13,2>": "-1", + "<44,13,3>": "" + }, + "<44,14>": "0", + "<44,15>": { + "<44,15,1>": { + "<44,15,1,1>": "Segoe UI", + "<44,15,1,2>": "-12", + "<44,15,1,3>": "400", + "<44,15,1,4>": "0", + "<44,15,1,5>": "0", + "<44,15,1,6>": "0", + "<44,15,1,7>": "0", + "<44,15,1,8>": "34", + "<44,15,1,9>": "0", + "<44,15,1,10>": "3", + "<44,15,1,11>": "2", + "<44,15,1,12>": "1", + "<44,15,1,13>": "0", + "<44,15,1,14>": "0" + } + }, + "<44,16>": "", + "<44,17>": "", + "<44,18>": "", + "<44,19>": "", + "<44,20>": "", + "<44,21>": "", + "<44,22>": "", + "<44,23>": "", + "<44,24>": "", + "<44,25>": "", + "<44,26>": "", + "<44,27>": "", + "<44,28>": "<>", + "<44,29>": "<>", + "<44,30>": "", + "<44,31>": "", + "<44,32>": "", + "<44,33>": "", + "<44,34>": "", + "<44,35>": "", + "<44,36>": "", + "<44,37>": "", + "<44,38>": "", + "<44,39>": "", + "<44,40>": "", + "<44,41>": "", + "<44,42>": "", + "<44,43>": "", + "<44,44>": "", + "<44,45>": "", + "<44,46>": "", + "<44,47>": "", + "<44,48>": "", + "<44,49>": "", + "<44,50>": "", + "<44,51>": "", + "<44,52>": "", + "<44,53>": "", + "<44,54>": "", + "<44,55>": "", + "<44,56>": "", + "<44,57>": "", + "<44,58>": "", + "<44,59>": "", + "<44,60>": "", + "<44,61>": "", + "<44,62>": "0", + "<44,63>": { + "<44,63,1>": "", + "<44,63,2>": "", + "<44,63,3>": "", + "<44,63,4>": "", + "<44,63,5>": "", + "<44,63,6>": "", + "<44,63,7>": "", + "<44,63,8>": "" + }, + "<44,64>": { + "<44,64,1>": "", + "<44,64,2>": "", + "<44,64,3>": "" + }, + "<44,65>": "-2", + "<44,66>": "", + "<44,67>": "", + "<44,68>": "", + "<44,69>": "", + "<44,70>": "", + "<44,71>": "", + "<44,72>": "", + "<44,73>": "", + "<44,74>": "", + "<44,75>": "", + "<44,76>": "", + "<44,77>": "", + "<44,78>": "", + "<44,79>": "", + "<44,80>": "", + "<44,81>": "", + "<44,82>": "", + "<44,83>": "", + "<44,84>": "", + "<44,85>": "", + "<44,86>": "", + "<44,87>": "", + "<44,88>": "", + "<44,89>": "", + "<44,90>": "0", + "<44,91>": "0", + "<44,92>": "", + "<44,93>": "", + "<44,94>": "", + "<44,95>": "", + "<44,96>": "", + "<44,97>": "", + "<44,98>": "", + "<44,99>": "", + "<44,100>": "", + "<44,101>": "", + "<44,102>": "", + "<44,103>": "", + "<44,104>": "", + "<44,105>": "", + "<44,106>": "", + "<44,107>": "", + "<44,108>": "" + }, + "<45>": { + "<45,1>": "EDL_RESOURCE_TITLE", + "<45,2>": "", + "<45,3>": "EDITFIELD", + "<45,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<45,5>": "-209", + "<45,6>": "111:2", + "<45,7>": "169", + "<45,8>": "23", + "<45,9>": "", + "<45,10>": { + "<45,10,1>": "0x56000080", + "<45,10,2>": "0x200" + }, + "<45,11>": { + "<45,11,1>": "0x1000", + "<45,11,2>": "0x80000000" + }, + "<45,12>": "28", + "<45,13>": { + "<45,13,1>": "-2", + "<45,13,2>": "-2", + "<45,13,3>": "" + }, + "<45,14>": "0", + "<45,15>": { + "<45,15,1>": { + "<45,15,1,1>": "Segoe UI", + "<45,15,1,2>": "-12", + "<45,15,1,3>": "400", + "<45,15,1,4>": "0", + "<45,15,1,5>": "0", + "<45,15,1,6>": "0", + "<45,15,1,7>": "0", + "<45,15,1,8>": "34", + "<45,15,1,9>": "0", + "<45,15,1,10>": "3", + "<45,15,1,11>": "2", + "<45,15,1,12>": "1", + "<45,15,1,13>": "0", + "<45,15,1,14>": "0" + } + }, + "<45,16>": "", + "<45,17>": "", + "<45,18>": { + "<45,18,1>": { + "<45,18,1,1>": "R", + "<45,18,1,2>": "EXECUTE", + "<45,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<45,18,1,4>": { + "<45,18,1,4,1>": "@SELF", + "<45,18,1,4,2>": "@EVENT", + "<45,18,1,4,3>": "@PARAM1", + "<45,18,1,4,4>": "@PARAM2", + "<45,18,1,4,5>": "@PARAM3", + "<45,18,1,4,6>": "@PARAM4", + "<45,18,1,4,7>": "@PARAM5", + "<45,18,1,4,8>": "@PARAM6" + }, + "<45,18,1,5>": "", + "<45,18,1,6>": "", + "<45,18,1,7>": "", + "<45,18,1,8>": "", + "<45,18,1,9>": "", + "<45,18,1,10>": "", + "<45,18,1,11>": "", + "<45,18,1,12>": "", + "<45,18,1,13>": "", + "<45,18,1,14>": "", + "<45,18,1,15>": "STPROC" + } + }, + "<45,19>": "LOSTFOCUS", + "<45,20>": "", + "<45,21>": "", + "<45,22>": "", + "<45,23>": "", + "<45,24>": "", + "<45,25>": "", + "<45,26>": "", + "<45,27>": "", + "<45,28>": "<>", + "<45,29>": "<>", + "<45,30>": "<>", + "<45,31>": "0", + "<45,32>": "", + "<45,33>": "", + "<45,34>": "", + "<45,35>": "", + "<45,36>": { + "<45,36,1>": "0", + "<45,36,2>": "0" + }, + "<45,37>": "", + "<45,38>": "", + "<45,39>": "", + "<45,40>": "", + "<45,41>": "", + "<45,42>": "", + "<45,43>": "", + "<45,44>": "", + "<45,45>": "", + "<45,46>": "", + "<45,47>": "", + "<45,48>": "", + "<45,49>": "", + "<45,50>": "", + "<45,51>": "", + "<45,52>": "", + "<45,53>": "", + "<45,54>": "", + "<45,55>": "", + "<45,56>": "", + "<45,57>": "", + "<45,58>": "", + "<45,59>": "", + "<45,60>": "", + "<45,61>": "", + "<45,62>": "0", + "<45,63>": "", + "<45,64>": "", + "<45,65>": "", + "<45,66>": "", + "<45,67>": "", + "<45,68>": "", + "<45,69>": "", + "<45,70>": "", + "<45,71>": "", + "<45,72>": "", + "<45,73>": "", + "<45,74>": "", + "<45,75>": "", + "<45,76>": "", + "<45,77>": "", + "<45,78>": "", + "<45,79>": "", + "<45,80>": "", + "<45,81>": "", + "<45,82>": "", + "<45,83>": "", + "<45,84>": "", + "<45,85>": "", + "<45,86>": "", + "<45,87>": "", + "<45,88>": "", + "<45,89>": "", + "<45,90>": "", + "<45,91>": "", + "<45,92>": "", + "<45,93>": "", + "<45,94>": "", + "<45,95>": "", + "<45,96>": "", + "<45,97>": "", + "<45,98>": "", + "<45,99>": "", + "<45,100>": "", + "<45,101>": "", + "<45,102>": "", + "<45,103>": "", + "<45,104>": "", + "<45,105>": "", + "<45,106>": "", + "<45,107>": "", + "<45,108>": "" + }, + "<46>": { + "<46,1>": "STA_RESOURCE_DESCRIPTION", + "<46,2>": "", + "<46,3>": "STATIC", + "<46,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<46,5>": "-209", + "<46,6>": "146:2", + "<46,7>": "62", + "<46,8>": "15", + "<46,9>": "Description:", + "<46,10>": { + "<46,10,1>": "0x56000000", + "<46,10,2>": "0x0" + }, + "<46,11>": { + "<46,11,1>": "0x1000", + "<46,11,2>": "0x80000000" + }, + "<46,12>": "101", + "<46,13>": { + "<46,13,1>": "-1", + "<46,13,2>": "-1", + "<46,13,3>": "" + }, + "<46,14>": "0", + "<46,15>": { + "<46,15,1>": { + "<46,15,1,1>": "Segoe UI", + "<46,15,1,2>": "-12", + "<46,15,1,3>": "400", + "<46,15,1,4>": "0", + "<46,15,1,5>": "0", + "<46,15,1,6>": "0", + "<46,15,1,7>": "0", + "<46,15,1,8>": "34", + "<46,15,1,9>": "0", + "<46,15,1,10>": "3", + "<46,15,1,11>": "2", + "<46,15,1,12>": "1", + "<46,15,1,13>": "0", + "<46,15,1,14>": "0" + } + }, + "<46,16>": "", + "<46,17>": "", + "<46,18>": "", + "<46,19>": "", + "<46,20>": "", + "<46,21>": "", + "<46,22>": "", + "<46,23>": "", + "<46,24>": "", + "<46,25>": "", + "<46,26>": "", + "<46,27>": "", + "<46,28>": "<>", + "<46,29>": "<>", + "<46,30>": "", + "<46,31>": "", + "<46,32>": "", + "<46,33>": "", + "<46,34>": "", + "<46,35>": "", + "<46,36>": "", + "<46,37>": "", + "<46,38>": "", + "<46,39>": "", + "<46,40>": "", + "<46,41>": "", + "<46,42>": "", + "<46,43>": "", + "<46,44>": "", + "<46,45>": "", + "<46,46>": "", + "<46,47>": "", + "<46,48>": "", + "<46,49>": "", + "<46,50>": "", + "<46,51>": "", + "<46,52>": "", + "<46,53>": "", + "<46,54>": "", + "<46,55>": "", + "<46,56>": "", + "<46,57>": "", + "<46,58>": "", + "<46,59>": "", + "<46,60>": "", + "<46,61>": "", + "<46,62>": "0", + "<46,63>": { + "<46,63,1>": "", + "<46,63,2>": "", + "<46,63,3>": "", + "<46,63,4>": "", + "<46,63,5>": "", + "<46,63,6>": "", + "<46,63,7>": "", + "<46,63,8>": "" + }, + "<46,64>": { + "<46,64,1>": "", + "<46,64,2>": "", + "<46,64,3>": "" + }, + "<46,65>": "-2", + "<46,66>": "", + "<46,67>": "", + "<46,68>": "", + "<46,69>": "", + "<46,70>": "", + "<46,71>": "", + "<46,72>": "", + "<46,73>": "", + "<46,74>": "", + "<46,75>": "", + "<46,76>": "", + "<46,77>": "", + "<46,78>": "", + "<46,79>": "", + "<46,80>": "", + "<46,81>": "", + "<46,82>": "", + "<46,83>": "", + "<46,84>": "", + "<46,85>": "", + "<46,86>": "", + "<46,87>": "", + "<46,88>": "", + "<46,89>": "", + "<46,90>": "0", + "<46,91>": "0", + "<46,92>": "", + "<46,93>": "", + "<46,94>": "", + "<46,95>": "", + "<46,96>": "", + "<46,97>": "", + "<46,98>": "", + "<46,99>": "", + "<46,100>": "", + "<46,101>": "", + "<46,102>": "", + "<46,103>": "", + "<46,104>": "", + "<46,105>": "", + "<46,106>": "", + "<46,107>": "", + "<46,108>": "" + }, + "<47>": { + "<47,1>": "EDB_RESOURCE_DESCRIPTION", + "<47,2>": "", + "<47,3>": "EDITBOX", + "<47,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<47,5>": "-209", + "<47,6>": "166:2", + "<47,7>": "169", + "<47,8>": "-381", + "<47,9>": "", + "<47,10>": { + "<47,10,1>": "0x56200040", + "<47,10,2>": "0x200" + }, + "<47,11>": { + "<47,11,1>": "0x9000", + "<47,11,2>": "0x80000000" + }, + "<47,12>": "29", + "<47,13>": { + "<47,13,1>": "-2", + "<47,13,2>": "-2", + "<47,13,3>": "" + }, + "<47,14>": "0", + "<47,15>": { + "<47,15,1>": { + "<47,15,1,1>": "Segoe UI", + "<47,15,1,2>": "-12", + "<47,15,1,3>": "400", + "<47,15,1,4>": "0", + "<47,15,1,5>": "0", + "<47,15,1,6>": "0", + "<47,15,1,7>": "0", + "<47,15,1,8>": "34", + "<47,15,1,9>": "0", + "<47,15,1,10>": "3", + "<47,15,1,11>": "2", + "<47,15,1,12>": "1", + "<47,15,1,13>": "0", + "<47,15,1,14>": "0" + } + }, + "<47,16>": "", + "<47,17>": "", + "<47,18>": { + "<47,18,1>": { + "<47,18,1,1>": "R", + "<47,18,1,2>": "EXECUTE", + "<47,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<47,18,1,4>": { + "<47,18,1,4,1>": "@SELF", + "<47,18,1,4,2>": "@EVENT", + "<47,18,1,4,3>": "@PARAM1", + "<47,18,1,4,4>": "@PARAM2", + "<47,18,1,4,5>": "@PARAM3", + "<47,18,1,4,6>": "@PARAM4", + "<47,18,1,4,7>": "@PARAM5", + "<47,18,1,4,8>": "@PARAM6" + }, + "<47,18,1,5>": "", + "<47,18,1,6>": "", + "<47,18,1,7>": "", + "<47,18,1,8>": "", + "<47,18,1,9>": "", + "<47,18,1,10>": "", + "<47,18,1,11>": "", + "<47,18,1,12>": "", + "<47,18,1,13>": "", + "<47,18,1,14>": "", + "<47,18,1,15>": "STPROC" + } + }, + "<47,19>": "LOSTFOCUS", + "<47,20>": "", + "<47,21>": "", + "<47,22>": "", + "<47,23>": "", + "<47,24>": "", + "<47,25>": "", + "<47,26>": "", + "<47,27>": "", + "<47,28>": "<>", + "<47,29>": "<>", + "<47,30>": "", + "<47,31>": "0", + "<47,32>": "", + "<47,33>": "", + "<47,34>": "", + "<47,35>": "", + "<47,36>": "", + "<47,37>": "", + "<47,38>": "", + "<47,39>": "", + "<47,40>": "", + "<47,41>": "", + "<47,42>": "", + "<47,43>": "", + "<47,44>": "", + "<47,45>": "", + "<47,46>": "", + "<47,47>": "", + "<47,48>": "", + "<47,49>": "", + "<47,50>": "", + "<47,51>": "", + "<47,52>": "", + "<47,53>": "", + "<47,54>": "", + "<47,55>": "", + "<47,56>": "", + "<47,57>": "", + "<47,58>": "", + "<47,59>": "", + "<47,60>": "", + "<47,61>": "", + "<47,62>": "0", + "<47,63>": "", + "<47,64>": "", + "<47,65>": "", + "<47,66>": "", + "<47,67>": "", + "<47,68>": "", + "<47,69>": "", + "<47,70>": "", + "<47,71>": "", + "<47,72>": "", + "<47,73>": "", + "<47,74>": "", + "<47,75>": "", + "<47,76>": "", + "<47,77>": "", + "<47,78>": "", + "<47,79>": "", + "<47,80>": "", + "<47,81>": "", + "<47,82>": "", + "<47,83>": "", + "<47,84>": "", + "<47,85>": "", + "<47,86>": "", + "<47,87>": "", + "<47,88>": "", + "<47,89>": "", + "<47,90>": "", + "<47,91>": "", + "<47,92>": "", + "<47,93>": "", + "<47,94>": "", + "<47,95>": "", + "<47,96>": "", + "<47,97>": "", + "<47,98>": "", + "<47,99>": "", + "<47,100>": "", + "<47,101>": "", + "<47,102>": "", + "<47,103>": "", + "<47,104>": "", + "<47,105>": "", + "<47,106>": "", + "<47,107>": "", + "<47,108>": "" + }, + "<48>": { + "<48,1>": "STA_RESOURCE_METHODS", + "<48,2>": "", + "<48,3>": "STATIC", + "<48,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<48,5>": "-209", + "<48,6>": "-369:2", + "<48,7>": "50", + "<48,8>": "15", + "<48,9>": "Methods:", + "<48,10>": { + "<48,10,1>": "0x56000000", + "<48,10,2>": "0x0" + }, + "<48,11>": { + "<48,11,1>": "0x3000", + "<48,11,2>": "0x80000000" + }, + "<48,12>": "102", + "<48,13>": { + "<48,13,1>": "-1", + "<48,13,2>": "-1", + "<48,13,3>": "" + }, + "<48,14>": "0", + "<48,15>": { + "<48,15,1>": { + "<48,15,1,1>": "Segoe UI", + "<48,15,1,2>": "-12", + "<48,15,1,3>": "400", + "<48,15,1,4>": "0", + "<48,15,1,5>": "0", + "<48,15,1,6>": "0", + "<48,15,1,7>": "0", + "<48,15,1,8>": "34", + "<48,15,1,9>": "0", + "<48,15,1,10>": "3", + "<48,15,1,11>": "2", + "<48,15,1,12>": "1", + "<48,15,1,13>": "0", + "<48,15,1,14>": "0" + } + }, + "<48,16>": "", + "<48,17>": "", + "<48,18>": "", + "<48,19>": "", + "<48,20>": "", + "<48,21>": "", + "<48,22>": "", + "<48,23>": "", + "<48,24>": "", + "<48,25>": "", + "<48,26>": "", + "<48,27>": "", + "<48,28>": "<>", + "<48,29>": "<>", + "<48,30>": "", + "<48,31>": "", + "<48,32>": "", + "<48,33>": "", + "<48,34>": "", + "<48,35>": "", + "<48,36>": "", + "<48,37>": "", + "<48,38>": "", + "<48,39>": "", + "<48,40>": "", + "<48,41>": "", + "<48,42>": "", + "<48,43>": "", + "<48,44>": "", + "<48,45>": "", + "<48,46>": "", + "<48,47>": "", + "<48,48>": "", + "<48,49>": "", + "<48,50>": "", + "<48,51>": "", + "<48,52>": "", + "<48,53>": "", + "<48,54>": "", + "<48,55>": "", + "<48,56>": "", + "<48,57>": "", + "<48,58>": "", + "<48,59>": "", + "<48,60>": "", + "<48,61>": "", + "<48,62>": "0", + "<48,63>": { + "<48,63,1>": "", + "<48,63,2>": "", + "<48,63,3>": "", + "<48,63,4>": "", + "<48,63,5>": "", + "<48,63,6>": "", + "<48,63,7>": "", + "<48,63,8>": "" + }, + "<48,64>": { + "<48,64,1>": "", + "<48,64,2>": "", + "<48,64,3>": "" + }, + "<48,65>": "-2", + "<48,66>": "", + "<48,67>": "", + "<48,68>": "", + "<48,69>": "", + "<48,70>": "", + "<48,71>": "", + "<48,72>": "", + "<48,73>": "", + "<48,74>": "", + "<48,75>": "", + "<48,76>": "", + "<48,77>": "", + "<48,78>": "", + "<48,79>": "", + "<48,80>": "", + "<48,81>": "", + "<48,82>": "", + "<48,83>": "", + "<48,84>": "", + "<48,85>": "", + "<48,86>": "", + "<48,87>": "", + "<48,88>": "", + "<48,89>": "", + "<48,90>": "0", + "<48,91>": "0", + "<48,92>": "", + "<48,93>": "", + "<48,94>": "", + "<48,95>": "", + "<48,96>": "", + "<48,97>": "", + "<48,98>": "", + "<48,99>": "", + "<48,100>": "", + "<48,101>": "", + "<48,102>": "", + "<48,103>": "", + "<48,104>": "", + "<48,105>": "", + "<48,106>": "", + "<48,107>": "", + "<48,108>": "" + }, + "<49>": { + "<49,1>": "OLE_TRE_RESOURCE_METHODS", + "<49,2>": "", + "<49,3>": "OLECONTROL.SRP.Tree.1", + "<49,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<49,5>": "-209", + "<49,6>": "-349:2", + "<49,7>": "169", + "<49,8>": "-225", + "<49,9>": "SRP.Tree.1", + "<49,10>": { + "<49,10,1>": "0x56000000", + "<49,10,2>": "0x0" + }, + "<49,11>": { + "<49,11,1>": "0xB000", + "<49,11,2>": "0x80000000" + }, + "<49,12>": "30", + "<49,13>": { + "<49,13,1>": "-2", + "<49,13,2>": "-2", + "<49,13,3>": "" + }, + "<49,14>": "0", + "<49,15>": { + "<49,15,1>": { + "<49,15,1,1>": "Segoe UI", + "<49,15,1,2>": "-12", + "<49,15,1,3>": "400", + "<49,15,1,4>": "0", + "<49,15,1,5>": "0", + "<49,15,1,6>": "0", + "<49,15,1,7>": "0", + "<49,15,1,8>": "34", + "<49,15,1,9>": "0", + "<49,15,1,10>": "3", + "<49,15,1,11>": "2", + "<49,15,1,12>": "1", + "<49,15,1,13>": "0", + "<49,15,1,14>": "0" + } + }, + "<49,16>": "", + "<49,17>": "", + "<49,18>": { + "<49,18,1>": { + "<49,18,1,1>": "R", + "<49,18,1,2>": "EXECUTE", + "<49,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<49,18,1,4>": { + "<49,18,1,4,1>": "@SELF", + "<49,18,1,4,2>": "@EVENT", + "<49,18,1,4,3>": "@PARAM1", + "<49,18,1,4,4>": "@PARAM2", + "<49,18,1,4,5>": "@PARAM3", + "<49,18,1,4,6>": "@PARAM4", + "<49,18,1,4,7>": "@PARAM5", + "<49,18,1,4,8>": "@PARAM6" + }, + "<49,18,1,5>": "", + "<49,18,1,6>": "", + "<49,18,1,7>": "", + "<49,18,1,8>": "", + "<49,18,1,9>": "", + "<49,18,1,10>": "", + "<49,18,1,11>": "", + "<49,18,1,12>": "", + "<49,18,1,13>": "", + "<49,18,1,14>": "", + "<49,18,1,15>": "STPROC" + } + }, + "<49,19>": "OLE", + "<49,20>": "", + "<49,21>": "", + "<49,22>": "", + "<49,23>": "", + "<49,24>": "", + "<49,25>": "", + "<49,26>": "", + "<49,27>": "", + "<49,28>": "", + "<49,29>": "", + "<49,30>": "", + "<49,31>": "", + "<49,32>": "", + "<49,33>": "", + "<49,34>": "", + "<49,35>": "", + "<49,36>": "0100000000000000", + "<49,37>": "", + "<49,38>": "", + "<49,39>": "", + "<49,40>": "", + "<49,41>": "", + "<49,42>": "", + "<49,43>": "", + "<49,44>": "", + "<49,45>": "", + "<49,46>": "", + "<49,47>": "", + "<49,48>": "", + "<49,49>": "", + "<49,50>": "", + "<49,51>": "", + "<49,52>": "", + "<49,53>": "", + "<49,54>": "", + "<49,55>": "OLE.Border", + "<49,56>": "XP", + "<49,57>": "", + "<49,58>": "", + "<49,59>": "", + "<49,60>": "", + "<49,61>": "", + "<49,62>": "", + "<49,63>": "", + "<49,64>": "", + "<49,65>": "", + "<49,66>": "", + "<49,67>": "", + "<49,68>": "", + "<49,69>": "", + "<49,70>": "", + "<49,71>": "", + "<49,72>": "", + "<49,73>": "", + "<49,74>": "", + "<49,75>": "", + "<49,76>": "", + "<49,77>": "", + "<49,78>": "", + "<49,79>": "", + "<49,80>": "", + "<49,81>": "", + "<49,82>": "", + "<49,83>": "", + "<49,84>": "", + "<49,85>": "", + "<49,86>": "", + "<49,87>": "", + "<49,88>": "", + "<49,89>": "", + "<49,90>": "", + "<49,91>": "", + "<49,92>": "", + "<49,93>": "", + "<49,94>": "", + "<49,95>": "", + "<49,96>": "", + "<49,97>": "", + "<49,98>": "", + "<49,99>": "", + "<49,100>": "", + "<49,101>": "", + "<49,102>": "", + "<49,103>": "", + "<49,104>": "", + "<49,105>": "", + "<49,106>": "", + "<49,107>": "", + "<49,108>": "" + }, + "<50>": { + "<50,1>": "STA_RESOURCE_QUERY_PARAMS", + "<50,2>": "", + "<50,3>": "STATIC", + "<50,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<50,5>": "-209", + "<50,6>": "-213:2", + "<50,7>": "77", + "<50,8>": "15", + "<50,9>": "Query Params:", + "<50,10>": { + "<50,10,1>": "0x56000000", + "<50,10,2>": "0x0" + }, + "<50,11>": { + "<50,11,1>": "0x3000", + "<50,11,2>": "0x80000000" + }, + "<50,12>": "103", + "<50,13>": { + "<50,13,1>": "-1", + "<50,13,2>": "-1", + "<50,13,3>": "" + }, + "<50,14>": "0", + "<50,15>": { + "<50,15,1>": { + "<50,15,1,1>": "Segoe UI", + "<50,15,1,2>": "-12", + "<50,15,1,3>": "400", + "<50,15,1,4>": "0", + "<50,15,1,5>": "0", + "<50,15,1,6>": "0", + "<50,15,1,7>": "0", + "<50,15,1,8>": "34", + "<50,15,1,9>": "0", + "<50,15,1,10>": "3", + "<50,15,1,11>": "2", + "<50,15,1,12>": "1", + "<50,15,1,13>": "0", + "<50,15,1,14>": "0" + } + }, + "<50,16>": "", + "<50,17>": "", + "<50,18>": "", + "<50,19>": "", + "<50,20>": "", + "<50,21>": "", + "<50,22>": "", + "<50,23>": "", + "<50,24>": "", + "<50,25>": "", + "<50,26>": "", + "<50,27>": "", + "<50,28>": "<>", + "<50,29>": "<>", + "<50,30>": "", + "<50,31>": "", + "<50,32>": "", + "<50,33>": "", + "<50,34>": "", + "<50,35>": "", + "<50,36>": "", + "<50,37>": "", + "<50,38>": "", + "<50,39>": "", + "<50,40>": "", + "<50,41>": "", + "<50,42>": "", + "<50,43>": "", + "<50,44>": "", + "<50,45>": "", + "<50,46>": "", + "<50,47>": "", + "<50,48>": "", + "<50,49>": "", + "<50,50>": "", + "<50,51>": "", + "<50,52>": "", + "<50,53>": "", + "<50,54>": "", + "<50,55>": "", + "<50,56>": "", + "<50,57>": "", + "<50,58>": "", + "<50,59>": "", + "<50,60>": "", + "<50,61>": "", + "<50,62>": "0", + "<50,63>": { + "<50,63,1>": "", + "<50,63,2>": "", + "<50,63,3>": "", + "<50,63,4>": "", + "<50,63,5>": "", + "<50,63,6>": "", + "<50,63,7>": "", + "<50,63,8>": "" + }, + "<50,64>": { + "<50,64,1>": "", + "<50,64,2>": "", + "<50,64,3>": "" + }, + "<50,65>": "-2", + "<50,66>": "", + "<50,67>": "", + "<50,68>": "", + "<50,69>": "", + "<50,70>": "", + "<50,71>": "", + "<50,72>": "", + "<50,73>": "", + "<50,74>": "", + "<50,75>": "", + "<50,76>": "", + "<50,77>": "", + "<50,78>": "", + "<50,79>": "", + "<50,80>": "", + "<50,81>": "", + "<50,82>": "", + "<50,83>": "", + "<50,84>": "", + "<50,85>": "", + "<50,86>": "", + "<50,87>": "", + "<50,88>": "", + "<50,89>": "", + "<50,90>": "0", + "<50,91>": "0", + "<50,92>": "", + "<50,93>": "", + "<50,94>": "", + "<50,95>": "", + "<50,96>": "", + "<50,97>": "", + "<50,98>": "", + "<50,99>": "", + "<50,100>": "", + "<50,101>": "", + "<50,102>": "", + "<50,103>": "", + "<50,104>": "", + "<50,105>": "", + "<50,106>": "", + "<50,107>": "", + "<50,108>": "" + }, + "<51>": { + "<51,1>": "OLE_TRE_RESOURCE_QUERY_PARAMS", + "<51,2>": "", + "<51,3>": "OLECONTROL.SRP.Tree.1", + "<51,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<51,5>": "-209", + "<51,6>": "-193:2", + "<51,7>": "169", + "<51,8>": "-141", + "<51,9>": "SRP.Tree.1", + "<51,10>": { + "<51,10,1>": "0x56000000", + "<51,10,2>": "0x0" + }, + "<51,11>": { + "<51,11,1>": "0xB000", + "<51,11,2>": "0x80000000" + }, + "<51,12>": "31", + "<51,13>": { + "<51,13,1>": "-2", + "<51,13,2>": "-2", + "<51,13,3>": "" + }, + "<51,14>": "0", + "<51,15>": { + "<51,15,1>": { + "<51,15,1,1>": "Segoe UI", + "<51,15,1,2>": "-12", + "<51,15,1,3>": "400", + "<51,15,1,4>": "0", + "<51,15,1,5>": "0", + "<51,15,1,6>": "0", + "<51,15,1,7>": "0", + "<51,15,1,8>": "34", + "<51,15,1,9>": "0", + "<51,15,1,10>": "3", + "<51,15,1,11>": "2", + "<51,15,1,12>": "1", + "<51,15,1,13>": "0", + "<51,15,1,14>": "0" + } + }, + "<51,16>": "", + "<51,17>": "", + "<51,18>": { + "<51,18,1>": { + "<51,18,1,1>": "R", + "<51,18,1,2>": "EXECUTE", + "<51,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<51,18,1,4>": { + "<51,18,1,4,1>": "@SELF", + "<51,18,1,4,2>": "@EVENT", + "<51,18,1,4,3>": "@PARAM1", + "<51,18,1,4,4>": "@PARAM2", + "<51,18,1,4,5>": "@PARAM3", + "<51,18,1,4,6>": "@PARAM4", + "<51,18,1,4,7>": "@PARAM5", + "<51,18,1,4,8>": "@PARAM6" + }, + "<51,18,1,5>": "", + "<51,18,1,6>": "", + "<51,18,1,7>": "", + "<51,18,1,8>": "", + "<51,18,1,9>": "", + "<51,18,1,10>": "", + "<51,18,1,11>": "", + "<51,18,1,12>": "", + "<51,18,1,13>": "", + "<51,18,1,14>": "", + "<51,18,1,15>": "STPROC" + } + }, + "<51,19>": "OLE", + "<51,20>": "", + "<51,21>": "", + "<51,22>": "", + "<51,23>": "", + "<51,24>": "", + "<51,25>": "", + "<51,26>": "", + "<51,27>": "", + "<51,28>": "", + "<51,29>": "", + "<51,30>": "", + "<51,31>": "", + "<51,32>": "", + "<51,33>": "", + "<51,34>": "", + "<51,35>": "", + "<51,36>": "0100000000000000", + "<51,37>": "", + "<51,38>": "", + "<51,39>": "", + "<51,40>": "", + "<51,41>": "", + "<51,42>": "", + "<51,43>": "", + "<51,44>": "", + "<51,45>": "", + "<51,46>": "", + "<51,47>": "", + "<51,48>": "", + "<51,49>": "", + "<51,50>": "", + "<51,51>": "", + "<51,52>": "", + "<51,53>": "", + "<51,54>": "", + "<51,55>": "OLE.Border", + "<51,56>": "XP", + "<51,57>": "", + "<51,58>": "", + "<51,59>": "", + "<51,60>": "", + "<51,61>": "", + "<51,62>": "", + "<51,63>": "", + "<51,64>": "", + "<51,65>": "", + "<51,66>": "", + "<51,67>": "", + "<51,68>": "", + "<51,69>": "", + "<51,70>": "", + "<51,71>": "", + "<51,72>": "", + "<51,73>": "", + "<51,74>": "", + "<51,75>": "", + "<51,76>": "", + "<51,77>": "", + "<51,78>": "", + "<51,79>": "", + "<51,80>": "", + "<51,81>": "", + "<51,82>": "", + "<51,83>": "", + "<51,84>": "", + "<51,85>": "", + "<51,86>": "", + "<51,87>": "", + "<51,88>": "", + "<51,89>": "", + "<51,90>": "", + "<51,91>": "", + "<51,92>": "", + "<51,93>": "", + "<51,94>": "", + "<51,95>": "", + "<51,96>": "", + "<51,97>": "", + "<51,98>": "", + "<51,99>": "", + "<51,100>": "", + "<51,101>": "", + "<51,102>": "", + "<51,103>": "", + "<51,104>": "", + "<51,105>": "", + "<51,106>": "", + "<51,107>": "", + "<51,108>": "" + }, + "<52>": { + "<52,1>": "CHB_RESOURCE_EXCLUDE_FROM_LOGGING", + "<52,2>": "", + "<52,3>": "CHECKBOX", + "<52,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<52,5>": "-209", + "<52,6>": "-132:2", + "<52,7>": "138", + "<52,8>": "25", + "<52,9>": "Exclude From Logging", + "<52,10>": { + "<52,10,1>": "0x56000103", + "<52,10,2>": "0x0" + }, + "<52,11>": { + "<52,11,1>": "0x3000", + "<52,11,2>": "0x80000000" + }, + "<52,12>": "32", + "<52,13>": { + "<52,13,1>": "-1", + "<52,13,2>": "-1", + "<52,13,3>": "" + }, + "<52,14>": "0", + "<52,15>": { + "<52,15,1>": { + "<52,15,1,1>": "Segoe UI", + "<52,15,1,2>": "-12", + "<52,15,1,3>": "400", + "<52,15,1,4>": "0", + "<52,15,1,5>": "0", + "<52,15,1,6>": "0", + "<52,15,1,7>": "0", + "<52,15,1,8>": "34", + "<52,15,1,9>": "0", + "<52,15,1,10>": "3", + "<52,15,1,11>": "2", + "<52,15,1,12>": "1", + "<52,15,1,13>": "0", + "<52,15,1,14>": "0" + } + }, + "<52,16>": "", + "<52,17>": "", + "<52,18>": { + "<52,18,1>": { + "<52,18,1,1>": "R", + "<52,18,1,2>": "EXECUTE", + "<52,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<52,18,1,4>": { + "<52,18,1,4,1>": "@SELF", + "<52,18,1,4,2>": "@EVENT", + "<52,18,1,4,3>": "@PARAM1", + "<52,18,1,4,4>": "@PARAM2", + "<52,18,1,4,5>": "@PARAM3", + "<52,18,1,4,6>": "@PARAM4", + "<52,18,1,4,7>": "@PARAM5", + "<52,18,1,4,8>": "@PARAM6" + }, + "<52,18,1,5>": "", + "<52,18,1,6>": "", + "<52,18,1,7>": "", + "<52,18,1,8>": "", + "<52,18,1,9>": "", + "<52,18,1,10>": "", + "<52,18,1,11>": "", + "<52,18,1,12>": "", + "<52,18,1,13>": "", + "<52,18,1,14>": "", + "<52,18,1,15>": "STPROC" + } + }, + "<52,19>": "CLICK", + "<52,20>": "", + "<52,21>": "", + "<52,22>": "", + "<52,23>": "", + "<52,24>": "", + "<52,25>": "", + "<52,26>": "", + "<52,27>": "", + "<52,28>": "", + "<52,29>": "", + "<52,30>": "", + "<52,31>": "", + "<52,32>": "", + "<52,33>": "", + "<52,34>": "", + "<52,35>": "", + "<52,36>": "0", + "<52,37>": "", + "<52,38>": "", + "<52,39>": "", + "<52,40>": "", + "<52,41>": "", + "<52,42>": "", + "<52,43>": "", + "<52,44>": "", + "<52,45>": "", + "<52,46>": "", + "<52,47>": "", + "<52,48>": "", + "<52,49>": "", + "<52,50>": "", + "<52,51>": "", + "<52,52>": "", + "<52,53>": "", + "<52,54>": "", + "<52,55>": "", + "<52,56>": "", + "<52,57>": "", + "<52,58>": "", + "<52,59>": "", + "<52,60>": "", + "<52,61>": "", + "<52,62>": "0", + "<52,63>": { + "<52,63,1>": "", + "<52,63,2>": "", + "<52,63,3>": "", + "<52,63,4>": "", + "<52,63,5>": "", + "<52,63,6>": "", + "<52,63,7>": "", + "<52,63,8>": "" + }, + "<52,64>": { + "<52,64,1>": "", + "<52,64,2>": "", + "<52,64,3>": "" + }, + "<52,65>": "-2", + "<52,66>": "", + "<52,67>": "", + "<52,68>": "", + "<52,69>": "", + "<52,70>": "", + "<52,71>": "", + "<52,72>": "", + "<52,73>": "", + "<52,74>": "", + "<52,75>": "", + "<52,76>": "", + "<52,77>": "", + "<52,78>": "", + "<52,79>": "", + "<52,80>": "", + "<52,81>": "", + "<52,82>": "", + "<52,83>": "", + "<52,84>": "", + "<52,85>": "", + "<52,86>": "", + "<52,87>": "", + "<52,88>": "", + "<52,89>": "", + "<52,90>": "0", + "<52,91>": "0", + "<52,92>": "", + "<52,93>": "", + "<52,94>": "", + "<52,95>": "", + "<52,96>": "", + "<52,97>": "", + "<52,98>": "", + "<52,99>": "", + "<52,100>": "", + "<52,101>": "", + "<52,102>": "", + "<52,103>": "", + "<52,104>": "", + "<52,105>": "", + "<52,106>": "", + "<52,107>": "", + "<52,108>": "" + }, + "<53>": { + "<53,1>": "OLE_PUB_NEW_RESOURCE", + "<53,2>": "", + "<53,3>": "OLECONTROL.SRP.Button.1", + "<53,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<53,5>": "179", + "<53,6>": "-91:2", + "<53,7>": "137", + "<53,8>": "29", + "<53,9>": "SRP.Button.1", + "<53,10>": { + "<53,10,1>": "0x56000000", + "<53,10,2>": "0x0" + }, + "<53,11>": { + "<53,11,1>": "0x2000", + "<53,11,2>": "0x80000000" + }, + "<53,12>": "33", + "<53,13>": { + "<53,13,1>": "-2", + "<53,13,2>": "-2", + "<53,13,3>": "" + }, + "<53,14>": "0", + "<53,15>": { + "<53,15,1>": { + "<53,15,1,1>": "Segoe UI", + "<53,15,1,2>": "-12", + "<53,15,1,3>": "400", + "<53,15,1,4>": "0", + "<53,15,1,5>": "0", + "<53,15,1,6>": "0", + "<53,15,1,7>": "0", + "<53,15,1,8>": "34", + "<53,15,1,9>": "0", + "<53,15,1,10>": "3", + "<53,15,1,11>": "2", + "<53,15,1,12>": "1", + "<53,15,1,13>": "0", + "<53,15,1,14>": "0" + } + }, + "<53,16>": "", + "<53,17>": "", + "<53,18>": { + "<53,18,1>": { + "<53,18,1,1>": "R", + "<53,18,1,2>": "EXECUTE", + "<53,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<53,18,1,4>": { + "<53,18,1,4,1>": "@SELF", + "<53,18,1,4,2>": "@EVENT", + "<53,18,1,4,3>": "@PARAM1", + "<53,18,1,4,4>": "@PARAM2", + "<53,18,1,4,5>": "@PARAM3", + "<53,18,1,4,6>": "@PARAM4", + "<53,18,1,4,7>": "@PARAM5", + "<53,18,1,4,8>": "@PARAM6" + }, + "<53,18,1,5>": "", + "<53,18,1,6>": "", + "<53,18,1,7>": "", + "<53,18,1,8>": "", + "<53,18,1,9>": "", + "<53,18,1,10>": "", + "<53,18,1,11>": "", + "<53,18,1,12>": "", + "<53,18,1,13>": "", + "<53,18,1,14>": "", + "<53,18,1,15>": "STPROC" + } + }, + "<53,19>": "OLE", + "<53,20>": "", + "<53,21>": "", + "<53,22>": "", + "<53,23>": "", + "<53,24>": "", + "<53,25>": "", + "<53,26>": "", + "<53,27>": "", + "<53,28>": "", + "<53,29>": "", + "<53,30>": "", + "<53,31>": "", + "<53,32>": "", + "<53,33>": "", + "<53,34>": "", + "<53,35>": "", + "<53,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF0C4E006500770020005200650073006F00750072006300650000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<53,37>": "", + "<53,38>": "", + "<53,39>": "", + "<53,40>": "", + "<53,41>": "", + "<53,42>": "", + "<53,43>": "", + "<53,44>": "", + "<53,45>": "", + "<53,46>": "", + "<53,47>": "", + "<53,48>": "", + "<53,49>": "", + "<53,50>": "", + "<53,51>": "", + "<53,52>": "", + "<53,53>": "", + "<53,54>": "", + "<53,55>": { + "<53,55,1>": "OLE.ButtonType", + "<53,55,2>": "OLE.Cancel", + "<53,55,3>": "OLE.Caption", + "<53,55,4>": "OLE.Default", + "<53,55,5>": "OLE.FontBold", + "<53,55,6>": "OLE.FontItalic", + "<53,55,7>": "OLE.FontName", + "<53,55,8>": "OLE.FontSize", + "<53,55,9>": "OLE.FontUnderlined", + "<53,55,10>": "OLE.IconFrameCount", + "<53,55,11>": "OLE.IconHeight", + "<53,55,12>": "OLE.IconPath", + "<53,55,13>": "OLE.IconSizeToFit", + "<53,55,14>": "OLE.IconWidth", + "<53,55,15>": "OLE.State", + "<53,55,16>": "OLE.StatusBarText", + "<53,55,17>": "OLE.Style", + "<53,55,18>": "OLE.ToolTip", + "<53,55,19>": "OLE.TransparentColor" + }, + "<53,56>": { + "<53,56,1>": "Normal", + "<53,56,2>": "0", + "<53,56,3>": "New Resource", + "<53,56,4>": "0", + "<53,56,5>": "0", + "<53,56,6>": "0", + "<53,56,7>": "Segoe UI", + "<53,56,8>": "9", + "<53,56,9>": "0", + "<53,56,10>": "1", + "<53,56,11>": "0", + "<53,56,12>": "", + "<53,56,13>": "0", + "<53,56,14>": "0", + "<53,56,15>": "0", + "<53,56,16>": "", + "<53,56,17>": "Standard Toolbar", + "<53,56,18>": "", + "<53,56,19>": "Auto" + }, + "<53,57>": "", + "<53,58>": "", + "<53,59>": "", + "<53,60>": "", + "<53,61>": "", + "<53,62>": "", + "<53,63>": "", + "<53,64>": "", + "<53,65>": "", + "<53,66>": "", + "<53,67>": "", + "<53,68>": "", + "<53,69>": "", + "<53,70>": "", + "<53,71>": "", + "<53,72>": "", + "<53,73>": "", + "<53,74>": "", + "<53,75>": "", + "<53,76>": "", + "<53,77>": "", + "<53,78>": "", + "<53,79>": "", + "<53,80>": "", + "<53,81>": "", + "<53,82>": "", + "<53,83>": "", + "<53,84>": "", + "<53,85>": "", + "<53,86>": "", + "<53,87>": "", + "<53,88>": "", + "<53,89>": "", + "<53,90>": "", + "<53,91>": "", + "<53,92>": "", + "<53,93>": "", + "<53,94>": "", + "<53,95>": "", + "<53,96>": "", + "<53,97>": "", + "<53,98>": "", + "<53,99>": "", + "<53,100>": "", + "<53,101>": "", + "<53,102>": "", + "<53,103>": "", + "<53,104>": "", + "<53,105>": "", + "<53,106>": "", + "<53,107>": "", + "<53,108>": "" + }, + "<54>": { + "<54,1>": "OLE_PUB_NEW_RESOURCE_ID", + "<54,2>": "", + "<54,3>": "OLECONTROL.SRP.Button.1", + "<54,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<54,5>": "321", + "<54,6>": "-91:2", + "<54,7>": "137", + "<54,8>": "29", + "<54,9>": "SRP.Button.1", + "<54,10>": { + "<54,10,1>": "0x5E000000", + "<54,10,2>": "0x0" + }, + "<54,11>": { + "<54,11,1>": "0x2000", + "<54,11,2>": "0x80000000" + }, + "<54,12>": "34", + "<54,13>": { + "<54,13,1>": "-2", + "<54,13,2>": "-2", + "<54,13,3>": "" + }, + "<54,14>": "0", + "<54,15>": { + "<54,15,1>": { + "<54,15,1,1>": "Segoe UI", + "<54,15,1,2>": "-12", + "<54,15,1,3>": "400", + "<54,15,1,4>": "0", + "<54,15,1,5>": "0", + "<54,15,1,6>": "0", + "<54,15,1,7>": "0", + "<54,15,1,8>": "34", + "<54,15,1,9>": "0", + "<54,15,1,10>": "3", + "<54,15,1,11>": "2", + "<54,15,1,12>": "1", + "<54,15,1,13>": "0", + "<54,15,1,14>": "0" + } + }, + "<54,16>": "", + "<54,17>": "", + "<54,18>": { + "<54,18,1>": { + "<54,18,1,1>": "R", + "<54,18,1,2>": "EXECUTE", + "<54,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<54,18,1,4>": { + "<54,18,1,4,1>": "@SELF", + "<54,18,1,4,2>": "@EVENT", + "<54,18,1,4,3>": "@PARAM1", + "<54,18,1,4,4>": "@PARAM2", + "<54,18,1,4,5>": "@PARAM3", + "<54,18,1,4,6>": "@PARAM4", + "<54,18,1,4,7>": "@PARAM5", + "<54,18,1,4,8>": "@PARAM6" + }, + "<54,18,1,5>": "", + "<54,18,1,6>": "", + "<54,18,1,7>": "", + "<54,18,1,8>": "", + "<54,18,1,9>": "", + "<54,18,1,10>": "", + "<54,18,1,11>": "", + "<54,18,1,12>": "", + "<54,18,1,13>": "", + "<54,18,1,14>": "", + "<54,18,1,15>": "STPROC" + } + }, + "<54,19>": "OLE", + "<54,20>": "", + "<54,21>": "", + "<54,22>": "", + "<54,23>": "", + "<54,24>": "", + "<54,25>": "", + "<54,26>": "", + "<54,27>": "", + "<54,28>": "", + "<54,29>": "", + "<54,30>": "", + "<54,31>": "", + "<54,32>": "", + "<54,33>": "", + "<54,34>": "", + "<54,35>": "", + "<54,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF0F4E006500770020005200650073006F00750072006300650020004900440000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<54,37>": "", + "<54,38>": "", + "<54,39>": "", + "<54,40>": "", + "<54,41>": "", + "<54,42>": "", + "<54,43>": "", + "<54,44>": "", + "<54,45>": "", + "<54,46>": "", + "<54,47>": "", + "<54,48>": "", + "<54,49>": "", + "<54,50>": "", + "<54,51>": "", + "<54,52>": "", + "<54,53>": "", + "<54,54>": "", + "<54,55>": { + "<54,55,1>": "OLE.ButtonType", + "<54,55,2>": "OLE.Cancel", + "<54,55,3>": "OLE.Caption", + "<54,55,4>": "OLE.Default", + "<54,55,5>": "OLE.FontBold", + "<54,55,6>": "OLE.FontItalic", + "<54,55,7>": "OLE.FontName", + "<54,55,8>": "OLE.FontSize", + "<54,55,9>": "OLE.FontUnderlined", + "<54,55,10>": "OLE.IconFrameCount", + "<54,55,11>": "OLE.IconHeight", + "<54,55,12>": "OLE.IconPath", + "<54,55,13>": "OLE.IconSizeToFit", + "<54,55,14>": "OLE.IconWidth", + "<54,55,15>": "OLE.State", + "<54,55,16>": "OLE.StatusBarText", + "<54,55,17>": "OLE.Style", + "<54,55,18>": "OLE.ToolTip", + "<54,55,19>": "OLE.TransparentColor" + }, + "<54,56>": { + "<54,56,1>": "Normal", + "<54,56,2>": "0", + "<54,56,3>": "New Resource ID", + "<54,56,4>": "0", + "<54,56,5>": "0", + "<54,56,6>": "0", + "<54,56,7>": "Segoe UI", + "<54,56,8>": "9", + "<54,56,9>": "0", + "<54,56,10>": "1", + "<54,56,11>": "0", + "<54,56,12>": "", + "<54,56,13>": "0", + "<54,56,14>": "0", + "<54,56,15>": "0", + "<54,56,16>": "", + "<54,56,17>": "Standard Toolbar", + "<54,56,18>": "", + "<54,56,19>": "Auto" + }, + "<54,57>": "", + "<54,58>": "", + "<54,59>": "", + "<54,60>": "", + "<54,61>": "", + "<54,62>": "", + "<54,63>": "", + "<54,64>": "", + "<54,65>": "", + "<54,66>": "", + "<54,67>": "", + "<54,68>": "", + "<54,69>": "", + "<54,70>": "", + "<54,71>": "", + "<54,72>": "", + "<54,73>": "", + "<54,74>": "", + "<54,75>": "", + "<54,76>": "", + "<54,77>": "", + "<54,78>": "", + "<54,79>": "", + "<54,80>": "", + "<54,81>": "", + "<54,82>": "", + "<54,83>": "", + "<54,84>": "", + "<54,85>": "", + "<54,86>": "", + "<54,87>": "", + "<54,88>": "", + "<54,89>": "", + "<54,90>": "", + "<54,91>": "", + "<54,92>": "", + "<54,93>": "", + "<54,94>": "", + "<54,95>": "", + "<54,96>": "", + "<54,97>": "", + "<54,98>": "", + "<54,99>": "", + "<54,100>": "", + "<54,101>": "", + "<54,102>": "", + "<54,103>": "", + "<54,104>": "", + "<54,105>": "", + "<54,106>": "", + "<54,107>": "", + "<54,108>": "" + }, + "<55>": { + "<55,1>": "OLE_PUB_NEW_PROPERTY", + "<55,2>": "", + "<55,3>": "OLECONTROL.SRP.Button.1", + "<55,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<55,5>": "463", + "<55,6>": "-91:2", + "<55,7>": "137", + "<55,8>": "29", + "<55,9>": "SRP.Button.1", + "<55,10>": { + "<55,10,1>": "0x5E000000", + "<55,10,2>": "0x0" + }, + "<55,11>": { + "<55,11,1>": "0x2000", + "<55,11,2>": "0x80000000" + }, + "<55,12>": "35", + "<55,13>": { + "<55,13,1>": "-2", + "<55,13,2>": "-2", + "<55,13,3>": "" + }, + "<55,14>": "0", + "<55,15>": { + "<55,15,1>": { + "<55,15,1,1>": "Segoe UI", + "<55,15,1,2>": "-12", + "<55,15,1,3>": "400", + "<55,15,1,4>": "0", + "<55,15,1,5>": "0", + "<55,15,1,6>": "0", + "<55,15,1,7>": "0", + "<55,15,1,8>": "34", + "<55,15,1,9>": "0", + "<55,15,1,10>": "3", + "<55,15,1,11>": "2", + "<55,15,1,12>": "1", + "<55,15,1,13>": "0", + "<55,15,1,14>": "0" + } + }, + "<55,16>": "", + "<55,17>": "", + "<55,18>": { + "<55,18,1>": { + "<55,18,1,1>": "R", + "<55,18,1,2>": "EXECUTE", + "<55,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<55,18,1,4>": { + "<55,18,1,4,1>": "@SELF", + "<55,18,1,4,2>": "@EVENT", + "<55,18,1,4,3>": "@PARAM1", + "<55,18,1,4,4>": "@PARAM2", + "<55,18,1,4,5>": "@PARAM3", + "<55,18,1,4,6>": "@PARAM4", + "<55,18,1,4,7>": "@PARAM5", + "<55,18,1,4,8>": "@PARAM6" + }, + "<55,18,1,5>": "", + "<55,18,1,6>": "", + "<55,18,1,7>": "", + "<55,18,1,8>": "", + "<55,18,1,9>": "", + "<55,18,1,10>": "", + "<55,18,1,11>": "", + "<55,18,1,12>": "", + "<55,18,1,13>": "", + "<55,18,1,14>": "", + "<55,18,1,15>": "STPROC" + } + }, + "<55,19>": "OLE", + "<55,20>": "", + "<55,21>": "", + "<55,22>": "", + "<55,23>": "", + "<55,24>": "", + "<55,25>": "", + "<55,26>": "", + "<55,27>": "", + "<55,28>": "", + "<55,29>": "", + "<55,30>": "", + "<55,31>": "", + "<55,32>": "", + "<55,33>": "", + "<55,34>": "", + "<55,35>": "", + "<55,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF0C4E00650077002000500072006F007000650072007400790000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<55,37>": "", + "<55,38>": "", + "<55,39>": "", + "<55,40>": "", + "<55,41>": "", + "<55,42>": "", + "<55,43>": "", + "<55,44>": "", + "<55,45>": "", + "<55,46>": "", + "<55,47>": "", + "<55,48>": "", + "<55,49>": "", + "<55,50>": "", + "<55,51>": "", + "<55,52>": "", + "<55,53>": "", + "<55,54>": "", + "<55,55>": { + "<55,55,1>": "OLE.ButtonType", + "<55,55,2>": "OLE.Cancel", + "<55,55,3>": "OLE.Caption", + "<55,55,4>": "OLE.Default", + "<55,55,5>": "OLE.FontBold", + "<55,55,6>": "OLE.FontItalic", + "<55,55,7>": "OLE.FontName", + "<55,55,8>": "OLE.FontSize", + "<55,55,9>": "OLE.FontUnderlined", + "<55,55,10>": "OLE.IconFrameCount", + "<55,55,11>": "OLE.IconHeight", + "<55,55,12>": "OLE.IconPath", + "<55,55,13>": "OLE.IconSizeToFit", + "<55,55,14>": "OLE.IconWidth", + "<55,55,15>": "OLE.State", + "<55,55,16>": "OLE.StatusBarText", + "<55,55,17>": "OLE.Style", + "<55,55,18>": "OLE.ToolTip", + "<55,55,19>": "OLE.TransparentColor" + }, + "<55,56>": { + "<55,56,1>": "Normal", + "<55,56,2>": "0", + "<55,56,3>": "New Property", + "<55,56,4>": "0", + "<55,56,5>": "0", + "<55,56,6>": "0", + "<55,56,7>": "Segoe UI", + "<55,56,8>": "9", + "<55,56,9>": "0", + "<55,56,10>": "1", + "<55,56,11>": "0", + "<55,56,12>": "", + "<55,56,13>": "0", + "<55,56,14>": "0", + "<55,56,15>": "0", + "<55,56,16>": "", + "<55,56,17>": "Standard Toolbar", + "<55,56,18>": "", + "<55,56,19>": "Auto" + }, + "<55,57>": "", + "<55,58>": "", + "<55,59>": "", + "<55,60>": "", + "<55,61>": "", + "<55,62>": "", + "<55,63>": "", + "<55,64>": "", + "<55,65>": "", + "<55,66>": "", + "<55,67>": "", + "<55,68>": "", + "<55,69>": "", + "<55,70>": "", + "<55,71>": "", + "<55,72>": "", + "<55,73>": "", + "<55,74>": "", + "<55,75>": "", + "<55,76>": "", + "<55,77>": "", + "<55,78>": "", + "<55,79>": "", + "<55,80>": "", + "<55,81>": "", + "<55,82>": "", + "<55,83>": "", + "<55,84>": "", + "<55,85>": "", + "<55,86>": "", + "<55,87>": "", + "<55,88>": "", + "<55,89>": "", + "<55,90>": "", + "<55,91>": "", + "<55,92>": "", + "<55,93>": "", + "<55,94>": "", + "<55,95>": "", + "<55,96>": "", + "<55,97>": "", + "<55,98>": "", + "<55,99>": "", + "<55,100>": "", + "<55,101>": "", + "<55,102>": "", + "<55,103>": "", + "<55,104>": "", + "<55,105>": "", + "<55,106>": "", + "<55,107>": "", + "<55,108>": "" + }, + "<56>": { + "<56,1>": "OLE_PUB_RENAME", + "<56,2>": "", + "<56,3>": "OLECONTROL.SRP.Button.1", + "<56,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<56,5>": "605", + "<56,6>": "-91:2", + "<56,7>": "137", + "<56,8>": "29", + "<56,9>": "SRP.Button.1", + "<56,10>": { + "<56,10,1>": "0x56000000", + "<56,10,2>": "0x0" + }, + "<56,11>": { + "<56,11,1>": "0x2000", + "<56,11,2>": "0x80000000" + }, + "<56,12>": "36", + "<56,13>": { + "<56,13,1>": "-2", + "<56,13,2>": "-2", + "<56,13,3>": "" + }, + "<56,14>": "0", + "<56,15>": { + "<56,15,1>": { + "<56,15,1,1>": "Segoe UI", + "<56,15,1,2>": "-12", + "<56,15,1,3>": "400", + "<56,15,1,4>": "0", + "<56,15,1,5>": "0", + "<56,15,1,6>": "0", + "<56,15,1,7>": "0", + "<56,15,1,8>": "34", + "<56,15,1,9>": "0", + "<56,15,1,10>": "3", + "<56,15,1,11>": "2", + "<56,15,1,12>": "1", + "<56,15,1,13>": "0", + "<56,15,1,14>": "0" + } + }, + "<56,16>": "", + "<56,17>": "", + "<56,18>": { + "<56,18,1>": { + "<56,18,1,1>": "R", + "<56,18,1,2>": "EXECUTE", + "<56,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<56,18,1,4>": { + "<56,18,1,4,1>": "@SELF", + "<56,18,1,4,2>": "@EVENT", + "<56,18,1,4,3>": "@PARAM1", + "<56,18,1,4,4>": "@PARAM2", + "<56,18,1,4,5>": "@PARAM3", + "<56,18,1,4,6>": "@PARAM4", + "<56,18,1,4,7>": "@PARAM5", + "<56,18,1,4,8>": "@PARAM6" + }, + "<56,18,1,5>": "", + "<56,18,1,6>": "", + "<56,18,1,7>": "", + "<56,18,1,8>": "", + "<56,18,1,9>": "", + "<56,18,1,10>": "", + "<56,18,1,11>": "", + "<56,18,1,12>": "", + "<56,18,1,13>": "", + "<56,18,1,14>": "", + "<56,18,1,15>": "STPROC" + } + }, + "<56,19>": "OLE", + "<56,20>": "", + "<56,21>": "", + "<56,22>": "", + "<56,23>": "", + "<56,24>": "", + "<56,25>": "", + "<56,26>": "", + "<56,27>": "", + "<56,28>": "", + "<56,29>": "", + "<56,30>": "", + "<56,31>": "", + "<56,32>": "", + "<56,33>": "", + "<56,34>": "", + "<56,35>": "", + "<56,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF06520065006E0061006D00650000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<56,37>": "", + "<56,38>": "", + "<56,39>": "", + "<56,40>": "", + "<56,41>": "", + "<56,42>": "", + "<56,43>": "", + "<56,44>": "", + "<56,45>": "", + "<56,46>": "", + "<56,47>": "", + "<56,48>": "", + "<56,49>": "", + "<56,50>": "", + "<56,51>": "", + "<56,52>": "", + "<56,53>": "", + "<56,54>": "", + "<56,55>": { + "<56,55,1>": "OLE.ButtonType", + "<56,55,2>": "OLE.Cancel", + "<56,55,3>": "OLE.Caption", + "<56,55,4>": "OLE.Default", + "<56,55,5>": "OLE.FontBold", + "<56,55,6>": "OLE.FontItalic", + "<56,55,7>": "OLE.FontName", + "<56,55,8>": "OLE.FontSize", + "<56,55,9>": "OLE.FontUnderlined", + "<56,55,10>": "OLE.IconFrameCount", + "<56,55,11>": "OLE.IconHeight", + "<56,55,12>": "OLE.IconPath", + "<56,55,13>": "OLE.IconSizeToFit", + "<56,55,14>": "OLE.IconWidth", + "<56,55,15>": "OLE.State", + "<56,55,16>": "OLE.StatusBarText", + "<56,55,17>": "OLE.Style", + "<56,55,18>": "OLE.ToolTip", + "<56,55,19>": "OLE.TransparentColor" + }, + "<56,56>": { + "<56,56,1>": "Normal", + "<56,56,2>": "0", + "<56,56,3>": "Rename", + "<56,56,4>": "0", + "<56,56,5>": "0", + "<56,56,6>": "0", + "<56,56,7>": "Segoe UI", + "<56,56,8>": "9", + "<56,56,9>": "0", + "<56,56,10>": "1", + "<56,56,11>": "0", + "<56,56,12>": "", + "<56,56,13>": "0", + "<56,56,14>": "0", + "<56,56,15>": "0", + "<56,56,16>": "", + "<56,56,17>": "Standard Toolbar", + "<56,56,18>": "", + "<56,56,19>": "Auto" + }, + "<56,57>": "", + "<56,58>": "", + "<56,59>": "", + "<56,60>": "", + "<56,61>": "", + "<56,62>": "", + "<56,63>": "", + "<56,64>": "", + "<56,65>": "", + "<56,66>": "", + "<56,67>": "", + "<56,68>": "", + "<56,69>": "", + "<56,70>": "", + "<56,71>": "", + "<56,72>": "", + "<56,73>": "", + "<56,74>": "", + "<56,75>": "", + "<56,76>": "", + "<56,77>": "", + "<56,78>": "", + "<56,79>": "", + "<56,80>": "", + "<56,81>": "", + "<56,82>": "", + "<56,83>": "", + "<56,84>": "", + "<56,85>": "", + "<56,86>": "", + "<56,87>": "", + "<56,88>": "", + "<56,89>": "", + "<56,90>": "", + "<56,91>": "", + "<56,92>": "", + "<56,93>": "", + "<56,94>": "", + "<56,95>": "", + "<56,96>": "", + "<56,97>": "", + "<56,98>": "", + "<56,99>": "", + "<56,100>": "", + "<56,101>": "", + "<56,102>": "", + "<56,103>": "", + "<56,104>": "", + "<56,105>": "", + "<56,106>": "", + "<56,107>": "", + "<56,108>": "" + }, + "<57>": { + "<57,1>": "OLE_PUB_REMOVE_ENDPOINT", + "<57,2>": "", + "<57,3>": "OLECONTROL.SRP.Button.1", + "<57,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<57,5>": "747", + "<57,6>": "-91:2", + "<57,7>": "137", + "<57,8>": "29", + "<57,9>": "SRP.Button.1", + "<57,10>": { + "<57,10,1>": "0x5E000000", + "<57,10,2>": "0x0" + }, + "<57,11>": { + "<57,11,1>": "0x2000", + "<57,11,2>": "0x80000000" + }, + "<57,12>": "37", + "<57,13>": { + "<57,13,1>": "-2", + "<57,13,2>": "-2", + "<57,13,3>": "" + }, + "<57,14>": "0", + "<57,15>": { + "<57,15,1>": { + "<57,15,1,1>": "Segoe UI", + "<57,15,1,2>": "-12", + "<57,15,1,3>": "400", + "<57,15,1,4>": "0", + "<57,15,1,5>": "0", + "<57,15,1,6>": "0", + "<57,15,1,7>": "0", + "<57,15,1,8>": "34", + "<57,15,1,9>": "0", + "<57,15,1,10>": "3", + "<57,15,1,11>": "2", + "<57,15,1,12>": "1", + "<57,15,1,13>": "0", + "<57,15,1,14>": "0" + } + }, + "<57,16>": "", + "<57,17>": "", + "<57,18>": { + "<57,18,1>": { + "<57,18,1,1>": "R", + "<57,18,1,2>": "EXECUTE", + "<57,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<57,18,1,4>": { + "<57,18,1,4,1>": "@SELF", + "<57,18,1,4,2>": "@EVENT", + "<57,18,1,4,3>": "@PARAM1", + "<57,18,1,4,4>": "@PARAM2", + "<57,18,1,4,5>": "@PARAM3", + "<57,18,1,4,6>": "@PARAM4", + "<57,18,1,4,7>": "@PARAM5", + "<57,18,1,4,8>": "@PARAM6" + }, + "<57,18,1,5>": "", + "<57,18,1,6>": "", + "<57,18,1,7>": "", + "<57,18,1,8>": "", + "<57,18,1,9>": "", + "<57,18,1,10>": "", + "<57,18,1,11>": "", + "<57,18,1,12>": "", + "<57,18,1,13>": "", + "<57,18,1,14>": "", + "<57,18,1,15>": "STPROC" + } + }, + "<57,19>": "OLE", + "<57,20>": "", + "<57,21>": "", + "<57,22>": "", + "<57,23>": "", + "<57,24>": "", + "<57,25>": "", + "<57,26>": "", + "<57,27>": "", + "<57,28>": "", + "<57,29>": "", + "<57,30>": "", + "<57,31>": "", + "<57,32>": "", + "<57,33>": "", + "<57,34>": "", + "<57,35>": "", + "<57,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF12520065006D006F0076006500200045006E00640070006F0069006E0074002E002E002E0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<57,37>": "", + "<57,38>": "", + "<57,39>": "", + "<57,40>": "", + "<57,41>": "", + "<57,42>": "", + "<57,43>": "", + "<57,44>": "", + "<57,45>": "", + "<57,46>": "", + "<57,47>": "", + "<57,48>": "", + "<57,49>": "", + "<57,50>": "", + "<57,51>": "", + "<57,52>": "", + "<57,53>": "", + "<57,54>": "", + "<57,55>": { + "<57,55,1>": "OLE.ButtonType", + "<57,55,2>": "OLE.Cancel", + "<57,55,3>": "OLE.Caption", + "<57,55,4>": "OLE.Default", + "<57,55,5>": "OLE.FontBold", + "<57,55,6>": "OLE.FontItalic", + "<57,55,7>": "OLE.FontName", + "<57,55,8>": "OLE.FontSize", + "<57,55,9>": "OLE.FontUnderlined", + "<57,55,10>": "OLE.IconFrameCount", + "<57,55,11>": "OLE.IconHeight", + "<57,55,12>": "OLE.IconPath", + "<57,55,13>": "OLE.IconSizeToFit", + "<57,55,14>": "OLE.IconWidth", + "<57,55,15>": "OLE.State", + "<57,55,16>": "OLE.StatusBarText", + "<57,55,17>": "OLE.Style", + "<57,55,18>": "OLE.ToolTip", + "<57,55,19>": "OLE.TransparentColor" + }, + "<57,56>": { + "<57,56,1>": "Normal", + "<57,56,2>": "0", + "<57,56,3>": "Remove Endpoint...", + "<57,56,4>": "0", + "<57,56,5>": "0", + "<57,56,6>": "0", + "<57,56,7>": "Segoe UI", + "<57,56,8>": "9", + "<57,56,9>": "0", + "<57,56,10>": "1", + "<57,56,11>": "0", + "<57,56,12>": "", + "<57,56,13>": "0", + "<57,56,14>": "0", + "<57,56,15>": "0", + "<57,56,16>": "", + "<57,56,17>": "Standard Toolbar", + "<57,56,18>": "", + "<57,56,19>": "Auto" + }, + "<57,57>": "", + "<57,58>": "", + "<57,59>": "", + "<57,60>": "", + "<57,61>": "", + "<57,62>": "", + "<57,63>": "", + "<57,64>": "", + "<57,65>": "", + "<57,66>": "", + "<57,67>": "", + "<57,68>": "", + "<57,69>": "", + "<57,70>": "", + "<57,71>": "", + "<57,72>": "", + "<57,73>": "", + "<57,74>": "", + "<57,75>": "", + "<57,76>": "", + "<57,77>": "", + "<57,78>": "", + "<57,79>": "", + "<57,80>": "", + "<57,81>": "", + "<57,82>": "", + "<57,83>": "", + "<57,84>": "", + "<57,85>": "", + "<57,86>": "", + "<57,87>": "", + "<57,88>": "", + "<57,89>": "", + "<57,90>": "", + "<57,91>": "", + "<57,92>": "", + "<57,93>": "", + "<57,94>": "", + "<57,95>": "", + "<57,96>": "", + "<57,97>": "", + "<57,98>": "", + "<57,99>": "", + "<57,100>": "", + "<57,101>": "", + "<57,102>": "", + "<57,103>": "", + "<57,104>": "", + "<57,105>": "", + "<57,106>": "", + "<57,107>": "", + "<57,108>": "" + }, + "<58>": { + "<58,1>": "OLE_PUB_CREATE_APIS", + "<58,2>": "", + "<58,3>": "OLECONTROL.SRP.Button.1", + "<58,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<58,5>": "889", + "<58,6>": "-91:2", + "<58,7>": "137", + "<58,8>": "29", + "<58,9>": "SRP.Button.1", + "<58,10>": { + "<58,10,1>": "0x5E000000", + "<58,10,2>": "0x0" + }, + "<58,11>": { + "<58,11,1>": "0x2000", + "<58,11,2>": "0x80000000" + }, + "<58,12>": "38", + "<58,13>": { + "<58,13,1>": "-2", + "<58,13,2>": "-2", + "<58,13,3>": "" + }, + "<58,14>": "0", + "<58,15>": { + "<58,15,1>": { + "<58,15,1,1>": "Segoe UI", + "<58,15,1,2>": "-12", + "<58,15,1,3>": "400", + "<58,15,1,4>": "0", + "<58,15,1,5>": "0", + "<58,15,1,6>": "0", + "<58,15,1,7>": "0", + "<58,15,1,8>": "34", + "<58,15,1,9>": "0", + "<58,15,1,10>": "3", + "<58,15,1,11>": "2", + "<58,15,1,12>": "1", + "<58,15,1,13>": "0", + "<58,15,1,14>": "0" + } + }, + "<58,16>": "", + "<58,17>": "", + "<58,18>": { + "<58,18,1>": { + "<58,18,1,1>": "R", + "<58,18,1,2>": "EXECUTE", + "<58,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<58,18,1,4>": { + "<58,18,1,4,1>": "@SELF", + "<58,18,1,4,2>": "@EVENT", + "<58,18,1,4,3>": "@PARAM1", + "<58,18,1,4,4>": "@PARAM2", + "<58,18,1,4,5>": "@PARAM3", + "<58,18,1,4,6>": "@PARAM4", + "<58,18,1,4,7>": "@PARAM5", + "<58,18,1,4,8>": "@PARAM6" + }, + "<58,18,1,5>": "", + "<58,18,1,6>": "", + "<58,18,1,7>": "", + "<58,18,1,8>": "", + "<58,18,1,9>": "", + "<58,18,1,10>": "", + "<58,18,1,11>": "", + "<58,18,1,12>": "", + "<58,18,1,13>": "", + "<58,18,1,14>": "", + "<58,18,1,15>": "STPROC" + } + }, + "<58,19>": "OLE", + "<58,20>": "", + "<58,21>": "", + "<58,22>": "", + "<58,23>": "", + "<58,24>": "", + "<58,25>": "", + "<58,26>": "", + "<58,27>": "", + "<58,28>": "", + "<58,29>": "", + "<58,30>": "", + "<58,31>": "", + "<58,32>": "", + "<58,33>": "", + "<58,34>": "", + "<58,35>": "", + "<58,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF0B4300720065006100740065002000410050004900730000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<58,37>": "", + "<58,38>": "", + "<58,39>": "", + "<58,40>": "", + "<58,41>": "", + "<58,42>": "", + "<58,43>": "", + "<58,44>": "", + "<58,45>": "", + "<58,46>": "", + "<58,47>": "", + "<58,48>": "", + "<58,49>": "", + "<58,50>": "", + "<58,51>": "", + "<58,52>": "", + "<58,53>": "", + "<58,54>": "", + "<58,55>": { + "<58,55,1>": "OLE.ButtonType", + "<58,55,2>": "OLE.Cancel", + "<58,55,3>": "OLE.Caption", + "<58,55,4>": "OLE.Default", + "<58,55,5>": "OLE.FontBold", + "<58,55,6>": "OLE.FontItalic", + "<58,55,7>": "OLE.FontName", + "<58,55,8>": "OLE.FontSize", + "<58,55,9>": "OLE.FontUnderlined", + "<58,55,10>": "OLE.IconFrameCount", + "<58,55,11>": "OLE.IconHeight", + "<58,55,12>": "OLE.IconPath", + "<58,55,13>": "OLE.IconSizeToFit", + "<58,55,14>": "OLE.IconWidth", + "<58,55,15>": "OLE.State", + "<58,55,16>": "OLE.StatusBarText", + "<58,55,17>": "OLE.Style", + "<58,55,18>": "OLE.ToolTip", + "<58,55,19>": "OLE.TransparentColor" + }, + "<58,56>": { + "<58,56,1>": "Normal", + "<58,56,2>": "0", + "<58,56,3>": "Create APIs", + "<58,56,4>": "0", + "<58,56,5>": "0", + "<58,56,6>": "0", + "<58,56,7>": "Segoe UI", + "<58,56,8>": "9", + "<58,56,9>": "0", + "<58,56,10>": "1", + "<58,56,11>": "0", + "<58,56,12>": "", + "<58,56,13>": "0", + "<58,56,14>": "0", + "<58,56,15>": "0", + "<58,56,16>": "", + "<58,56,17>": "Standard Toolbar", + "<58,56,18>": "", + "<58,56,19>": "Auto" + }, + "<58,57>": "", + "<58,58>": "", + "<58,59>": "", + "<58,60>": "", + "<58,61>": "", + "<58,62>": "", + "<58,63>": "", + "<58,64>": "", + "<58,65>": "", + "<58,66>": "", + "<58,67>": "", + "<58,68>": "", + "<58,69>": "", + "<58,70>": "", + "<58,71>": "", + "<58,72>": "", + "<58,73>": "", + "<58,74>": "", + "<58,75>": "", + "<58,76>": "", + "<58,77>": "", + "<58,78>": "", + "<58,79>": "", + "<58,80>": "", + "<58,81>": "", + "<58,82>": "", + "<58,83>": "", + "<58,84>": "", + "<58,85>": "", + "<58,86>": "", + "<58,87>": "", + "<58,88>": "", + "<58,89>": "", + "<58,90>": "", + "<58,91>": "", + "<58,92>": "", + "<58,93>": "", + "<58,94>": "", + "<58,95>": "", + "<58,96>": "", + "<58,97>": "", + "<58,98>": "", + "<58,99>": "", + "<58,100>": "", + "<58,101>": "", + "<58,102>": "", + "<58,103>": "", + "<58,104>": "", + "<58,105>": "", + "<58,106>": "", + "<58,107>": "", + "<58,108>": "" + }, + "<59>": { + "<59,1>": "OLE_PUB_RESOURCE_QUERY_PARAMS_NEW", + "<59,2>": "", + "<59,3>": "OLECONTROL.SRP.Button.1", + "<59,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<59,5>": "-77", + "<59,6>": "-213:2", + "<59,7>": "16", + "<59,8>": "16", + "<59,9>": "SRP.Button.1", + "<59,10>": { + "<59,10,1>": "0x56000000", + "<59,10,2>": "0x0" + }, + "<59,11>": { + "<59,11,1>": "0x3000", + "<59,11,2>": "0x80000000" + }, + "<59,12>": "39", + "<59,13>": { + "<59,13,1>": "-2", + "<59,13,2>": "-2", + "<59,13,3>": "" + }, + "<59,14>": "0", + "<59,15>": { + "<59,15,1>": { + "<59,15,1,1>": "Segoe UI", + "<59,15,1,2>": "-12", + "<59,15,1,3>": "400", + "<59,15,1,4>": "0", + "<59,15,1,5>": "0", + "<59,15,1,6>": "0", + "<59,15,1,7>": "0", + "<59,15,1,8>": "34", + "<59,15,1,9>": "0", + "<59,15,1,10>": "3", + "<59,15,1,11>": "2", + "<59,15,1,12>": "1", + "<59,15,1,13>": "0", + "<59,15,1,14>": "0" + } + }, + "<59,16>": "", + "<59,17>": "", + "<59,18>": { + "<59,18,1>": { + "<59,18,1,1>": "R", + "<59,18,1,2>": "EXECUTE", + "<59,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<59,18,1,4>": { + "<59,18,1,4,1>": "@SELF", + "<59,18,1,4,2>": "@EVENT", + "<59,18,1,4,3>": "@PARAM1", + "<59,18,1,4,4>": "@PARAM2", + "<59,18,1,4,5>": "@PARAM3", + "<59,18,1,4,6>": "@PARAM4", + "<59,18,1,4,7>": "@PARAM5", + "<59,18,1,4,8>": "@PARAM6" + }, + "<59,18,1,5>": "", + "<59,18,1,6>": "", + "<59,18,1,7>": "", + "<59,18,1,8>": "", + "<59,18,1,9>": "", + "<59,18,1,10>": "", + "<59,18,1,11>": "", + "<59,18,1,12>": "", + "<59,18,1,13>": "", + "<59,18,1,14>": "", + "<59,18,1,15>": "STPROC" + } + }, + "<59,19>": "OLE", + "<59,20>": "", + "<59,21>": "", + "<59,22>": "", + "<59,23>": "", + "<59,24>": "", + "<59,25>": "", + "<59,26>": "", + "<59,27>": "", + "<59,28>": "", + "<59,29>": "", + "<59,30>": "", + "<59,31>": "", + "<59,32>": "", + "<59,33>": "", + "<59,34>": "", + "<59,35>": "", + "<59,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF012B0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<59,37>": "", + "<59,38>": "", + "<59,39>": "", + "<59,40>": "", + "<59,41>": "", + "<59,42>": "", + "<59,43>": "", + "<59,44>": "", + "<59,45>": "", + "<59,46>": "", + "<59,47>": "", + "<59,48>": "", + "<59,49>": "", + "<59,50>": "", + "<59,51>": "", + "<59,52>": "", + "<59,53>": "", + "<59,54>": "", + "<59,55>": { + "<59,55,1>": "OLE.ButtonType", + "<59,55,2>": "OLE.Cancel", + "<59,55,3>": "OLE.Caption", + "<59,55,4>": "OLE.Default", + "<59,55,5>": "OLE.FontBold", + "<59,55,6>": "OLE.FontItalic", + "<59,55,7>": "OLE.FontName", + "<59,55,8>": "OLE.FontSize", + "<59,55,9>": "OLE.FontUnderlined", + "<59,55,10>": "OLE.IconFrameCount", + "<59,55,11>": "OLE.IconHeight", + "<59,55,12>": "OLE.IconPath", + "<59,55,13>": "OLE.IconSizeToFit", + "<59,55,14>": "OLE.IconWidth", + "<59,55,15>": "OLE.State", + "<59,55,16>": "OLE.StatusBarText", + "<59,55,17>": "OLE.Style", + "<59,55,18>": "OLE.ToolTip", + "<59,55,19>": "OLE.TransparentColor" + }, + "<59,56>": { + "<59,56,1>": "Normal", + "<59,56,2>": "0", + "<59,56,3>": "+", + "<59,56,4>": "0", + "<59,56,5>": "0", + "<59,56,6>": "0", + "<59,56,7>": "Segoe UI", + "<59,56,8>": "9", + "<59,56,9>": "0", + "<59,56,10>": "1", + "<59,56,11>": "0", + "<59,56,12>": "", + "<59,56,13>": "0", + "<59,56,14>": "0", + "<59,56,15>": "0", + "<59,56,16>": "", + "<59,56,17>": "Standard Toolbar", + "<59,56,18>": "", + "<59,56,19>": "Auto" + }, + "<59,57>": "", + "<59,58>": "", + "<59,59>": "", + "<59,60>": "", + "<59,61>": "", + "<59,62>": "", + "<59,63>": "", + "<59,64>": "", + "<59,65>": "", + "<59,66>": "", + "<59,67>": "", + "<59,68>": "", + "<59,69>": "", + "<59,70>": "", + "<59,71>": "", + "<59,72>": "", + "<59,73>": "", + "<59,74>": "", + "<59,75>": "", + "<59,76>": "", + "<59,77>": "", + "<59,78>": "", + "<59,79>": "", + "<59,80>": "", + "<59,81>": "", + "<59,82>": "", + "<59,83>": "", + "<59,84>": "", + "<59,85>": "", + "<59,86>": "", + "<59,87>": "", + "<59,88>": "", + "<59,89>": "", + "<59,90>": "", + "<59,91>": "", + "<59,92>": "", + "<59,93>": "", + "<59,94>": "", + "<59,95>": "", + "<59,96>": "", + "<59,97>": "", + "<59,98>": "", + "<59,99>": "", + "<59,100>": "", + "<59,101>": "", + "<59,102>": "", + "<59,103>": "", + "<59,104>": "", + "<59,105>": "", + "<59,106>": "", + "<59,107>": "", + "<59,108>": "" + }, + "<60>": { + "<60,1>": "OLE_PUB_RESOURCE_QUERY_PARAMS_REMOVE", + "<60,2>": "", + "<60,3>": "OLECONTROL.SRP.Button.1", + "<60,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<60,5>": "-56", + "<60,6>": "-213:2", + "<60,7>": "16", + "<60,8>": "16", + "<60,9>": "SRP.Button.1", + "<60,10>": { + "<60,10,1>": "0x5E000000", + "<60,10,2>": "0x0" + }, + "<60,11>": { + "<60,11,1>": "0x3000", + "<60,11,2>": "0x80000000" + }, + "<60,12>": "40", + "<60,13>": { + "<60,13,1>": "-2", + "<60,13,2>": "-2", + "<60,13,3>": "" + }, + "<60,14>": "0", + "<60,15>": { + "<60,15,1>": { + "<60,15,1,1>": "Segoe UI", + "<60,15,1,2>": "-12", + "<60,15,1,3>": "400", + "<60,15,1,4>": "0", + "<60,15,1,5>": "0", + "<60,15,1,6>": "0", + "<60,15,1,7>": "0", + "<60,15,1,8>": "34", + "<60,15,1,9>": "0", + "<60,15,1,10>": "3", + "<60,15,1,11>": "2", + "<60,15,1,12>": "1", + "<60,15,1,13>": "0", + "<60,15,1,14>": "0" + } + }, + "<60,16>": "", + "<60,17>": "", + "<60,18>": { + "<60,18,1>": { + "<60,18,1,1>": "R", + "<60,18,1,2>": "EXECUTE", + "<60,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<60,18,1,4>": { + "<60,18,1,4,1>": "@SELF", + "<60,18,1,4,2>": "@EVENT", + "<60,18,1,4,3>": "@PARAM1", + "<60,18,1,4,4>": "@PARAM2", + "<60,18,1,4,5>": "@PARAM3", + "<60,18,1,4,6>": "@PARAM4", + "<60,18,1,4,7>": "@PARAM5", + "<60,18,1,4,8>": "@PARAM6" + }, + "<60,18,1,5>": "", + "<60,18,1,6>": "", + "<60,18,1,7>": "", + "<60,18,1,8>": "", + "<60,18,1,9>": "", + "<60,18,1,10>": "", + "<60,18,1,11>": "", + "<60,18,1,12>": "", + "<60,18,1,13>": "", + "<60,18,1,14>": "", + "<60,18,1,15>": "STPROC" + } + }, + "<60,19>": "OLE", + "<60,20>": "", + "<60,21>": "", + "<60,22>": "", + "<60,23>": "", + "<60,24>": "", + "<60,25>": "", + "<60,26>": "", + "<60,27>": "", + "<60,28>": "", + "<60,29>": "", + "<60,30>": "", + "<60,31>": "", + "<60,32>": "", + "<60,33>": "", + "<60,34>": "", + "<60,35>": "", + "<60,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF012D0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<60,37>": "", + "<60,38>": "", + "<60,39>": "", + "<60,40>": "", + "<60,41>": "", + "<60,42>": "", + "<60,43>": "", + "<60,44>": "", + "<60,45>": "", + "<60,46>": "", + "<60,47>": "", + "<60,48>": "", + "<60,49>": "", + "<60,50>": "", + "<60,51>": "", + "<60,52>": "", + "<60,53>": "", + "<60,54>": "", + "<60,55>": { + "<60,55,1>": "OLE.ButtonType", + "<60,55,2>": "OLE.Cancel", + "<60,55,3>": "OLE.Caption", + "<60,55,4>": "OLE.Default", + "<60,55,5>": "OLE.FontBold", + "<60,55,6>": "OLE.FontItalic", + "<60,55,7>": "OLE.FontName", + "<60,55,8>": "OLE.FontSize", + "<60,55,9>": "OLE.FontUnderlined", + "<60,55,10>": "OLE.IconFrameCount", + "<60,55,11>": "OLE.IconHeight", + "<60,55,12>": "OLE.IconPath", + "<60,55,13>": "OLE.IconSizeToFit", + "<60,55,14>": "OLE.IconWidth", + "<60,55,15>": "OLE.State", + "<60,55,16>": "OLE.StatusBarText", + "<60,55,17>": "OLE.Style", + "<60,55,18>": "OLE.ToolTip", + "<60,55,19>": "OLE.TransparentColor" + }, + "<60,56>": { + "<60,56,1>": "Normal", + "<60,56,2>": "0", + "<60,56,3>": "-", + "<60,56,4>": "0", + "<60,56,5>": "0", + "<60,56,6>": "0", + "<60,56,7>": "Segoe UI", + "<60,56,8>": "9", + "<60,56,9>": "0", + "<60,56,10>": "1", + "<60,56,11>": "0", + "<60,56,12>": "", + "<60,56,13>": "0", + "<60,56,14>": "0", + "<60,56,15>": "0", + "<60,56,16>": "", + "<60,56,17>": "Standard Toolbar", + "<60,56,18>": "", + "<60,56,19>": "Auto" + }, + "<60,57>": "", + "<60,58>": "", + "<60,59>": "", + "<60,60>": "", + "<60,61>": "", + "<60,62>": "", + "<60,63>": "", + "<60,64>": "", + "<60,65>": "", + "<60,66>": "", + "<60,67>": "", + "<60,68>": "", + "<60,69>": "", + "<60,70>": "", + "<60,71>": "", + "<60,72>": "", + "<60,73>": "", + "<60,74>": "", + "<60,75>": "", + "<60,76>": "", + "<60,77>": "", + "<60,78>": "", + "<60,79>": "", + "<60,80>": "", + "<60,81>": "", + "<60,82>": "", + "<60,83>": "", + "<60,84>": "", + "<60,85>": "", + "<60,86>": "", + "<60,87>": "", + "<60,88>": "", + "<60,89>": "", + "<60,90>": "", + "<60,91>": "", + "<60,92>": "", + "<60,93>": "", + "<60,94>": "", + "<60,95>": "", + "<60,96>": "", + "<60,97>": "", + "<60,98>": "", + "<60,99>": "", + "<60,100>": "", + "<60,101>": "", + "<60,102>": "", + "<60,103>": "", + "<60,104>": "", + "<60,105>": "", + "<60,106>": "", + "<60,107>": "", + "<60,108>": "" + }, + "<61>": { + "<61,1>": "OLE_INFO_RESOURCE_EXCLUDE_FROM_LOGGING", + "<61,2>": "", + "<61,3>": "OLECONTROL.SRP.Picture.1", + "<61,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<61,5>": "-70", + "<61,6>": "-125:2", + "<61,7>": "10", + "<61,8>": "10", + "<61,9>": "SRP.Picture.1", + "<61,10>": { + "<61,10,1>": "0x56000000", + "<61,10,2>": "0x0" + }, + "<61,11>": { + "<61,11,1>": "0x3000", + "<61,11,2>": "0x80000000" + }, + "<61,12>": "41", + "<61,13>": { + "<61,13,1>": "-2", + "<61,13,2>": "-2", + "<61,13,3>": "" + }, + "<61,14>": "0", + "<61,15>": { + "<61,15,1>": { + "<61,15,1,1>": "Segoe UI", + "<61,15,1,2>": "-12", + "<61,15,1,3>": "400", + "<61,15,1,4>": "0", + "<61,15,1,5>": "0", + "<61,15,1,6>": "0", + "<61,15,1,7>": "0", + "<61,15,1,8>": "34", + "<61,15,1,9>": "0", + "<61,15,1,10>": "3", + "<61,15,1,11>": "2", + "<61,15,1,12>": "1", + "<61,15,1,13>": "0", + "<61,15,1,14>": "0" + } + }, + "<61,16>": "", + "<61,17>": "", + "<61,18>": { + "<61,18,1>": { + "<61,18,1,1>": "R", + "<61,18,1,2>": "EXECUTE", + "<61,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<61,18,1,4>": { + "<61,18,1,4,1>": "@SELF", + "<61,18,1,4,2>": "@EVENT", + "<61,18,1,4,3>": "@PARAM1", + "<61,18,1,4,4>": "@PARAM2", + "<61,18,1,4,5>": "@PARAM3", + "<61,18,1,4,6>": "@PARAM4", + "<61,18,1,4,7>": "@PARAM5", + "<61,18,1,4,8>": "@PARAM6" + }, + "<61,18,1,5>": "", + "<61,18,1,6>": "", + "<61,18,1,7>": "", + "<61,18,1,8>": "", + "<61,18,1,9>": "", + "<61,18,1,10>": "", + "<61,18,1,11>": "", + "<61,18,1,12>": "", + "<61,18,1,13>": "", + "<61,18,1,14>": "", + "<61,18,1,15>": "STPROC" + } + }, + "<61,19>": "OLE", + "<61,20>": "", + "<61,21>": "", + "<61,22>": "", + "<61,23>": "", + "<61,24>": "", + "<61,25>": "", + "<61,26>": "", + "<61,27>": "", + "<61,28>": "", + "<61,29>": "", + "<61,30>": "", + "<61,31>": "", + "<61,32>": "", + "<61,33>": "", + "<61,34>": "", + "<61,35>": "", + "<61,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<61,37>": "", + "<61,38>": "", + "<61,39>": "", + "<61,40>": "", + "<61,41>": "", + "<61,42>": "", + "<61,43>": "", + "<61,44>": "", + "<61,45>": "", + "<61,46>": "", + "<61,47>": "", + "<61,48>": "", + "<61,49>": "", + "<61,50>": "", + "<61,51>": "", + "<61,52>": "", + "<61,53>": "", + "<61,54>": "", + "<61,55>": { + "<61,55,1>": "OLE.Animated", + "<61,55,2>": "OLE.AnimationDelay", + "<61,55,3>": "OLE.AutoLoadDropFile", + "<61,55,4>": "OLE.BackgroundColor", + "<61,55,5>": "OLE.BorderAlignment", + "<61,55,6>": "OLE.BorderType", + "<61,55,7>": "OLE.Caption", + "<61,55,8>": "OLE.CaptionColor", + "<61,55,9>": "OLE.CaptionHorzAlign", + "<61,55,10>": "OLE.CaptionHorzOffset", + "<61,55,11>": "OLE.CaptionVertAlign", + "<61,55,12>": "OLE.CaptionVertOffset", + "<61,55,13>": "OLE.ControlPart", + "<61,55,14>": "OLE.FontBold", + "<61,55,15>": "OLE.FontItalic", + "<61,55,16>": "OLE.FontName", + "<61,55,17>": "OLE.FontSize", + "<61,55,18>": "OLE.FontUnderlined", + "<61,55,19>": "OLE.Frame", + "<61,55,20>": "OLE.FrameCount", + "<61,55,21>": "OLE.HorzAlign", + "<61,55,22>": "OLE.Image", + "<61,55,23>": "OLE.ImageHorzOffset", + "<61,55,24>": "OLE.ImageVertOffset", + "<61,55,25>": "OLE.Layout", + "<61,55,26>": "OLE.ResizeUsingGDIPlus", + "<61,55,27>": "OLE.TransparentColor", + "<61,55,28>": "OLE.VertAlign", + "<61,55,29>": "OLE.Zoom" + }, + "<61,56>": { + "<61,56,1>": "0", + "<61,56,2>": "50", + "<61,56,3>": "0", + "<61,56,4>": "None", + "<61,56,5>": "All", + "<61,56,6>": "None", + "<61,56,7>": "", + "<61,56,8>": "None", + "<61,56,9>": "Center", + "<61,56,10>": "0", + "<61,56,11>": "Center", + "<61,56,12>": "0", + "<61,56,13>": "None", + "<61,56,14>": "0", + "<61,56,15>": "0", + "<61,56,16>": "Segoe UI", + "<61,56,17>": "8", + "<61,56,18>": "0", + "<61,56,19>": "1", + "<61,56,20>": "1", + "<61,56,21>": "Center", + "<61,56,22>": "BMPS\\SRPHTTPInfo.png", + "<61,56,23>": "0", + "<61,56,24>": "0", + "<61,56,25>": "Clip", + "<61,56,26>": "1", + "<61,56,27>": "Auto", + "<61,56,28>": "Center", + "<61,56,29>": "1" + }, + "<61,57>": "", + "<61,58>": "", + "<61,59>": "", + "<61,60>": "", + "<61,61>": "", + "<61,62>": "", + "<61,63>": "", + "<61,64>": "", + "<61,65>": "", + "<61,66>": "", + "<61,67>": "", + "<61,68>": "", + "<61,69>": "", + "<61,70>": "", + "<61,71>": "", + "<61,72>": "", + "<61,73>": "", + "<61,74>": "", + "<61,75>": "", + "<61,76>": "", + "<61,77>": "", + "<61,78>": "", + "<61,79>": "", + "<61,80>": "", + "<61,81>": "", + "<61,82>": "", + "<61,83>": "", + "<61,84>": "", + "<61,85>": "", + "<61,86>": "", + "<61,87>": "", + "<61,88>": "", + "<61,89>": "", + "<61,90>": "", + "<61,91>": "", + "<61,92>": "", + "<61,93>": "", + "<61,94>": "", + "<61,95>": "", + "<61,96>": "", + "<61,97>": "", + "<61,98>": "", + "<61,99>": "", + "<61,100>": "", + "<61,101>": "", + "<61,102>": "", + "<61,103>": "", + "<61,104>": "", + "<61,105>": "", + "<61,106>": "", + "<61,107>": "", + "<61,108>": "" + }, + "<62>": { + "<62,1>": "PUB_OK", + "<62,2>": "", + "<62,3>": "PUSHBUTTON", + "<62,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<62,5>": "-250", + "<62,6>": "-29", + "<62,7>": "75", + "<62,8>": "23", + "<62,9>": "&OK", + "<62,10>": { + "<62,10,1>": "0x56002300", + "<62,10,2>": "0x0" + }, + "<62,11>": { + "<62,11,1>": "0x13000", + "<62,11,2>": "0x80000000" + }, + "<62,12>": "42", + "<62,13>": { + "<62,13,1>": "16053492", + "<62,13,2>": "16053492", + "<62,13,3>": "0" + }, + "<62,14>": "0", + "<62,15>": { + "<62,15,1>": { + "<62,15,1,1>": "Segoe UI", + "<62,15,1,2>": "-11", + "<62,15,1,3>": "400", + "<62,15,1,4>": "0", + "<62,15,1,5>": "0", + "<62,15,1,6>": "0", + "<62,15,1,7>": "0", + "<62,15,1,8>": "34", + "<62,15,1,9>": "0", + "<62,15,1,10>": "3", + "<62,15,1,11>": "2", + "<62,15,1,12>": "1", + "<62,15,1,13>": "0", + "<62,15,1,14>": "0" + } + }, + "<62,16>": "", + "<62,17>": "", + "<62,18>": { + "<62,18,1>": { + "<62,18,1,1>": "R", + "<62,18,1,2>": "EXECUTE", + "<62,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<62,18,1,4>": { + "<62,18,1,4,1>": "@SELF", + "<62,18,1,4,2>": "@EVENT", + "<62,18,1,4,3>": "@PARAM1", + "<62,18,1,4,4>": "@PARAM2", + "<62,18,1,4,5>": "@PARAM3", + "<62,18,1,4,6>": "@PARAM4", + "<62,18,1,4,7>": "@PARAM5", + "<62,18,1,4,8>": "@PARAM6" + }, + "<62,18,1,5>": "", + "<62,18,1,6>": "", + "<62,18,1,7>": "", + "<62,18,1,8>": "", + "<62,18,1,9>": "", + "<62,18,1,10>": "", + "<62,18,1,11>": "", + "<62,18,1,12>": "", + "<62,18,1,13>": "", + "<62,18,1,14>": "", + "<62,18,1,15>": "STPROC" + } + }, + "<62,19>": "CLICK", + "<62,20>": "", + "<62,21>": "", + "<62,22>": "", + "<62,23>": "", + "<62,24>": "", + "<62,25>": "", + "<62,26>": "", + "<62,27>": "", + "<62,28>": "", + "<62,29>": "", + "<62,30>": "", + "<62,31>": "", + "<62,32>": "", + "<62,33>": "", + "<62,34>": "", + "<62,35>": "", + "<62,36>": "", + "<62,37>": "", + "<62,38>": "", + "<62,39>": "", + "<62,40>": "1", + "<62,41>": { + "<62,41,1>": "", + "<62,41,2>": "-1" + }, + "<62,42>": "", + "<62,43>": "", + "<62,44>": "", + "<62,45>": "", + "<62,46>": "", + "<62,47>": "", + "<62,48>": "", + "<62,49>": "", + "<62,50>": "", + "<62,51>": "", + "<62,52>": "", + "<62,53>": "", + "<62,54>": "", + "<62,55>": "", + "<62,56>": "", + "<62,57>": "", + "<62,58>": "", + "<62,59>": "", + "<62,60>": "", + "<62,61>": "", + "<62,62>": "0", + "<62,63>": "", + "<62,64>": { + "<62,64,1>": "-2", + "<62,64,2>": "-2", + "<62,64,3>": "0" + }, + "<62,65>": "-2", + "<62,66>": "", + "<62,67>": "", + "<62,68>": "", + "<62,69>": "", + "<62,70>": "", + "<62,71>": "", + "<62,72>": "", + "<62,73>": "", + "<62,74>": "", + "<62,75>": "", + "<62,76>": "", + "<62,77>": "", + "<62,78>": "", + "<62,79>": "", + "<62,80>": "", + "<62,81>": "", + "<62,82>": "", + "<62,83>": "", + "<62,84>": "", + "<62,85>": "", + "<62,86>": "", + "<62,87>": "", + "<62,88>": "", + "<62,89>": "", + "<62,90>": "0", + "<62,91>": "0", + "<62,92>": "", + "<62,93>": "", + "<62,94>": "", + "<62,95>": "", + "<62,96>": "", + "<62,97>": "", + "<62,98>": "", + "<62,99>": "", + "<62,100>": "", + "<62,101>": "", + "<62,102>": "", + "<62,103>": "", + "<62,104>": "", + "<62,105>": "", + "<62,106>": "", + "<62,107>": "", + "<62,108>": "" + }, + "<63>": { + "<63,1>": "PUB_CANCEL", + "<63,2>": "", + "<63,3>": "PUSHBUTTON", + "<63,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<63,5>": "-166", + "<63,6>": "-29", + "<63,7>": "75", + "<63,8>": "23", + "<63,9>": "&Cancel", + "<63,10>": { + "<63,10,1>": "0x56002300", + "<63,10,2>": "0x0" + }, + "<63,11>": { + "<63,11,1>": "0x13000", + "<63,11,2>": "0x80000000" + }, + "<63,12>": "43", + "<63,13>": { + "<63,13,1>": "16053492", + "<63,13,2>": "16053492", + "<63,13,3>": "0" + }, + "<63,14>": "0", + "<63,15>": { + "<63,15,1>": { + "<63,15,1,1>": "Segoe UI", + "<63,15,1,2>": "-11", + "<63,15,1,3>": "400", + "<63,15,1,4>": "0", + "<63,15,1,5>": "0", + "<63,15,1,6>": "0", + "<63,15,1,7>": "0", + "<63,15,1,8>": "34", + "<63,15,1,9>": "0", + "<63,15,1,10>": "3", + "<63,15,1,11>": "2", + "<63,15,1,12>": "1", + "<63,15,1,13>": "0", + "<63,15,1,14>": "0" + } + }, + "<63,16>": "", + "<63,17>": "", + "<63,18>": { + "<63,18,1>": { + "<63,18,1,1>": "R", + "<63,18,1,2>": "EXECUTE", + "<63,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<63,18,1,4>": { + "<63,18,1,4,1>": "@SELF", + "<63,18,1,4,2>": "@EVENT", + "<63,18,1,4,3>": "@PARAM1", + "<63,18,1,4,4>": "@PARAM2", + "<63,18,1,4,5>": "@PARAM3", + "<63,18,1,4,6>": "@PARAM4", + "<63,18,1,4,7>": "@PARAM5", + "<63,18,1,4,8>": "@PARAM6" + }, + "<63,18,1,5>": "", + "<63,18,1,6>": "", + "<63,18,1,7>": "", + "<63,18,1,8>": "", + "<63,18,1,9>": "", + "<63,18,1,10>": "", + "<63,18,1,11>": "", + "<63,18,1,12>": "", + "<63,18,1,13>": "", + "<63,18,1,14>": "", + "<63,18,1,15>": "STPROC" + } + }, + "<63,19>": "CLICK", + "<63,20>": "", + "<63,21>": "", + "<63,22>": "", + "<63,23>": "", + "<63,24>": "", + "<63,25>": "", + "<63,26>": "", + "<63,27>": "", + "<63,28>": "", + "<63,29>": "", + "<63,30>": "", + "<63,31>": "", + "<63,32>": "", + "<63,33>": "", + "<63,34>": "", + "<63,35>": "", + "<63,36>": "", + "<63,37>": "", + "<63,38>": "", + "<63,39>": "", + "<63,40>": "1", + "<63,41>": { + "<63,41,1>": "", + "<63,41,2>": "-1" + }, + "<63,42>": "", + "<63,43>": "", + "<63,44>": "", + "<63,45>": "", + "<63,46>": "", + "<63,47>": "", + "<63,48>": "", + "<63,49>": "", + "<63,50>": "", + "<63,51>": "", + "<63,52>": "", + "<63,53>": "", + "<63,54>": "", + "<63,55>": "", + "<63,56>": "", + "<63,57>": "", + "<63,58>": "", + "<63,59>": "", + "<63,60>": "", + "<63,61>": "", + "<63,62>": "0", + "<63,63>": "", + "<63,64>": { + "<63,64,1>": "-2", + "<63,64,2>": "-2", + "<63,64,3>": "0" + }, + "<63,65>": "-2", + "<63,66>": "", + "<63,67>": "", + "<63,68>": "", + "<63,69>": "", + "<63,70>": "", + "<63,71>": "", + "<63,72>": "", + "<63,73>": "", + "<63,74>": "", + "<63,75>": "", + "<63,76>": "", + "<63,77>": "", + "<63,78>": "", + "<63,79>": "", + "<63,80>": "", + "<63,81>": "", + "<63,82>": "", + "<63,83>": "", + "<63,84>": "", + "<63,85>": "", + "<63,86>": "", + "<63,87>": "", + "<63,88>": "", + "<63,89>": "", + "<63,90>": "0", + "<63,91>": "0", + "<63,92>": "", + "<63,93>": "", + "<63,94>": "", + "<63,95>": "", + "<63,96>": "", + "<63,97>": "", + "<63,98>": "", + "<63,99>": "", + "<63,100>": "", + "<63,101>": "", + "<63,102>": "", + "<63,103>": "", + "<63,104>": "", + "<63,105>": "", + "<63,106>": "", + "<63,107>": "", + "<63,108>": "" + }, + "<64>": { + "<64,1>": "PUB_APPLY", + "<64,2>": "", + "<64,3>": "PUSHBUTTON", + "<64,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<64,5>": "-82", + "<64,6>": "-30", + "<64,7>": "76", + "<64,8>": "24", + "<64,9>": "&Apply", + "<64,10>": { + "<64,10,1>": "0x56002300", + "<64,10,2>": "0x0" + }, + "<64,11>": { + "<64,11,1>": "0x13000", + "<64,11,2>": "0x80000000" + }, + "<64,12>": "44", + "<64,13>": { + "<64,13,1>": "16053492", + "<64,13,2>": "16053492", + "<64,13,3>": "0" + }, + "<64,14>": "0", + "<64,15>": { + "<64,15,1>": { + "<64,15,1,1>": "Segoe UI", + "<64,15,1,2>": "-11", + "<64,15,1,3>": "400", + "<64,15,1,4>": "0", + "<64,15,1,5>": "0", + "<64,15,1,6>": "0", + "<64,15,1,7>": "0", + "<64,15,1,8>": "34", + "<64,15,1,9>": "0", + "<64,15,1,10>": "3", + "<64,15,1,11>": "2", + "<64,15,1,12>": "1", + "<64,15,1,13>": "0", + "<64,15,1,14>": "0" + } + }, + "<64,16>": "", + "<64,17>": "", + "<64,18>": { + "<64,18,1>": { + "<64,18,1,1>": "R", + "<64,18,1,2>": "EXECUTE", + "<64,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<64,18,1,4>": { + "<64,18,1,4,1>": "@SELF", + "<64,18,1,4,2>": "@EVENT", + "<64,18,1,4,3>": "@PARAM1", + "<64,18,1,4,4>": "@PARAM2", + "<64,18,1,4,5>": "@PARAM3", + "<64,18,1,4,6>": "@PARAM4", + "<64,18,1,4,7>": "@PARAM5", + "<64,18,1,4,8>": "@PARAM6" + }, + "<64,18,1,5>": "", + "<64,18,1,6>": "", + "<64,18,1,7>": "", + "<64,18,1,8>": "", + "<64,18,1,9>": "", + "<64,18,1,10>": "", + "<64,18,1,11>": "", + "<64,18,1,12>": "", + "<64,18,1,13>": "", + "<64,18,1,14>": "", + "<64,18,1,15>": "STPROC" + } + }, + "<64,19>": "CLICK", + "<64,20>": "", + "<64,21>": "", + "<64,22>": "", + "<64,23>": "", + "<64,24>": "", + "<64,25>": "", + "<64,26>": "", + "<64,27>": "", + "<64,28>": "", + "<64,29>": "", + "<64,30>": "", + "<64,31>": "", + "<64,32>": "", + "<64,33>": "", + "<64,34>": "", + "<64,35>": "", + "<64,36>": "", + "<64,37>": "", + "<64,38>": "", + "<64,39>": "", + "<64,40>": "1", + "<64,41>": { + "<64,41,1>": "", + "<64,41,2>": "-1" + }, + "<64,42>": "", + "<64,43>": "", + "<64,44>": "", + "<64,45>": "", + "<64,46>": "", + "<64,47>": "", + "<64,48>": "", + "<64,49>": "", + "<64,50>": "", + "<64,51>": "", + "<64,52>": "", + "<64,53>": "", + "<64,54>": "", + "<64,55>": "", + "<64,56>": "", + "<64,57>": "", + "<64,58>": "", + "<64,59>": "", + "<64,60>": "", + "<64,61>": "", + "<64,62>": "0", + "<64,63>": "", + "<64,64>": { + "<64,64,1>": "-2", + "<64,64,2>": "-2", + "<64,64,3>": "0" + }, + "<64,65>": "-2", + "<64,66>": "", + "<64,67>": "", + "<64,68>": "", + "<64,69>": "", + "<64,70>": "", + "<64,71>": "", + "<64,72>": "", + "<64,73>": "", + "<64,74>": "", + "<64,75>": "", + "<64,76>": "", + "<64,77>": "", + "<64,78>": "", + "<64,79>": "", + "<64,80>": "", + "<64,81>": "", + "<64,82>": "", + "<64,83>": "", + "<64,84>": "", + "<64,85>": "", + "<64,86>": "", + "<64,87>": "", + "<64,88>": "", + "<64,89>": "", + "<64,90>": "0", + "<64,91>": "0", + "<64,92>": "", + "<64,93>": "", + "<64,94>": "", + "<64,95>": "", + "<64,96>": "", + "<64,97>": "", + "<64,98>": "", + "<64,99>": "", + "<64,100>": "", + "<64,101>": "", + "<64,102>": "", + "<64,103>": "", + "<64,104>": "", + "<64,105>": "", + "<64,106>": "", + "<64,107>": "", + "<64,108>": "" + }, + "<65>": { + "<65,1>": "OLE_TRE_MENU", + "<65,2>": "", + "<65,3>": "OLECONTROL.SRP.Tree.1", + "<65,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<65,5>": "7", + "<65,6>": "9", + "<65,7>": "137", + "<65,8>": "-34", + "<65,9>": "SRP.Tree.1", + "<65,10>": { + "<65,10,1>": "0x56000000", + "<65,10,2>": "0x0" + }, + "<65,11>": { + "<65,11,1>": "0x18000", + "<65,11,2>": "0x80000000" + }, + "<65,12>": "45", + "<65,13>": { + "<65,13,1>": "-2", + "<65,13,2>": "-2", + "<65,13,3>": "" + }, + "<65,14>": "0", + "<65,15>": { + "<65,15,1>": { + "<65,15,1,1>": "Segoe UI", + "<65,15,1,2>": "-12", + "<65,15,1,3>": "400", + "<65,15,1,4>": "0", + "<65,15,1,5>": "0", + "<65,15,1,6>": "0", + "<65,15,1,7>": "0", + "<65,15,1,8>": "34", + "<65,15,1,9>": "0", + "<65,15,1,10>": "3", + "<65,15,1,11>": "2", + "<65,15,1,12>": "1", + "<65,15,1,13>": "0", + "<65,15,1,14>": "0" + } + }, + "<65,16>": "", + "<65,17>": "", + "<65,18>": { + "<65,18,1>": { + "<65,18,1,1>": "R", + "<65,18,1,2>": "EXECUTE", + "<65,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<65,18,1,4>": { + "<65,18,1,4,1>": "@SELF", + "<65,18,1,4,2>": "@EVENT", + "<65,18,1,4,3>": "@PARAM1", + "<65,18,1,4,4>": "@PARAM2", + "<65,18,1,4,5>": "@PARAM3", + "<65,18,1,4,6>": "@PARAM4", + "<65,18,1,4,7>": "@PARAM5", + "<65,18,1,4,8>": "@PARAM6" + }, + "<65,18,1,5>": "", + "<65,18,1,6>": "", + "<65,18,1,7>": "", + "<65,18,1,8>": "", + "<65,18,1,9>": "", + "<65,18,1,10>": "", + "<65,18,1,11>": "", + "<65,18,1,12>": "", + "<65,18,1,13>": "", + "<65,18,1,14>": "", + "<65,18,1,15>": "STPROC" + } + }, + "<65,19>": "OLE", + "<65,20>": "", + "<65,21>": "", + "<65,22>": "", + "<65,23>": "", + "<65,24>": "", + "<65,25>": "", + "<65,26>": "", + "<65,27>": "", + "<65,28>": "", + "<65,29>": "", + "<65,30>": "", + "<65,31>": "", + "<65,32>": "", + "<65,33>": "", + "<65,34>": "", + "<65,35>": "", + "<65,36>": "0100000000000000", + "<65,37>": "", + "<65,38>": "", + "<65,39>": "", + "<65,40>": "", + "<65,41>": "", + "<65,42>": "", + "<65,43>": "", + "<65,44>": "", + "<65,45>": "", + "<65,46>": "", + "<65,47>": "", + "<65,48>": "", + "<65,49>": "", + "<65,50>": "", + "<65,51>": "", + "<65,52>": "", + "<65,53>": "", + "<65,54>": "", + "<65,55>": "OLE.Border", + "<65,56>": "XP", + "<65,57>": "", + "<65,58>": "", + "<65,59>": "", + "<65,60>": "", + "<65,61>": "", + "<65,62>": "", + "<65,63>": "", + "<65,64>": "", + "<65,65>": "", + "<65,66>": "", + "<65,67>": "", + "<65,68>": "", + "<65,69>": "", + "<65,70>": "", + "<65,71>": "", + "<65,72>": "", + "<65,73>": "", + "<65,74>": "", + "<65,75>": "", + "<65,76>": "", + "<65,77>": "", + "<65,78>": "", + "<65,79>": "", + "<65,80>": "", + "<65,81>": "", + "<65,82>": "", + "<65,83>": "", + "<65,84>": "", + "<65,85>": "", + "<65,86>": "", + "<65,87>": "", + "<65,88>": "", + "<65,89>": "", + "<65,90>": "", + "<65,91>": "", + "<65,92>": "", + "<65,93>": "", + "<65,94>": "", + "<65,95>": "", + "<65,96>": "", + "<65,97>": "", + "<65,98>": "", + "<65,99>": "", + "<65,100>": "", + "<65,101>": "", + "<65,102>": "", + "<65,103>": "", + "<65,104>": "", + "<65,105>": "", + "<65,106>": "", + "<65,107>": "", + "<65,108>": "" + }, + "<66>": { + "<66,1>": "OLE_TAB", + "<66,2>": "", + "<66,3>": "OLECONTROL.SRP.Tab.1", + "<66,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<66,5>": "151", + "<66,6>": "7", + "<66,7>": "-7", + "<66,8>": "2", + "<66,9>": "SRP.Tab.1", + "<66,10>": { + "<66,10,1>": "0x56000000", + "<66,10,2>": "0x0" + }, + "<66,11>": { + "<66,11,1>": "0x14000", + "<66,11,2>": "0x80000000" + }, + "<66,12>": "46", + "<66,13>": { + "<66,13,1>": "-2", + "<66,13,2>": "-2", + "<66,13,3>": "" + }, + "<66,14>": "0", + "<66,15>": { + "<66,15,1>": { + "<66,15,1,1>": "Segoe UI", + "<66,15,1,2>": "-12", + "<66,15,1,3>": "400", + "<66,15,1,4>": "0", + "<66,15,1,5>": "0", + "<66,15,1,6>": "0", + "<66,15,1,7>": "0", + "<66,15,1,8>": "34", + "<66,15,1,9>": "0", + "<66,15,1,10>": "3", + "<66,15,1,11>": "2", + "<66,15,1,12>": "1", + "<66,15,1,13>": "0", + "<66,15,1,14>": "0" + } + }, + "<66,16>": "", + "<66,17>": "", + "<66,18>": "", + "<66,19>": "", + "<66,20>": "", + "<66,21>": "", + "<66,22>": "", + "<66,23>": "", + "<66,24>": "", + "<66,25>": "", + "<66,26>": "", + "<66,27>": "", + "<66,28>": "", + "<66,29>": "", + "<66,30>": "", + "<66,31>": "", + "<66,32>": "", + "<66,33>": "", + "<66,34>": "", + "<66,35>": "", + "<66,36>": "010000000400000000000000FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000DEFFFFFF0000000001000000010000000100000000000000FFFEFF00FFFEFF044E006F006E0065000000000000000000B0030000", + "<66,37>": "", + "<66,38>": "", + "<66,39>": "", + "<66,40>": "", + "<66,41>": "", + "<66,42>": "", + "<66,43>": "", + "<66,44>": "", + "<66,45>": "", + "<66,46>": "", + "<66,47>": "", + "<66,48>": "", + "<66,49>": "", + "<66,50>": "", + "<66,51>": "", + "<66,52>": "", + "<66,53>": "", + "<66,54>": "", + "<66,55>": { + "<66,55,1>": "OLE.CaptionList", + "<66,55,2>": "OLE.CloseButtons", + "<66,55,3>": "OLE.CustomPaneColor", + "<66,55,4>": "OLE.FillParentBackground", + "<66,55,5>": "OLE.FocusOnClick", + "<66,55,6>": "OLE.FontBold", + "<66,55,7>": "OLE.FontItalic", + "<66,55,8>": "OLE.FontName", + "<66,55,9>": "OLE.FontSize", + "<66,55,10>": "OLE.FontUnderlined", + "<66,55,11>": "OLE.Height", + "<66,55,12>": "OLE.MultiLined", + "<66,55,13>": "OLE.SelectedTab", + "<66,55,14>": "OLE.ShowFocus", + "<66,55,15>": "OLE.TabCount", + "<66,55,16>": "OLE.TopMost", + "<66,55,17>": "OLE.Width" + }, + "<66,56>": { + "<66,56,1>": "", + "<66,56,2>": "0", + "<66,56,3>": "None", + "<66,56,4>": "0", + "<66,56,5>": "0", + "<66,56,6>": "0", + "<66,56,7>": "0", + "<66,56,8>": "Segoe UI", + "<66,56,9>": "8", + "<66,56,10>": "0", + "<66,56,11>": "-34", + "<66,56,12>": "0", + "<66,56,13>": "1", + "<66,56,14>": "1", + "<66,56,15>": "0", + "<66,56,16>": "1", + "<66,56,17>": "944" + }, + "<66,57>": "", + "<66,58>": "", + "<66,59>": "", + "<66,60>": "", + "<66,61>": "", + "<66,62>": "", + "<66,63>": "", + "<66,64>": "", + "<66,65>": "", + "<66,66>": "", + "<66,67>": "", + "<66,68>": "", + "<66,69>": "", + "<66,70>": "", + "<66,71>": "", + "<66,72>": "", + "<66,73>": "", + "<66,74>": "", + "<66,75>": "", + "<66,76>": "", + "<66,77>": "", + "<66,78>": "", + "<66,79>": "", + "<66,80>": "", + "<66,81>": "", + "<66,82>": "", + "<66,83>": "", + "<66,84>": "", + "<66,85>": "", + "<66,86>": "", + "<66,87>": "", + "<66,88>": "", + "<66,89>": "", + "<66,90>": "", + "<66,91>": "", + "<66,92>": "", + "<66,93>": "", + "<66,94>": "", + "<66,95>": "", + "<66,96>": "", + "<66,97>": "", + "<66,98>": "", + "<66,99>": "", + "<66,100>": "", + "<66,101>": "", + "<66,102>": "", + "<66,103>": "", + "<66,104>": "", + "<66,105>": "", + "<66,106>": "", + "<66,107>": "", + "<66,108>": "" + }, + "<67>": { + "<67,1>": "OLE_PIC_SERVER_OPTIONS", + "<67,2>": "", + "<67,3>": "OLECONTROL.SRP.Picture.1", + "<67,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<67,5>": "165", + "<67,6>": "23", + "<67,7>": "-537", + "<67,8>": "24", + "<67,9>": "SRP.Picture.1", + "<67,10>": { + "<67,10,1>": "0x56000000", + "<67,10,2>": "0x0" + }, + "<67,11>": { + "<67,11,1>": "0x4000", + "<67,11,2>": "0x80000000" + }, + "<67,12>": "47", + "<67,13>": { + "<67,13,1>": "-2", + "<67,13,2>": "-2", + "<67,13,3>": "" + }, + "<67,14>": "0", + "<67,15>": { + "<67,15,1>": { + "<67,15,1,1>": "Segoe UI", + "<67,15,1,2>": "-12", + "<67,15,1,3>": "400", + "<67,15,1,4>": "0", + "<67,15,1,5>": "0", + "<67,15,1,6>": "0", + "<67,15,1,7>": "0", + "<67,15,1,8>": "34", + "<67,15,1,9>": "0", + "<67,15,1,10>": "3", + "<67,15,1,11>": "2", + "<67,15,1,12>": "1", + "<67,15,1,13>": "0", + "<67,15,1,14>": "0" + } + }, + "<67,16>": "", + "<67,17>": "", + "<67,18>": "", + "<67,19>": "", + "<67,20>": "", + "<67,21>": "", + "<67,22>": "", + "<67,23>": "", + "<67,24>": "", + "<67,25>": "", + "<67,26>": "", + "<67,27>": "", + "<67,28>": "", + "<67,29>": "", + "<67,30>": "", + "<67,31>": "", + "<67,32>": "", + "<67,33>": "", + "<67,34>": "", + "<67,35>": "", + "<67,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<67,37>": "", + "<67,38>": "", + "<67,39>": "", + "<67,40>": "", + "<67,41>": "", + "<67,42>": "", + "<67,43>": "", + "<67,44>": "", + "<67,45>": "", + "<67,46>": "", + "<67,47>": "", + "<67,48>": "", + "<67,49>": "", + "<67,50>": "", + "<67,51>": "", + "<67,52>": "", + "<67,53>": "", + "<67,54>": "", + "<67,55>": { + "<67,55,1>": "OLE.Animated", + "<67,55,2>": "OLE.AnimationDelay", + "<67,55,3>": "OLE.AutoLoadDropFile", + "<67,55,4>": "OLE.BackgroundColor", + "<67,55,5>": "OLE.BorderAlignment", + "<67,55,6>": "OLE.BorderType", + "<67,55,7>": "OLE.Caption", + "<67,55,8>": "OLE.CaptionColor", + "<67,55,9>": "OLE.CaptionHorzAlign", + "<67,55,10>": "OLE.CaptionHorzOffset", + "<67,55,11>": "OLE.CaptionVertAlign", + "<67,55,12>": "OLE.CaptionVertOffset", + "<67,55,13>": "OLE.ControlPart", + "<67,55,14>": "OLE.FontBold", + "<67,55,15>": "OLE.FontItalic", + "<67,55,16>": "OLE.FontName", + "<67,55,17>": "OLE.FontSize", + "<67,55,18>": "OLE.FontUnderlined", + "<67,55,19>": "OLE.Frame", + "<67,55,20>": "OLE.FrameCount", + "<67,55,21>": "OLE.HorzAlign", + "<67,55,22>": "OLE.Image", + "<67,55,23>": "OLE.ImageHorzOffset", + "<67,55,24>": "OLE.ImageVertOffset", + "<67,55,25>": "OLE.Layout", + "<67,55,26>": "OLE.ResizeUsingGDIPlus", + "<67,55,27>": "OLE.TransparentColor", + "<67,55,28>": "OLE.VertAlign", + "<67,55,29>": "OLE.Zoom" + }, + "<67,56>": { + "<67,56,1>": "0", + "<67,56,2>": "50", + "<67,56,3>": "0", + "<67,56,4>": "None", + "<67,56,5>": "All", + "<67,56,6>": "None", + "<67,56,7>": "", + "<67,56,8>": "None", + "<67,56,9>": "Center", + "<67,56,10>": "0", + "<67,56,11>": "Center", + "<67,56,12>": "0", + "<67,56,13>": "None", + "<67,56,14>": "0", + "<67,56,15>": "0", + "<67,56,16>": "Segoe UI", + "<67,56,17>": "8", + "<67,56,18>": "0", + "<67,56,19>": "1", + "<67,56,20>": "1", + "<67,56,21>": "Center", + "<67,56,22>": "", + "<67,56,23>": "0", + "<67,56,24>": "0", + "<67,56,25>": "Clip", + "<67,56,26>": "1", + "<67,56,27>": "Auto", + "<67,56,28>": "Center", + "<67,56,29>": "1" + }, + "<67,57>": "", + "<67,58>": "", + "<67,59>": "", + "<67,60>": "", + "<67,61>": "", + "<67,62>": "", + "<67,63>": "", + "<67,64>": "", + "<67,65>": "", + "<67,66>": "", + "<67,67>": "", + "<67,68>": "", + "<67,69>": "", + "<67,70>": "", + "<67,71>": "", + "<67,72>": "", + "<67,73>": "", + "<67,74>": "", + "<67,75>": "", + "<67,76>": "", + "<67,77>": "", + "<67,78>": "", + "<67,79>": "", + "<67,80>": "", + "<67,81>": "", + "<67,82>": "", + "<67,83>": "", + "<67,84>": "", + "<67,85>": "", + "<67,86>": "", + "<67,87>": "", + "<67,88>": "", + "<67,89>": "", + "<67,90>": "", + "<67,91>": "", + "<67,92>": "", + "<67,93>": "", + "<67,94>": "", + "<67,95>": "", + "<67,96>": "", + "<67,97>": "", + "<67,98>": "", + "<67,99>": "", + "<67,100>": "", + "<67,101>": "", + "<67,102>": "", + "<67,103>": "", + "<67,104>": "", + "<67,105>": "", + "<67,106>": "", + "<67,107>": "", + "<67,108>": "" + }, + "<68>": { + "<68,1>": "OLE_PIC_AUTHENTICATION_OPTIONS", + "<68,2>": "", + "<68,3>": "OLECONTROL.SRP.Picture.1", + "<68,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<68,5>": "165", + "<68,6>": "23:1", + "<68,7>": "-537", + "<68,8>": "24", + "<68,9>": "SRP.Picture.1", + "<68,10>": { + "<68,10,1>": "0x56000000", + "<68,10,2>": "0x0" + }, + "<68,11>": { + "<68,11,1>": "0x4000", + "<68,11,2>": "0x80000000" + }, + "<68,12>": "48", + "<68,13>": { + "<68,13,1>": "-2", + "<68,13,2>": "-2", + "<68,13,3>": "" + }, + "<68,14>": "0", + "<68,15>": { + "<68,15,1>": { + "<68,15,1,1>": "Segoe UI", + "<68,15,1,2>": "-12", + "<68,15,1,3>": "400", + "<68,15,1,4>": "0", + "<68,15,1,5>": "0", + "<68,15,1,6>": "0", + "<68,15,1,7>": "0", + "<68,15,1,8>": "34", + "<68,15,1,9>": "0", + "<68,15,1,10>": "3", + "<68,15,1,11>": "2", + "<68,15,1,12>": "1", + "<68,15,1,13>": "0", + "<68,15,1,14>": "0" + } + }, + "<68,16>": "", + "<68,17>": "", + "<68,18>": "", + "<68,19>": "", + "<68,20>": "", + "<68,21>": "", + "<68,22>": "", + "<68,23>": "", + "<68,24>": "", + "<68,25>": "", + "<68,26>": "", + "<68,27>": "", + "<68,28>": "", + "<68,29>": "", + "<68,30>": "", + "<68,31>": "", + "<68,32>": "", + "<68,33>": "", + "<68,34>": "", + "<68,35>": "", + "<68,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<68,37>": "", + "<68,38>": "", + "<68,39>": "", + "<68,40>": "", + "<68,41>": "", + "<68,42>": "", + "<68,43>": "", + "<68,44>": "", + "<68,45>": "", + "<68,46>": "", + "<68,47>": "", + "<68,48>": "", + "<68,49>": "", + "<68,50>": "", + "<68,51>": "", + "<68,52>": "", + "<68,53>": "", + "<68,54>": "", + "<68,55>": { + "<68,55,1>": "OLE.Animated", + "<68,55,2>": "OLE.AnimationDelay", + "<68,55,3>": "OLE.AutoLoadDropFile", + "<68,55,4>": "OLE.BackgroundColor", + "<68,55,5>": "OLE.BorderAlignment", + "<68,55,6>": "OLE.BorderType", + "<68,55,7>": "OLE.Caption", + "<68,55,8>": "OLE.CaptionColor", + "<68,55,9>": "OLE.CaptionHorzAlign", + "<68,55,10>": "OLE.CaptionHorzOffset", + "<68,55,11>": "OLE.CaptionVertAlign", + "<68,55,12>": "OLE.CaptionVertOffset", + "<68,55,13>": "OLE.ControlPart", + "<68,55,14>": "OLE.FontBold", + "<68,55,15>": "OLE.FontItalic", + "<68,55,16>": "OLE.FontName", + "<68,55,17>": "OLE.FontSize", + "<68,55,18>": "OLE.FontUnderlined", + "<68,55,19>": "OLE.Frame", + "<68,55,20>": "OLE.FrameCount", + "<68,55,21>": "OLE.HorzAlign", + "<68,55,22>": "OLE.Image", + "<68,55,23>": "OLE.ImageHorzOffset", + "<68,55,24>": "OLE.ImageVertOffset", + "<68,55,25>": "OLE.Layout", + "<68,55,26>": "OLE.ResizeUsingGDIPlus", + "<68,55,27>": "OLE.TransparentColor", + "<68,55,28>": "OLE.VertAlign", + "<68,55,29>": "OLE.Zoom" + }, + "<68,56>": { + "<68,56,1>": "0", + "<68,56,2>": "50", + "<68,56,3>": "0", + "<68,56,4>": "None", + "<68,56,5>": "All", + "<68,56,6>": "None", + "<68,56,7>": "", + "<68,56,8>": "None", + "<68,56,9>": "Center", + "<68,56,10>": "0", + "<68,56,11>": "Center", + "<68,56,12>": "0", + "<68,56,13>": "None", + "<68,56,14>": "0", + "<68,56,15>": "0", + "<68,56,16>": "Segoe UI", + "<68,56,17>": "8", + "<68,56,18>": "0", + "<68,56,19>": "1", + "<68,56,20>": "1", + "<68,56,21>": "Center", + "<68,56,22>": "", + "<68,56,23>": "0", + "<68,56,24>": "0", + "<68,56,25>": "Clip", + "<68,56,26>": "1", + "<68,56,27>": "Auto", + "<68,56,28>": "Center", + "<68,56,29>": "1" + }, + "<68,57>": "", + "<68,58>": "", + "<68,59>": "", + "<68,60>": "", + "<68,61>": "", + "<68,62>": "", + "<68,63>": "", + "<68,64>": "", + "<68,65>": "", + "<68,66>": "", + "<68,67>": "", + "<68,68>": "", + "<68,69>": "", + "<68,70>": "", + "<68,71>": "", + "<68,72>": "", + "<68,73>": "", + "<68,74>": "", + "<68,75>": "", + "<68,76>": "", + "<68,77>": "", + "<68,78>": "", + "<68,79>": "", + "<68,80>": "", + "<68,81>": "", + "<68,82>": "", + "<68,83>": "", + "<68,84>": "", + "<68,85>": "", + "<68,86>": "", + "<68,87>": "", + "<68,88>": "", + "<68,89>": "", + "<68,90>": "", + "<68,91>": "", + "<68,92>": "", + "<68,93>": "", + "<68,94>": "", + "<68,95>": "", + "<68,96>": "", + "<68,97>": "", + "<68,98>": "", + "<68,99>": "", + "<68,100>": "", + "<68,101>": "", + "<68,102>": "", + "<68,103>": "", + "<68,104>": "", + "<68,105>": "", + "<68,106>": "", + "<68,107>": "", + "<68,108>": "" + }, + "<69>": { + "<69,1>": "OLE_INFO_HOME_URL", + "<69,2>": "", + "<69,3>": "OLECONTROL.SRP.Picture.1", + "<69,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<69,5>": "638", + "<69,6>": "58", + "<69,7>": "10", + "<69,8>": "10", + "<69,9>": "SRP.Picture.1", + "<69,10>": { + "<69,10,1>": "0x56000000", + "<69,10,2>": "0x0" + }, + "<69,11>": { + "<69,11,1>": "0x0", + "<69,11,2>": "0x80000000" + }, + "<69,12>": "49", + "<69,13>": { + "<69,13,1>": "-2", + "<69,13,2>": "-2", + "<69,13,3>": "" + }, + "<69,14>": "0", + "<69,15>": { + "<69,15,1>": { + "<69,15,1,1>": "Segoe UI", + "<69,15,1,2>": "-12", + "<69,15,1,3>": "400", + "<69,15,1,4>": "0", + "<69,15,1,5>": "0", + "<69,15,1,6>": "0", + "<69,15,1,7>": "0", + "<69,15,1,8>": "34", + "<69,15,1,9>": "0", + "<69,15,1,10>": "3", + "<69,15,1,11>": "2", + "<69,15,1,12>": "1", + "<69,15,1,13>": "0", + "<69,15,1,14>": "0" + } + }, + "<69,16>": "", + "<69,17>": "", + "<69,18>": { + "<69,18,1>": { + "<69,18,1,1>": "R", + "<69,18,1,2>": "EXECUTE", + "<69,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<69,18,1,4>": { + "<69,18,1,4,1>": "@SELF", + "<69,18,1,4,2>": "@EVENT", + "<69,18,1,4,3>": "@PARAM1", + "<69,18,1,4,4>": "@PARAM2", + "<69,18,1,4,5>": "@PARAM3", + "<69,18,1,4,6>": "@PARAM4", + "<69,18,1,4,7>": "@PARAM5", + "<69,18,1,4,8>": "@PARAM6" + }, + "<69,18,1,5>": "", + "<69,18,1,6>": "", + "<69,18,1,7>": "", + "<69,18,1,8>": "", + "<69,18,1,9>": "", + "<69,18,1,10>": "", + "<69,18,1,11>": "", + "<69,18,1,12>": "", + "<69,18,1,13>": "", + "<69,18,1,14>": "", + "<69,18,1,15>": "STPROC" + } + }, + "<69,19>": "OLE", + "<69,20>": "", + "<69,21>": "", + "<69,22>": "", + "<69,23>": "", + "<69,24>": "", + "<69,25>": "", + "<69,26>": "", + "<69,27>": "", + "<69,28>": "", + "<69,29>": "", + "<69,30>": "", + "<69,31>": "", + "<69,32>": "", + "<69,33>": "", + "<69,34>": "", + "<69,35>": "", + "<69,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<69,37>": "", + "<69,38>": "", + "<69,39>": "", + "<69,40>": "", + "<69,41>": "", + "<69,42>": "", + "<69,43>": "", + "<69,44>": "", + "<69,45>": "", + "<69,46>": "", + "<69,47>": "", + "<69,48>": "", + "<69,49>": "", + "<69,50>": "", + "<69,51>": "", + "<69,52>": "", + "<69,53>": "", + "<69,54>": "", + "<69,55>": { + "<69,55,1>": "OLE.Animated", + "<69,55,2>": "OLE.AnimationDelay", + "<69,55,3>": "OLE.AutoLoadDropFile", + "<69,55,4>": "OLE.BackgroundColor", + "<69,55,5>": "OLE.BorderAlignment", + "<69,55,6>": "OLE.BorderType", + "<69,55,7>": "OLE.Caption", + "<69,55,8>": "OLE.CaptionColor", + "<69,55,9>": "OLE.CaptionHorzAlign", + "<69,55,10>": "OLE.CaptionHorzOffset", + "<69,55,11>": "OLE.CaptionVertAlign", + "<69,55,12>": "OLE.CaptionVertOffset", + "<69,55,13>": "OLE.ControlPart", + "<69,55,14>": "OLE.FontBold", + "<69,55,15>": "OLE.FontItalic", + "<69,55,16>": "OLE.FontName", + "<69,55,17>": "OLE.FontSize", + "<69,55,18>": "OLE.FontUnderlined", + "<69,55,19>": "OLE.Frame", + "<69,55,20>": "OLE.FrameCount", + "<69,55,21>": "OLE.HorzAlign", + "<69,55,22>": "OLE.Image", + "<69,55,23>": "OLE.ImageHorzOffset", + "<69,55,24>": "OLE.ImageVertOffset", + "<69,55,25>": "OLE.Layout", + "<69,55,26>": "OLE.ResizeUsingGDIPlus", + "<69,55,27>": "OLE.TransparentColor", + "<69,55,28>": "OLE.VertAlign", + "<69,55,29>": "OLE.Zoom" + }, + "<69,56>": { + "<69,56,1>": "0", + "<69,56,2>": "50", + "<69,56,3>": "0", + "<69,56,4>": "None", + "<69,56,5>": "All", + "<69,56,6>": "None", + "<69,56,7>": "", + "<69,56,8>": "None", + "<69,56,9>": "Center", + "<69,56,10>": "0", + "<69,56,11>": "Center", + "<69,56,12>": "0", + "<69,56,13>": "None", + "<69,56,14>": "0", + "<69,56,15>": "0", + "<69,56,16>": "Segoe UI", + "<69,56,17>": "8", + "<69,56,18>": "0", + "<69,56,19>": "1", + "<69,56,20>": "1", + "<69,56,21>": "Center", + "<69,56,22>": "BMPS\\SRPHTTPInfo.png", + "<69,56,23>": "0", + "<69,56,24>": "0", + "<69,56,25>": "Clip", + "<69,56,26>": "1", + "<69,56,27>": "Auto", + "<69,56,28>": "Center", + "<69,56,29>": "1" + }, + "<69,57>": "", + "<69,58>": "", + "<69,59>": "", + "<69,60>": "", + "<69,61>": "", + "<69,62>": "", + "<69,63>": "", + "<69,64>": "", + "<69,65>": "", + "<69,66>": "", + "<69,67>": "", + "<69,68>": "", + "<69,69>": "", + "<69,70>": "", + "<69,71>": "", + "<69,72>": "", + "<69,73>": "", + "<69,74>": "", + "<69,75>": "", + "<69,76>": "", + "<69,77>": "", + "<69,78>": "", + "<69,79>": "", + "<69,80>": "", + "<69,81>": "", + "<69,82>": "", + "<69,83>": "", + "<69,84>": "", + "<69,85>": "", + "<69,86>": "", + "<69,87>": "", + "<69,88>": "", + "<69,89>": "", + "<69,90>": "", + "<69,91>": "", + "<69,92>": "", + "<69,93>": "", + "<69,94>": "", + "<69,95>": "", + "<69,96>": "", + "<69,97>": "", + "<69,98>": "", + "<69,99>": "", + "<69,100>": "", + "<69,101>": "", + "<69,102>": "", + "<69,103>": "", + "<69,104>": "", + "<69,105>": "", + "<69,106>": "", + "<69,107>": "", + "<69,108>": "" + }, + "<70>": { + "<70,1>": "OLE_INFO_API_URL", + "<70,2>": "", + "<70,3>": "OLECONTROL.SRP.Picture.1", + "<70,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<70,5>": "638", + "<70,6>": "88", + "<70,7>": "10", + "<70,8>": "10", + "<70,9>": "SRP.Picture.1", + "<70,10>": { + "<70,10,1>": "0x56000000", + "<70,10,2>": "0x0" + }, + "<70,11>": { + "<70,11,1>": "0x0", + "<70,11,2>": "0x80000000" + }, + "<70,12>": "50", + "<70,13>": { + "<70,13,1>": "-2", + "<70,13,2>": "-2", + "<70,13,3>": "" + }, + "<70,14>": "0", + "<70,15>": { + "<70,15,1>": { + "<70,15,1,1>": "Segoe UI", + "<70,15,1,2>": "-12", + "<70,15,1,3>": "400", + "<70,15,1,4>": "0", + "<70,15,1,5>": "0", + "<70,15,1,6>": "0", + "<70,15,1,7>": "0", + "<70,15,1,8>": "34", + "<70,15,1,9>": "0", + "<70,15,1,10>": "3", + "<70,15,1,11>": "2", + "<70,15,1,12>": "1", + "<70,15,1,13>": "0", + "<70,15,1,14>": "0" + } + }, + "<70,16>": "", + "<70,17>": "", + "<70,18>": { + "<70,18,1>": { + "<70,18,1,1>": "R", + "<70,18,1,2>": "EXECUTE", + "<70,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<70,18,1,4>": { + "<70,18,1,4,1>": "@SELF", + "<70,18,1,4,2>": "@EVENT", + "<70,18,1,4,3>": "@PARAM1", + "<70,18,1,4,4>": "@PARAM2", + "<70,18,1,4,5>": "@PARAM3", + "<70,18,1,4,6>": "@PARAM4", + "<70,18,1,4,7>": "@PARAM5", + "<70,18,1,4,8>": "@PARAM6" + }, + "<70,18,1,5>": "", + "<70,18,1,6>": "", + "<70,18,1,7>": "", + "<70,18,1,8>": "", + "<70,18,1,9>": "", + "<70,18,1,10>": "", + "<70,18,1,11>": "", + "<70,18,1,12>": "", + "<70,18,1,13>": "", + "<70,18,1,14>": "", + "<70,18,1,15>": "STPROC" + } + }, + "<70,19>": "OLE", + "<70,20>": "", + "<70,21>": "", + "<70,22>": "", + "<70,23>": "", + "<70,24>": "", + "<70,25>": "", + "<70,26>": "", + "<70,27>": "", + "<70,28>": "", + "<70,29>": "", + "<70,30>": "", + "<70,31>": "", + "<70,32>": "", + "<70,33>": "", + "<70,34>": "", + "<70,35>": "", + "<70,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<70,37>": "", + "<70,38>": "", + "<70,39>": "", + "<70,40>": "", + "<70,41>": "", + "<70,42>": "", + "<70,43>": "", + "<70,44>": "", + "<70,45>": "", + "<70,46>": "", + "<70,47>": "", + "<70,48>": "", + "<70,49>": "", + "<70,50>": "", + "<70,51>": "", + "<70,52>": "", + "<70,53>": "", + "<70,54>": "", + "<70,55>": { + "<70,55,1>": "OLE.Animated", + "<70,55,2>": "OLE.AnimationDelay", + "<70,55,3>": "OLE.AutoLoadDropFile", + "<70,55,4>": "OLE.BackgroundColor", + "<70,55,5>": "OLE.BorderAlignment", + "<70,55,6>": "OLE.BorderType", + "<70,55,7>": "OLE.Caption", + "<70,55,8>": "OLE.CaptionColor", + "<70,55,9>": "OLE.CaptionHorzAlign", + "<70,55,10>": "OLE.CaptionHorzOffset", + "<70,55,11>": "OLE.CaptionVertAlign", + "<70,55,12>": "OLE.CaptionVertOffset", + "<70,55,13>": "OLE.ControlPart", + "<70,55,14>": "OLE.FontBold", + "<70,55,15>": "OLE.FontItalic", + "<70,55,16>": "OLE.FontName", + "<70,55,17>": "OLE.FontSize", + "<70,55,18>": "OLE.FontUnderlined", + "<70,55,19>": "OLE.Frame", + "<70,55,20>": "OLE.FrameCount", + "<70,55,21>": "OLE.HorzAlign", + "<70,55,22>": "OLE.Image", + "<70,55,23>": "OLE.ImageHorzOffset", + "<70,55,24>": "OLE.ImageVertOffset", + "<70,55,25>": "OLE.Layout", + "<70,55,26>": "OLE.ResizeUsingGDIPlus", + "<70,55,27>": "OLE.TransparentColor", + "<70,55,28>": "OLE.VertAlign", + "<70,55,29>": "OLE.Zoom" + }, + "<70,56>": { + "<70,56,1>": "0", + "<70,56,2>": "50", + "<70,56,3>": "0", + "<70,56,4>": "None", + "<70,56,5>": "All", + "<70,56,6>": "None", + "<70,56,7>": "", + "<70,56,8>": "None", + "<70,56,9>": "Center", + "<70,56,10>": "0", + "<70,56,11>": "Center", + "<70,56,12>": "0", + "<70,56,13>": "None", + "<70,56,14>": "0", + "<70,56,15>": "0", + "<70,56,16>": "Segoe UI", + "<70,56,17>": "8", + "<70,56,18>": "0", + "<70,56,19>": "1", + "<70,56,20>": "1", + "<70,56,21>": "Center", + "<70,56,22>": "BMPS\\SRPHTTPInfo.png", + "<70,56,23>": "0", + "<70,56,24>": "0", + "<70,56,25>": "Clip", + "<70,56,26>": "1", + "<70,56,27>": "Auto", + "<70,56,28>": "Center", + "<70,56,29>": "1" + }, + "<70,57>": "", + "<70,58>": "", + "<70,59>": "", + "<70,60>": "", + "<70,61>": "", + "<70,62>": "", + "<70,63>": "", + "<70,64>": "", + "<70,65>": "", + "<70,66>": "", + "<70,67>": "", + "<70,68>": "", + "<70,69>": "", + "<70,70>": "", + "<70,71>": "", + "<70,72>": "", + "<70,73>": "", + "<70,74>": "", + "<70,75>": "", + "<70,76>": "", + "<70,77>": "", + "<70,78>": "", + "<70,79>": "", + "<70,80>": "", + "<70,81>": "", + "<70,82>": "", + "<70,83>": "", + "<70,84>": "", + "<70,85>": "", + "<70,86>": "", + "<70,87>": "", + "<70,88>": "", + "<70,89>": "", + "<70,90>": "", + "<70,91>": "", + "<70,92>": "", + "<70,93>": "", + "<70,94>": "", + "<70,95>": "", + "<70,96>": "", + "<70,97>": "", + "<70,98>": "", + "<70,99>": "", + "<70,100>": "", + "<70,101>": "", + "<70,102>": "", + "<70,103>": "", + "<70,104>": "", + "<70,105>": "", + "<70,106>": "", + "<70,107>": "", + "<70,108>": "" + }, + "<71>": { + "<71,1>": "OLE_INFO_ENABLE_LOGGING", + "<71,2>": "", + "<71,3>": "OLECONTROL.SRP.Picture.1", + "<71,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<71,5>": "286", + "<71,6>": "155", + "<71,7>": "10", + "<71,8>": "10", + "<71,9>": "SRP.Picture.1", + "<71,10>": { + "<71,10,1>": "0x56000000", + "<71,10,2>": "0x0" + }, + "<71,11>": { + "<71,11,1>": "0x0", + "<71,11,2>": "0x80000000" + }, + "<71,12>": "51", + "<71,13>": { + "<71,13,1>": "-2", + "<71,13,2>": "-2", + "<71,13,3>": "" + }, + "<71,14>": "0", + "<71,15>": { + "<71,15,1>": { + "<71,15,1,1>": "Segoe UI", + "<71,15,1,2>": "-12", + "<71,15,1,3>": "400", + "<71,15,1,4>": "0", + "<71,15,1,5>": "0", + "<71,15,1,6>": "0", + "<71,15,1,7>": "0", + "<71,15,1,8>": "34", + "<71,15,1,9>": "0", + "<71,15,1,10>": "3", + "<71,15,1,11>": "2", + "<71,15,1,12>": "1", + "<71,15,1,13>": "0", + "<71,15,1,14>": "0" + } + }, + "<71,16>": "", + "<71,17>": "", + "<71,18>": { + "<71,18,1>": { + "<71,18,1,1>": "R", + "<71,18,1,2>": "EXECUTE", + "<71,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<71,18,1,4>": { + "<71,18,1,4,1>": "@SELF", + "<71,18,1,4,2>": "@EVENT", + "<71,18,1,4,3>": "@PARAM1", + "<71,18,1,4,4>": "@PARAM2", + "<71,18,1,4,5>": "@PARAM3", + "<71,18,1,4,6>": "@PARAM4", + "<71,18,1,4,7>": "@PARAM5", + "<71,18,1,4,8>": "@PARAM6" + }, + "<71,18,1,5>": "", + "<71,18,1,6>": "", + "<71,18,1,7>": "", + "<71,18,1,8>": "", + "<71,18,1,9>": "", + "<71,18,1,10>": "", + "<71,18,1,11>": "", + "<71,18,1,12>": "", + "<71,18,1,13>": "", + "<71,18,1,14>": "", + "<71,18,1,15>": "STPROC" + } + }, + "<71,19>": "OLE", + "<71,20>": "", + "<71,21>": "", + "<71,22>": "", + "<71,23>": "", + "<71,24>": "", + "<71,25>": "", + "<71,26>": "", + "<71,27>": "", + "<71,28>": "", + "<71,29>": "", + "<71,30>": "", + "<71,31>": "", + "<71,32>": "", + "<71,33>": "", + "<71,34>": "", + "<71,35>": "", + "<71,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<71,37>": "", + "<71,38>": "", + "<71,39>": "", + "<71,40>": "", + "<71,41>": "", + "<71,42>": "", + "<71,43>": "", + "<71,44>": "", + "<71,45>": "", + "<71,46>": "", + "<71,47>": "", + "<71,48>": "", + "<71,49>": "", + "<71,50>": "", + "<71,51>": "", + "<71,52>": "", + "<71,53>": "", + "<71,54>": "", + "<71,55>": { + "<71,55,1>": "OLE.Animated", + "<71,55,2>": "OLE.AnimationDelay", + "<71,55,3>": "OLE.AutoLoadDropFile", + "<71,55,4>": "OLE.BackgroundColor", + "<71,55,5>": "OLE.BorderAlignment", + "<71,55,6>": "OLE.BorderType", + "<71,55,7>": "OLE.Caption", + "<71,55,8>": "OLE.CaptionColor", + "<71,55,9>": "OLE.CaptionHorzAlign", + "<71,55,10>": "OLE.CaptionHorzOffset", + "<71,55,11>": "OLE.CaptionVertAlign", + "<71,55,12>": "OLE.CaptionVertOffset", + "<71,55,13>": "OLE.ControlPart", + "<71,55,14>": "OLE.FontBold", + "<71,55,15>": "OLE.FontItalic", + "<71,55,16>": "OLE.FontName", + "<71,55,17>": "OLE.FontSize", + "<71,55,18>": "OLE.FontUnderlined", + "<71,55,19>": "OLE.Frame", + "<71,55,20>": "OLE.FrameCount", + "<71,55,21>": "OLE.HorzAlign", + "<71,55,22>": "OLE.Image", + "<71,55,23>": "OLE.ImageHorzOffset", + "<71,55,24>": "OLE.ImageVertOffset", + "<71,55,25>": "OLE.Layout", + "<71,55,26>": "OLE.ResizeUsingGDIPlus", + "<71,55,27>": "OLE.TransparentColor", + "<71,55,28>": "OLE.VertAlign", + "<71,55,29>": "OLE.Zoom" + }, + "<71,56>": { + "<71,56,1>": "0", + "<71,56,2>": "50", + "<71,56,3>": "0", + "<71,56,4>": "None", + "<71,56,5>": "All", + "<71,56,6>": "None", + "<71,56,7>": "", + "<71,56,8>": "None", + "<71,56,9>": "Center", + "<71,56,10>": "0", + "<71,56,11>": "Center", + "<71,56,12>": "0", + "<71,56,13>": "None", + "<71,56,14>": "0", + "<71,56,15>": "0", + "<71,56,16>": "Segoe UI", + "<71,56,17>": "8", + "<71,56,18>": "0", + "<71,56,19>": "1", + "<71,56,20>": "1", + "<71,56,21>": "Center", + "<71,56,22>": "BMPS\\SRPHTTPInfo.png", + "<71,56,23>": "0", + "<71,56,24>": "0", + "<71,56,25>": "Clip", + "<71,56,26>": "1", + "<71,56,27>": "Auto", + "<71,56,28>": "Center", + "<71,56,29>": "1" + }, + "<71,57>": "", + "<71,58>": "", + "<71,59>": "", + "<71,60>": "", + "<71,61>": "", + "<71,62>": "", + "<71,63>": "", + "<71,64>": "", + "<71,65>": "", + "<71,66>": "", + "<71,67>": "", + "<71,68>": "", + "<71,69>": "", + "<71,70>": "", + "<71,71>": "", + "<71,72>": "", + "<71,73>": "", + "<71,74>": "", + "<71,75>": "", + "<71,76>": "", + "<71,77>": "", + "<71,78>": "", + "<71,79>": "", + "<71,80>": "", + "<71,81>": "", + "<71,82>": "", + "<71,83>": "", + "<71,84>": "", + "<71,85>": "", + "<71,86>": "", + "<71,87>": "", + "<71,88>": "", + "<71,89>": "", + "<71,90>": "", + "<71,91>": "", + "<71,92>": "", + "<71,93>": "", + "<71,94>": "", + "<71,95>": "", + "<71,96>": "", + "<71,97>": "", + "<71,98>": "", + "<71,99>": "", + "<71,100>": "", + "<71,101>": "", + "<71,102>": "", + "<71,103>": "", + "<71,104>": "", + "<71,105>": "", + "<71,106>": "", + "<71,107>": "", + "<71,108>": "" + }, + "<72>": { + "<72,1>": "OLE_INFO_LOG_ERRORS_ONLY", + "<72,2>": "", + "<72,3>": "OLECONTROL.SRP.Picture.1", + "<72,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<72,5>": "412", + "<72,6>": "181", + "<72,7>": "10", + "<72,8>": "10", + "<72,9>": "SRP.Picture.1", + "<72,10>": { + "<72,10,1>": "0x56000000", + "<72,10,2>": "0x0" + }, + "<72,11>": { + "<72,11,1>": "0x0", + "<72,11,2>": "0x80000000" + }, + "<72,12>": "52", + "<72,13>": { + "<72,13,1>": "-2", + "<72,13,2>": "-2", + "<72,13,3>": "" + }, + "<72,14>": "0", + "<72,15>": { + "<72,15,1>": { + "<72,15,1,1>": "Segoe UI", + "<72,15,1,2>": "-12", + "<72,15,1,3>": "400", + "<72,15,1,4>": "0", + "<72,15,1,5>": "0", + "<72,15,1,6>": "0", + "<72,15,1,7>": "0", + "<72,15,1,8>": "34", + "<72,15,1,9>": "0", + "<72,15,1,10>": "3", + "<72,15,1,11>": "2", + "<72,15,1,12>": "1", + "<72,15,1,13>": "0", + "<72,15,1,14>": "0" + } + }, + "<72,16>": "", + "<72,17>": "", + "<72,18>": { + "<72,18,1>": { + "<72,18,1,1>": "R", + "<72,18,1,2>": "EXECUTE", + "<72,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<72,18,1,4>": { + "<72,18,1,4,1>": "@SELF", + "<72,18,1,4,2>": "@EVENT", + "<72,18,1,4,3>": "@PARAM1", + "<72,18,1,4,4>": "@PARAM2", + "<72,18,1,4,5>": "@PARAM3", + "<72,18,1,4,6>": "@PARAM4", + "<72,18,1,4,7>": "@PARAM5", + "<72,18,1,4,8>": "@PARAM6" + }, + "<72,18,1,5>": "", + "<72,18,1,6>": "", + "<72,18,1,7>": "", + "<72,18,1,8>": "", + "<72,18,1,9>": "", + "<72,18,1,10>": "", + "<72,18,1,11>": "", + "<72,18,1,12>": "", + "<72,18,1,13>": "", + "<72,18,1,14>": "", + "<72,18,1,15>": "STPROC" + } + }, + "<72,19>": "OLE", + "<72,20>": "", + "<72,21>": "", + "<72,22>": "", + "<72,23>": "", + "<72,24>": "", + "<72,25>": "", + "<72,26>": "", + "<72,27>": "", + "<72,28>": "", + "<72,29>": "", + "<72,30>": "", + "<72,31>": "", + "<72,32>": "", + "<72,33>": "", + "<72,34>": "", + "<72,35>": "", + "<72,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<72,37>": "", + "<72,38>": "", + "<72,39>": "", + "<72,40>": "", + "<72,41>": "", + "<72,42>": "", + "<72,43>": "", + "<72,44>": "", + "<72,45>": "", + "<72,46>": "", + "<72,47>": "", + "<72,48>": "", + "<72,49>": "", + "<72,50>": "", + "<72,51>": "", + "<72,52>": "", + "<72,53>": "", + "<72,54>": "", + "<72,55>": { + "<72,55,1>": "OLE.Animated", + "<72,55,2>": "OLE.AnimationDelay", + "<72,55,3>": "OLE.AutoLoadDropFile", + "<72,55,4>": "OLE.BackgroundColor", + "<72,55,5>": "OLE.BorderAlignment", + "<72,55,6>": "OLE.BorderType", + "<72,55,7>": "OLE.Caption", + "<72,55,8>": "OLE.CaptionColor", + "<72,55,9>": "OLE.CaptionHorzAlign", + "<72,55,10>": "OLE.CaptionHorzOffset", + "<72,55,11>": "OLE.CaptionVertAlign", + "<72,55,12>": "OLE.CaptionVertOffset", + "<72,55,13>": "OLE.ControlPart", + "<72,55,14>": "OLE.FontBold", + "<72,55,15>": "OLE.FontItalic", + "<72,55,16>": "OLE.FontName", + "<72,55,17>": "OLE.FontSize", + "<72,55,18>": "OLE.FontUnderlined", + "<72,55,19>": "OLE.Frame", + "<72,55,20>": "OLE.FrameCount", + "<72,55,21>": "OLE.HorzAlign", + "<72,55,22>": "OLE.Image", + "<72,55,23>": "OLE.ImageHorzOffset", + "<72,55,24>": "OLE.ImageVertOffset", + "<72,55,25>": "OLE.Layout", + "<72,55,26>": "OLE.ResizeUsingGDIPlus", + "<72,55,27>": "OLE.TransparentColor", + "<72,55,28>": "OLE.VertAlign", + "<72,55,29>": "OLE.Zoom" + }, + "<72,56>": { + "<72,56,1>": "0", + "<72,56,2>": "50", + "<72,56,3>": "0", + "<72,56,4>": "None", + "<72,56,5>": "All", + "<72,56,6>": "None", + "<72,56,7>": "", + "<72,56,8>": "None", + "<72,56,9>": "Center", + "<72,56,10>": "0", + "<72,56,11>": "Center", + "<72,56,12>": "0", + "<72,56,13>": "None", + "<72,56,14>": "0", + "<72,56,15>": "0", + "<72,56,16>": "Segoe UI", + "<72,56,17>": "8", + "<72,56,18>": "0", + "<72,56,19>": "1", + "<72,56,20>": "1", + "<72,56,21>": "Center", + "<72,56,22>": "BMPS\\SRPHTTPInfo.png", + "<72,56,23>": "0", + "<72,56,24>": "0", + "<72,56,25>": "Clip", + "<72,56,26>": "1", + "<72,56,27>": "Auto", + "<72,56,28>": "Center", + "<72,56,29>": "1" + }, + "<72,57>": "", + "<72,58>": "", + "<72,59>": "", + "<72,60>": "", + "<72,61>": "", + "<72,62>": "", + "<72,63>": "", + "<72,64>": "", + "<72,65>": "", + "<72,66>": "", + "<72,67>": "", + "<72,68>": "", + "<72,69>": "", + "<72,70>": "", + "<72,71>": "", + "<72,72>": "", + "<72,73>": "", + "<72,74>": "", + "<72,75>": "", + "<72,76>": "", + "<72,77>": "", + "<72,78>": "", + "<72,79>": "", + "<72,80>": "", + "<72,81>": "", + "<72,82>": "", + "<72,83>": "", + "<72,84>": "", + "<72,85>": "", + "<72,86>": "", + "<72,87>": "", + "<72,88>": "", + "<72,89>": "", + "<72,90>": "", + "<72,91>": "", + "<72,92>": "", + "<72,93>": "", + "<72,94>": "", + "<72,95>": "", + "<72,96>": "", + "<72,97>": "", + "<72,98>": "", + "<72,99>": "", + "<72,100>": "", + "<72,101>": "", + "<72,102>": "", + "<72,103>": "", + "<72,104>": "", + "<72,105>": "", + "<72,106>": "", + "<72,107>": "", + "<72,108>": "" + }, + "<73>": { + "<73,1>": "OLE_INFO_CAPTURE_PATH", + "<73,2>": "", + "<73,3>": "OLECONTROL.SRP.Picture.1", + "<73,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<73,5>": "638", + "<73,6>": "201", + "<73,7>": "10", + "<73,8>": "10", + "<73,9>": "SRP.Picture.1", + "<73,10>": { + "<73,10,1>": "0x56000000", + "<73,10,2>": "0x0" + }, + "<73,11>": { + "<73,11,1>": "0x0", + "<73,11,2>": "0x80000000" + }, + "<73,12>": "53", + "<73,13>": { + "<73,13,1>": "-2", + "<73,13,2>": "-2", + "<73,13,3>": "" + }, + "<73,14>": "0", + "<73,15>": { + "<73,15,1>": { + "<73,15,1,1>": "Segoe UI", + "<73,15,1,2>": "-12", + "<73,15,1,3>": "400", + "<73,15,1,4>": "0", + "<73,15,1,5>": "0", + "<73,15,1,6>": "0", + "<73,15,1,7>": "0", + "<73,15,1,8>": "34", + "<73,15,1,9>": "0", + "<73,15,1,10>": "3", + "<73,15,1,11>": "2", + "<73,15,1,12>": "1", + "<73,15,1,13>": "0", + "<73,15,1,14>": "0" + } + }, + "<73,16>": "", + "<73,17>": "", + "<73,18>": { + "<73,18,1>": { + "<73,18,1,1>": "R", + "<73,18,1,2>": "EXECUTE", + "<73,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<73,18,1,4>": { + "<73,18,1,4,1>": "@SELF", + "<73,18,1,4,2>": "@EVENT", + "<73,18,1,4,3>": "@PARAM1", + "<73,18,1,4,4>": "@PARAM2", + "<73,18,1,4,5>": "@PARAM3", + "<73,18,1,4,6>": "@PARAM4", + "<73,18,1,4,7>": "@PARAM5", + "<73,18,1,4,8>": "@PARAM6" + }, + "<73,18,1,5>": "", + "<73,18,1,6>": "", + "<73,18,1,7>": "", + "<73,18,1,8>": "", + "<73,18,1,9>": "", + "<73,18,1,10>": "", + "<73,18,1,11>": "", + "<73,18,1,12>": "", + "<73,18,1,13>": "", + "<73,18,1,14>": "", + "<73,18,1,15>": "STPROC" + } + }, + "<73,19>": "OLE", + "<73,20>": "", + "<73,21>": "", + "<73,22>": "", + "<73,23>": "", + "<73,24>": "", + "<73,25>": "", + "<73,26>": "", + "<73,27>": "", + "<73,28>": "", + "<73,29>": "", + "<73,30>": "", + "<73,31>": "", + "<73,32>": "", + "<73,33>": "", + "<73,34>": "", + "<73,35>": "", + "<73,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<73,37>": "", + "<73,38>": "", + "<73,39>": "", + "<73,40>": "", + "<73,41>": "", + "<73,42>": "", + "<73,43>": "", + "<73,44>": "", + "<73,45>": "", + "<73,46>": "", + "<73,47>": "", + "<73,48>": "", + "<73,49>": "", + "<73,50>": "", + "<73,51>": "", + "<73,52>": "", + "<73,53>": "", + "<73,54>": "", + "<73,55>": { + "<73,55,1>": "OLE.Animated", + "<73,55,2>": "OLE.AnimationDelay", + "<73,55,3>": "OLE.AutoLoadDropFile", + "<73,55,4>": "OLE.BackgroundColor", + "<73,55,5>": "OLE.BorderAlignment", + "<73,55,6>": "OLE.BorderType", + "<73,55,7>": "OLE.Caption", + "<73,55,8>": "OLE.CaptionColor", + "<73,55,9>": "OLE.CaptionHorzAlign", + "<73,55,10>": "OLE.CaptionHorzOffset", + "<73,55,11>": "OLE.CaptionVertAlign", + "<73,55,12>": "OLE.CaptionVertOffset", + "<73,55,13>": "OLE.ControlPart", + "<73,55,14>": "OLE.FontBold", + "<73,55,15>": "OLE.FontItalic", + "<73,55,16>": "OLE.FontName", + "<73,55,17>": "OLE.FontSize", + "<73,55,18>": "OLE.FontUnderlined", + "<73,55,19>": "OLE.Frame", + "<73,55,20>": "OLE.FrameCount", + "<73,55,21>": "OLE.HorzAlign", + "<73,55,22>": "OLE.Image", + "<73,55,23>": "OLE.ImageHorzOffset", + "<73,55,24>": "OLE.ImageVertOffset", + "<73,55,25>": "OLE.Layout", + "<73,55,26>": "OLE.ResizeUsingGDIPlus", + "<73,55,27>": "OLE.TransparentColor", + "<73,55,28>": "OLE.VertAlign", + "<73,55,29>": "OLE.Zoom" + }, + "<73,56>": { + "<73,56,1>": "0", + "<73,56,2>": "50", + "<73,56,3>": "0", + "<73,56,4>": "None", + "<73,56,5>": "All", + "<73,56,6>": "None", + "<73,56,7>": "", + "<73,56,8>": "None", + "<73,56,9>": "Center", + "<73,56,10>": "0", + "<73,56,11>": "Center", + "<73,56,12>": "0", + "<73,56,13>": "None", + "<73,56,14>": "0", + "<73,56,15>": "0", + "<73,56,16>": "Segoe UI", + "<73,56,17>": "8", + "<73,56,18>": "0", + "<73,56,19>": "1", + "<73,56,20>": "1", + "<73,56,21>": "Center", + "<73,56,22>": "BMPS\\SRPHTTPInfo.png", + "<73,56,23>": "0", + "<73,56,24>": "0", + "<73,56,25>": "Clip", + "<73,56,26>": "1", + "<73,56,27>": "Auto", + "<73,56,28>": "Center", + "<73,56,29>": "1" + }, + "<73,57>": "", + "<73,58>": "", + "<73,59>": "", + "<73,60>": "", + "<73,61>": "", + "<73,62>": "", + "<73,63>": "", + "<73,64>": "", + "<73,65>": "", + "<73,66>": "", + "<73,67>": "", + "<73,68>": "", + "<73,69>": "", + "<73,70>": "", + "<73,71>": "", + "<73,72>": "", + "<73,73>": "", + "<73,74>": "", + "<73,75>": "", + "<73,76>": "", + "<73,77>": "", + "<73,78>": "", + "<73,79>": "", + "<73,80>": "", + "<73,81>": "", + "<73,82>": "", + "<73,83>": "", + "<73,84>": "", + "<73,85>": "", + "<73,86>": "", + "<73,87>": "", + "<73,88>": "", + "<73,89>": "", + "<73,90>": "", + "<73,91>": "", + "<73,92>": "", + "<73,93>": "", + "<73,94>": "", + "<73,95>": "", + "<73,96>": "", + "<73,97>": "", + "<73,98>": "", + "<73,99>": "", + "<73,100>": "", + "<73,101>": "", + "<73,102>": "", + "<73,103>": "", + "<73,104>": "", + "<73,105>": "", + "<73,106>": "", + "<73,107>": "", + "<73,108>": "" + }, + "<74>": { + "<74,1>": "OLE_INFO_REALM_VALUE", + "<74,2>": "", + "<74,3>": "OLECONTROL.SRP.Picture.1", + "<74,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<74,5>": "638", + "<74,6>": "118", + "<74,7>": "10", + "<74,8>": "10", + "<74,9>": "SRP.Picture.1", + "<74,10>": { + "<74,10,1>": "0x56000000", + "<74,10,2>": "0x0" + }, + "<74,11>": { + "<74,11,1>": "0x0", + "<74,11,2>": "0x80000000" + }, + "<74,12>": "54", + "<74,13>": { + "<74,13,1>": "-2", + "<74,13,2>": "-2", + "<74,13,3>": "" + }, + "<74,14>": "0", + "<74,15>": { + "<74,15,1>": { + "<74,15,1,1>": "Segoe UI", + "<74,15,1,2>": "-12", + "<74,15,1,3>": "400", + "<74,15,1,4>": "0", + "<74,15,1,5>": "0", + "<74,15,1,6>": "0", + "<74,15,1,7>": "0", + "<74,15,1,8>": "34", + "<74,15,1,9>": "0", + "<74,15,1,10>": "3", + "<74,15,1,11>": "2", + "<74,15,1,12>": "1", + "<74,15,1,13>": "0", + "<74,15,1,14>": "0" + } + }, + "<74,16>": "", + "<74,17>": "", + "<74,18>": { + "<74,18,1>": { + "<74,18,1,1>": "R", + "<74,18,1,2>": "EXECUTE", + "<74,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<74,18,1,4>": { + "<74,18,1,4,1>": "@SELF", + "<74,18,1,4,2>": "@EVENT", + "<74,18,1,4,3>": "@PARAM1", + "<74,18,1,4,4>": "@PARAM2", + "<74,18,1,4,5>": "@PARAM3", + "<74,18,1,4,6>": "@PARAM4", + "<74,18,1,4,7>": "@PARAM5", + "<74,18,1,4,8>": "@PARAM6" + }, + "<74,18,1,5>": "", + "<74,18,1,6>": "", + "<74,18,1,7>": "", + "<74,18,1,8>": "", + "<74,18,1,9>": "", + "<74,18,1,10>": "", + "<74,18,1,11>": "", + "<74,18,1,12>": "", + "<74,18,1,13>": "", + "<74,18,1,14>": "", + "<74,18,1,15>": "STPROC" + } + }, + "<74,19>": "OLE", + "<74,20>": "", + "<74,21>": "", + "<74,22>": "", + "<74,23>": "", + "<74,24>": "", + "<74,25>": "", + "<74,26>": "", + "<74,27>": "", + "<74,28>": "", + "<74,29>": "", + "<74,30>": "", + "<74,31>": "", + "<74,32>": "", + "<74,33>": "", + "<74,34>": "", + "<74,35>": "", + "<74,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<74,37>": "", + "<74,38>": "", + "<74,39>": "", + "<74,40>": "", + "<74,41>": "", + "<74,42>": "", + "<74,43>": "", + "<74,44>": "", + "<74,45>": "", + "<74,46>": "", + "<74,47>": "", + "<74,48>": "", + "<74,49>": "", + "<74,50>": "", + "<74,51>": "", + "<74,52>": "", + "<74,53>": "", + "<74,54>": "", + "<74,55>": { + "<74,55,1>": "OLE.Animated", + "<74,55,2>": "OLE.AnimationDelay", + "<74,55,3>": "OLE.AutoLoadDropFile", + "<74,55,4>": "OLE.BackgroundColor", + "<74,55,5>": "OLE.BorderAlignment", + "<74,55,6>": "OLE.BorderType", + "<74,55,7>": "OLE.Caption", + "<74,55,8>": "OLE.CaptionColor", + "<74,55,9>": "OLE.CaptionHorzAlign", + "<74,55,10>": "OLE.CaptionHorzOffset", + "<74,55,11>": "OLE.CaptionVertAlign", + "<74,55,12>": "OLE.CaptionVertOffset", + "<74,55,13>": "OLE.ControlPart", + "<74,55,14>": "OLE.FontBold", + "<74,55,15>": "OLE.FontItalic", + "<74,55,16>": "OLE.FontName", + "<74,55,17>": "OLE.FontSize", + "<74,55,18>": "OLE.FontUnderlined", + "<74,55,19>": "OLE.Frame", + "<74,55,20>": "OLE.FrameCount", + "<74,55,21>": "OLE.HorzAlign", + "<74,55,22>": "OLE.Image", + "<74,55,23>": "OLE.ImageHorzOffset", + "<74,55,24>": "OLE.ImageVertOffset", + "<74,55,25>": "OLE.Layout", + "<74,55,26>": "OLE.ResizeUsingGDIPlus", + "<74,55,27>": "OLE.TransparentColor", + "<74,55,28>": "OLE.VertAlign", + "<74,55,29>": "OLE.Zoom" + }, + "<74,56>": { + "<74,56,1>": "0", + "<74,56,2>": "50", + "<74,56,3>": "0", + "<74,56,4>": "None", + "<74,56,5>": "All", + "<74,56,6>": "None", + "<74,56,7>": "", + "<74,56,8>": "None", + "<74,56,9>": "Center", + "<74,56,10>": "0", + "<74,56,11>": "Center", + "<74,56,12>": "0", + "<74,56,13>": "None", + "<74,56,14>": "0", + "<74,56,15>": "0", + "<74,56,16>": "Segoe UI", + "<74,56,17>": "8", + "<74,56,18>": "0", + "<74,56,19>": "1", + "<74,56,20>": "1", + "<74,56,21>": "Center", + "<74,56,22>": "BMPS\\SRPHTTPInfo.png", + "<74,56,23>": "0", + "<74,56,24>": "0", + "<74,56,25>": "Clip", + "<74,56,26>": "1", + "<74,56,27>": "Auto", + "<74,56,28>": "Center", + "<74,56,29>": "1" + }, + "<74,57>": "", + "<74,58>": "", + "<74,59>": "", + "<74,60>": "", + "<74,61>": "", + "<74,62>": "", + "<74,63>": "", + "<74,64>": "", + "<74,65>": "", + "<74,66>": "", + "<74,67>": "", + "<74,68>": "", + "<74,69>": "", + "<74,70>": "", + "<74,71>": "", + "<74,72>": "", + "<74,73>": "", + "<74,74>": "", + "<74,75>": "", + "<74,76>": "", + "<74,77>": "", + "<74,78>": "", + "<74,79>": "", + "<74,80>": "", + "<74,81>": "", + "<74,82>": "", + "<74,83>": "", + "<74,84>": "", + "<74,85>": "", + "<74,86>": "", + "<74,87>": "", + "<74,88>": "", + "<74,89>": "", + "<74,90>": "", + "<74,91>": "", + "<74,92>": "", + "<74,93>": "", + "<74,94>": "", + "<74,95>": "", + "<74,96>": "", + "<74,97>": "", + "<74,98>": "", + "<74,99>": "", + "<74,100>": "", + "<74,101>": "", + "<74,102>": "", + "<74,103>": "", + "<74,104>": "", + "<74,105>": "", + "<74,106>": "", + "<74,107>": "", + "<74,108>": "" + }, + "<75>": { + "<75,1>": "OLE_INFO_ENTRY_POINT_SERVICE", + "<75,2>": "", + "<75,3>": "OLECONTROL.SRP.Picture.1", + "<75,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<75,5>": "638", + "<75,6>": "261", + "<75,7>": "10", + "<75,8>": "10", + "<75,9>": "SRP.Picture.1", + "<75,10>": { + "<75,10,1>": "0x56000000", + "<75,10,2>": "0x0" + }, + "<75,11>": { + "<75,11,1>": "0x0", + "<75,11,2>": "0x80000000" + }, + "<75,12>": "55", + "<75,13>": { + "<75,13,1>": "-2", + "<75,13,2>": "-2", + "<75,13,3>": "" + }, + "<75,14>": "0", + "<75,15>": { + "<75,15,1>": { + "<75,15,1,1>": "Segoe UI", + "<75,15,1,2>": "-12", + "<75,15,1,3>": "400", + "<75,15,1,4>": "0", + "<75,15,1,5>": "0", + "<75,15,1,6>": "0", + "<75,15,1,7>": "0", + "<75,15,1,8>": "34", + "<75,15,1,9>": "0", + "<75,15,1,10>": "3", + "<75,15,1,11>": "2", + "<75,15,1,12>": "1", + "<75,15,1,13>": "0", + "<75,15,1,14>": "0" + } + }, + "<75,16>": "", + "<75,17>": "", + "<75,18>": { + "<75,18,1>": { + "<75,18,1,1>": "R", + "<75,18,1,2>": "EXECUTE", + "<75,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<75,18,1,4>": { + "<75,18,1,4,1>": "@SELF", + "<75,18,1,4,2>": "@EVENT", + "<75,18,1,4,3>": "@PARAM1", + "<75,18,1,4,4>": "@PARAM2", + "<75,18,1,4,5>": "@PARAM3", + "<75,18,1,4,6>": "@PARAM4", + "<75,18,1,4,7>": "@PARAM5", + "<75,18,1,4,8>": "@PARAM6" + }, + "<75,18,1,5>": "", + "<75,18,1,6>": "", + "<75,18,1,7>": "", + "<75,18,1,8>": "", + "<75,18,1,9>": "", + "<75,18,1,10>": "", + "<75,18,1,11>": "", + "<75,18,1,12>": "", + "<75,18,1,13>": "", + "<75,18,1,14>": "", + "<75,18,1,15>": "STPROC" + } + }, + "<75,19>": "OLE", + "<75,20>": "", + "<75,21>": "", + "<75,22>": "", + "<75,23>": "", + "<75,24>": "", + "<75,25>": "", + "<75,26>": "", + "<75,27>": "", + "<75,28>": "", + "<75,29>": "", + "<75,30>": "", + "<75,31>": "", + "<75,32>": "", + "<75,33>": "", + "<75,34>": "", + "<75,35>": "", + "<75,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<75,37>": "", + "<75,38>": "", + "<75,39>": "", + "<75,40>": "", + "<75,41>": "", + "<75,42>": "", + "<75,43>": "", + "<75,44>": "", + "<75,45>": "", + "<75,46>": "", + "<75,47>": "", + "<75,48>": "", + "<75,49>": "", + "<75,50>": "", + "<75,51>": "", + "<75,52>": "", + "<75,53>": "", + "<75,54>": "", + "<75,55>": { + "<75,55,1>": "OLE.Animated", + "<75,55,2>": "OLE.AnimationDelay", + "<75,55,3>": "OLE.AutoLoadDropFile", + "<75,55,4>": "OLE.BackgroundColor", + "<75,55,5>": "OLE.BorderAlignment", + "<75,55,6>": "OLE.BorderType", + "<75,55,7>": "OLE.Caption", + "<75,55,8>": "OLE.CaptionColor", + "<75,55,9>": "OLE.CaptionHorzAlign", + "<75,55,10>": "OLE.CaptionHorzOffset", + "<75,55,11>": "OLE.CaptionVertAlign", + "<75,55,12>": "OLE.CaptionVertOffset", + "<75,55,13>": "OLE.ControlPart", + "<75,55,14>": "OLE.FontBold", + "<75,55,15>": "OLE.FontItalic", + "<75,55,16>": "OLE.FontName", + "<75,55,17>": "OLE.FontSize", + "<75,55,18>": "OLE.FontUnderlined", + "<75,55,19>": "OLE.Frame", + "<75,55,20>": "OLE.FrameCount", + "<75,55,21>": "OLE.HorzAlign", + "<75,55,22>": "OLE.Image", + "<75,55,23>": "OLE.ImageHorzOffset", + "<75,55,24>": "OLE.ImageVertOffset", + "<75,55,25>": "OLE.Layout", + "<75,55,26>": "OLE.ResizeUsingGDIPlus", + "<75,55,27>": "OLE.TransparentColor", + "<75,55,28>": "OLE.VertAlign", + "<75,55,29>": "OLE.Zoom" + }, + "<75,56>": { + "<75,56,1>": "0", + "<75,56,2>": "50", + "<75,56,3>": "0", + "<75,56,4>": "None", + "<75,56,5>": "All", + "<75,56,6>": "None", + "<75,56,7>": "", + "<75,56,8>": "None", + "<75,56,9>": "Center", + "<75,56,10>": "0", + "<75,56,11>": "Center", + "<75,56,12>": "0", + "<75,56,13>": "None", + "<75,56,14>": "0", + "<75,56,15>": "0", + "<75,56,16>": "Segoe UI", + "<75,56,17>": "8", + "<75,56,18>": "0", + "<75,56,19>": "1", + "<75,56,20>": "1", + "<75,56,21>": "Center", + "<75,56,22>": "BMPS\\SRPHTTPInfo.png", + "<75,56,23>": "0", + "<75,56,24>": "0", + "<75,56,25>": "Clip", + "<75,56,26>": "1", + "<75,56,27>": "Auto", + "<75,56,28>": "Center", + "<75,56,29>": "1" + }, + "<75,57>": "", + "<75,58>": "", + "<75,59>": "", + "<75,60>": "", + "<75,61>": "", + "<75,62>": "", + "<75,63>": "", + "<75,64>": "", + "<75,65>": "", + "<75,66>": "", + "<75,67>": "", + "<75,68>": "", + "<75,69>": "", + "<75,70>": "", + "<75,71>": "", + "<75,72>": "", + "<75,73>": "", + "<75,74>": "", + "<75,75>": "", + "<75,76>": "", + "<75,77>": "", + "<75,78>": "", + "<75,79>": "", + "<75,80>": "", + "<75,81>": "", + "<75,82>": "", + "<75,83>": "", + "<75,84>": "", + "<75,85>": "", + "<75,86>": "", + "<75,87>": "", + "<75,88>": "", + "<75,89>": "", + "<75,90>": "", + "<75,91>": "", + "<75,92>": "", + "<75,93>": "", + "<75,94>": "", + "<75,95>": "", + "<75,96>": "", + "<75,97>": "", + "<75,98>": "", + "<75,99>": "", + "<75,100>": "", + "<75,101>": "", + "<75,102>": "", + "<75,103>": "", + "<75,104>": "", + "<75,105>": "", + "<75,106>": "", + "<75,107>": "", + "<75,108>": "" + }, + "<76>": { + "<76,1>": "OLE_INFO_ABORTED_SERVICE", + "<76,2>": "", + "<76,3>": "OLECONTROL.SRP.Picture.1", + "<76,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<76,5>": "638", + "<76,6>": "291", + "<76,7>": "10", + "<76,8>": "10", + "<76,9>": "SRP.Picture.1", + "<76,10>": { + "<76,10,1>": "0x56000000", + "<76,10,2>": "0x0" + }, + "<76,11>": { + "<76,11,1>": "0x0", + "<76,11,2>": "0x80000000" + }, + "<76,12>": "56", + "<76,13>": { + "<76,13,1>": "-2", + "<76,13,2>": "-2", + "<76,13,3>": "" + }, + "<76,14>": "0", + "<76,15>": { + "<76,15,1>": { + "<76,15,1,1>": "Segoe UI", + "<76,15,1,2>": "-12", + "<76,15,1,3>": "400", + "<76,15,1,4>": "0", + "<76,15,1,5>": "0", + "<76,15,1,6>": "0", + "<76,15,1,7>": "0", + "<76,15,1,8>": "34", + "<76,15,1,9>": "0", + "<76,15,1,10>": "3", + "<76,15,1,11>": "2", + "<76,15,1,12>": "1", + "<76,15,1,13>": "0", + "<76,15,1,14>": "0" + } + }, + "<76,16>": "", + "<76,17>": "", + "<76,18>": { + "<76,18,1>": { + "<76,18,1,1>": "R", + "<76,18,1,2>": "EXECUTE", + "<76,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<76,18,1,4>": { + "<76,18,1,4,1>": "@SELF", + "<76,18,1,4,2>": "@EVENT", + "<76,18,1,4,3>": "@PARAM1", + "<76,18,1,4,4>": "@PARAM2", + "<76,18,1,4,5>": "@PARAM3", + "<76,18,1,4,6>": "@PARAM4", + "<76,18,1,4,7>": "@PARAM5", + "<76,18,1,4,8>": "@PARAM6" + }, + "<76,18,1,5>": "", + "<76,18,1,6>": "", + "<76,18,1,7>": "", + "<76,18,1,8>": "", + "<76,18,1,9>": "", + "<76,18,1,10>": "", + "<76,18,1,11>": "", + "<76,18,1,12>": "", + "<76,18,1,13>": "", + "<76,18,1,14>": "", + "<76,18,1,15>": "STPROC" + } + }, + "<76,19>": "OLE", + "<76,20>": "", + "<76,21>": "", + "<76,22>": "", + "<76,23>": "", + "<76,24>": "", + "<76,25>": "", + "<76,26>": "", + "<76,27>": "", + "<76,28>": "", + "<76,29>": "", + "<76,30>": "", + "<76,31>": "", + "<76,32>": "", + "<76,33>": "", + "<76,34>": "", + "<76,35>": "", + "<76,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<76,37>": "", + "<76,38>": "", + "<76,39>": "", + "<76,40>": "", + "<76,41>": "", + "<76,42>": "", + "<76,43>": "", + "<76,44>": "", + "<76,45>": "", + "<76,46>": "", + "<76,47>": "", + "<76,48>": "", + "<76,49>": "", + "<76,50>": "", + "<76,51>": "", + "<76,52>": "", + "<76,53>": "", + "<76,54>": "", + "<76,55>": { + "<76,55,1>": "OLE.Animated", + "<76,55,2>": "OLE.AnimationDelay", + "<76,55,3>": "OLE.AutoLoadDropFile", + "<76,55,4>": "OLE.BackgroundColor", + "<76,55,5>": "OLE.BorderAlignment", + "<76,55,6>": "OLE.BorderType", + "<76,55,7>": "OLE.Caption", + "<76,55,8>": "OLE.CaptionColor", + "<76,55,9>": "OLE.CaptionHorzAlign", + "<76,55,10>": "OLE.CaptionHorzOffset", + "<76,55,11>": "OLE.CaptionVertAlign", + "<76,55,12>": "OLE.CaptionVertOffset", + "<76,55,13>": "OLE.ControlPart", + "<76,55,14>": "OLE.FontBold", + "<76,55,15>": "OLE.FontItalic", + "<76,55,16>": "OLE.FontName", + "<76,55,17>": "OLE.FontSize", + "<76,55,18>": "OLE.FontUnderlined", + "<76,55,19>": "OLE.Frame", + "<76,55,20>": "OLE.FrameCount", + "<76,55,21>": "OLE.HorzAlign", + "<76,55,22>": "OLE.Image", + "<76,55,23>": "OLE.ImageHorzOffset", + "<76,55,24>": "OLE.ImageVertOffset", + "<76,55,25>": "OLE.Layout", + "<76,55,26>": "OLE.ResizeUsingGDIPlus", + "<76,55,27>": "OLE.TransparentColor", + "<76,55,28>": "OLE.VertAlign", + "<76,55,29>": "OLE.Zoom" + }, + "<76,56>": { + "<76,56,1>": "0", + "<76,56,2>": "50", + "<76,56,3>": "0", + "<76,56,4>": "None", + "<76,56,5>": "All", + "<76,56,6>": "None", + "<76,56,7>": "", + "<76,56,8>": "None", + "<76,56,9>": "Center", + "<76,56,10>": "0", + "<76,56,11>": "Center", + "<76,56,12>": "0", + "<76,56,13>": "None", + "<76,56,14>": "0", + "<76,56,15>": "0", + "<76,56,16>": "Segoe UI", + "<76,56,17>": "8", + "<76,56,18>": "0", + "<76,56,19>": "1", + "<76,56,20>": "1", + "<76,56,21>": "Center", + "<76,56,22>": "BMPS\\SRPHTTPInfo.png", + "<76,56,23>": "0", + "<76,56,24>": "0", + "<76,56,25>": "Clip", + "<76,56,26>": "1", + "<76,56,27>": "Auto", + "<76,56,28>": "Center", + "<76,56,29>": "1" + }, + "<76,57>": "", + "<76,58>": "", + "<76,59>": "", + "<76,60>": "", + "<76,61>": "", + "<76,62>": "", + "<76,63>": "", + "<76,64>": "", + "<76,65>": "", + "<76,66>": "", + "<76,67>": "", + "<76,68>": "", + "<76,69>": "", + "<76,70>": "", + "<76,71>": "", + "<76,72>": "", + "<76,73>": "", + "<76,74>": "", + "<76,75>": "", + "<76,76>": "", + "<76,77>": "", + "<76,78>": "", + "<76,79>": "", + "<76,80>": "", + "<76,81>": "", + "<76,82>": "", + "<76,83>": "", + "<76,84>": "", + "<76,85>": "", + "<76,86>": "", + "<76,87>": "", + "<76,88>": "", + "<76,89>": "", + "<76,90>": "", + "<76,91>": "", + "<76,92>": "", + "<76,93>": "", + "<76,94>": "", + "<76,95>": "", + "<76,96>": "", + "<76,97>": "", + "<76,98>": "", + "<76,99>": "", + "<76,100>": "", + "<76,101>": "", + "<76,102>": "", + "<76,103>": "", + "<76,104>": "", + "<76,105>": "", + "<76,106>": "", + "<76,107>": "", + "<76,108>": "" + }, + "<77>": { + "<77,1>": "OLE_INFO_DEBUGGER_SETTING", + "<77,2>": "", + "<77,3>": "OLECONTROL.SRP.Picture.1", + "<77,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<77,5>": "638", + "<77,6>": "321", + "<77,7>": "10", + "<77,8>": "10", + "<77,9>": "SRP.Picture.1", + "<77,10>": { + "<77,10,1>": "0x56000000", + "<77,10,2>": "0x0" + }, + "<77,11>": { + "<77,11,1>": "0x0", + "<77,11,2>": "0x80000000" + }, + "<77,12>": "57", + "<77,13>": { + "<77,13,1>": "-2", + "<77,13,2>": "-2", + "<77,13,3>": "" + }, + "<77,14>": "0", + "<77,15>": { + "<77,15,1>": { + "<77,15,1,1>": "Segoe UI", + "<77,15,1,2>": "-12", + "<77,15,1,3>": "400", + "<77,15,1,4>": "0", + "<77,15,1,5>": "0", + "<77,15,1,6>": "0", + "<77,15,1,7>": "0", + "<77,15,1,8>": "34", + "<77,15,1,9>": "0", + "<77,15,1,10>": "3", + "<77,15,1,11>": "2", + "<77,15,1,12>": "1", + "<77,15,1,13>": "0", + "<77,15,1,14>": "0" + } + }, + "<77,16>": "", + "<77,17>": "", + "<77,18>": { + "<77,18,1>": { + "<77,18,1,1>": "R", + "<77,18,1,2>": "EXECUTE", + "<77,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<77,18,1,4>": { + "<77,18,1,4,1>": "@SELF", + "<77,18,1,4,2>": "@EVENT", + "<77,18,1,4,3>": "@PARAM1", + "<77,18,1,4,4>": "@PARAM2", + "<77,18,1,4,5>": "@PARAM3", + "<77,18,1,4,6>": "@PARAM4", + "<77,18,1,4,7>": "@PARAM5", + "<77,18,1,4,8>": "@PARAM6" + }, + "<77,18,1,5>": "", + "<77,18,1,6>": "", + "<77,18,1,7>": "", + "<77,18,1,8>": "", + "<77,18,1,9>": "", + "<77,18,1,10>": "", + "<77,18,1,11>": "", + "<77,18,1,12>": "", + "<77,18,1,13>": "", + "<77,18,1,14>": "", + "<77,18,1,15>": "STPROC" + } + }, + "<77,19>": "OLE", + "<77,20>": "", + "<77,21>": "", + "<77,22>": "", + "<77,23>": "", + "<77,24>": "", + "<77,25>": "", + "<77,26>": "", + "<77,27>": "", + "<77,28>": "", + "<77,29>": "", + "<77,30>": "", + "<77,31>": "", + "<77,32>": "", + "<77,33>": "", + "<77,34>": "", + "<77,35>": "", + "<77,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<77,37>": "", + "<77,38>": "", + "<77,39>": "", + "<77,40>": "", + "<77,41>": "", + "<77,42>": "", + "<77,43>": "", + "<77,44>": "", + "<77,45>": "", + "<77,46>": "", + "<77,47>": "", + "<77,48>": "", + "<77,49>": "", + "<77,50>": "", + "<77,51>": "", + "<77,52>": "", + "<77,53>": "", + "<77,54>": "", + "<77,55>": { + "<77,55,1>": "OLE.Animated", + "<77,55,2>": "OLE.AnimationDelay", + "<77,55,3>": "OLE.AutoLoadDropFile", + "<77,55,4>": "OLE.BackgroundColor", + "<77,55,5>": "OLE.BorderAlignment", + "<77,55,6>": "OLE.BorderType", + "<77,55,7>": "OLE.Caption", + "<77,55,8>": "OLE.CaptionColor", + "<77,55,9>": "OLE.CaptionHorzAlign", + "<77,55,10>": "OLE.CaptionHorzOffset", + "<77,55,11>": "OLE.CaptionVertAlign", + "<77,55,12>": "OLE.CaptionVertOffset", + "<77,55,13>": "OLE.ControlPart", + "<77,55,14>": "OLE.FontBold", + "<77,55,15>": "OLE.FontItalic", + "<77,55,16>": "OLE.FontName", + "<77,55,17>": "OLE.FontSize", + "<77,55,18>": "OLE.FontUnderlined", + "<77,55,19>": "OLE.Frame", + "<77,55,20>": "OLE.FrameCount", + "<77,55,21>": "OLE.HorzAlign", + "<77,55,22>": "OLE.Image", + "<77,55,23>": "OLE.ImageHorzOffset", + "<77,55,24>": "OLE.ImageVertOffset", + "<77,55,25>": "OLE.Layout", + "<77,55,26>": "OLE.ResizeUsingGDIPlus", + "<77,55,27>": "OLE.TransparentColor", + "<77,55,28>": "OLE.VertAlign", + "<77,55,29>": "OLE.Zoom" + }, + "<77,56>": { + "<77,56,1>": "0", + "<77,56,2>": "50", + "<77,56,3>": "0", + "<77,56,4>": "None", + "<77,56,5>": "All", + "<77,56,6>": "None", + "<77,56,7>": "", + "<77,56,8>": "None", + "<77,56,9>": "Center", + "<77,56,10>": "0", + "<77,56,11>": "Center", + "<77,56,12>": "0", + "<77,56,13>": "None", + "<77,56,14>": "0", + "<77,56,15>": "0", + "<77,56,16>": "Segoe UI", + "<77,56,17>": "8", + "<77,56,18>": "0", + "<77,56,19>": "1", + "<77,56,20>": "1", + "<77,56,21>": "Center", + "<77,56,22>": "BMPS\\SRPHTTPInfo.png", + "<77,56,23>": "0", + "<77,56,24>": "0", + "<77,56,25>": "Clip", + "<77,56,26>": "1", + "<77,56,27>": "Auto", + "<77,56,28>": "Center", + "<77,56,29>": "1" + }, + "<77,57>": "", + "<77,58>": "", + "<77,59>": "", + "<77,60>": "", + "<77,61>": "", + "<77,62>": "", + "<77,63>": "", + "<77,64>": "", + "<77,65>": "", + "<77,66>": "", + "<77,67>": "", + "<77,68>": "", + "<77,69>": "", + "<77,70>": "", + "<77,71>": "", + "<77,72>": "", + "<77,73>": "", + "<77,74>": "", + "<77,75>": "", + "<77,76>": "", + "<77,77>": "", + "<77,78>": "", + "<77,79>": "", + "<77,80>": "", + "<77,81>": "", + "<77,82>": "", + "<77,83>": "", + "<77,84>": "", + "<77,85>": "", + "<77,86>": "", + "<77,87>": "", + "<77,88>": "", + "<77,89>": "", + "<77,90>": "", + "<77,91>": "", + "<77,92>": "", + "<77,93>": "", + "<77,94>": "", + "<77,95>": "", + "<77,96>": "", + "<77,97>": "", + "<77,98>": "", + "<77,99>": "", + "<77,100>": "", + "<77,101>": "", + "<77,102>": "", + "<77,103>": "", + "<77,104>": "", + "<77,105>": "", + "<77,106>": "", + "<77,107>": "", + "<77,108>": "" + }, + "<78>": { + "<78,1>": "OLE_INFO_FLUSH_CACHE", + "<78,2>": "", + "<78,3>": "OLECONTROL.SRP.Picture.1", + "<78,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<78,5>": "267", + "<78,6>": "358", + "<78,7>": "10", + "<78,8>": "10", + "<78,9>": "SRP.Picture.1", + "<78,10>": { + "<78,10,1>": "0x56000000", + "<78,10,2>": "0x0" + }, + "<78,11>": { + "<78,11,1>": "0x0", + "<78,11,2>": "0x80000000" + }, + "<78,12>": "58", + "<78,13>": { + "<78,13,1>": "-2", + "<78,13,2>": "-2", + "<78,13,3>": "" + }, + "<78,14>": "0", + "<78,15>": { + "<78,15,1>": { + "<78,15,1,1>": "Segoe UI", + "<78,15,1,2>": "-12", + "<78,15,1,3>": "400", + "<78,15,1,4>": "0", + "<78,15,1,5>": "0", + "<78,15,1,6>": "0", + "<78,15,1,7>": "0", + "<78,15,1,8>": "34", + "<78,15,1,9>": "0", + "<78,15,1,10>": "3", + "<78,15,1,11>": "2", + "<78,15,1,12>": "1", + "<78,15,1,13>": "0", + "<78,15,1,14>": "0" + } + }, + "<78,16>": "", + "<78,17>": "", + "<78,18>": { + "<78,18,1>": { + "<78,18,1,1>": "R", + "<78,18,1,2>": "EXECUTE", + "<78,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<78,18,1,4>": { + "<78,18,1,4,1>": "@SELF", + "<78,18,1,4,2>": "@EVENT", + "<78,18,1,4,3>": "@PARAM1", + "<78,18,1,4,4>": "@PARAM2", + "<78,18,1,4,5>": "@PARAM3", + "<78,18,1,4,6>": "@PARAM4", + "<78,18,1,4,7>": "@PARAM5", + "<78,18,1,4,8>": "@PARAM6" + }, + "<78,18,1,5>": "", + "<78,18,1,6>": "", + "<78,18,1,7>": "", + "<78,18,1,8>": "", + "<78,18,1,9>": "", + "<78,18,1,10>": "", + "<78,18,1,11>": "", + "<78,18,1,12>": "", + "<78,18,1,13>": "", + "<78,18,1,14>": "", + "<78,18,1,15>": "STPROC" + } + }, + "<78,19>": "OLE", + "<78,20>": "", + "<78,21>": "", + "<78,22>": "", + "<78,23>": "", + "<78,24>": "", + "<78,25>": "", + "<78,26>": "", + "<78,27>": "", + "<78,28>": "", + "<78,29>": "", + "<78,30>": "", + "<78,31>": "", + "<78,32>": "", + "<78,33>": "", + "<78,34>": "", + "<78,35>": "", + "<78,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<78,37>": "", + "<78,38>": "", + "<78,39>": "", + "<78,40>": "", + "<78,41>": "", + "<78,42>": "", + "<78,43>": "", + "<78,44>": "", + "<78,45>": "", + "<78,46>": "", + "<78,47>": "", + "<78,48>": "", + "<78,49>": "", + "<78,50>": "", + "<78,51>": "", + "<78,52>": "", + "<78,53>": "", + "<78,54>": "", + "<78,55>": { + "<78,55,1>": "OLE.Animated", + "<78,55,2>": "OLE.AnimationDelay", + "<78,55,3>": "OLE.AutoLoadDropFile", + "<78,55,4>": "OLE.BackgroundColor", + "<78,55,5>": "OLE.BorderAlignment", + "<78,55,6>": "OLE.BorderType", + "<78,55,7>": "OLE.Caption", + "<78,55,8>": "OLE.CaptionColor", + "<78,55,9>": "OLE.CaptionHorzAlign", + "<78,55,10>": "OLE.CaptionHorzOffset", + "<78,55,11>": "OLE.CaptionVertAlign", + "<78,55,12>": "OLE.CaptionVertOffset", + "<78,55,13>": "OLE.ControlPart", + "<78,55,14>": "OLE.FontBold", + "<78,55,15>": "OLE.FontItalic", + "<78,55,16>": "OLE.FontName", + "<78,55,17>": "OLE.FontSize", + "<78,55,18>": "OLE.FontUnderlined", + "<78,55,19>": "OLE.Frame", + "<78,55,20>": "OLE.FrameCount", + "<78,55,21>": "OLE.HorzAlign", + "<78,55,22>": "OLE.Image", + "<78,55,23>": "OLE.ImageHorzOffset", + "<78,55,24>": "OLE.ImageVertOffset", + "<78,55,25>": "OLE.Layout", + "<78,55,26>": "OLE.ResizeUsingGDIPlus", + "<78,55,27>": "OLE.TransparentColor", + "<78,55,28>": "OLE.VertAlign", + "<78,55,29>": "OLE.Zoom" + }, + "<78,56>": { + "<78,56,1>": "0", + "<78,56,2>": "50", + "<78,56,3>": "0", + "<78,56,4>": "None", + "<78,56,5>": "All", + "<78,56,6>": "None", + "<78,56,7>": "", + "<78,56,8>": "None", + "<78,56,9>": "Center", + "<78,56,10>": "0", + "<78,56,11>": "Center", + "<78,56,12>": "0", + "<78,56,13>": "None", + "<78,56,14>": "0", + "<78,56,15>": "0", + "<78,56,16>": "Segoe UI", + "<78,56,17>": "8", + "<78,56,18>": "0", + "<78,56,19>": "1", + "<78,56,20>": "1", + "<78,56,21>": "Center", + "<78,56,22>": "BMPS\\SRPHTTPInfo.png", + "<78,56,23>": "0", + "<78,56,24>": "0", + "<78,56,25>": "Clip", + "<78,56,26>": "1", + "<78,56,27>": "Auto", + "<78,56,28>": "Center", + "<78,56,29>": "1" + }, + "<78,57>": "", + "<78,58>": "", + "<78,59>": "", + "<78,60>": "", + "<78,61>": "", + "<78,62>": "", + "<78,63>": "", + "<78,64>": "", + "<78,65>": "", + "<78,66>": "", + "<78,67>": "", + "<78,68>": "", + "<78,69>": "", + "<78,70>": "", + "<78,71>": "", + "<78,72>": "", + "<78,73>": "", + "<78,74>": "", + "<78,75>": "", + "<78,76>": "", + "<78,77>": "", + "<78,78>": "", + "<78,79>": "", + "<78,80>": "", + "<78,81>": "", + "<78,82>": "", + "<78,83>": "", + "<78,84>": "", + "<78,85>": "", + "<78,86>": "", + "<78,87>": "", + "<78,88>": "", + "<78,89>": "", + "<78,90>": "", + "<78,91>": "", + "<78,92>": "", + "<78,93>": "", + "<78,94>": "", + "<78,95>": "", + "<78,96>": "", + "<78,97>": "", + "<78,98>": "", + "<78,99>": "", + "<78,100>": "", + "<78,101>": "", + "<78,102>": "", + "<78,103>": "", + "<78,104>": "", + "<78,105>": "", + "<78,106>": "", + "<78,107>": "", + "<78,108>": "" + }, + "<79>": { + "<79,1>": "OLE_PIC_HTTP", + "<79,2>": "", + "<79,3>": "OLECONTROL.SRP.Picture.1", + "<79,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<79,5>": "309", + "<79,6>": "58", + "<79,7>": "82", + "<79,8>": "23", + "<79,9>": "SRP.Picture.1", + "<79,10>": { + "<79,10,1>": "0x56000000", + "<79,10,2>": "0x0" + }, + "<79,11>": { + "<79,11,1>": "0x0", + "<79,11,2>": "0x80000000" + }, + "<79,12>": "59", + "<79,13>": { + "<79,13,1>": "-2", + "<79,13,2>": "-2", + "<79,13,3>": "" + }, + "<79,14>": "0", + "<79,15>": { + "<79,15,1>": { + "<79,15,1,1>": "Segoe UI", + "<79,15,1,2>": "-12", + "<79,15,1,3>": "400", + "<79,15,1,4>": "0", + "<79,15,1,5>": "0", + "<79,15,1,6>": "0", + "<79,15,1,7>": "0", + "<79,15,1,8>": "34", + "<79,15,1,9>": "0", + "<79,15,1,10>": "3", + "<79,15,1,11>": "2", + "<79,15,1,12>": "1", + "<79,15,1,13>": "0", + "<79,15,1,14>": "0" + } + }, + "<79,16>": "", + "<79,17>": "", + "<79,18>": "", + "<79,19>": "", + "<79,20>": "", + "<79,21>": "", + "<79,22>": "", + "<79,23>": "", + "<79,24>": "", + "<79,25>": "", + "<79,26>": "", + "<79,27>": "", + "<79,28>": "", + "<79,29>": "", + "<79,30>": "", + "<79,31>": "", + "<79,32>": "", + "<79,33>": "", + "<79,34>": "", + "<79,35>": "", + "<79,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF0258005000FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0D68007400740070002B00680074007400700073003A002F002F00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<79,37>": "", + "<79,38>": "", + "<79,39>": "", + "<79,40>": "", + "<79,41>": "", + "<79,42>": "", + "<79,43>": "", + "<79,44>": "", + "<79,45>": "", + "<79,46>": "", + "<79,47>": "", + "<79,48>": "", + "<79,49>": "", + "<79,50>": "", + "<79,51>": "", + "<79,52>": "", + "<79,53>": "", + "<79,54>": "", + "<79,55>": { + "<79,55,1>": "OLE.Animated", + "<79,55,2>": "OLE.AnimationDelay", + "<79,55,3>": "OLE.AutoLoadDropFile", + "<79,55,4>": "OLE.BackgroundColor", + "<79,55,5>": "OLE.BorderAlignment", + "<79,55,6>": "OLE.BorderType", + "<79,55,7>": "OLE.Caption", + "<79,55,8>": "OLE.CaptionColor", + "<79,55,9>": "OLE.CaptionHorzAlign", + "<79,55,10>": "OLE.CaptionHorzOffset", + "<79,55,11>": "OLE.CaptionVertAlign", + "<79,55,12>": "OLE.CaptionVertOffset", + "<79,55,13>": "OLE.ControlPart", + "<79,55,14>": "OLE.FontBold", + "<79,55,15>": "OLE.FontItalic", + "<79,55,16>": "OLE.FontName", + "<79,55,17>": "OLE.FontSize", + "<79,55,18>": "OLE.FontUnderlined", + "<79,55,19>": "OLE.Frame", + "<79,55,20>": "OLE.FrameCount", + "<79,55,21>": "OLE.HorzAlign", + "<79,55,22>": "OLE.Image", + "<79,55,23>": "OLE.ImageHorzOffset", + "<79,55,24>": "OLE.ImageVertOffset", + "<79,55,25>": "OLE.Layout", + "<79,55,26>": "OLE.ResizeUsingGDIPlus", + "<79,55,27>": "OLE.TransparentColor", + "<79,55,28>": "OLE.VertAlign", + "<79,55,29>": "OLE.Zoom" + }, + "<79,56>": { + "<79,56,1>": "0", + "<79,56,2>": "50", + "<79,56,3>": "0", + "<79,56,4>": "None", + "<79,56,5>": "All", + "<79,56,6>": "XP", + "<79,56,7>": "http+https://", + "<79,56,8>": "None", + "<79,56,9>": "Center", + "<79,56,10>": "0", + "<79,56,11>": "Center", + "<79,56,12>": "0", + "<79,56,13>": "None", + "<79,56,14>": "0", + "<79,56,15>": "0", + "<79,56,16>": "Segoe UI", + "<79,56,17>": "8", + "<79,56,18>": "0", + "<79,56,19>": "1", + "<79,56,20>": "1", + "<79,56,21>": "Center", + "<79,56,22>": "", + "<79,56,23>": "0", + "<79,56,24>": "0", + "<79,56,25>": "Clip", + "<79,56,26>": "1", + "<79,56,27>": "Auto", + "<79,56,28>": "Center", + "<79,56,29>": "1" + }, + "<79,57>": "", + "<79,58>": "", + "<79,59>": "", + "<79,60>": "", + "<79,61>": "", + "<79,62>": "", + "<79,63>": "", + "<79,64>": "", + "<79,65>": "", + "<79,66>": "", + "<79,67>": "", + "<79,68>": "", + "<79,69>": "", + "<79,70>": "", + "<79,71>": "", + "<79,72>": "", + "<79,73>": "", + "<79,74>": "", + "<79,75>": "", + "<79,76>": "", + "<79,77>": "", + "<79,78>": "", + "<79,79>": "", + "<79,80>": "", + "<79,81>": "", + "<79,82>": "", + "<79,83>": "", + "<79,84>": "", + "<79,85>": "", + "<79,86>": "", + "<79,87>": "", + "<79,88>": "", + "<79,89>": "", + "<79,90>": "", + "<79,91>": "", + "<79,92>": "", + "<79,93>": "", + "<79,94>": "", + "<79,95>": "", + "<79,96>": "", + "<79,97>": "", + "<79,98>": "", + "<79,99>": "", + "<79,100>": "", + "<79,101>": "", + "<79,102>": "", + "<79,103>": "", + "<79,104>": "", + "<79,105>": "", + "<79,106>": "", + "<79,107>": "", + "<79,108>": "" + }, + "<80>": { + "<80,1>": "OLE_POPUP", + "<80,2>": "", + "<80,3>": "OLECONTROL.SRP.Popup.1", + "<80,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<80,5>": "146", + "<80,6>": "-30", + "<80,7>": "130", + "<80,8>": "24", + "<80,9>": "SRP.Popup.1", + "<80,10>": { + "<80,10,1>": "0x46000000", + "<80,10,2>": "0x0" + }, + "<80,11>": { + "<80,11,1>": "0x2000", + "<80,11,2>": "0x80000000" + }, + "<80,12>": "60", + "<80,13>": { + "<80,13,1>": "-2", + "<80,13,2>": "-2", + "<80,13,3>": "" + }, + "<80,14>": "0", + "<80,15>": { + "<80,15,1>": { + "<80,15,1,1>": "Segoe UI", + "<80,15,1,2>": "-12", + "<80,15,1,3>": "400", + "<80,15,1,4>": "0", + "<80,15,1,5>": "0", + "<80,15,1,6>": "0", + "<80,15,1,7>": "0", + "<80,15,1,8>": "34", + "<80,15,1,9>": "0", + "<80,15,1,10>": "3", + "<80,15,1,11>": "2", + "<80,15,1,12>": "1", + "<80,15,1,13>": "0", + "<80,15,1,14>": "0" + } + }, + "<80,16>": "", + "<80,17>": "", + "<80,18>": { + "<80,18,1>": { + "<80,18,1,1>": "R", + "<80,18,1,2>": "EXECUTE", + "<80,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<80,18,1,4>": { + "<80,18,1,4,1>": "@SELF", + "<80,18,1,4,2>": "@EVENT", + "<80,18,1,4,3>": "@PARAM1", + "<80,18,1,4,4>": "@PARAM2", + "<80,18,1,4,5>": "@PARAM3", + "<80,18,1,4,6>": "@PARAM4", + "<80,18,1,4,7>": "@PARAM5", + "<80,18,1,4,8>": "@PARAM6" + }, + "<80,18,1,5>": "", + "<80,18,1,6>": "", + "<80,18,1,7>": "", + "<80,18,1,8>": "", + "<80,18,1,9>": "", + "<80,18,1,10>": "", + "<80,18,1,11>": "", + "<80,18,1,12>": "", + "<80,18,1,13>": "", + "<80,18,1,14>": "", + "<80,18,1,15>": "STPROC" + } + }, + "<80,19>": "OLE", + "<80,20>": "", + "<80,21>": "", + "<80,22>": "", + "<80,23>": "", + "<80,24>": "", + "<80,25>": "", + "<80,26>": "", + "<80,27>": "", + "<80,28>": "", + "<80,29>": "", + "<80,30>": "", + "<80,31>": "", + "<80,32>": "", + "<80,33>": "", + "<80,34>": "", + "<80,35>": "", + "<80,36>": "", + "<80,37>": "", + "<80,38>": "", + "<80,39>": "", + "<80,40>": "", + "<80,41>": "", + "<80,42>": "", + "<80,43>": "", + "<80,44>": "", + "<80,45>": "", + "<80,46>": "", + "<80,47>": "", + "<80,48>": "", + "<80,49>": "", + "<80,50>": "", + "<80,51>": "", + "<80,52>": "", + "<80,53>": "", + "<80,54>": "", + "<80,55>": "OLE.Border", + "<80,56>": "None", + "<80,57>": "", + "<80,58>": "", + "<80,59>": "", + "<80,60>": "", + "<80,61>": "", + "<80,62>": "", + "<80,63>": "", + "<80,64>": "", + "<80,65>": "", + "<80,66>": "", + "<80,67>": "", + "<80,68>": "", + "<80,69>": "", + "<80,70>": "", + "<80,71>": "", + "<80,72>": "", + "<80,73>": "", + "<80,74>": "", + "<80,75>": "", + "<80,76>": "", + "<80,77>": "", + "<80,78>": "", + "<80,79>": "", + "<80,80>": "", + "<80,81>": "", + "<80,82>": "", + "<80,83>": "", + "<80,84>": "", + "<80,85>": "", + "<80,86>": "", + "<80,87>": "", + "<80,88>": "", + "<80,89>": "", + "<80,90>": "", + "<80,91>": "", + "<80,92>": "", + "<80,93>": "", + "<80,94>": "", + "<80,95>": "", + "<80,96>": "", + "<80,97>": "", + "<80,98>": "", + "<80,99>": "", + "<80,100>": "", + "<80,101>": "", + "<80,102>": "", + "<80,103>": "", + "<80,104>": "", + "<80,105>": "", + "<80,106>": "", + "<80,107>": "", + "<80,108>": "" + }, + "<81>": { + "<81,1>": "OLE_INFO_ENABLE_AUTHENTICATION", + "<81,2>": "", + "<81,3>": "OLECONTROL.SRP.Picture.1", + "<81,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<81,5>": "321", + "<81,6>": "61:1", + "<81,7>": "10", + "<81,8>": "10", + "<81,9>": "SRP.Picture.1", + "<81,10>": { + "<81,10,1>": "0x56000000", + "<81,10,2>": "0x0" + }, + "<81,11>": { + "<81,11,1>": "0x0", + "<81,11,2>": "0x80000000" + }, + "<81,12>": "61", + "<81,13>": { + "<81,13,1>": "-2", + "<81,13,2>": "-2", + "<81,13,3>": "" + }, + "<81,14>": "0", + "<81,15>": { + "<81,15,1>": { + "<81,15,1,1>": "Segoe UI", + "<81,15,1,2>": "-12", + "<81,15,1,3>": "400", + "<81,15,1,4>": "0", + "<81,15,1,5>": "0", + "<81,15,1,6>": "0", + "<81,15,1,7>": "0", + "<81,15,1,8>": "34", + "<81,15,1,9>": "0", + "<81,15,1,10>": "3", + "<81,15,1,11>": "2", + "<81,15,1,12>": "1", + "<81,15,1,13>": "0", + "<81,15,1,14>": "0" + } + }, + "<81,16>": "", + "<81,17>": "", + "<81,18>": { + "<81,18,1>": { + "<81,18,1,1>": "R", + "<81,18,1,2>": "EXECUTE", + "<81,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<81,18,1,4>": { + "<81,18,1,4,1>": "@SELF", + "<81,18,1,4,2>": "@EVENT", + "<81,18,1,4,3>": "@PARAM1", + "<81,18,1,4,4>": "@PARAM2", + "<81,18,1,4,5>": "@PARAM3", + "<81,18,1,4,6>": "@PARAM4", + "<81,18,1,4,7>": "@PARAM5", + "<81,18,1,4,8>": "@PARAM6" + }, + "<81,18,1,5>": "", + "<81,18,1,6>": "", + "<81,18,1,7>": "", + "<81,18,1,8>": "", + "<81,18,1,9>": "", + "<81,18,1,10>": "", + "<81,18,1,11>": "", + "<81,18,1,12>": "", + "<81,18,1,13>": "", + "<81,18,1,14>": "", + "<81,18,1,15>": "STPROC" + } + }, + "<81,19>": "OLE", + "<81,20>": "", + "<81,21>": "", + "<81,22>": "", + "<81,23>": "", + "<81,24>": "", + "<81,25>": "", + "<81,26>": "", + "<81,27>": "", + "<81,28>": "", + "<81,29>": "", + "<81,30>": "", + "<81,31>": "", + "<81,32>": "", + "<81,33>": "", + "<81,34>": "", + "<81,35>": "", + "<81,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<81,37>": "", + "<81,38>": "", + "<81,39>": "", + "<81,40>": "", + "<81,41>": "", + "<81,42>": "", + "<81,43>": "", + "<81,44>": "", + "<81,45>": "", + "<81,46>": "", + "<81,47>": "", + "<81,48>": "", + "<81,49>": "", + "<81,50>": "", + "<81,51>": "", + "<81,52>": "", + "<81,53>": "", + "<81,54>": "", + "<81,55>": { + "<81,55,1>": "OLE.Animated", + "<81,55,2>": "OLE.AnimationDelay", + "<81,55,3>": "OLE.AutoLoadDropFile", + "<81,55,4>": "OLE.BackgroundColor", + "<81,55,5>": "OLE.BorderAlignment", + "<81,55,6>": "OLE.BorderType", + "<81,55,7>": "OLE.Caption", + "<81,55,8>": "OLE.CaptionColor", + "<81,55,9>": "OLE.CaptionHorzAlign", + "<81,55,10>": "OLE.CaptionHorzOffset", + "<81,55,11>": "OLE.CaptionVertAlign", + "<81,55,12>": "OLE.CaptionVertOffset", + "<81,55,13>": "OLE.ControlPart", + "<81,55,14>": "OLE.FontBold", + "<81,55,15>": "OLE.FontItalic", + "<81,55,16>": "OLE.FontName", + "<81,55,17>": "OLE.FontSize", + "<81,55,18>": "OLE.FontUnderlined", + "<81,55,19>": "OLE.Frame", + "<81,55,20>": "OLE.FrameCount", + "<81,55,21>": "OLE.HorzAlign", + "<81,55,22>": "OLE.Image", + "<81,55,23>": "OLE.ImageHorzOffset", + "<81,55,24>": "OLE.ImageVertOffset", + "<81,55,25>": "OLE.Layout", + "<81,55,26>": "OLE.ResizeUsingGDIPlus", + "<81,55,27>": "OLE.TransparentColor", + "<81,55,28>": "OLE.VertAlign", + "<81,55,29>": "OLE.Zoom" + }, + "<81,56>": { + "<81,56,1>": "0", + "<81,56,2>": "50", + "<81,56,3>": "0", + "<81,56,4>": "None", + "<81,56,5>": "All", + "<81,56,6>": "None", + "<81,56,7>": "", + "<81,56,8>": "None", + "<81,56,9>": "Center", + "<81,56,10>": "0", + "<81,56,11>": "Center", + "<81,56,12>": "0", + "<81,56,13>": "None", + "<81,56,14>": "0", + "<81,56,15>": "0", + "<81,56,16>": "Segoe UI", + "<81,56,17>": "8", + "<81,56,18>": "0", + "<81,56,19>": "1", + "<81,56,20>": "1", + "<81,56,21>": "Center", + "<81,56,22>": "BMPS\\SRPHTTPInfo.png", + "<81,56,23>": "0", + "<81,56,24>": "0", + "<81,56,25>": "Clip", + "<81,56,26>": "1", + "<81,56,27>": "Auto", + "<81,56,28>": "Center", + "<81,56,29>": "1" + }, + "<81,57>": "", + "<81,58>": "", + "<81,59>": "", + "<81,60>": "", + "<81,61>": "", + "<81,62>": "", + "<81,63>": "", + "<81,64>": "", + "<81,65>": "", + "<81,66>": "", + "<81,67>": "", + "<81,68>": "", + "<81,69>": "", + "<81,70>": "", + "<81,71>": "", + "<81,72>": "", + "<81,73>": "", + "<81,74>": "", + "<81,75>": "", + "<81,76>": "", + "<81,77>": "", + "<81,78>": "", + "<81,79>": "", + "<81,80>": "", + "<81,81>": "", + "<81,82>": "", + "<81,83>": "", + "<81,84>": "", + "<81,85>": "", + "<81,86>": "", + "<81,87>": "", + "<81,88>": "", + "<81,89>": "", + "<81,90>": "", + "<81,91>": "", + "<81,92>": "", + "<81,93>": "", + "<81,94>": "", + "<81,95>": "", + "<81,96>": "", + "<81,97>": "", + "<81,98>": "", + "<81,99>": "", + "<81,100>": "", + "<81,101>": "", + "<81,102>": "", + "<81,103>": "", + "<81,104>": "", + "<81,105>": "", + "<81,106>": "", + "<81,107>": "", + "<81,108>": "" + }, + "<82>": { + "<82,1>": "OLE_INFO_ENABLE_HTTP_BASIC_AUTHENTICATION", + "<82,2>": "", + "<82,3>": "OLECONTROL.SRP.Picture.1", + "<82,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<82,5>": "402", + "<82,6>": "87:1", + "<82,7>": "10", + "<82,8>": "10", + "<82,9>": "SRP.Picture.1", + "<82,10>": { + "<82,10,1>": "0x56000000", + "<82,10,2>": "0x0" + }, + "<82,11>": { + "<82,11,1>": "0x0", + "<82,11,2>": "0x80000000" + }, + "<82,12>": "62", + "<82,13>": { + "<82,13,1>": "-2", + "<82,13,2>": "-2", + "<82,13,3>": "" + }, + "<82,14>": "0", + "<82,15>": { + "<82,15,1>": { + "<82,15,1,1>": "Segoe UI", + "<82,15,1,2>": "-12", + "<82,15,1,3>": "400", + "<82,15,1,4>": "0", + "<82,15,1,5>": "0", + "<82,15,1,6>": "0", + "<82,15,1,7>": "0", + "<82,15,1,8>": "34", + "<82,15,1,9>": "0", + "<82,15,1,10>": "3", + "<82,15,1,11>": "2", + "<82,15,1,12>": "1", + "<82,15,1,13>": "0", + "<82,15,1,14>": "0" + } + }, + "<82,16>": "", + "<82,17>": "", + "<82,18>": { + "<82,18,1>": { + "<82,18,1,1>": "R", + "<82,18,1,2>": "EXECUTE", + "<82,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<82,18,1,4>": { + "<82,18,1,4,1>": "@SELF", + "<82,18,1,4,2>": "@EVENT", + "<82,18,1,4,3>": "@PARAM1", + "<82,18,1,4,4>": "@PARAM2", + "<82,18,1,4,5>": "@PARAM3", + "<82,18,1,4,6>": "@PARAM4", + "<82,18,1,4,7>": "@PARAM5", + "<82,18,1,4,8>": "@PARAM6" + }, + "<82,18,1,5>": "", + "<82,18,1,6>": "", + "<82,18,1,7>": "", + "<82,18,1,8>": "", + "<82,18,1,9>": "", + "<82,18,1,10>": "", + "<82,18,1,11>": "", + "<82,18,1,12>": "", + "<82,18,1,13>": "", + "<82,18,1,14>": "", + "<82,18,1,15>": "STPROC" + } + }, + "<82,19>": "OLE", + "<82,20>": "", + "<82,21>": "", + "<82,22>": "", + "<82,23>": "", + "<82,24>": "", + "<82,25>": "", + "<82,26>": "", + "<82,27>": "", + "<82,28>": "", + "<82,29>": "", + "<82,30>": "", + "<82,31>": "", + "<82,32>": "", + "<82,33>": "", + "<82,34>": "", + "<82,35>": "", + "<82,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<82,37>": "", + "<82,38>": "", + "<82,39>": "", + "<82,40>": "", + "<82,41>": "", + "<82,42>": "", + "<82,43>": "", + "<82,44>": "", + "<82,45>": "", + "<82,46>": "", + "<82,47>": "", + "<82,48>": "", + "<82,49>": "", + "<82,50>": "", + "<82,51>": "", + "<82,52>": "", + "<82,53>": "", + "<82,54>": "", + "<82,55>": { + "<82,55,1>": "OLE.Animated", + "<82,55,2>": "OLE.AnimationDelay", + "<82,55,3>": "OLE.AutoLoadDropFile", + "<82,55,4>": "OLE.BackgroundColor", + "<82,55,5>": "OLE.BorderAlignment", + "<82,55,6>": "OLE.BorderType", + "<82,55,7>": "OLE.Caption", + "<82,55,8>": "OLE.CaptionColor", + "<82,55,9>": "OLE.CaptionHorzAlign", + "<82,55,10>": "OLE.CaptionHorzOffset", + "<82,55,11>": "OLE.CaptionVertAlign", + "<82,55,12>": "OLE.CaptionVertOffset", + "<82,55,13>": "OLE.ControlPart", + "<82,55,14>": "OLE.FontBold", + "<82,55,15>": "OLE.FontItalic", + "<82,55,16>": "OLE.FontName", + "<82,55,17>": "OLE.FontSize", + "<82,55,18>": "OLE.FontUnderlined", + "<82,55,19>": "OLE.Frame", + "<82,55,20>": "OLE.FrameCount", + "<82,55,21>": "OLE.HorzAlign", + "<82,55,22>": "OLE.Image", + "<82,55,23>": "OLE.ImageHorzOffset", + "<82,55,24>": "OLE.ImageVertOffset", + "<82,55,25>": "OLE.Layout", + "<82,55,26>": "OLE.ResizeUsingGDIPlus", + "<82,55,27>": "OLE.TransparentColor", + "<82,55,28>": "OLE.VertAlign", + "<82,55,29>": "OLE.Zoom" + }, + "<82,56>": { + "<82,56,1>": "0", + "<82,56,2>": "50", + "<82,56,3>": "0", + "<82,56,4>": "None", + "<82,56,5>": "All", + "<82,56,6>": "None", + "<82,56,7>": "", + "<82,56,8>": "None", + "<82,56,9>": "Center", + "<82,56,10>": "0", + "<82,56,11>": "Center", + "<82,56,12>": "0", + "<82,56,13>": "None", + "<82,56,14>": "0", + "<82,56,15>": "0", + "<82,56,16>": "Segoe UI", + "<82,56,17>": "8", + "<82,56,18>": "0", + "<82,56,19>": "1", + "<82,56,20>": "1", + "<82,56,21>": "Center", + "<82,56,22>": "BMPS\\SRPHTTPInfo.png", + "<82,56,23>": "0", + "<82,56,24>": "0", + "<82,56,25>": "Clip", + "<82,56,26>": "1", + "<82,56,27>": "Auto", + "<82,56,28>": "Center", + "<82,56,29>": "1" + }, + "<82,57>": "", + "<82,58>": "", + "<82,59>": "", + "<82,60>": "", + "<82,61>": "", + "<82,62>": "", + "<82,63>": "", + "<82,64>": "", + "<82,65>": "", + "<82,66>": "", + "<82,67>": "", + "<82,68>": "", + "<82,69>": "", + "<82,70>": "", + "<82,71>": "", + "<82,72>": "", + "<82,73>": "", + "<82,74>": "", + "<82,75>": "", + "<82,76>": "", + "<82,77>": "", + "<82,78>": "", + "<82,79>": "", + "<82,80>": "", + "<82,81>": "", + "<82,82>": "", + "<82,83>": "", + "<82,84>": "", + "<82,85>": "", + "<82,86>": "", + "<82,87>": "", + "<82,88>": "", + "<82,89>": "", + "<82,90>": "", + "<82,91>": "", + "<82,92>": "", + "<82,93>": "", + "<82,94>": "", + "<82,95>": "", + "<82,96>": "", + "<82,97>": "", + "<82,98>": "", + "<82,99>": "", + "<82,100>": "", + "<82,101>": "", + "<82,102>": "", + "<82,103>": "", + "<82,104>": "", + "<82,105>": "", + "<82,106>": "", + "<82,107>": "", + "<82,108>": "" + }, + "<83>": { + "<83,1>": "OLE_INFO_NEW_PASSWORD_TIME_TO_LIVE", + "<83,2>": "", + "<83,3>": "OLECONTROL.SRP.Picture.1", + "<83,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<83,5>": "637", + "<83,6>": "110:1", + "<83,7>": "10", + "<83,8>": "10", + "<83,9>": "SRP.Picture.1", + "<83,10>": { + "<83,10,1>": "0x56000000", + "<83,10,2>": "0x0" + }, + "<83,11>": { + "<83,11,1>": "0x0", + "<83,11,2>": "0x80000000" + }, + "<83,12>": "63", + "<83,13>": { + "<83,13,1>": "-2", + "<83,13,2>": "-2", + "<83,13,3>": "" + }, + "<83,14>": "0", + "<83,15>": { + "<83,15,1>": { + "<83,15,1,1>": "Segoe UI", + "<83,15,1,2>": "-12", + "<83,15,1,3>": "400", + "<83,15,1,4>": "0", + "<83,15,1,5>": "0", + "<83,15,1,6>": "0", + "<83,15,1,7>": "0", + "<83,15,1,8>": "34", + "<83,15,1,9>": "0", + "<83,15,1,10>": "3", + "<83,15,1,11>": "2", + "<83,15,1,12>": "1", + "<83,15,1,13>": "0", + "<83,15,1,14>": "0" + } + }, + "<83,16>": "", + "<83,17>": "", + "<83,18>": { + "<83,18,1>": { + "<83,18,1,1>": "R", + "<83,18,1,2>": "EXECUTE", + "<83,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<83,18,1,4>": { + "<83,18,1,4,1>": "@SELF", + "<83,18,1,4,2>": "@EVENT", + "<83,18,1,4,3>": "@PARAM1", + "<83,18,1,4,4>": "@PARAM2", + "<83,18,1,4,5>": "@PARAM3", + "<83,18,1,4,6>": "@PARAM4", + "<83,18,1,4,7>": "@PARAM5", + "<83,18,1,4,8>": "@PARAM6" + }, + "<83,18,1,5>": "", + "<83,18,1,6>": "", + "<83,18,1,7>": "", + "<83,18,1,8>": "", + "<83,18,1,9>": "", + "<83,18,1,10>": "", + "<83,18,1,11>": "", + "<83,18,1,12>": "", + "<83,18,1,13>": "", + "<83,18,1,14>": "", + "<83,18,1,15>": "STPROC" + } + }, + "<83,19>": "OLE", + "<83,20>": "", + "<83,21>": "", + "<83,22>": "", + "<83,23>": "", + "<83,24>": "", + "<83,25>": "", + "<83,26>": "", + "<83,27>": "", + "<83,28>": "", + "<83,29>": "", + "<83,30>": "", + "<83,31>": "", + "<83,32>": "", + "<83,33>": "", + "<83,34>": "", + "<83,35>": "", + "<83,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<83,37>": "", + "<83,38>": "", + "<83,39>": "", + "<83,40>": "", + "<83,41>": "", + "<83,42>": "", + "<83,43>": "", + "<83,44>": "", + "<83,45>": "", + "<83,46>": "", + "<83,47>": "", + "<83,48>": "", + "<83,49>": "", + "<83,50>": "", + "<83,51>": "", + "<83,52>": "", + "<83,53>": "", + "<83,54>": "", + "<83,55>": { + "<83,55,1>": "OLE.Animated", + "<83,55,2>": "OLE.AnimationDelay", + "<83,55,3>": "OLE.AutoLoadDropFile", + "<83,55,4>": "OLE.BackgroundColor", + "<83,55,5>": "OLE.BorderAlignment", + "<83,55,6>": "OLE.BorderType", + "<83,55,7>": "OLE.Caption", + "<83,55,8>": "OLE.CaptionColor", + "<83,55,9>": "OLE.CaptionHorzAlign", + "<83,55,10>": "OLE.CaptionHorzOffset", + "<83,55,11>": "OLE.CaptionVertAlign", + "<83,55,12>": "OLE.CaptionVertOffset", + "<83,55,13>": "OLE.ControlPart", + "<83,55,14>": "OLE.FontBold", + "<83,55,15>": "OLE.FontItalic", + "<83,55,16>": "OLE.FontName", + "<83,55,17>": "OLE.FontSize", + "<83,55,18>": "OLE.FontUnderlined", + "<83,55,19>": "OLE.Frame", + "<83,55,20>": "OLE.FrameCount", + "<83,55,21>": "OLE.HorzAlign", + "<83,55,22>": "OLE.Image", + "<83,55,23>": "OLE.ImageHorzOffset", + "<83,55,24>": "OLE.ImageVertOffset", + "<83,55,25>": "OLE.Layout", + "<83,55,26>": "OLE.ResizeUsingGDIPlus", + "<83,55,27>": "OLE.TransparentColor", + "<83,55,28>": "OLE.VertAlign", + "<83,55,29>": "OLE.Zoom" + }, + "<83,56>": { + "<83,56,1>": "0", + "<83,56,2>": "50", + "<83,56,3>": "0", + "<83,56,4>": "None", + "<83,56,5>": "All", + "<83,56,6>": "None", + "<83,56,7>": "", + "<83,56,8>": "None", + "<83,56,9>": "Center", + "<83,56,10>": "0", + "<83,56,11>": "Center", + "<83,56,12>": "0", + "<83,56,13>": "None", + "<83,56,14>": "0", + "<83,56,15>": "0", + "<83,56,16>": "Segoe UI", + "<83,56,17>": "8", + "<83,56,18>": "0", + "<83,56,19>": "1", + "<83,56,20>": "1", + "<83,56,21>": "Center", + "<83,56,22>": "BMPS\\SRPHTTPInfo.png", + "<83,56,23>": "0", + "<83,56,24>": "0", + "<83,56,25>": "Clip", + "<83,56,26>": "1", + "<83,56,27>": "Auto", + "<83,56,28>": "Center", + "<83,56,29>": "1" + }, + "<83,57>": "", + "<83,58>": "", + "<83,59>": "", + "<83,60>": "", + "<83,61>": "", + "<83,62>": "", + "<83,63>": "", + "<83,64>": "", + "<83,65>": "", + "<83,66>": "", + "<83,67>": "", + "<83,68>": "", + "<83,69>": "", + "<83,70>": "", + "<83,71>": "", + "<83,72>": "", + "<83,73>": "", + "<83,74>": "", + "<83,75>": "", + "<83,76>": "", + "<83,77>": "", + "<83,78>": "", + "<83,79>": "", + "<83,80>": "", + "<83,81>": "", + "<83,82>": "", + "<83,83>": "", + "<83,84>": "", + "<83,85>": "", + "<83,86>": "", + "<83,87>": "", + "<83,88>": "", + "<83,89>": "", + "<83,90>": "", + "<83,91>": "", + "<83,92>": "", + "<83,93>": "", + "<83,94>": "", + "<83,95>": "", + "<83,96>": "", + "<83,97>": "", + "<83,98>": "", + "<83,99>": "", + "<83,100>": "", + "<83,101>": "", + "<83,102>": "", + "<83,103>": "", + "<83,104>": "", + "<83,105>": "", + "<83,106>": "", + "<83,107>": "", + "<83,108>": "" + }, + "<84>": { + "<84,1>": "OLE_INFO_OLD_PASSWORD_TIME_TO_LIVE", + "<84,2>": "", + "<84,3>": "OLECONTROL.SRP.Picture.1", + "<84,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<84,5>": "637", + "<84,6>": "140:1", + "<84,7>": "10", + "<84,8>": "10", + "<84,9>": "SRP.Picture.1", + "<84,10>": { + "<84,10,1>": "0x56000000", + "<84,10,2>": "0x0" + }, + "<84,11>": { + "<84,11,1>": "0x0", + "<84,11,2>": "0x80000000" + }, + "<84,12>": "64", + "<84,13>": { + "<84,13,1>": "-2", + "<84,13,2>": "-2", + "<84,13,3>": "" + }, + "<84,14>": "0", + "<84,15>": { + "<84,15,1>": { + "<84,15,1,1>": "Segoe UI", + "<84,15,1,2>": "-12", + "<84,15,1,3>": "400", + "<84,15,1,4>": "0", + "<84,15,1,5>": "0", + "<84,15,1,6>": "0", + "<84,15,1,7>": "0", + "<84,15,1,8>": "34", + "<84,15,1,9>": "0", + "<84,15,1,10>": "3", + "<84,15,1,11>": "2", + "<84,15,1,12>": "1", + "<84,15,1,13>": "0", + "<84,15,1,14>": "0" + } + }, + "<84,16>": "", + "<84,17>": "", + "<84,18>": { + "<84,18,1>": { + "<84,18,1,1>": "R", + "<84,18,1,2>": "EXECUTE", + "<84,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<84,18,1,4>": { + "<84,18,1,4,1>": "@SELF", + "<84,18,1,4,2>": "@EVENT", + "<84,18,1,4,3>": "@PARAM1", + "<84,18,1,4,4>": "@PARAM2", + "<84,18,1,4,5>": "@PARAM3", + "<84,18,1,4,6>": "@PARAM4", + "<84,18,1,4,7>": "@PARAM5", + "<84,18,1,4,8>": "@PARAM6" + }, + "<84,18,1,5>": "", + "<84,18,1,6>": "", + "<84,18,1,7>": "", + "<84,18,1,8>": "", + "<84,18,1,9>": "", + "<84,18,1,10>": "", + "<84,18,1,11>": "", + "<84,18,1,12>": "", + "<84,18,1,13>": "", + "<84,18,1,14>": "", + "<84,18,1,15>": "STPROC" + } + }, + "<84,19>": "OLE", + "<84,20>": "", + "<84,21>": "", + "<84,22>": "", + "<84,23>": "", + "<84,24>": "", + "<84,25>": "", + "<84,26>": "", + "<84,27>": "", + "<84,28>": "", + "<84,29>": "", + "<84,30>": "", + "<84,31>": "", + "<84,32>": "", + "<84,33>": "", + "<84,34>": "", + "<84,35>": "", + "<84,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<84,37>": "", + "<84,38>": "", + "<84,39>": "", + "<84,40>": "", + "<84,41>": "", + "<84,42>": "", + "<84,43>": "", + "<84,44>": "", + "<84,45>": "", + "<84,46>": "", + "<84,47>": "", + "<84,48>": "", + "<84,49>": "", + "<84,50>": "", + "<84,51>": "", + "<84,52>": "", + "<84,53>": "", + "<84,54>": "", + "<84,55>": { + "<84,55,1>": "OLE.Animated", + "<84,55,2>": "OLE.AnimationDelay", + "<84,55,3>": "OLE.AutoLoadDropFile", + "<84,55,4>": "OLE.BackgroundColor", + "<84,55,5>": "OLE.BorderAlignment", + "<84,55,6>": "OLE.BorderType", + "<84,55,7>": "OLE.Caption", + "<84,55,8>": "OLE.CaptionColor", + "<84,55,9>": "OLE.CaptionHorzAlign", + "<84,55,10>": "OLE.CaptionHorzOffset", + "<84,55,11>": "OLE.CaptionVertAlign", + "<84,55,12>": "OLE.CaptionVertOffset", + "<84,55,13>": "OLE.ControlPart", + "<84,55,14>": "OLE.FontBold", + "<84,55,15>": "OLE.FontItalic", + "<84,55,16>": "OLE.FontName", + "<84,55,17>": "OLE.FontSize", + "<84,55,18>": "OLE.FontUnderlined", + "<84,55,19>": "OLE.Frame", + "<84,55,20>": "OLE.FrameCount", + "<84,55,21>": "OLE.HorzAlign", + "<84,55,22>": "OLE.Image", + "<84,55,23>": "OLE.ImageHorzOffset", + "<84,55,24>": "OLE.ImageVertOffset", + "<84,55,25>": "OLE.Layout", + "<84,55,26>": "OLE.ResizeUsingGDIPlus", + "<84,55,27>": "OLE.TransparentColor", + "<84,55,28>": "OLE.VertAlign", + "<84,55,29>": "OLE.Zoom" + }, + "<84,56>": { + "<84,56,1>": "0", + "<84,56,2>": "50", + "<84,56,3>": "0", + "<84,56,4>": "None", + "<84,56,5>": "All", + "<84,56,6>": "None", + "<84,56,7>": "", + "<84,56,8>": "None", + "<84,56,9>": "Center", + "<84,56,10>": "0", + "<84,56,11>": "Center", + "<84,56,12>": "0", + "<84,56,13>": "None", + "<84,56,14>": "0", + "<84,56,15>": "0", + "<84,56,16>": "Segoe UI", + "<84,56,17>": "8", + "<84,56,18>": "0", + "<84,56,19>": "1", + "<84,56,20>": "1", + "<84,56,21>": "Center", + "<84,56,22>": "BMPS\\SRPHTTPInfo.png", + "<84,56,23>": "0", + "<84,56,24>": "0", + "<84,56,25>": "Clip", + "<84,56,26>": "1", + "<84,56,27>": "Auto", + "<84,56,28>": "Center", + "<84,56,29>": "1" + }, + "<84,57>": "", + "<84,58>": "", + "<84,59>": "", + "<84,60>": "", + "<84,61>": "", + "<84,62>": "", + "<84,63>": "", + "<84,64>": "", + "<84,65>": "", + "<84,66>": "", + "<84,67>": "", + "<84,68>": "", + "<84,69>": "", + "<84,70>": "", + "<84,71>": "", + "<84,72>": "", + "<84,73>": "", + "<84,74>": "", + "<84,75>": "", + "<84,76>": "", + "<84,77>": "", + "<84,78>": "", + "<84,79>": "", + "<84,80>": "", + "<84,81>": "", + "<84,82>": "", + "<84,83>": "", + "<84,84>": "", + "<84,85>": "", + "<84,86>": "", + "<84,87>": "", + "<84,88>": "", + "<84,89>": "", + "<84,90>": "", + "<84,91>": "", + "<84,92>": "", + "<84,93>": "", + "<84,94>": "", + "<84,95>": "", + "<84,96>": "", + "<84,97>": "", + "<84,98>": "", + "<84,99>": "", + "<84,100>": "", + "<84,101>": "", + "<84,102>": "", + "<84,103>": "", + "<84,104>": "", + "<84,105>": "", + "<84,106>": "", + "<84,107>": "", + "<84,108>": "" + }, + "<85>": { + "<85,1>": "OLE_INFO_NON_AUTHENTICATED_PATHS", + "<85,2>": "", + "<85,3>": "OLECONTROL.SRP.Picture.1", + "<85,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<85,5>": "638", + "<85,6>": "288:1", + "<85,7>": "10", + "<85,8>": "10", + "<85,9>": "SRP.Picture.1", + "<85,10>": { + "<85,10,1>": "0x56000000", + "<85,10,2>": "0x0" + }, + "<85,11>": { + "<85,11,1>": "0x0", + "<85,11,2>": "0x80000000" + }, + "<85,12>": "65", + "<85,13>": { + "<85,13,1>": "-2", + "<85,13,2>": "-2", + "<85,13,3>": "" + }, + "<85,14>": "0", + "<85,15>": { + "<85,15,1>": { + "<85,15,1,1>": "Segoe UI", + "<85,15,1,2>": "-12", + "<85,15,1,3>": "400", + "<85,15,1,4>": "0", + "<85,15,1,5>": "0", + "<85,15,1,6>": "0", + "<85,15,1,7>": "0", + "<85,15,1,8>": "34", + "<85,15,1,9>": "0", + "<85,15,1,10>": "3", + "<85,15,1,11>": "2", + "<85,15,1,12>": "1", + "<85,15,1,13>": "0", + "<85,15,1,14>": "0" + } + }, + "<85,16>": "", + "<85,17>": "", + "<85,18>": { + "<85,18,1>": { + "<85,18,1,1>": "R", + "<85,18,1,2>": "EXECUTE", + "<85,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<85,18,1,4>": { + "<85,18,1,4,1>": "@SELF", + "<85,18,1,4,2>": "@EVENT", + "<85,18,1,4,3>": "@PARAM1", + "<85,18,1,4,4>": "@PARAM2", + "<85,18,1,4,5>": "@PARAM3", + "<85,18,1,4,6>": "@PARAM4", + "<85,18,1,4,7>": "@PARAM5", + "<85,18,1,4,8>": "@PARAM6" + }, + "<85,18,1,5>": "", + "<85,18,1,6>": "", + "<85,18,1,7>": "", + "<85,18,1,8>": "", + "<85,18,1,9>": "", + "<85,18,1,10>": "", + "<85,18,1,11>": "", + "<85,18,1,12>": "", + "<85,18,1,13>": "", + "<85,18,1,14>": "", + "<85,18,1,15>": "STPROC" + } + }, + "<85,19>": "OLE", + "<85,20>": "", + "<85,21>": "", + "<85,22>": "", + "<85,23>": "", + "<85,24>": "", + "<85,25>": "", + "<85,26>": "", + "<85,27>": "", + "<85,28>": "", + "<85,29>": "", + "<85,30>": "", + "<85,31>": "", + "<85,32>": "", + "<85,33>": "", + "<85,34>": "", + "<85,35>": "", + "<85,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<85,37>": "", + "<85,38>": "", + "<85,39>": "", + "<85,40>": "", + "<85,41>": "", + "<85,42>": "", + "<85,43>": "", + "<85,44>": "", + "<85,45>": "", + "<85,46>": "", + "<85,47>": "", + "<85,48>": "", + "<85,49>": "", + "<85,50>": "", + "<85,51>": "", + "<85,52>": "", + "<85,53>": "", + "<85,54>": "", + "<85,55>": { + "<85,55,1>": "OLE.Animated", + "<85,55,2>": "OLE.AnimationDelay", + "<85,55,3>": "OLE.AutoLoadDropFile", + "<85,55,4>": "OLE.BackgroundColor", + "<85,55,5>": "OLE.BorderAlignment", + "<85,55,6>": "OLE.BorderType", + "<85,55,7>": "OLE.Caption", + "<85,55,8>": "OLE.CaptionColor", + "<85,55,9>": "OLE.CaptionHorzAlign", + "<85,55,10>": "OLE.CaptionHorzOffset", + "<85,55,11>": "OLE.CaptionVertAlign", + "<85,55,12>": "OLE.CaptionVertOffset", + "<85,55,13>": "OLE.ControlPart", + "<85,55,14>": "OLE.FontBold", + "<85,55,15>": "OLE.FontItalic", + "<85,55,16>": "OLE.FontName", + "<85,55,17>": "OLE.FontSize", + "<85,55,18>": "OLE.FontUnderlined", + "<85,55,19>": "OLE.Frame", + "<85,55,20>": "OLE.FrameCount", + "<85,55,21>": "OLE.HorzAlign", + "<85,55,22>": "OLE.Image", + "<85,55,23>": "OLE.ImageHorzOffset", + "<85,55,24>": "OLE.ImageVertOffset", + "<85,55,25>": "OLE.Layout", + "<85,55,26>": "OLE.ResizeUsingGDIPlus", + "<85,55,27>": "OLE.TransparentColor", + "<85,55,28>": "OLE.VertAlign", + "<85,55,29>": "OLE.Zoom" + }, + "<85,56>": { + "<85,56,1>": "0", + "<85,56,2>": "50", + "<85,56,3>": "0", + "<85,56,4>": "None", + "<85,56,5>": "All", + "<85,56,6>": "None", + "<85,56,7>": "", + "<85,56,8>": "None", + "<85,56,9>": "Center", + "<85,56,10>": "0", + "<85,56,11>": "Center", + "<85,56,12>": "0", + "<85,56,13>": "None", + "<85,56,14>": "0", + "<85,56,15>": "0", + "<85,56,16>": "Segoe UI", + "<85,56,17>": "8", + "<85,56,18>": "0", + "<85,56,19>": "1", + "<85,56,20>": "1", + "<85,56,21>": "Center", + "<85,56,22>": "BMPS\\SRPHTTPInfo.png", + "<85,56,23>": "0", + "<85,56,24>": "0", + "<85,56,25>": "Clip", + "<85,56,26>": "1", + "<85,56,27>": "Auto", + "<85,56,28>": "Center", + "<85,56,29>": "1" + }, + "<85,57>": "", + "<85,58>": "", + "<85,59>": "", + "<85,60>": "", + "<85,61>": "", + "<85,62>": "", + "<85,63>": "", + "<85,64>": "", + "<85,65>": "", + "<85,66>": "", + "<85,67>": "", + "<85,68>": "", + "<85,69>": "", + "<85,70>": "", + "<85,71>": "", + "<85,72>": "", + "<85,73>": "", + "<85,74>": "", + "<85,75>": "", + "<85,76>": "", + "<85,77>": "", + "<85,78>": "", + "<85,79>": "", + "<85,80>": "", + "<85,81>": "", + "<85,82>": "", + "<85,83>": "", + "<85,84>": "", + "<85,85>": "", + "<85,86>": "", + "<85,87>": "", + "<85,88>": "", + "<85,89>": "", + "<85,90>": "", + "<85,91>": "", + "<85,92>": "", + "<85,93>": "", + "<85,94>": "", + "<85,95>": "", + "<85,96>": "", + "<85,97>": "", + "<85,98>": "", + "<85,99>": "", + "<85,100>": "", + "<85,101>": "", + "<85,102>": "", + "<85,103>": "", + "<85,104>": "", + "<85,105>": "", + "<85,106>": "", + "<85,107>": "", + "<85,108>": "" + }, + "<86>": { + "<86,1>": "OLE_INFO_WHITELISTED_IPS", + "<86,2>": "", + "<86,3>": "OLECONTROL.SRP.Picture.1", + "<86,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<86,5>": "638", + "<86,6>": "410:1", + "<86,7>": "10", + "<86,8>": "10", + "<86,9>": "SRP.Picture.1", + "<86,10>": { + "<86,10,1>": "0x56000000", + "<86,10,2>": "0x0" + }, + "<86,11>": { + "<86,11,1>": "0x0", + "<86,11,2>": "0x80000000" + }, + "<86,12>": "66", + "<86,13>": { + "<86,13,1>": "-2", + "<86,13,2>": "-2", + "<86,13,3>": "" + }, + "<86,14>": "0", + "<86,15>": { + "<86,15,1>": { + "<86,15,1,1>": "Segoe UI", + "<86,15,1,2>": "-12", + "<86,15,1,3>": "400", + "<86,15,1,4>": "0", + "<86,15,1,5>": "0", + "<86,15,1,6>": "0", + "<86,15,1,7>": "0", + "<86,15,1,8>": "34", + "<86,15,1,9>": "0", + "<86,15,1,10>": "3", + "<86,15,1,11>": "2", + "<86,15,1,12>": "1", + "<86,15,1,13>": "0", + "<86,15,1,14>": "0" + } + }, + "<86,16>": "", + "<86,17>": "", + "<86,18>": { + "<86,18,1>": { + "<86,18,1,1>": "R", + "<86,18,1,2>": "EXECUTE", + "<86,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<86,18,1,4>": { + "<86,18,1,4,1>": "@SELF", + "<86,18,1,4,2>": "@EVENT", + "<86,18,1,4,3>": "@PARAM1", + "<86,18,1,4,4>": "@PARAM2", + "<86,18,1,4,5>": "@PARAM3", + "<86,18,1,4,6>": "@PARAM4", + "<86,18,1,4,7>": "@PARAM5", + "<86,18,1,4,8>": "@PARAM6" + }, + "<86,18,1,5>": "", + "<86,18,1,6>": "", + "<86,18,1,7>": "", + "<86,18,1,8>": "", + "<86,18,1,9>": "", + "<86,18,1,10>": "", + "<86,18,1,11>": "", + "<86,18,1,12>": "", + "<86,18,1,13>": "", + "<86,18,1,14>": "", + "<86,18,1,15>": "STPROC" + } + }, + "<86,19>": "OLE", + "<86,20>": "", + "<86,21>": "", + "<86,22>": "", + "<86,23>": "", + "<86,24>": "", + "<86,25>": "", + "<86,26>": "", + "<86,27>": "", + "<86,28>": "", + "<86,29>": "", + "<86,30>": "", + "<86,31>": "", + "<86,32>": "", + "<86,33>": "", + "<86,34>": "", + "<86,35>": "", + "<86,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<86,37>": "", + "<86,38>": "", + "<86,39>": "", + "<86,40>": "", + "<86,41>": "", + "<86,42>": "", + "<86,43>": "", + "<86,44>": "", + "<86,45>": "", + "<86,46>": "", + "<86,47>": "", + "<86,48>": "", + "<86,49>": "", + "<86,50>": "", + "<86,51>": "", + "<86,52>": "", + "<86,53>": "", + "<86,54>": "", + "<86,55>": { + "<86,55,1>": "OLE.Animated", + "<86,55,2>": "OLE.AnimationDelay", + "<86,55,3>": "OLE.AutoLoadDropFile", + "<86,55,4>": "OLE.BackgroundColor", + "<86,55,5>": "OLE.BorderAlignment", + "<86,55,6>": "OLE.BorderType", + "<86,55,7>": "OLE.Caption", + "<86,55,8>": "OLE.CaptionColor", + "<86,55,9>": "OLE.CaptionHorzAlign", + "<86,55,10>": "OLE.CaptionHorzOffset", + "<86,55,11>": "OLE.CaptionVertAlign", + "<86,55,12>": "OLE.CaptionVertOffset", + "<86,55,13>": "OLE.ControlPart", + "<86,55,14>": "OLE.FontBold", + "<86,55,15>": "OLE.FontItalic", + "<86,55,16>": "OLE.FontName", + "<86,55,17>": "OLE.FontSize", + "<86,55,18>": "OLE.FontUnderlined", + "<86,55,19>": "OLE.Frame", + "<86,55,20>": "OLE.FrameCount", + "<86,55,21>": "OLE.HorzAlign", + "<86,55,22>": "OLE.Image", + "<86,55,23>": "OLE.ImageHorzOffset", + "<86,55,24>": "OLE.ImageVertOffset", + "<86,55,25>": "OLE.Layout", + "<86,55,26>": "OLE.ResizeUsingGDIPlus", + "<86,55,27>": "OLE.TransparentColor", + "<86,55,28>": "OLE.VertAlign", + "<86,55,29>": "OLE.Zoom" + }, + "<86,56>": { + "<86,56,1>": "0", + "<86,56,2>": "50", + "<86,56,3>": "0", + "<86,56,4>": "None", + "<86,56,5>": "All", + "<86,56,6>": "None", + "<86,56,7>": "", + "<86,56,8>": "None", + "<86,56,9>": "Center", + "<86,56,10>": "0", + "<86,56,11>": "Center", + "<86,56,12>": "0", + "<86,56,13>": "None", + "<86,56,14>": "0", + "<86,56,15>": "0", + "<86,56,16>": "Segoe UI", + "<86,56,17>": "8", + "<86,56,18>": "0", + "<86,56,19>": "1", + "<86,56,20>": "1", + "<86,56,21>": "Center", + "<86,56,22>": "BMPS\\SRPHTTPInfo.png", + "<86,56,23>": "0", + "<86,56,24>": "0", + "<86,56,25>": "Clip", + "<86,56,26>": "1", + "<86,56,27>": "Auto", + "<86,56,28>": "Center", + "<86,56,29>": "1" + }, + "<86,57>": "", + "<86,58>": "", + "<86,59>": "", + "<86,60>": "", + "<86,61>": "", + "<86,62>": "", + "<86,63>": "", + "<86,64>": "", + "<86,65>": "", + "<86,66>": "", + "<86,67>": "", + "<86,68>": "", + "<86,69>": "", + "<86,70>": "", + "<86,71>": "", + "<86,72>": "", + "<86,73>": "", + "<86,74>": "", + "<86,75>": "", + "<86,76>": "", + "<86,77>": "", + "<86,78>": "", + "<86,79>": "", + "<86,80>": "", + "<86,81>": "", + "<86,82>": "", + "<86,83>": "", + "<86,84>": "", + "<86,85>": "", + "<86,86>": "", + "<86,87>": "", + "<86,88>": "", + "<86,89>": "", + "<86,90>": "", + "<86,91>": "", + "<86,92>": "", + "<86,93>": "", + "<86,94>": "", + "<86,95>": "", + "<86,96>": "", + "<86,97>": "", + "<86,98>": "", + "<86,99>": "", + "<86,100>": "", + "<86,101>": "", + "<86,102>": "", + "<86,103>": "", + "<86,104>": "", + "<86,105>": "", + "<86,106>": "", + "<86,107>": "", + "<86,108>": "" + }, + "<87>": { + "<87,1>": "OLE_INFO_BANNED_IPS", + "<87,2>": "", + "<87,3>": "OLECONTROL.SRP.Picture.1", + "<87,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<87,5>": "638", + "<87,6>": "531:1", + "<87,7>": "10", + "<87,8>": "10", + "<87,9>": "SRP.Picture.1", + "<87,10>": { + "<87,10,1>": "0x56000000", + "<87,10,2>": "0x0" + }, + "<87,11>": { + "<87,11,1>": "0x0", + "<87,11,2>": "0x80000000" + }, + "<87,12>": "67", + "<87,13>": { + "<87,13,1>": "-2", + "<87,13,2>": "-2", + "<87,13,3>": "" + }, + "<87,14>": "0", + "<87,15>": { + "<87,15,1>": { + "<87,15,1,1>": "Segoe UI", + "<87,15,1,2>": "-12", + "<87,15,1,3>": "400", + "<87,15,1,4>": "0", + "<87,15,1,5>": "0", + "<87,15,1,6>": "0", + "<87,15,1,7>": "0", + "<87,15,1,8>": "34", + "<87,15,1,9>": "0", + "<87,15,1,10>": "3", + "<87,15,1,11>": "2", + "<87,15,1,12>": "1", + "<87,15,1,13>": "0", + "<87,15,1,14>": "0" + } + }, + "<87,16>": "", + "<87,17>": "", + "<87,18>": { + "<87,18,1>": { + "<87,18,1,1>": "R", + "<87,18,1,2>": "EXECUTE", + "<87,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<87,18,1,4>": { + "<87,18,1,4,1>": "@SELF", + "<87,18,1,4,2>": "@EVENT", + "<87,18,1,4,3>": "@PARAM1", + "<87,18,1,4,4>": "@PARAM2", + "<87,18,1,4,5>": "@PARAM3", + "<87,18,1,4,6>": "@PARAM4", + "<87,18,1,4,7>": "@PARAM5", + "<87,18,1,4,8>": "@PARAM6" + }, + "<87,18,1,5>": "", + "<87,18,1,6>": "", + "<87,18,1,7>": "", + "<87,18,1,8>": "", + "<87,18,1,9>": "", + "<87,18,1,10>": "", + "<87,18,1,11>": "", + "<87,18,1,12>": "", + "<87,18,1,13>": "", + "<87,18,1,14>": "", + "<87,18,1,15>": "STPROC" + } + }, + "<87,19>": "OLE", + "<87,20>": "", + "<87,21>": "", + "<87,22>": "", + "<87,23>": "", + "<87,24>": "", + "<87,25>": "", + "<87,26>": "", + "<87,27>": "", + "<87,28>": "", + "<87,29>": "", + "<87,30>": "", + "<87,31>": "", + "<87,32>": "", + "<87,33>": "", + "<87,34>": "", + "<87,35>": "", + "<87,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<87,37>": "", + "<87,38>": "", + "<87,39>": "", + "<87,40>": "", + "<87,41>": "", + "<87,42>": "", + "<87,43>": "", + "<87,44>": "", + "<87,45>": "", + "<87,46>": "", + "<87,47>": "", + "<87,48>": "", + "<87,49>": "", + "<87,50>": "", + "<87,51>": "", + "<87,52>": "", + "<87,53>": "", + "<87,54>": "", + "<87,55>": { + "<87,55,1>": "OLE.Animated", + "<87,55,2>": "OLE.AnimationDelay", + "<87,55,3>": "OLE.AutoLoadDropFile", + "<87,55,4>": "OLE.BackgroundColor", + "<87,55,5>": "OLE.BorderAlignment", + "<87,55,6>": "OLE.BorderType", + "<87,55,7>": "OLE.Caption", + "<87,55,8>": "OLE.CaptionColor", + "<87,55,9>": "OLE.CaptionHorzAlign", + "<87,55,10>": "OLE.CaptionHorzOffset", + "<87,55,11>": "OLE.CaptionVertAlign", + "<87,55,12>": "OLE.CaptionVertOffset", + "<87,55,13>": "OLE.ControlPart", + "<87,55,14>": "OLE.FontBold", + "<87,55,15>": "OLE.FontItalic", + "<87,55,16>": "OLE.FontName", + "<87,55,17>": "OLE.FontSize", + "<87,55,18>": "OLE.FontUnderlined", + "<87,55,19>": "OLE.Frame", + "<87,55,20>": "OLE.FrameCount", + "<87,55,21>": "OLE.HorzAlign", + "<87,55,22>": "OLE.Image", + "<87,55,23>": "OLE.ImageHorzOffset", + "<87,55,24>": "OLE.ImageVertOffset", + "<87,55,25>": "OLE.Layout", + "<87,55,26>": "OLE.ResizeUsingGDIPlus", + "<87,55,27>": "OLE.TransparentColor", + "<87,55,28>": "OLE.VertAlign", + "<87,55,29>": "OLE.Zoom" + }, + "<87,56>": { + "<87,56,1>": "0", + "<87,56,2>": "50", + "<87,56,3>": "0", + "<87,56,4>": "None", + "<87,56,5>": "All", + "<87,56,6>": "None", + "<87,56,7>": "", + "<87,56,8>": "None", + "<87,56,9>": "Center", + "<87,56,10>": "0", + "<87,56,11>": "Center", + "<87,56,12>": "0", + "<87,56,13>": "None", + "<87,56,14>": "0", + "<87,56,15>": "0", + "<87,56,16>": "Segoe UI", + "<87,56,17>": "8", + "<87,56,18>": "0", + "<87,56,19>": "1", + "<87,56,20>": "1", + "<87,56,21>": "Center", + "<87,56,22>": "BMPS\\SRPHTTPInfo.png", + "<87,56,23>": "0", + "<87,56,24>": "0", + "<87,56,25>": "Clip", + "<87,56,26>": "1", + "<87,56,27>": "Auto", + "<87,56,28>": "Center", + "<87,56,29>": "1" + }, + "<87,57>": "", + "<87,58>": "", + "<87,59>": "", + "<87,60>": "", + "<87,61>": "", + "<87,62>": "", + "<87,63>": "", + "<87,64>": "", + "<87,65>": "", + "<87,66>": "", + "<87,67>": "", + "<87,68>": "", + "<87,69>": "", + "<87,70>": "", + "<87,71>": "", + "<87,72>": "", + "<87,73>": "", + "<87,74>": "", + "<87,75>": "", + "<87,76>": "", + "<87,77>": "", + "<87,78>": "", + "<87,79>": "", + "<87,80>": "", + "<87,81>": "", + "<87,82>": "", + "<87,83>": "", + "<87,84>": "", + "<87,85>": "", + "<87,86>": "", + "<87,87>": "", + "<87,88>": "", + "<87,89>": "", + "<87,90>": "", + "<87,91>": "", + "<87,92>": "", + "<87,93>": "", + "<87,94>": "", + "<87,95>": "", + "<87,96>": "", + "<87,97>": "", + "<87,98>": "", + "<87,99>": "", + "<87,100>": "", + "<87,101>": "", + "<87,102>": "", + "<87,103>": "", + "<87,104>": "", + "<87,105>": "", + "<87,106>": "", + "<87,107>": "", + "<87,108>": "" + }, + "<88>": { + "<88,1>": "OLE_INFO_INVALID_PASSWORD_LIMIT", + "<88,2>": "", + "<88,3>": "OLECONTROL.SRP.Picture.1", + "<88,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<88,5>": "637", + "<88,6>": "170:1", + "<88,7>": "10", + "<88,8>": "10", + "<88,9>": "SRP.Picture.1", + "<88,10>": { + "<88,10,1>": "0x56000000", + "<88,10,2>": "0x0" + }, + "<88,11>": { + "<88,11,1>": "0x0", + "<88,11,2>": "0x80000000" + }, + "<88,12>": "68", + "<88,13>": { + "<88,13,1>": "-2", + "<88,13,2>": "-2", + "<88,13,3>": "" + }, + "<88,14>": "0", + "<88,15>": { + "<88,15,1>": { + "<88,15,1,1>": "Segoe UI", + "<88,15,1,2>": "-12", + "<88,15,1,3>": "400", + "<88,15,1,4>": "0", + "<88,15,1,5>": "0", + "<88,15,1,6>": "0", + "<88,15,1,7>": "0", + "<88,15,1,8>": "34", + "<88,15,1,9>": "0", + "<88,15,1,10>": "3", + "<88,15,1,11>": "2", + "<88,15,1,12>": "1", + "<88,15,1,13>": "0", + "<88,15,1,14>": "0" + } + }, + "<88,16>": "", + "<88,17>": "", + "<88,18>": { + "<88,18,1>": { + "<88,18,1,1>": "R", + "<88,18,1,2>": "EXECUTE", + "<88,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<88,18,1,4>": { + "<88,18,1,4,1>": "@SELF", + "<88,18,1,4,2>": "@EVENT", + "<88,18,1,4,3>": "@PARAM1", + "<88,18,1,4,4>": "@PARAM2", + "<88,18,1,4,5>": "@PARAM3", + "<88,18,1,4,6>": "@PARAM4", + "<88,18,1,4,7>": "@PARAM5", + "<88,18,1,4,8>": "@PARAM6" + }, + "<88,18,1,5>": "", + "<88,18,1,6>": "", + "<88,18,1,7>": "", + "<88,18,1,8>": "", + "<88,18,1,9>": "", + "<88,18,1,10>": "", + "<88,18,1,11>": "", + "<88,18,1,12>": "", + "<88,18,1,13>": "", + "<88,18,1,14>": "", + "<88,18,1,15>": "STPROC" + } + }, + "<88,19>": "OLE", + "<88,20>": "", + "<88,21>": "", + "<88,22>": "", + "<88,23>": "", + "<88,24>": "", + "<88,25>": "", + "<88,26>": "", + "<88,27>": "", + "<88,28>": "", + "<88,29>": "", + "<88,30>": "", + "<88,31>": "", + "<88,32>": "", + "<88,33>": "", + "<88,34>": "", + "<88,35>": "", + "<88,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<88,37>": "", + "<88,38>": "", + "<88,39>": "", + "<88,40>": "", + "<88,41>": "", + "<88,42>": "", + "<88,43>": "", + "<88,44>": "", + "<88,45>": "", + "<88,46>": "", + "<88,47>": "", + "<88,48>": "", + "<88,49>": "", + "<88,50>": "", + "<88,51>": "", + "<88,52>": "", + "<88,53>": "", + "<88,54>": "", + "<88,55>": { + "<88,55,1>": "OLE.Animated", + "<88,55,2>": "OLE.AnimationDelay", + "<88,55,3>": "OLE.AutoLoadDropFile", + "<88,55,4>": "OLE.BackgroundColor", + "<88,55,5>": "OLE.BorderAlignment", + "<88,55,6>": "OLE.BorderType", + "<88,55,7>": "OLE.Caption", + "<88,55,8>": "OLE.CaptionColor", + "<88,55,9>": "OLE.CaptionHorzAlign", + "<88,55,10>": "OLE.CaptionHorzOffset", + "<88,55,11>": "OLE.CaptionVertAlign", + "<88,55,12>": "OLE.CaptionVertOffset", + "<88,55,13>": "OLE.ControlPart", + "<88,55,14>": "OLE.FontBold", + "<88,55,15>": "OLE.FontItalic", + "<88,55,16>": "OLE.FontName", + "<88,55,17>": "OLE.FontSize", + "<88,55,18>": "OLE.FontUnderlined", + "<88,55,19>": "OLE.Frame", + "<88,55,20>": "OLE.FrameCount", + "<88,55,21>": "OLE.HorzAlign", + "<88,55,22>": "OLE.Image", + "<88,55,23>": "OLE.ImageHorzOffset", + "<88,55,24>": "OLE.ImageVertOffset", + "<88,55,25>": "OLE.Layout", + "<88,55,26>": "OLE.ResizeUsingGDIPlus", + "<88,55,27>": "OLE.TransparentColor", + "<88,55,28>": "OLE.VertAlign", + "<88,55,29>": "OLE.Zoom" + }, + "<88,56>": { + "<88,56,1>": "0", + "<88,56,2>": "50", + "<88,56,3>": "0", + "<88,56,4>": "None", + "<88,56,5>": "All", + "<88,56,6>": "None", + "<88,56,7>": "", + "<88,56,8>": "None", + "<88,56,9>": "Center", + "<88,56,10>": "0", + "<88,56,11>": "Center", + "<88,56,12>": "0", + "<88,56,13>": "None", + "<88,56,14>": "0", + "<88,56,15>": "0", + "<88,56,16>": "Segoe UI", + "<88,56,17>": "8", + "<88,56,18>": "0", + "<88,56,19>": "1", + "<88,56,20>": "1", + "<88,56,21>": "Center", + "<88,56,22>": "BMPS\\SRPHTTPInfo.png", + "<88,56,23>": "0", + "<88,56,24>": "0", + "<88,56,25>": "Clip", + "<88,56,26>": "1", + "<88,56,27>": "Auto", + "<88,56,28>": "Center", + "<88,56,29>": "1" + }, + "<88,57>": "", + "<88,58>": "", + "<88,59>": "", + "<88,60>": "", + "<88,61>": "", + "<88,62>": "", + "<88,63>": "", + "<88,64>": "", + "<88,65>": "", + "<88,66>": "", + "<88,67>": "", + "<88,68>": "", + "<88,69>": "", + "<88,70>": "", + "<88,71>": "", + "<88,72>": "", + "<88,73>": "", + "<88,74>": "", + "<88,75>": "", + "<88,76>": "", + "<88,77>": "", + "<88,78>": "", + "<88,79>": "", + "<88,80>": "", + "<88,81>": "", + "<88,82>": "", + "<88,83>": "", + "<88,84>": "", + "<88,85>": "", + "<88,86>": "", + "<88,87>": "", + "<88,88>": "", + "<88,89>": "", + "<88,90>": "", + "<88,91>": "", + "<88,92>": "", + "<88,93>": "", + "<88,94>": "", + "<88,95>": "", + "<88,96>": "", + "<88,97>": "", + "<88,98>": "", + "<88,99>": "", + "<88,100>": "", + "<88,101>": "", + "<88,102>": "", + "<88,103>": "", + "<88,104>": "", + "<88,105>": "", + "<88,106>": "", + "<88,107>": "", + "<88,108>": "" + }, + "<89>": { + "<89,1>": "OLE_INFO_CONTAINMENT_ACTION", + "<89,2>": "", + "<89,3>": "OLECONTROL.SRP.Picture.1", + "<89,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<89,5>": "637", + "<89,6>": "230:1", + "<89,7>": "10", + "<89,8>": "10", + "<89,9>": "SRP.Picture.1", + "<89,10>": { + "<89,10,1>": "0x56000000", + "<89,10,2>": "0x0" + }, + "<89,11>": { + "<89,11,1>": "0x0", + "<89,11,2>": "0x80000000" + }, + "<89,12>": "69", + "<89,13>": { + "<89,13,1>": "-2", + "<89,13,2>": "-2", + "<89,13,3>": "" + }, + "<89,14>": "0", + "<89,15>": { + "<89,15,1>": { + "<89,15,1,1>": "Segoe UI", + "<89,15,1,2>": "-12", + "<89,15,1,3>": "400", + "<89,15,1,4>": "0", + "<89,15,1,5>": "0", + "<89,15,1,6>": "0", + "<89,15,1,7>": "0", + "<89,15,1,8>": "34", + "<89,15,1,9>": "0", + "<89,15,1,10>": "3", + "<89,15,1,11>": "2", + "<89,15,1,12>": "1", + "<89,15,1,13>": "0", + "<89,15,1,14>": "0" + } + }, + "<89,16>": "", + "<89,17>": "", + "<89,18>": { + "<89,18,1>": { + "<89,18,1,1>": "R", + "<89,18,1,2>": "EXECUTE", + "<89,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<89,18,1,4>": { + "<89,18,1,4,1>": "@SELF", + "<89,18,1,4,2>": "@EVENT", + "<89,18,1,4,3>": "@PARAM1", + "<89,18,1,4,4>": "@PARAM2", + "<89,18,1,4,5>": "@PARAM3", + "<89,18,1,4,6>": "@PARAM4", + "<89,18,1,4,7>": "@PARAM5", + "<89,18,1,4,8>": "@PARAM6" + }, + "<89,18,1,5>": "", + "<89,18,1,6>": "", + "<89,18,1,7>": "", + "<89,18,1,8>": "", + "<89,18,1,9>": "", + "<89,18,1,10>": "", + "<89,18,1,11>": "", + "<89,18,1,12>": "", + "<89,18,1,13>": "", + "<89,18,1,14>": "", + "<89,18,1,15>": "STPROC" + } + }, + "<89,19>": "OLE", + "<89,20>": "", + "<89,21>": "", + "<89,22>": "", + "<89,23>": "", + "<89,24>": "", + "<89,25>": "", + "<89,26>": "", + "<89,27>": "", + "<89,28>": "", + "<89,29>": "", + "<89,30>": "", + "<89,31>": "", + "<89,32>": "", + "<89,33>": "", + "<89,34>": "", + "<89,35>": "", + "<89,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<89,37>": "", + "<89,38>": "", + "<89,39>": "", + "<89,40>": "", + "<89,41>": "", + "<89,42>": "", + "<89,43>": "", + "<89,44>": "", + "<89,45>": "", + "<89,46>": "", + "<89,47>": "", + "<89,48>": "", + "<89,49>": "", + "<89,50>": "", + "<89,51>": "", + "<89,52>": "", + "<89,53>": "", + "<89,54>": "", + "<89,55>": { + "<89,55,1>": "OLE.Animated", + "<89,55,2>": "OLE.AnimationDelay", + "<89,55,3>": "OLE.AutoLoadDropFile", + "<89,55,4>": "OLE.BackgroundColor", + "<89,55,5>": "OLE.BorderAlignment", + "<89,55,6>": "OLE.BorderType", + "<89,55,7>": "OLE.Caption", + "<89,55,8>": "OLE.CaptionColor", + "<89,55,9>": "OLE.CaptionHorzAlign", + "<89,55,10>": "OLE.CaptionHorzOffset", + "<89,55,11>": "OLE.CaptionVertAlign", + "<89,55,12>": "OLE.CaptionVertOffset", + "<89,55,13>": "OLE.ControlPart", + "<89,55,14>": "OLE.FontBold", + "<89,55,15>": "OLE.FontItalic", + "<89,55,16>": "OLE.FontName", + "<89,55,17>": "OLE.FontSize", + "<89,55,18>": "OLE.FontUnderlined", + "<89,55,19>": "OLE.Frame", + "<89,55,20>": "OLE.FrameCount", + "<89,55,21>": "OLE.HorzAlign", + "<89,55,22>": "OLE.Image", + "<89,55,23>": "OLE.ImageHorzOffset", + "<89,55,24>": "OLE.ImageVertOffset", + "<89,55,25>": "OLE.Layout", + "<89,55,26>": "OLE.ResizeUsingGDIPlus", + "<89,55,27>": "OLE.TransparentColor", + "<89,55,28>": "OLE.VertAlign", + "<89,55,29>": "OLE.Zoom" + }, + "<89,56>": { + "<89,56,1>": "0", + "<89,56,2>": "50", + "<89,56,3>": "0", + "<89,56,4>": "None", + "<89,56,5>": "All", + "<89,56,6>": "None", + "<89,56,7>": "", + "<89,56,8>": "None", + "<89,56,9>": "Center", + "<89,56,10>": "0", + "<89,56,11>": "Center", + "<89,56,12>": "0", + "<89,56,13>": "None", + "<89,56,14>": "0", + "<89,56,15>": "0", + "<89,56,16>": "Segoe UI", + "<89,56,17>": "8", + "<89,56,18>": "0", + "<89,56,19>": "1", + "<89,56,20>": "1", + "<89,56,21>": "Center", + "<89,56,22>": "BMPS\\SRPHTTPInfo.png", + "<89,56,23>": "0", + "<89,56,24>": "0", + "<89,56,25>": "Clip", + "<89,56,26>": "1", + "<89,56,27>": "Auto", + "<89,56,28>": "Center", + "<89,56,29>": "1" + }, + "<89,57>": "", + "<89,58>": "", + "<89,59>": "", + "<89,60>": "", + "<89,61>": "", + "<89,62>": "", + "<89,63>": "", + "<89,64>": "", + "<89,65>": "", + "<89,66>": "", + "<89,67>": "", + "<89,68>": "", + "<89,69>": "", + "<89,70>": "", + "<89,71>": "", + "<89,72>": "", + "<89,73>": "", + "<89,74>": "", + "<89,75>": "", + "<89,76>": "", + "<89,77>": "", + "<89,78>": "", + "<89,79>": "", + "<89,80>": "", + "<89,81>": "", + "<89,82>": "", + "<89,83>": "", + "<89,84>": "", + "<89,85>": "", + "<89,86>": "", + "<89,87>": "", + "<89,88>": "", + "<89,89>": "", + "<89,90>": "", + "<89,91>": "", + "<89,92>": "", + "<89,93>": "", + "<89,94>": "", + "<89,95>": "", + "<89,96>": "", + "<89,97>": "", + "<89,98>": "", + "<89,99>": "", + "<89,100>": "", + "<89,101>": "", + "<89,102>": "", + "<89,103>": "", + "<89,104>": "", + "<89,105>": "", + "<89,106>": "", + "<89,107>": "", + "<89,108>": "" + }, + "<90>": { + "<90,1>": "OLE_INFO_SERVER_ENABLED", + "<90,2>": "", + "<90,3>": "OLECONTROL.SRP.Picture.1", + "<90,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<90,5>": "280", + "<90,6>": "388", + "<90,7>": "10", + "<90,8>": "10", + "<90,9>": "SRP.Picture.1", + "<90,10>": { + "<90,10,1>": "0x56000000", + "<90,10,2>": "0x0" + }, + "<90,11>": { + "<90,11,1>": "0x0", + "<90,11,2>": "0x80000000" + }, + "<90,12>": "70", + "<90,13>": { + "<90,13,1>": "-2", + "<90,13,2>": "-2", + "<90,13,3>": "" + }, + "<90,14>": "0", + "<90,15>": { + "<90,15,1>": { + "<90,15,1,1>": "Segoe UI", + "<90,15,1,2>": "-12", + "<90,15,1,3>": "400", + "<90,15,1,4>": "0", + "<90,15,1,5>": "0", + "<90,15,1,6>": "0", + "<90,15,1,7>": "0", + "<90,15,1,8>": "34", + "<90,15,1,9>": "0", + "<90,15,1,10>": "3", + "<90,15,1,11>": "2", + "<90,15,1,12>": "1", + "<90,15,1,13>": "0", + "<90,15,1,14>": "0" + } + }, + "<90,16>": "", + "<90,17>": "", + "<90,18>": { + "<90,18,1>": { + "<90,18,1,1>": "R", + "<90,18,1,2>": "EXECUTE", + "<90,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<90,18,1,4>": { + "<90,18,1,4,1>": "@SELF", + "<90,18,1,4,2>": "@EVENT", + "<90,18,1,4,3>": "@PARAM1", + "<90,18,1,4,4>": "@PARAM2", + "<90,18,1,4,5>": "@PARAM3", + "<90,18,1,4,6>": "@PARAM4", + "<90,18,1,4,7>": "@PARAM5", + "<90,18,1,4,8>": "@PARAM6" + }, + "<90,18,1,5>": "", + "<90,18,1,6>": "", + "<90,18,1,7>": "", + "<90,18,1,8>": "", + "<90,18,1,9>": "", + "<90,18,1,10>": "", + "<90,18,1,11>": "", + "<90,18,1,12>": "", + "<90,18,1,13>": "", + "<90,18,1,14>": "", + "<90,18,1,15>": "STPROC" + } + }, + "<90,19>": "OLE", + "<90,20>": "", + "<90,21>": "", + "<90,22>": "", + "<90,23>": "", + "<90,24>": "", + "<90,25>": "", + "<90,26>": "", + "<90,27>": "", + "<90,28>": "", + "<90,29>": "", + "<90,30>": "", + "<90,31>": "", + "<90,32>": "", + "<90,33>": "", + "<90,34>": "", + "<90,35>": "", + "<90,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<90,37>": "", + "<90,38>": "", + "<90,39>": "", + "<90,40>": "", + "<90,41>": "", + "<90,42>": "", + "<90,43>": "", + "<90,44>": "", + "<90,45>": "", + "<90,46>": "", + "<90,47>": "", + "<90,48>": "", + "<90,49>": "", + "<90,50>": "", + "<90,51>": "", + "<90,52>": "", + "<90,53>": "", + "<90,54>": "", + "<90,55>": { + "<90,55,1>": "OLE.Animated", + "<90,55,2>": "OLE.AnimationDelay", + "<90,55,3>": "OLE.AutoLoadDropFile", + "<90,55,4>": "OLE.BackgroundColor", + "<90,55,5>": "OLE.BorderAlignment", + "<90,55,6>": "OLE.BorderType", + "<90,55,7>": "OLE.Caption", + "<90,55,8>": "OLE.CaptionColor", + "<90,55,9>": "OLE.CaptionHorzAlign", + "<90,55,10>": "OLE.CaptionHorzOffset", + "<90,55,11>": "OLE.CaptionVertAlign", + "<90,55,12>": "OLE.CaptionVertOffset", + "<90,55,13>": "OLE.ControlPart", + "<90,55,14>": "OLE.FontBold", + "<90,55,15>": "OLE.FontItalic", + "<90,55,16>": "OLE.FontName", + "<90,55,17>": "OLE.FontSize", + "<90,55,18>": "OLE.FontUnderlined", + "<90,55,19>": "OLE.Frame", + "<90,55,20>": "OLE.FrameCount", + "<90,55,21>": "OLE.HorzAlign", + "<90,55,22>": "OLE.Image", + "<90,55,23>": "OLE.ImageHorzOffset", + "<90,55,24>": "OLE.ImageVertOffset", + "<90,55,25>": "OLE.Layout", + "<90,55,26>": "OLE.ResizeUsingGDIPlus", + "<90,55,27>": "OLE.TransparentColor", + "<90,55,28>": "OLE.VertAlign", + "<90,55,29>": "OLE.Zoom" + }, + "<90,56>": { + "<90,56,1>": "0", + "<90,56,2>": "50", + "<90,56,3>": "0", + "<90,56,4>": "None", + "<90,56,5>": "All", + "<90,56,6>": "None", + "<90,56,7>": "", + "<90,56,8>": "None", + "<90,56,9>": "Center", + "<90,56,10>": "0", + "<90,56,11>": "Center", + "<90,56,12>": "0", + "<90,56,13>": "None", + "<90,56,14>": "0", + "<90,56,15>": "0", + "<90,56,16>": "Segoe UI", + "<90,56,17>": "8", + "<90,56,18>": "0", + "<90,56,19>": "1", + "<90,56,20>": "1", + "<90,56,21>": "Center", + "<90,56,22>": "BMPS\\SRPHTTPInfo.png", + "<90,56,23>": "0", + "<90,56,24>": "0", + "<90,56,25>": "Clip", + "<90,56,26>": "1", + "<90,56,27>": "Auto", + "<90,56,28>": "Center", + "<90,56,29>": "1" + }, + "<90,57>": "", + "<90,58>": "", + "<90,59>": "", + "<90,60>": "", + "<90,61>": "", + "<90,62>": "", + "<90,63>": "", + "<90,64>": "", + "<90,65>": "", + "<90,66>": "", + "<90,67>": "", + "<90,68>": "", + "<90,69>": "", + "<90,70>": "", + "<90,71>": "", + "<90,72>": "", + "<90,73>": "", + "<90,74>": "", + "<90,75>": "", + "<90,76>": "", + "<90,77>": "", + "<90,78>": "", + "<90,79>": "", + "<90,80>": "", + "<90,81>": "", + "<90,82>": "", + "<90,83>": "", + "<90,84>": "", + "<90,85>": "", + "<90,86>": "", + "<90,87>": "", + "<90,88>": "", + "<90,89>": "", + "<90,90>": "", + "<90,91>": "", + "<90,92>": "", + "<90,93>": "", + "<90,94>": "", + "<90,95>": "", + "<90,96>": "", + "<90,97>": "", + "<90,98>": "", + "<90,99>": "", + "<90,100>": "", + "<90,101>": "", + "<90,102>": "", + "<90,103>": "", + "<90,104>": "", + "<90,105>": "", + "<90,106>": "", + "<90,107>": "", + "<90,108>": "" + }, + "<91>": { + "<91,1>": "OLE_PIC_RESOURCE_MANAGER", + "<91,2>": "", + "<91,3>": "OLECONTROL.SRP.Picture.1", + "<91,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<91,5>": "165", + "<91,6>": "23:2", + "<91,7>": "-537", + "<91,8>": "24", + "<91,9>": "SRP.Picture.1", + "<91,10>": { + "<91,10,1>": "0x56000000", + "<91,10,2>": "0x0" + }, + "<91,11>": { + "<91,11,1>": "0x4000", + "<91,11,2>": "0x80000000" + }, + "<91,12>": "71", + "<91,13>": { + "<91,13,1>": "-2", + "<91,13,2>": "-2", + "<91,13,3>": "" + }, + "<91,14>": "0", + "<91,15>": { + "<91,15,1>": { + "<91,15,1,1>": "Segoe UI", + "<91,15,1,2>": "-12", + "<91,15,1,3>": "400", + "<91,15,1,4>": "0", + "<91,15,1,5>": "0", + "<91,15,1,6>": "0", + "<91,15,1,7>": "0", + "<91,15,1,8>": "34", + "<91,15,1,9>": "0", + "<91,15,1,10>": "3", + "<91,15,1,11>": "2", + "<91,15,1,12>": "1", + "<91,15,1,13>": "0", + "<91,15,1,14>": "0" + } + }, + "<91,16>": "", + "<91,17>": "", + "<91,18>": "", + "<91,19>": "", + "<91,20>": "", + "<91,21>": "", + "<91,22>": "", + "<91,23>": "", + "<91,24>": "", + "<91,25>": "", + "<91,26>": "", + "<91,27>": "", + "<91,28>": "", + "<91,29>": "", + "<91,30>": "", + "<91,31>": "", + "<91,32>": "", + "<91,33>": "", + "<91,34>": "", + "<91,35>": "", + "<91,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<91,37>": "", + "<91,38>": "", + "<91,39>": "", + "<91,40>": "", + "<91,41>": "", + "<91,42>": "", + "<91,43>": "", + "<91,44>": "", + "<91,45>": "", + "<91,46>": "", + "<91,47>": "", + "<91,48>": "", + "<91,49>": "", + "<91,50>": "", + "<91,51>": "", + "<91,52>": "", + "<91,53>": "", + "<91,54>": "", + "<91,55>": { + "<91,55,1>": "OLE.Animated", + "<91,55,2>": "OLE.AnimationDelay", + "<91,55,3>": "OLE.AutoLoadDropFile", + "<91,55,4>": "OLE.BackgroundColor", + "<91,55,5>": "OLE.BorderAlignment", + "<91,55,6>": "OLE.BorderType", + "<91,55,7>": "OLE.Caption", + "<91,55,8>": "OLE.CaptionColor", + "<91,55,9>": "OLE.CaptionHorzAlign", + "<91,55,10>": "OLE.CaptionHorzOffset", + "<91,55,11>": "OLE.CaptionVertAlign", + "<91,55,12>": "OLE.CaptionVertOffset", + "<91,55,13>": "OLE.ControlPart", + "<91,55,14>": "OLE.FontBold", + "<91,55,15>": "OLE.FontItalic", + "<91,55,16>": "OLE.FontName", + "<91,55,17>": "OLE.FontSize", + "<91,55,18>": "OLE.FontUnderlined", + "<91,55,19>": "OLE.Frame", + "<91,55,20>": "OLE.FrameCount", + "<91,55,21>": "OLE.HorzAlign", + "<91,55,22>": "OLE.Image", + "<91,55,23>": "OLE.ImageHorzOffset", + "<91,55,24>": "OLE.ImageVertOffset", + "<91,55,25>": "OLE.Layout", + "<91,55,26>": "OLE.ResizeUsingGDIPlus", + "<91,55,27>": "OLE.TransparentColor", + "<91,55,28>": "OLE.VertAlign", + "<91,55,29>": "OLE.Zoom" + }, + "<91,56>": { + "<91,56,1>": "0", + "<91,56,2>": "50", + "<91,56,3>": "0", + "<91,56,4>": "None", + "<91,56,5>": "All", + "<91,56,6>": "None", + "<91,56,7>": "", + "<91,56,8>": "None", + "<91,56,9>": "Center", + "<91,56,10>": "0", + "<91,56,11>": "Center", + "<91,56,12>": "0", + "<91,56,13>": "None", + "<91,56,14>": "0", + "<91,56,15>": "0", + "<91,56,16>": "Segoe UI", + "<91,56,17>": "8", + "<91,56,18>": "0", + "<91,56,19>": "1", + "<91,56,20>": "1", + "<91,56,21>": "Center", + "<91,56,22>": "", + "<91,56,23>": "0", + "<91,56,24>": "0", + "<91,56,25>": "Clip", + "<91,56,26>": "1", + "<91,56,27>": "Auto", + "<91,56,28>": "Center", + "<91,56,29>": "1" + }, + "<91,57>": "", + "<91,58>": "", + "<91,59>": "", + "<91,60>": "", + "<91,61>": "", + "<91,62>": "", + "<91,63>": "", + "<91,64>": "", + "<91,65>": "", + "<91,66>": "", + "<91,67>": "", + "<91,68>": "", + "<91,69>": "", + "<91,70>": "", + "<91,71>": "", + "<91,72>": "", + "<91,73>": "", + "<91,74>": "", + "<91,75>": "", + "<91,76>": "", + "<91,77>": "", + "<91,78>": "", + "<91,79>": "", + "<91,80>": "", + "<91,81>": "", + "<91,82>": "", + "<91,83>": "", + "<91,84>": "", + "<91,85>": "", + "<91,86>": "", + "<91,87>": "", + "<91,88>": "", + "<91,89>": "", + "<91,90>": "", + "<91,91>": "", + "<91,92>": "", + "<91,93>": "", + "<91,94>": "", + "<91,95>": "", + "<91,96>": "", + "<91,97>": "", + "<91,98>": "", + "<91,99>": "", + "<91,100>": "", + "<91,101>": "", + "<91,102>": "", + "<91,103>": "", + "<91,104>": "", + "<91,105>": "", + "<91,106>": "", + "<91,107>": "", + "<91,108>": "" + }, + "<92>": { + "<92,1>": "OLE_PIC_URL", + "<92,2>": "", + "<92,3>": "OLECONTROL.SRP.Picture.1", + "<92,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<92,5>": "181", + "<92,6>": "61:2", + "<92,7>": "-32", + "<92,8>": "22", + "<92,9>": "SRP.Picture.1", + "<92,10>": { + "<92,10,1>": "0x56000000", + "<92,10,2>": "0x0" + }, + "<92,11>": { + "<92,11,1>": "0x4000", + "<92,11,2>": "0x80000000" + }, + "<92,12>": "72", + "<92,13>": { + "<92,13,1>": "-2", + "<92,13,2>": "-2", + "<92,13,3>": "" + }, + "<92,14>": "0", + "<92,15>": { + "<92,15,1>": { + "<92,15,1,1>": "Segoe UI", + "<92,15,1,2>": "-12", + "<92,15,1,3>": "400", + "<92,15,1,4>": "0", + "<92,15,1,5>": "0", + "<92,15,1,6>": "0", + "<92,15,1,7>": "0", + "<92,15,1,8>": "34", + "<92,15,1,9>": "0", + "<92,15,1,10>": "3", + "<92,15,1,11>": "2", + "<92,15,1,12>": "1", + "<92,15,1,13>": "0", + "<92,15,1,14>": "0" + } + }, + "<92,16>": "", + "<92,17>": "", + "<92,18>": "", + "<92,19>": "", + "<92,20>": "", + "<92,21>": "", + "<92,22>": "", + "<92,23>": "", + "<92,24>": "", + "<92,25>": "", + "<92,26>": "", + "<92,27>": "", + "<92,28>": "", + "<92,29>": "", + "<92,30>": "", + "<92,31>": "", + "<92,32>": "", + "<92,33>": "", + "<92,34>": "", + "<92,35>": "", + "<92,36>": "05000000000000000000000032000000FFFEFF0557006800690074006500FFFEFF0341006C006C00FFFEFF0258005000FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF0D68007400740070002B00680074007400700073003A002F002F00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0B430065006E00740065007200FEF04C006500660074000000000000000000000000000000000001000000", + "<92,37>": "", + "<92,38>": "", + "<92,39>": "", + "<92,40>": "", + "<92,41>": "", + "<92,42>": "", + "<92,43>": "", + "<92,44>": "", + "<92,45>": "", + "<92,46>": "", + "<92,47>": "", + "<92,48>": "", + "<92,49>": "", + "<92,50>": "", + "<92,51>": "", + "<92,52>": "", + "<92,53>": "", + "<92,54>": "", + "<92,55>": { + "<92,55,1>": "OLE.Animated", + "<92,55,2>": "OLE.AnimationDelay", + "<92,55,3>": "OLE.AutoLoadDropFile", + "<92,55,4>": "OLE.BackgroundColor", + "<92,55,5>": "OLE.BorderAlignment", + "<92,55,6>": "OLE.BorderType", + "<92,55,7>": "OLE.Caption", + "<92,55,8>": "OLE.CaptionColor", + "<92,55,9>": "OLE.CaptionHorzAlign", + "<92,55,10>": "OLE.CaptionHorzOffset", + "<92,55,11>": "OLE.CaptionVertAlign", + "<92,55,12>": "OLE.CaptionVertOffset", + "<92,55,13>": "OLE.ControlPart", + "<92,55,14>": "OLE.FontBold", + "<92,55,15>": "OLE.FontItalic", + "<92,55,16>": "OLE.FontName", + "<92,55,17>": "OLE.FontSize", + "<92,55,18>": "OLE.FontUnderlined", + "<92,55,19>": "OLE.Frame", + "<92,55,20>": "OLE.FrameCount", + "<92,55,21>": "OLE.HorzAlign", + "<92,55,22>": "OLE.Image", + "<92,55,23>": "OLE.ImageHorzOffset", + "<92,55,24>": "OLE.ImageVertOffset", + "<92,55,25>": "OLE.Layout", + "<92,55,26>": "OLE.ResizeUsingGDIPlus", + "<92,55,27>": "OLE.TransparentColor", + "<92,55,28>": "OLE.VertAlign", + "<92,55,29>": "OLE.Zoom" + }, + "<92,56>": { + "<92,56,1>": "0", + "<92,56,2>": "50", + "<92,56,3>": "0", + "<92,56,4>": "White", + "<92,56,5>": "All", + "<92,56,6>": "XP", + "<92,56,7>": "http+https://", + "<92,56,8>": "None", + "<92,56,9>": "Left", + "<92,56,10>": "0", + "<92,56,11>": "Center", + "<92,56,12>": "0", + "<92,56,13>": "None", + "<92,56,14>": "0", + "<92,56,15>": "0", + "<92,56,16>": "Segoe UI", + "<92,56,17>": "8", + "<92,56,18>": "0", + "<92,56,19>": "1", + "<92,56,20>": "1", + "<92,56,21>": "Center", + "<92,56,22>": "", + "<92,56,23>": "0", + "<92,56,24>": "0", + "<92,56,25>": "Clip", + "<92,56,26>": "1", + "<92,56,27>": "Auto", + "<92,56,28>": "Center", + "<92,56,29>": "1" + }, + "<92,57>": "", + "<92,58>": "", + "<92,59>": "", + "<92,60>": "", + "<92,61>": "", + "<92,62>": "", + "<92,63>": "", + "<92,64>": "", + "<92,65>": "", + "<92,66>": "", + "<92,67>": "", + "<92,68>": "", + "<92,69>": "", + "<92,70>": "", + "<92,71>": "", + "<92,72>": "", + "<92,73>": "", + "<92,74>": "", + "<92,75>": "", + "<92,76>": "", + "<92,77>": "", + "<92,78>": "", + "<92,79>": "", + "<92,80>": "", + "<92,81>": "", + "<92,82>": "", + "<92,83>": "", + "<92,84>": "", + "<92,85>": "", + "<92,86>": "", + "<92,87>": "", + "<92,88>": "", + "<92,89>": "", + "<92,90>": "", + "<92,91>": "", + "<92,92>": "", + "<92,93>": "", + "<92,94>": "", + "<92,95>": "", + "<92,96>": "", + "<92,97>": "", + "<92,98>": "", + "<92,99>": "", + "<92,100>": "", + "<92,101>": "", + "<92,102>": "", + "<92,103>": "", + "<92,104>": "", + "<92,105>": "", + "<92,106>": "", + "<92,107>": "", + "<92,108>": "" + }, + "<93>": { + "<93,1>": "OLE_TAB_RESOURCE_METADATA", + "<93,2>": "", + "<93,3>": "OLECONTROL.SRP.Tab.1", + "<93,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<93,5>": "179", + "<93,6>": "58:2", + "<93,7>": "-30", + "<93,8>": "2", + "<93,9>": "SRP.Tab.1", + "<93,10>": { + "<93,10,1>": "0x56000000", + "<93,10,2>": "0x0" + }, + "<93,11>": { + "<93,11,1>": "0x4000", + "<93,11,2>": "0x80000000" + }, + "<93,12>": "73", + "<93,13>": { + "<93,13,1>": "-2", + "<93,13,2>": "-2", + "<93,13,3>": "" + }, + "<93,14>": "0", + "<93,15>": { + "<93,15,1>": { + "<93,15,1,1>": "Segoe UI", + "<93,15,1,2>": "-12", + "<93,15,1,3>": "400", + "<93,15,1,4>": "0", + "<93,15,1,5>": "0", + "<93,15,1,6>": "0", + "<93,15,1,7>": "0", + "<93,15,1,8>": "34", + "<93,15,1,9>": "0", + "<93,15,1,10>": "3", + "<93,15,1,11>": "2", + "<93,15,1,12>": "1", + "<93,15,1,13>": "0", + "<93,15,1,14>": "0" + } + }, + "<93,16>": "", + "<93,17>": "", + "<93,18>": "", + "<93,19>": "", + "<93,20>": "", + "<93,21>": "", + "<93,22>": "", + "<93,23>": "", + "<93,24>": "", + "<93,25>": "", + "<93,26>": "", + "<93,27>": "", + "<93,28>": "", + "<93,29>": "", + "<93,30>": "", + "<93,31>": "", + "<93,32>": "", + "<93,33>": "", + "<93,34>": "", + "<93,35>": "", + "<93,36>": "010000000400000000000000FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000A0FFFFFF0000000001000000000000000100000000000000FFFEFF00FFFEFF044E006F006E00650000000000000000007D030000", + "<93,37>": "", + "<93,38>": "", + "<93,39>": "", + "<93,40>": "", + "<93,41>": "", + "<93,42>": "", + "<93,43>": "", + "<93,44>": "", + "<93,45>": "", + "<93,46>": "", + "<93,47>": "", + "<93,48>": "", + "<93,49>": "", + "<93,50>": "", + "<93,51>": "", + "<93,52>": "", + "<93,53>": "", + "<93,54>": "", + "<93,55>": { + "<93,55,1>": "OLE.CaptionList", + "<93,55,2>": "OLE.CloseButtons", + "<93,55,3>": "OLE.CustomPaneColor", + "<93,55,4>": "OLE.FillParentBackground", + "<93,55,5>": "OLE.FocusOnClick", + "<93,55,6>": "OLE.FontBold", + "<93,55,7>": "OLE.FontItalic", + "<93,55,8>": "OLE.FontName", + "<93,55,9>": "OLE.FontSize", + "<93,55,10>": "OLE.FontUnderlined", + "<93,55,11>": "OLE.Height", + "<93,55,12>": "OLE.MultiLined", + "<93,55,13>": "OLE.SelectedTab", + "<93,55,14>": "OLE.ShowFocus", + "<93,55,15>": "OLE.TabCount", + "<93,55,16>": "OLE.TopMost", + "<93,55,17>": "OLE.Width" + }, + "<93,56>": { + "<93,56,1>": "", + "<93,56,2>": "0", + "<93,56,3>": "None", + "<93,56,4>": "0", + "<93,56,5>": "0", + "<93,56,6>": "0", + "<93,56,7>": "0", + "<93,56,8>": "Segoe UI", + "<93,56,9>": "8", + "<93,56,10>": "0", + "<93,56,11>": "-96", + "<93,56,12>": "0", + "<93,56,13>": "1", + "<93,56,14>": "1", + "<93,56,15>": "0", + "<93,56,16>": "0", + "<93,56,17>": "893" + }, + "<93,57>": "", + "<93,58>": "", + "<93,59>": "", + "<93,60>": "", + "<93,61>": "", + "<93,62>": "", + "<93,63>": "", + "<93,64>": "", + "<93,65>": "", + "<93,66>": "", + "<93,67>": "", + "<93,68>": "", + "<93,69>": "", + "<93,70>": "", + "<93,71>": "", + "<93,72>": "", + "<93,73>": "", + "<93,74>": "", + "<93,75>": "", + "<93,76>": "", + "<93,77>": "", + "<93,78>": "", + "<93,79>": "", + "<93,80>": "", + "<93,81>": "", + "<93,82>": "", + "<93,83>": "", + "<93,84>": "", + "<93,85>": "", + "<93,86>": "", + "<93,87>": "", + "<93,88>": "", + "<93,89>": "", + "<93,90>": "", + "<93,91>": "", + "<93,92>": "", + "<93,93>": "", + "<93,94>": "", + "<93,95>": "", + "<93,96>": "", + "<93,97>": "", + "<93,98>": "", + "<93,99>": "", + "<93,100>": "", + "<93,101>": "", + "<93,102>": "", + "<93,103>": "", + "<93,104>": "", + "<93,105>": "", + "<93,106>": "", + "<93,107>": "", + "<93,108>": "" + }, + "<94>": { + "<94,1>": "OLE_PIC_RESOURCE_HDIVIDER", + "<94,2>": "", + "<94,3>": "OLECONTROL.SRP.Picture.1", + "<94,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<94,5>": "183", + "<94,6>": "84:2", + "<94,7>": "-34", + "<94,8>": "2", + "<94,9>": "SRP.Picture.1", + "<94,10>": { + "<94,10,1>": "0x56000000", + "<94,10,2>": "0x0" + }, + "<94,11>": { + "<94,11,1>": "0x4000", + "<94,11,2>": "0x80000000" + }, + "<94,12>": "74", + "<94,13>": { + "<94,13,1>": "-2", + "<94,13,2>": "-2", + "<94,13,3>": "" + }, + "<94,14>": "0", + "<94,15>": { + "<94,15,1>": { + "<94,15,1,1>": "Segoe UI", + "<94,15,1,2>": "-12", + "<94,15,1,3>": "400", + "<94,15,1,4>": "0", + "<94,15,1,5>": "0", + "<94,15,1,6>": "0", + "<94,15,1,7>": "0", + "<94,15,1,8>": "34", + "<94,15,1,9>": "0", + "<94,15,1,10>": "3", + "<94,15,1,11>": "2", + "<94,15,1,12>": "1", + "<94,15,1,13>": "0", + "<94,15,1,14>": "0" + } + }, + "<94,16>": "", + "<94,17>": "", + "<94,18>": "", + "<94,19>": "", + "<94,20>": "", + "<94,21>": "", + "<94,22>": "", + "<94,23>": "", + "<94,24>": "", + "<94,25>": "", + "<94,26>": "", + "<94,27>": "", + "<94,28>": "", + "<94,29>": "", + "<94,30>": "", + "<94,31>": "", + "<94,32>": "", + "<94,33>": "", + "<94,34>": "", + "<94,35>": "", + "<94,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0F5400420020004D0065006E007500200044006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<94,37>": "", + "<94,38>": "", + "<94,39>": "", + "<94,40>": "", + "<94,41>": "", + "<94,42>": "", + "<94,43>": "", + "<94,44>": "", + "<94,45>": "", + "<94,46>": "", + "<94,47>": "", + "<94,48>": "", + "<94,49>": "", + "<94,50>": "", + "<94,51>": "", + "<94,52>": "", + "<94,53>": "", + "<94,54>": "", + "<94,55>": { + "<94,55,1>": "OLE.Animated", + "<94,55,2>": "OLE.AnimationDelay", + "<94,55,3>": "OLE.AutoLoadDropFile", + "<94,55,4>": "OLE.BackgroundColor", + "<94,55,5>": "OLE.BorderAlignment", + "<94,55,6>": "OLE.BorderType", + "<94,55,7>": "OLE.Caption", + "<94,55,8>": "OLE.CaptionColor", + "<94,55,9>": "OLE.CaptionHorzAlign", + "<94,55,10>": "OLE.CaptionHorzOffset", + "<94,55,11>": "OLE.CaptionVertAlign", + "<94,55,12>": "OLE.CaptionVertOffset", + "<94,55,13>": "OLE.ControlPart", + "<94,55,14>": "OLE.FontBold", + "<94,55,15>": "OLE.FontItalic", + "<94,55,16>": "OLE.FontName", + "<94,55,17>": "OLE.FontSize", + "<94,55,18>": "OLE.FontUnderlined", + "<94,55,19>": "OLE.Frame", + "<94,55,20>": "OLE.FrameCount", + "<94,55,21>": "OLE.HorzAlign", + "<94,55,22>": "OLE.Image", + "<94,55,23>": "OLE.ImageHorzOffset", + "<94,55,24>": "OLE.ImageVertOffset", + "<94,55,25>": "OLE.Layout", + "<94,55,26>": "OLE.ResizeUsingGDIPlus", + "<94,55,27>": "OLE.TransparentColor", + "<94,55,28>": "OLE.VertAlign", + "<94,55,29>": "OLE.Zoom" + }, + "<94,56>": { + "<94,56,1>": "0", + "<94,56,2>": "50", + "<94,56,3>": "0", + "<94,56,4>": "None", + "<94,56,5>": "All", + "<94,56,6>": "None", + "<94,56,7>": "", + "<94,56,8>": "None", + "<94,56,9>": "Center", + "<94,56,10>": "0", + "<94,56,11>": "Center", + "<94,56,12>": "0", + "<94,56,13>": "TB Menu Divider", + "<94,56,14>": "0", + "<94,56,15>": "0", + "<94,56,16>": "Segoe UI", + "<94,56,17>": "8", + "<94,56,18>": "0", + "<94,56,19>": "1", + "<94,56,20>": "1", + "<94,56,21>": "Center", + "<94,56,22>": "", + "<94,56,23>": "0", + "<94,56,24>": "0", + "<94,56,25>": "Clip", + "<94,56,26>": "1", + "<94,56,27>": "Auto", + "<94,56,28>": "Center", + "<94,56,29>": "1" + }, + "<94,57>": "", + "<94,58>": "", + "<94,59>": "", + "<94,60>": "", + "<94,61>": "", + "<94,62>": "", + "<94,63>": "", + "<94,64>": "", + "<94,65>": "", + "<94,66>": "", + "<94,67>": "", + "<94,68>": "", + "<94,69>": "", + "<94,70>": "", + "<94,71>": "", + "<94,72>": "", + "<94,73>": "", + "<94,74>": "", + "<94,75>": "", + "<94,76>": "", + "<94,77>": "", + "<94,78>": "", + "<94,79>": "", + "<94,80>": "", + "<94,81>": "", + "<94,82>": "", + "<94,83>": "", + "<94,84>": "", + "<94,85>": "", + "<94,86>": "", + "<94,87>": "", + "<94,88>": "", + "<94,89>": "", + "<94,90>": "", + "<94,91>": "", + "<94,92>": "", + "<94,93>": "", + "<94,94>": "", + "<94,95>": "", + "<94,96>": "", + "<94,97>": "", + "<94,98>": "", + "<94,99>": "", + "<94,100>": "", + "<94,101>": "", + "<94,102>": "", + "<94,103>": "", + "<94,104>": "", + "<94,105>": "", + "<94,106>": "", + "<94,107>": "", + "<94,108>": "" + }, + "<95>": { + "<95,1>": "OLE_PIC_RESOURCE_VDIVIDER", + "<95,2>": "", + "<95,3>": "OLECONTROL.SRP.Picture.1", + "<95,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<95,5>": "-219", + "<95,6>": "94:2", + "<95,7>": "2", + "<95,8>": "-106", + "<95,9>": "SRP.Picture.1", + "<95,10>": { + "<95,10,1>": "0x56000000", + "<95,10,2>": "0x0" + }, + "<95,11>": { + "<95,11,1>": "0x9000", + "<95,11,2>": "0x80000000" + }, + "<95,12>": "75", + "<95,13>": { + "<95,13,1>": "-2", + "<95,13,2>": "-2", + "<95,13,3>": "" + }, + "<95,14>": "0", + "<95,15>": { + "<95,15,1>": { + "<95,15,1,1>": "Segoe UI", + "<95,15,1,2>": "-12", + "<95,15,1,3>": "400", + "<95,15,1,4>": "0", + "<95,15,1,5>": "0", + "<95,15,1,6>": "0", + "<95,15,1,7>": "0", + "<95,15,1,8>": "34", + "<95,15,1,9>": "0", + "<95,15,1,10>": "3", + "<95,15,1,11>": "2", + "<95,15,1,12>": "1", + "<95,15,1,13>": "0", + "<95,15,1,14>": "0" + } + }, + "<95,16>": "", + "<95,17>": "", + "<95,18>": "", + "<95,19>": "", + "<95,20>": "", + "<95,21>": "", + "<95,22>": "", + "<95,23>": "", + "<95,24>": "", + "<95,25>": "", + "<95,26>": "", + "<95,27>": "", + "<95,28>": "", + "<95,29>": "", + "<95,30>": "", + "<95,31>": "", + "<95,32>": "", + "<95,33>": "", + "<95,34>": "", + "<95,35>": "", + "<95,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF1056006500720074006900630061006C00200044006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<95,37>": "", + "<95,38>": "", + "<95,39>": "", + "<95,40>": "", + "<95,41>": "", + "<95,42>": "", + "<95,43>": "", + "<95,44>": "", + "<95,45>": "", + "<95,46>": "", + "<95,47>": "", + "<95,48>": "", + "<95,49>": "", + "<95,50>": "", + "<95,51>": "", + "<95,52>": "", + "<95,53>": "", + "<95,54>": "", + "<95,55>": { + "<95,55,1>": "OLE.Animated", + "<95,55,2>": "OLE.AnimationDelay", + "<95,55,3>": "OLE.AutoLoadDropFile", + "<95,55,4>": "OLE.BackgroundColor", + "<95,55,5>": "OLE.BorderAlignment", + "<95,55,6>": "OLE.BorderType", + "<95,55,7>": "OLE.Caption", + "<95,55,8>": "OLE.CaptionColor", + "<95,55,9>": "OLE.CaptionHorzAlign", + "<95,55,10>": "OLE.CaptionHorzOffset", + "<95,55,11>": "OLE.CaptionVertAlign", + "<95,55,12>": "OLE.CaptionVertOffset", + "<95,55,13>": "OLE.ControlPart", + "<95,55,14>": "OLE.FontBold", + "<95,55,15>": "OLE.FontItalic", + "<95,55,16>": "OLE.FontName", + "<95,55,17>": "OLE.FontSize", + "<95,55,18>": "OLE.FontUnderlined", + "<95,55,19>": "OLE.Frame", + "<95,55,20>": "OLE.FrameCount", + "<95,55,21>": "OLE.HorzAlign", + "<95,55,22>": "OLE.Image", + "<95,55,23>": "OLE.ImageHorzOffset", + "<95,55,24>": "OLE.ImageVertOffset", + "<95,55,25>": "OLE.Layout", + "<95,55,26>": "OLE.ResizeUsingGDIPlus", + "<95,55,27>": "OLE.TransparentColor", + "<95,55,28>": "OLE.VertAlign", + "<95,55,29>": "OLE.Zoom" + }, + "<95,56>": { + "<95,56,1>": "0", + "<95,56,2>": "50", + "<95,56,3>": "0", + "<95,56,4>": "None", + "<95,56,5>": "All", + "<95,56,6>": "None", + "<95,56,7>": "", + "<95,56,8>": "None", + "<95,56,9>": "Center", + "<95,56,10>": "0", + "<95,56,11>": "Center", + "<95,56,12>": "0", + "<95,56,13>": "Vertical Divider", + "<95,56,14>": "0", + "<95,56,15>": "0", + "<95,56,16>": "Segoe UI", + "<95,56,17>": "8", + "<95,56,18>": "0", + "<95,56,19>": "1", + "<95,56,20>": "1", + "<95,56,21>": "Center", + "<95,56,22>": "", + "<95,56,23>": "0", + "<95,56,24>": "0", + "<95,56,25>": "Clip", + "<95,56,26>": "1", + "<95,56,27>": "Auto", + "<95,56,28>": "Center", + "<95,56,29>": "1" + }, + "<95,57>": "", + "<95,58>": "", + "<95,59>": "", + "<95,60>": "", + "<95,61>": "", + "<95,62>": "", + "<95,63>": "", + "<95,64>": "", + "<95,65>": "", + "<95,66>": "", + "<95,67>": "", + "<95,68>": "", + "<95,69>": "", + "<95,70>": "", + "<95,71>": "", + "<95,72>": "", + "<95,73>": "", + "<95,74>": "", + "<95,75>": "", + "<95,76>": "", + "<95,77>": "", + "<95,78>": "", + "<95,79>": "", + "<95,80>": "", + "<95,81>": "", + "<95,82>": "", + "<95,83>": "", + "<95,84>": "", + "<95,85>": "", + "<95,86>": "", + "<95,87>": "", + "<95,88>": "", + "<95,89>": "", + "<95,90>": "", + "<95,91>": "", + "<95,92>": "", + "<95,93>": "", + "<95,94>": "", + "<95,95>": "", + "<95,96>": "", + "<95,97>": "", + "<95,98>": "", + "<95,99>": "", + "<95,100>": "", + "<95,101>": "", + "<95,102>": "", + "<95,103>": "", + "<95,104>": "", + "<95,105>": "", + "<95,106>": "", + "<95,107>": "", + "<95,108>": "" + }, + "<96>": { + "<96,1>": "OLE_INFO_RESOURCES", + "<96,2>": "", + "<96,3>": "OLECONTROL.SRP.Picture.1", + "<96,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<96,5>": "-234", + "<96,6>": "94:2", + "<96,7>": "10", + "<96,8>": "10", + "<96,9>": "SRP.Picture.1", + "<96,10>": { + "<96,10,1>": "0x56000000", + "<96,10,2>": "0x0" + }, + "<96,11>": { + "<96,11,1>": "0x1000", + "<96,11,2>": "0x80000000" + }, + "<96,12>": "76", + "<96,13>": { + "<96,13,1>": "-2", + "<96,13,2>": "-2", + "<96,13,3>": "" + }, + "<96,14>": "0", + "<96,15>": { + "<96,15,1>": { + "<96,15,1,1>": "Segoe UI", + "<96,15,1,2>": "-12", + "<96,15,1,3>": "400", + "<96,15,1,4>": "0", + "<96,15,1,5>": "0", + "<96,15,1,6>": "0", + "<96,15,1,7>": "0", + "<96,15,1,8>": "34", + "<96,15,1,9>": "0", + "<96,15,1,10>": "3", + "<96,15,1,11>": "2", + "<96,15,1,12>": "1", + "<96,15,1,13>": "0", + "<96,15,1,14>": "0" + } + }, + "<96,16>": "", + "<96,17>": "", + "<96,18>": { + "<96,18,1>": { + "<96,18,1,1>": "R", + "<96,18,1,2>": "EXECUTE", + "<96,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<96,18,1,4>": { + "<96,18,1,4,1>": "@SELF", + "<96,18,1,4,2>": "@EVENT", + "<96,18,1,4,3>": "@PARAM1", + "<96,18,1,4,4>": "@PARAM2", + "<96,18,1,4,5>": "@PARAM3", + "<96,18,1,4,6>": "@PARAM4", + "<96,18,1,4,7>": "@PARAM5", + "<96,18,1,4,8>": "@PARAM6" + }, + "<96,18,1,5>": "", + "<96,18,1,6>": "", + "<96,18,1,7>": "", + "<96,18,1,8>": "", + "<96,18,1,9>": "", + "<96,18,1,10>": "", + "<96,18,1,11>": "", + "<96,18,1,12>": "", + "<96,18,1,13>": "", + "<96,18,1,14>": "", + "<96,18,1,15>": "STPROC" + } + }, + "<96,19>": "OLE", + "<96,20>": "", + "<96,21>": "", + "<96,22>": "", + "<96,23>": "", + "<96,24>": "", + "<96,25>": "", + "<96,26>": "", + "<96,27>": "", + "<96,28>": "", + "<96,29>": "", + "<96,30>": "", + "<96,31>": "", + "<96,32>": "", + "<96,33>": "", + "<96,34>": "", + "<96,35>": "", + "<96,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<96,37>": "", + "<96,38>": "", + "<96,39>": "", + "<96,40>": "", + "<96,41>": "", + "<96,42>": "", + "<96,43>": "", + "<96,44>": "", + "<96,45>": "", + "<96,46>": "", + "<96,47>": "", + "<96,48>": "", + "<96,49>": "", + "<96,50>": "", + "<96,51>": "", + "<96,52>": "", + "<96,53>": "", + "<96,54>": "", + "<96,55>": { + "<96,55,1>": "OLE.Animated", + "<96,55,2>": "OLE.AnimationDelay", + "<96,55,3>": "OLE.AutoLoadDropFile", + "<96,55,4>": "OLE.BackgroundColor", + "<96,55,5>": "OLE.BorderAlignment", + "<96,55,6>": "OLE.BorderType", + "<96,55,7>": "OLE.Caption", + "<96,55,8>": "OLE.CaptionColor", + "<96,55,9>": "OLE.CaptionHorzAlign", + "<96,55,10>": "OLE.CaptionHorzOffset", + "<96,55,11>": "OLE.CaptionVertAlign", + "<96,55,12>": "OLE.CaptionVertOffset", + "<96,55,13>": "OLE.ControlPart", + "<96,55,14>": "OLE.FontBold", + "<96,55,15>": "OLE.FontItalic", + "<96,55,16>": "OLE.FontName", + "<96,55,17>": "OLE.FontSize", + "<96,55,18>": "OLE.FontUnderlined", + "<96,55,19>": "OLE.Frame", + "<96,55,20>": "OLE.FrameCount", + "<96,55,21>": "OLE.HorzAlign", + "<96,55,22>": "OLE.Image", + "<96,55,23>": "OLE.ImageHorzOffset", + "<96,55,24>": "OLE.ImageVertOffset", + "<96,55,25>": "OLE.Layout", + "<96,55,26>": "OLE.ResizeUsingGDIPlus", + "<96,55,27>": "OLE.TransparentColor", + "<96,55,28>": "OLE.VertAlign", + "<96,55,29>": "OLE.Zoom" + }, + "<96,56>": { + "<96,56,1>": "0", + "<96,56,2>": "50", + "<96,56,3>": "0", + "<96,56,4>": "None", + "<96,56,5>": "All", + "<96,56,6>": "None", + "<96,56,7>": "", + "<96,56,8>": "None", + "<96,56,9>": "Center", + "<96,56,10>": "0", + "<96,56,11>": "Center", + "<96,56,12>": "0", + "<96,56,13>": "None", + "<96,56,14>": "0", + "<96,56,15>": "0", + "<96,56,16>": "Segoe UI", + "<96,56,17>": "8", + "<96,56,18>": "0", + "<96,56,19>": "1", + "<96,56,20>": "1", + "<96,56,21>": "Center", + "<96,56,22>": "BMPS\\SRPHTTPInfo.png", + "<96,56,23>": "0", + "<96,56,24>": "0", + "<96,56,25>": "Clip", + "<96,56,26>": "1", + "<96,56,27>": "Auto", + "<96,56,28>": "Center", + "<96,56,29>": "1" + }, + "<96,57>": "", + "<96,58>": "", + "<96,59>": "", + "<96,60>": "", + "<96,61>": "", + "<96,62>": "", + "<96,63>": "", + "<96,64>": "", + "<96,65>": "", + "<96,66>": "", + "<96,67>": "", + "<96,68>": "", + "<96,69>": "", + "<96,70>": "", + "<96,71>": "", + "<96,72>": "", + "<96,73>": "", + "<96,74>": "", + "<96,75>": "", + "<96,76>": "", + "<96,77>": "", + "<96,78>": "", + "<96,79>": "", + "<96,80>": "", + "<96,81>": "", + "<96,82>": "", + "<96,83>": "", + "<96,84>": "", + "<96,85>": "", + "<96,86>": "", + "<96,87>": "", + "<96,88>": "", + "<96,89>": "", + "<96,90>": "", + "<96,91>": "", + "<96,92>": "", + "<96,93>": "", + "<96,94>": "", + "<96,95>": "", + "<96,96>": "", + "<96,97>": "", + "<96,98>": "", + "<96,99>": "", + "<96,100>": "", + "<96,101>": "", + "<96,102>": "", + "<96,103>": "", + "<96,104>": "", + "<96,105>": "", + "<96,106>": "", + "<96,107>": "", + "<96,108>": "" + }, + "<97>": { + "<97,1>": "OLE_INFO_RESOURCE_DESCRIPTION", + "<97,2>": "", + "<97,3>": "OLECONTROL.SRP.Picture.1", + "<97,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<97,5>": "-144", + "<97,6>": "149:2", + "<97,7>": "10", + "<97,8>": "10", + "<97,9>": "SRP.Picture.1", + "<97,10>": { + "<97,10,1>": "0x56000000", + "<97,10,2>": "0x0" + }, + "<97,11>": { + "<97,11,1>": "0x1000", + "<97,11,2>": "0x80000000" + }, + "<97,12>": "77", + "<97,13>": { + "<97,13,1>": "-2", + "<97,13,2>": "-2", + "<97,13,3>": "" + }, + "<97,14>": "0", + "<97,15>": { + "<97,15,1>": { + "<97,15,1,1>": "Segoe UI", + "<97,15,1,2>": "-12", + "<97,15,1,3>": "400", + "<97,15,1,4>": "0", + "<97,15,1,5>": "0", + "<97,15,1,6>": "0", + "<97,15,1,7>": "0", + "<97,15,1,8>": "34", + "<97,15,1,9>": "0", + "<97,15,1,10>": "3", + "<97,15,1,11>": "2", + "<97,15,1,12>": "1", + "<97,15,1,13>": "0", + "<97,15,1,14>": "0" + } + }, + "<97,16>": "", + "<97,17>": "", + "<97,18>": { + "<97,18,1>": { + "<97,18,1,1>": "R", + "<97,18,1,2>": "EXECUTE", + "<97,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<97,18,1,4>": { + "<97,18,1,4,1>": "@SELF", + "<97,18,1,4,2>": "@EVENT", + "<97,18,1,4,3>": "@PARAM1", + "<97,18,1,4,4>": "@PARAM2", + "<97,18,1,4,5>": "@PARAM3", + "<97,18,1,4,6>": "@PARAM4", + "<97,18,1,4,7>": "@PARAM5", + "<97,18,1,4,8>": "@PARAM6" + }, + "<97,18,1,5>": "", + "<97,18,1,6>": "", + "<97,18,1,7>": "", + "<97,18,1,8>": "", + "<97,18,1,9>": "", + "<97,18,1,10>": "", + "<97,18,1,11>": "", + "<97,18,1,12>": "", + "<97,18,1,13>": "", + "<97,18,1,14>": "", + "<97,18,1,15>": "STPROC" + } + }, + "<97,19>": "OLE", + "<97,20>": "", + "<97,21>": "", + "<97,22>": "", + "<97,23>": "", + "<97,24>": "", + "<97,25>": "", + "<97,26>": "", + "<97,27>": "", + "<97,28>": "", + "<97,29>": "", + "<97,30>": "", + "<97,31>": "", + "<97,32>": "", + "<97,33>": "", + "<97,34>": "", + "<97,35>": "", + "<97,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<97,37>": "", + "<97,38>": "", + "<97,39>": "", + "<97,40>": "", + "<97,41>": "", + "<97,42>": "", + "<97,43>": "", + "<97,44>": "", + "<97,45>": "", + "<97,46>": "", + "<97,47>": "", + "<97,48>": "", + "<97,49>": "", + "<97,50>": "", + "<97,51>": "", + "<97,52>": "", + "<97,53>": "", + "<97,54>": "", + "<97,55>": { + "<97,55,1>": "OLE.Animated", + "<97,55,2>": "OLE.AnimationDelay", + "<97,55,3>": "OLE.AutoLoadDropFile", + "<97,55,4>": "OLE.BackgroundColor", + "<97,55,5>": "OLE.BorderAlignment", + "<97,55,6>": "OLE.BorderType", + "<97,55,7>": "OLE.Caption", + "<97,55,8>": "OLE.CaptionColor", + "<97,55,9>": "OLE.CaptionHorzAlign", + "<97,55,10>": "OLE.CaptionHorzOffset", + "<97,55,11>": "OLE.CaptionVertAlign", + "<97,55,12>": "OLE.CaptionVertOffset", + "<97,55,13>": "OLE.ControlPart", + "<97,55,14>": "OLE.FontBold", + "<97,55,15>": "OLE.FontItalic", + "<97,55,16>": "OLE.FontName", + "<97,55,17>": "OLE.FontSize", + "<97,55,18>": "OLE.FontUnderlined", + "<97,55,19>": "OLE.Frame", + "<97,55,20>": "OLE.FrameCount", + "<97,55,21>": "OLE.HorzAlign", + "<97,55,22>": "OLE.Image", + "<97,55,23>": "OLE.ImageHorzOffset", + "<97,55,24>": "OLE.ImageVertOffset", + "<97,55,25>": "OLE.Layout", + "<97,55,26>": "OLE.ResizeUsingGDIPlus", + "<97,55,27>": "OLE.TransparentColor", + "<97,55,28>": "OLE.VertAlign", + "<97,55,29>": "OLE.Zoom" + }, + "<97,56>": { + "<97,56,1>": "0", + "<97,56,2>": "50", + "<97,56,3>": "0", + "<97,56,4>": "None", + "<97,56,5>": "All", + "<97,56,6>": "None", + "<97,56,7>": "", + "<97,56,8>": "None", + "<97,56,9>": "Center", + "<97,56,10>": "0", + "<97,56,11>": "Center", + "<97,56,12>": "0", + "<97,56,13>": "None", + "<97,56,14>": "0", + "<97,56,15>": "0", + "<97,56,16>": "Segoe UI", + "<97,56,17>": "8", + "<97,56,18>": "0", + "<97,56,19>": "1", + "<97,56,20>": "1", + "<97,56,21>": "Center", + "<97,56,22>": "BMPS\\SRPHTTPInfo.png", + "<97,56,23>": "0", + "<97,56,24>": "0", + "<97,56,25>": "Clip", + "<97,56,26>": "1", + "<97,56,27>": "Auto", + "<97,56,28>": "Center", + "<97,56,29>": "1" + }, + "<97,57>": "", + "<97,58>": "", + "<97,59>": "", + "<97,60>": "", + "<97,61>": "", + "<97,62>": "", + "<97,63>": "", + "<97,64>": "", + "<97,65>": "", + "<97,66>": "", + "<97,67>": "", + "<97,68>": "", + "<97,69>": "", + "<97,70>": "", + "<97,71>": "", + "<97,72>": "", + "<97,73>": "", + "<97,74>": "", + "<97,75>": "", + "<97,76>": "", + "<97,77>": "", + "<97,78>": "", + "<97,79>": "", + "<97,80>": "", + "<97,81>": "", + "<97,82>": "", + "<97,83>": "", + "<97,84>": "", + "<97,85>": "", + "<97,86>": "", + "<97,87>": "", + "<97,88>": "", + "<97,89>": "", + "<97,90>": "", + "<97,91>": "", + "<97,92>": "", + "<97,93>": "", + "<97,94>": "", + "<97,95>": "", + "<97,96>": "", + "<97,97>": "", + "<97,98>": "", + "<97,99>": "", + "<97,100>": "", + "<97,101>": "", + "<97,102>": "", + "<97,103>": "", + "<97,104>": "", + "<97,105>": "", + "<97,106>": "", + "<97,107>": "", + "<97,108>": "" + }, + "<98>": { + "<98,1>": "OLE_INFO_RESOURCE_METHODS", + "<98,2>": "", + "<98,3>": "OLECONTROL.SRP.Picture.1", + "<98,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<98,5>": "-157", + "<98,6>": "-366:2", + "<98,7>": "10", + "<98,8>": "10", + "<98,9>": "SRP.Picture.1", + "<98,10>": { + "<98,10,1>": "0x56000000", + "<98,10,2>": "0x0" + }, + "<98,11>": { + "<98,11,1>": "0x3000", + "<98,11,2>": "0x80000000" + }, + "<98,12>": "78", + "<98,13>": { + "<98,13,1>": "-2", + "<98,13,2>": "-2", + "<98,13,3>": "" + }, + "<98,14>": "0", + "<98,15>": { + "<98,15,1>": { + "<98,15,1,1>": "Segoe UI", + "<98,15,1,2>": "-12", + "<98,15,1,3>": "400", + "<98,15,1,4>": "0", + "<98,15,1,5>": "0", + "<98,15,1,6>": "0", + "<98,15,1,7>": "0", + "<98,15,1,8>": "34", + "<98,15,1,9>": "0", + "<98,15,1,10>": "3", + "<98,15,1,11>": "2", + "<98,15,1,12>": "1", + "<98,15,1,13>": "0", + "<98,15,1,14>": "0" + } + }, + "<98,16>": "", + "<98,17>": "", + "<98,18>": { + "<98,18,1>": { + "<98,18,1,1>": "R", + "<98,18,1,2>": "EXECUTE", + "<98,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<98,18,1,4>": { + "<98,18,1,4,1>": "@SELF", + "<98,18,1,4,2>": "@EVENT", + "<98,18,1,4,3>": "@PARAM1", + "<98,18,1,4,4>": "@PARAM2", + "<98,18,1,4,5>": "@PARAM3", + "<98,18,1,4,6>": "@PARAM4", + "<98,18,1,4,7>": "@PARAM5", + "<98,18,1,4,8>": "@PARAM6" + }, + "<98,18,1,5>": "", + "<98,18,1,6>": "", + "<98,18,1,7>": "", + "<98,18,1,8>": "", + "<98,18,1,9>": "", + "<98,18,1,10>": "", + "<98,18,1,11>": "", + "<98,18,1,12>": "", + "<98,18,1,13>": "", + "<98,18,1,14>": "", + "<98,18,1,15>": "STPROC" + } + }, + "<98,19>": "OLE", + "<98,20>": "", + "<98,21>": "", + "<98,22>": "", + "<98,23>": "", + "<98,24>": "", + "<98,25>": "", + "<98,26>": "", + "<98,27>": "", + "<98,28>": "", + "<98,29>": "", + "<98,30>": "", + "<98,31>": "", + "<98,32>": "", + "<98,33>": "", + "<98,34>": "", + "<98,35>": "", + "<98,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<98,37>": "", + "<98,38>": "", + "<98,39>": "", + "<98,40>": "", + "<98,41>": "", + "<98,42>": "", + "<98,43>": "", + "<98,44>": "", + "<98,45>": "", + "<98,46>": "", + "<98,47>": "", + "<98,48>": "", + "<98,49>": "", + "<98,50>": "", + "<98,51>": "", + "<98,52>": "", + "<98,53>": "", + "<98,54>": "", + "<98,55>": { + "<98,55,1>": "OLE.Animated", + "<98,55,2>": "OLE.AnimationDelay", + "<98,55,3>": "OLE.AutoLoadDropFile", + "<98,55,4>": "OLE.BackgroundColor", + "<98,55,5>": "OLE.BorderAlignment", + "<98,55,6>": "OLE.BorderType", + "<98,55,7>": "OLE.Caption", + "<98,55,8>": "OLE.CaptionColor", + "<98,55,9>": "OLE.CaptionHorzAlign", + "<98,55,10>": "OLE.CaptionHorzOffset", + "<98,55,11>": "OLE.CaptionVertAlign", + "<98,55,12>": "OLE.CaptionVertOffset", + "<98,55,13>": "OLE.ControlPart", + "<98,55,14>": "OLE.FontBold", + "<98,55,15>": "OLE.FontItalic", + "<98,55,16>": "OLE.FontName", + "<98,55,17>": "OLE.FontSize", + "<98,55,18>": "OLE.FontUnderlined", + "<98,55,19>": "OLE.Frame", + "<98,55,20>": "OLE.FrameCount", + "<98,55,21>": "OLE.HorzAlign", + "<98,55,22>": "OLE.Image", + "<98,55,23>": "OLE.ImageHorzOffset", + "<98,55,24>": "OLE.ImageVertOffset", + "<98,55,25>": "OLE.Layout", + "<98,55,26>": "OLE.ResizeUsingGDIPlus", + "<98,55,27>": "OLE.TransparentColor", + "<98,55,28>": "OLE.VertAlign", + "<98,55,29>": "OLE.Zoom" + }, + "<98,56>": { + "<98,56,1>": "0", + "<98,56,2>": "50", + "<98,56,3>": "0", + "<98,56,4>": "None", + "<98,56,5>": "All", + "<98,56,6>": "None", + "<98,56,7>": "", + "<98,56,8>": "None", + "<98,56,9>": "Center", + "<98,56,10>": "0", + "<98,56,11>": "Center", + "<98,56,12>": "0", + "<98,56,13>": "None", + "<98,56,14>": "0", + "<98,56,15>": "0", + "<98,56,16>": "Segoe UI", + "<98,56,17>": "8", + "<98,56,18>": "0", + "<98,56,19>": "1", + "<98,56,20>": "1", + "<98,56,21>": "Center", + "<98,56,22>": "BMPS\\SRPHTTPInfo.png", + "<98,56,23>": "0", + "<98,56,24>": "0", + "<98,56,25>": "Clip", + "<98,56,26>": "1", + "<98,56,27>": "Auto", + "<98,56,28>": "Center", + "<98,56,29>": "1" + }, + "<98,57>": "", + "<98,58>": "", + "<98,59>": "", + "<98,60>": "", + "<98,61>": "", + "<98,62>": "", + "<98,63>": "", + "<98,64>": "", + "<98,65>": "", + "<98,66>": "", + "<98,67>": "", + "<98,68>": "", + "<98,69>": "", + "<98,70>": "", + "<98,71>": "", + "<98,72>": "", + "<98,73>": "", + "<98,74>": "", + "<98,75>": "", + "<98,76>": "", + "<98,77>": "", + "<98,78>": "", + "<98,79>": "", + "<98,80>": "", + "<98,81>": "", + "<98,82>": "", + "<98,83>": "", + "<98,84>": "", + "<98,85>": "", + "<98,86>": "", + "<98,87>": "", + "<98,88>": "", + "<98,89>": "", + "<98,90>": "", + "<98,91>": "", + "<98,92>": "", + "<98,93>": "", + "<98,94>": "", + "<98,95>": "", + "<98,96>": "", + "<98,97>": "", + "<98,98>": "", + "<98,99>": "", + "<98,100>": "", + "<98,101>": "", + "<98,102>": "", + "<98,103>": "", + "<98,104>": "", + "<98,105>": "", + "<98,106>": "", + "<98,107>": "", + "<98,108>": "" + }, + "<99>": { + "<99,1>": "OLE_INFO_RESOURCE_QUERY_PARAMS", + "<99,2>": "", + "<99,3>": "OLECONTROL.SRP.Picture.1", + "<99,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<99,5>": "-130", + "<99,6>": "-210:2", + "<99,7>": "10", + "<99,8>": "10", + "<99,9>": "SRP.Picture.1", + "<99,10>": { + "<99,10,1>": "0x56000000", + "<99,10,2>": "0x0" + }, + "<99,11>": { + "<99,11,1>": "0x3000", + "<99,11,2>": "0x80000000" + }, + "<99,12>": "79", + "<99,13>": { + "<99,13,1>": "-2", + "<99,13,2>": "-2", + "<99,13,3>": "" + }, + "<99,14>": "0", + "<99,15>": { + "<99,15,1>": { + "<99,15,1,1>": "Segoe UI", + "<99,15,1,2>": "-12", + "<99,15,1,3>": "400", + "<99,15,1,4>": "0", + "<99,15,1,5>": "0", + "<99,15,1,6>": "0", + "<99,15,1,7>": "0", + "<99,15,1,8>": "34", + "<99,15,1,9>": "0", + "<99,15,1,10>": "3", + "<99,15,1,11>": "2", + "<99,15,1,12>": "1", + "<99,15,1,13>": "0", + "<99,15,1,14>": "0" + } + }, + "<99,16>": "", + "<99,17>": "", + "<99,18>": { + "<99,18,1>": { + "<99,18,1,1>": "R", + "<99,18,1,2>": "EXECUTE", + "<99,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<99,18,1,4>": { + "<99,18,1,4,1>": "@SELF", + "<99,18,1,4,2>": "@EVENT", + "<99,18,1,4,3>": "@PARAM1", + "<99,18,1,4,4>": "@PARAM2", + "<99,18,1,4,5>": "@PARAM3", + "<99,18,1,4,6>": "@PARAM4", + "<99,18,1,4,7>": "@PARAM5", + "<99,18,1,4,8>": "@PARAM6" + }, + "<99,18,1,5>": "", + "<99,18,1,6>": "", + "<99,18,1,7>": "", + "<99,18,1,8>": "", + "<99,18,1,9>": "", + "<99,18,1,10>": "", + "<99,18,1,11>": "", + "<99,18,1,12>": "", + "<99,18,1,13>": "", + "<99,18,1,14>": "", + "<99,18,1,15>": "STPROC" + } + }, + "<99,19>": "OLE", + "<99,20>": "", + "<99,21>": "", + "<99,22>": "", + "<99,23>": "", + "<99,24>": "", + "<99,25>": "", + "<99,26>": "", + "<99,27>": "", + "<99,28>": "", + "<99,29>": "", + "<99,30>": "", + "<99,31>": "", + "<99,32>": "", + "<99,33>": "", + "<99,34>": "", + "<99,35>": "", + "<99,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<99,37>": "", + "<99,38>": "", + "<99,39>": "", + "<99,40>": "", + "<99,41>": "", + "<99,42>": "", + "<99,43>": "", + "<99,44>": "", + "<99,45>": "", + "<99,46>": "", + "<99,47>": "", + "<99,48>": "", + "<99,49>": "", + "<99,50>": "", + "<99,51>": "", + "<99,52>": "", + "<99,53>": "", + "<99,54>": "", + "<99,55>": { + "<99,55,1>": "OLE.Animated", + "<99,55,2>": "OLE.AnimationDelay", + "<99,55,3>": "OLE.AutoLoadDropFile", + "<99,55,4>": "OLE.BackgroundColor", + "<99,55,5>": "OLE.BorderAlignment", + "<99,55,6>": "OLE.BorderType", + "<99,55,7>": "OLE.Caption", + "<99,55,8>": "OLE.CaptionColor", + "<99,55,9>": "OLE.CaptionHorzAlign", + "<99,55,10>": "OLE.CaptionHorzOffset", + "<99,55,11>": "OLE.CaptionVertAlign", + "<99,55,12>": "OLE.CaptionVertOffset", + "<99,55,13>": "OLE.ControlPart", + "<99,55,14>": "OLE.FontBold", + "<99,55,15>": "OLE.FontItalic", + "<99,55,16>": "OLE.FontName", + "<99,55,17>": "OLE.FontSize", + "<99,55,18>": "OLE.FontUnderlined", + "<99,55,19>": "OLE.Frame", + "<99,55,20>": "OLE.FrameCount", + "<99,55,21>": "OLE.HorzAlign", + "<99,55,22>": "OLE.Image", + "<99,55,23>": "OLE.ImageHorzOffset", + "<99,55,24>": "OLE.ImageVertOffset", + "<99,55,25>": "OLE.Layout", + "<99,55,26>": "OLE.ResizeUsingGDIPlus", + "<99,55,27>": "OLE.TransparentColor", + "<99,55,28>": "OLE.VertAlign", + "<99,55,29>": "OLE.Zoom" + }, + "<99,56>": { + "<99,56,1>": "0", + "<99,56,2>": "50", + "<99,56,3>": "0", + "<99,56,4>": "None", + "<99,56,5>": "All", + "<99,56,6>": "None", + "<99,56,7>": "", + "<99,56,8>": "None", + "<99,56,9>": "Center", + "<99,56,10>": "0", + "<99,56,11>": "Center", + "<99,56,12>": "0", + "<99,56,13>": "None", + "<99,56,14>": "0", + "<99,56,15>": "0", + "<99,56,16>": "Segoe UI", + "<99,56,17>": "8", + "<99,56,18>": "0", + "<99,56,19>": "1", + "<99,56,20>": "1", + "<99,56,21>": "Center", + "<99,56,22>": "BMPS\\SRPHTTPInfo.png", + "<99,56,23>": "0", + "<99,56,24>": "0", + "<99,56,25>": "Clip", + "<99,56,26>": "1", + "<99,56,27>": "Auto", + "<99,56,28>": "Center", + "<99,56,29>": "1" + }, + "<99,57>": "", + "<99,58>": "", + "<99,59>": "", + "<99,60>": "", + "<99,61>": "", + "<99,62>": "", + "<99,63>": "", + "<99,64>": "", + "<99,65>": "", + "<99,66>": "", + "<99,67>": "", + "<99,68>": "", + "<99,69>": "", + "<99,70>": "", + "<99,71>": "", + "<99,72>": "", + "<99,73>": "", + "<99,74>": "", + "<99,75>": "", + "<99,76>": "", + "<99,77>": "", + "<99,78>": "", + "<99,79>": "", + "<99,80>": "", + "<99,81>": "", + "<99,82>": "", + "<99,83>": "", + "<99,84>": "", + "<99,85>": "", + "<99,86>": "", + "<99,87>": "", + "<99,88>": "", + "<99,89>": "", + "<99,90>": "", + "<99,91>": "", + "<99,92>": "", + "<99,93>": "", + "<99,94>": "", + "<99,95>": "", + "<99,96>": "", + "<99,97>": "", + "<99,98>": "", + "<99,99>": "", + "<99,100>": "", + "<99,101>": "", + "<99,102>": "", + "<99,103>": "", + "<99,104>": "", + "<99,105>": "", + "<99,106>": "", + "<99,107>": "", + "<99,108>": "" + }, + "<100>": { + "<100,1>": "OLE_INFO_TOTAL_INVALID_PASSWORD_ATTEMPTS", + "<100,2>": "", + "<100,3>": "OLECONTROL.SRP.Picture.1", + "<100,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<100,5>": "637", + "<100,6>": "200:1", + "<100,7>": "10", + "<100,8>": "10", + "<100,9>": "SRP.Picture.1", + "<100,10>": { + "<100,10,1>": "0x56000000", + "<100,10,2>": "0x0" + }, + "<100,11>": { + "<100,11,1>": "0x0", + "<100,11,2>": "0x80000000" + }, + "<100,12>": "80", + "<100,13>": { + "<100,13,1>": "-2", + "<100,13,2>": "-2", + "<100,13,3>": "" + }, + "<100,14>": "0", + "<100,15>": { + "<100,15,1>": { + "<100,15,1,1>": "Segoe UI", + "<100,15,1,2>": "-12", + "<100,15,1,3>": "400", + "<100,15,1,4>": "0", + "<100,15,1,5>": "0", + "<100,15,1,6>": "0", + "<100,15,1,7>": "0", + "<100,15,1,8>": "34", + "<100,15,1,9>": "0", + "<100,15,1,10>": "3", + "<100,15,1,11>": "2", + "<100,15,1,12>": "1", + "<100,15,1,13>": "0", + "<100,15,1,14>": "0" + } + }, + "<100,16>": "", + "<100,17>": "", + "<100,18>": { + "<100,18,1>": { + "<100,18,1,1>": "R", + "<100,18,1,2>": "EXECUTE", + "<100,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<100,18,1,4>": { + "<100,18,1,4,1>": "@SELF", + "<100,18,1,4,2>": "@EVENT", + "<100,18,1,4,3>": "@PARAM1", + "<100,18,1,4,4>": "@PARAM2", + "<100,18,1,4,5>": "@PARAM3", + "<100,18,1,4,6>": "@PARAM4", + "<100,18,1,4,7>": "@PARAM5", + "<100,18,1,4,8>": "@PARAM6" + }, + "<100,18,1,5>": "", + "<100,18,1,6>": "", + "<100,18,1,7>": "", + "<100,18,1,8>": "", + "<100,18,1,9>": "", + "<100,18,1,10>": "", + "<100,18,1,11>": "", + "<100,18,1,12>": "", + "<100,18,1,13>": "", + "<100,18,1,14>": "", + "<100,18,1,15>": "STPROC" + } + }, + "<100,19>": "OLE", + "<100,20>": "", + "<100,21>": "", + "<100,22>": "", + "<100,23>": "", + "<100,24>": "", + "<100,25>": "", + "<100,26>": "", + "<100,27>": "", + "<100,28>": "", + "<100,29>": "", + "<100,30>": "", + "<100,31>": "", + "<100,32>": "", + "<100,33>": "", + "<100,34>": "", + "<100,35>": "", + "<100,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<100,37>": "", + "<100,38>": "", + "<100,39>": "", + "<100,40>": "", + "<100,41>": "", + "<100,42>": "", + "<100,43>": "", + "<100,44>": "", + "<100,45>": "", + "<100,46>": "", + "<100,47>": "", + "<100,48>": "", + "<100,49>": "", + "<100,50>": "", + "<100,51>": "", + "<100,52>": "", + "<100,53>": "", + "<100,54>": "", + "<100,55>": { + "<100,55,1>": "OLE.Animated", + "<100,55,2>": "OLE.AnimationDelay", + "<100,55,3>": "OLE.AutoLoadDropFile", + "<100,55,4>": "OLE.BackgroundColor", + "<100,55,5>": "OLE.BorderAlignment", + "<100,55,6>": "OLE.BorderType", + "<100,55,7>": "OLE.Caption", + "<100,55,8>": "OLE.CaptionColor", + "<100,55,9>": "OLE.CaptionHorzAlign", + "<100,55,10>": "OLE.CaptionHorzOffset", + "<100,55,11>": "OLE.CaptionVertAlign", + "<100,55,12>": "OLE.CaptionVertOffset", + "<100,55,13>": "OLE.ControlPart", + "<100,55,14>": "OLE.FontBold", + "<100,55,15>": "OLE.FontItalic", + "<100,55,16>": "OLE.FontName", + "<100,55,17>": "OLE.FontSize", + "<100,55,18>": "OLE.FontUnderlined", + "<100,55,19>": "OLE.Frame", + "<100,55,20>": "OLE.FrameCount", + "<100,55,21>": "OLE.HorzAlign", + "<100,55,22>": "OLE.Image", + "<100,55,23>": "OLE.ImageHorzOffset", + "<100,55,24>": "OLE.ImageVertOffset", + "<100,55,25>": "OLE.Layout", + "<100,55,26>": "OLE.ResizeUsingGDIPlus", + "<100,55,27>": "OLE.TransparentColor", + "<100,55,28>": "OLE.VertAlign", + "<100,55,29>": "OLE.Zoom" + }, + "<100,56>": { + "<100,56,1>": "0", + "<100,56,2>": "50", + "<100,56,3>": "0", + "<100,56,4>": "None", + "<100,56,5>": "All", + "<100,56,6>": "None", + "<100,56,7>": "", + "<100,56,8>": "None", + "<100,56,9>": "Center", + "<100,56,10>": "0", + "<100,56,11>": "Center", + "<100,56,12>": "0", + "<100,56,13>": "None", + "<100,56,14>": "0", + "<100,56,15>": "0", + "<100,56,16>": "Segoe UI", + "<100,56,17>": "8", + "<100,56,18>": "0", + "<100,56,19>": "1", + "<100,56,20>": "1", + "<100,56,21>": "Center", + "<100,56,22>": "BMPS\\SRPHTTPInfo.png", + "<100,56,23>": "0", + "<100,56,24>": "0", + "<100,56,25>": "Clip", + "<100,56,26>": "1", + "<100,56,27>": "Auto", + "<100,56,28>": "Center", + "<100,56,29>": "1" + }, + "<100,57>": "", + "<100,58>": "", + "<100,59>": "", + "<100,60>": "", + "<100,61>": "", + "<100,62>": "", + "<100,63>": "", + "<100,64>": "", + "<100,65>": "", + "<100,66>": "", + "<100,67>": "", + "<100,68>": "", + "<100,69>": "", + "<100,70>": "", + "<100,71>": "", + "<100,72>": "", + "<100,73>": "", + "<100,74>": "", + "<100,75>": "", + "<100,76>": "", + "<100,77>": "", + "<100,78>": "", + "<100,79>": "", + "<100,80>": "", + "<100,81>": "", + "<100,82>": "", + "<100,83>": "", + "<100,84>": "", + "<100,85>": "", + "<100,86>": "", + "<100,87>": "", + "<100,88>": "", + "<100,89>": "", + "<100,90>": "", + "<100,91>": "", + "<100,92>": "", + "<100,93>": "", + "<100,94>": "", + "<100,95>": "", + "<100,96>": "", + "<100,97>": "", + "<100,98>": "", + "<100,99>": "", + "<100,100>": "", + "<100,101>": "", + "<100,102>": "", + "<100,103>": "", + "<100,104>": "", + "<100,105>": "", + "<100,106>": "", + "<100,107>": "", + "<100,108>": "" + }, + "<101>": { + "<101,1>": "OLE_INFO_API_CALL_PROCEDURE", + "<101,2>": "", + "<101,3>": "OLECONTROL.SRP.Picture.1", + "<101,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<101,5>": "424", + "<101,6>": "231", + "<101,7>": "10", + "<101,8>": "10", + "<101,9>": "SRP.Picture.1", + "<101,10>": { + "<101,10,1>": "0x56000000", + "<101,10,2>": "0x0" + }, + "<101,11>": { + "<101,11,1>": "0x0", + "<101,11,2>": "0x80000000" + }, + "<101,12>": "81", + "<101,13>": { + "<101,13,1>": "-2", + "<101,13,2>": "-2", + "<101,13,3>": "" + }, + "<101,14>": "0", + "<101,15>": { + "<101,15,1>": { + "<101,15,1,1>": "Segoe UI", + "<101,15,1,2>": "-12", + "<101,15,1,3>": "400", + "<101,15,1,4>": "0", + "<101,15,1,5>": "0", + "<101,15,1,6>": "0", + "<101,15,1,7>": "0", + "<101,15,1,8>": "34", + "<101,15,1,9>": "0", + "<101,15,1,10>": "3", + "<101,15,1,11>": "2", + "<101,15,1,12>": "1", + "<101,15,1,13>": "0", + "<101,15,1,14>": "0" + } + }, + "<101,16>": "", + "<101,17>": "", + "<101,18>": { + "<101,18,1>": { + "<101,18,1,1>": "R", + "<101,18,1,2>": "EXECUTE", + "<101,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<101,18,1,4>": { + "<101,18,1,4,1>": "@SELF", + "<101,18,1,4,2>": "@EVENT", + "<101,18,1,4,3>": "@PARAM1", + "<101,18,1,4,4>": "@PARAM2", + "<101,18,1,4,5>": "@PARAM3", + "<101,18,1,4,6>": "@PARAM4", + "<101,18,1,4,7>": "@PARAM5", + "<101,18,1,4,8>": "@PARAM6" + }, + "<101,18,1,5>": "", + "<101,18,1,6>": "", + "<101,18,1,7>": "", + "<101,18,1,8>": "", + "<101,18,1,9>": "", + "<101,18,1,10>": "", + "<101,18,1,11>": "", + "<101,18,1,12>": "", + "<101,18,1,13>": "", + "<101,18,1,14>": "", + "<101,18,1,15>": "STPROC" + } + }, + "<101,19>": "OLE", + "<101,20>": "", + "<101,21>": "", + "<101,22>": "", + "<101,23>": "", + "<101,24>": "", + "<101,25>": "", + "<101,26>": "", + "<101,27>": "", + "<101,28>": "", + "<101,29>": "", + "<101,30>": "", + "<101,31>": "", + "<101,32>": "", + "<101,33>": "", + "<101,34>": "", + "<101,35>": "", + "<101,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<101,37>": "", + "<101,38>": "", + "<101,39>": "", + "<101,40>": "", + "<101,41>": "", + "<101,42>": "", + "<101,43>": "", + "<101,44>": "", + "<101,45>": "", + "<101,46>": "", + "<101,47>": "", + "<101,48>": "", + "<101,49>": "", + "<101,50>": "", + "<101,51>": "", + "<101,52>": "", + "<101,53>": "", + "<101,54>": "", + "<101,55>": { + "<101,55,1>": "OLE.Animated", + "<101,55,2>": "OLE.AnimationDelay", + "<101,55,3>": "OLE.AutoLoadDropFile", + "<101,55,4>": "OLE.BackgroundColor", + "<101,55,5>": "OLE.BorderAlignment", + "<101,55,6>": "OLE.BorderType", + "<101,55,7>": "OLE.Caption", + "<101,55,8>": "OLE.CaptionColor", + "<101,55,9>": "OLE.CaptionHorzAlign", + "<101,55,10>": "OLE.CaptionHorzOffset", + "<101,55,11>": "OLE.CaptionVertAlign", + "<101,55,12>": "OLE.CaptionVertOffset", + "<101,55,13>": "OLE.ControlPart", + "<101,55,14>": "OLE.FontBold", + "<101,55,15>": "OLE.FontItalic", + "<101,55,16>": "OLE.FontName", + "<101,55,17>": "OLE.FontSize", + "<101,55,18>": "OLE.FontUnderlined", + "<101,55,19>": "OLE.Frame", + "<101,55,20>": "OLE.FrameCount", + "<101,55,21>": "OLE.HorzAlign", + "<101,55,22>": "OLE.Image", + "<101,55,23>": "OLE.ImageHorzOffset", + "<101,55,24>": "OLE.ImageVertOffset", + "<101,55,25>": "OLE.Layout", + "<101,55,26>": "OLE.ResizeUsingGDIPlus", + "<101,55,27>": "OLE.TransparentColor", + "<101,55,28>": "OLE.VertAlign", + "<101,55,29>": "OLE.Zoom" + }, + "<101,56>": { + "<101,56,1>": "0", + "<101,56,2>": "50", + "<101,56,3>": "0", + "<101,56,4>": "None", + "<101,56,5>": "All", + "<101,56,6>": "None", + "<101,56,7>": "", + "<101,56,8>": "None", + "<101,56,9>": "Center", + "<101,56,10>": "0", + "<101,56,11>": "Center", + "<101,56,12>": "0", + "<101,56,13>": "None", + "<101,56,14>": "0", + "<101,56,15>": "0", + "<101,56,16>": "Segoe UI", + "<101,56,17>": "8", + "<101,56,18>": "0", + "<101,56,19>": "1", + "<101,56,20>": "1", + "<101,56,21>": "Center", + "<101,56,22>": "BMPS\\SRPHTTPInfo.png", + "<101,56,23>": "0", + "<101,56,24>": "0", + "<101,56,25>": "Clip", + "<101,56,26>": "1", + "<101,56,27>": "Auto", + "<101,56,28>": "Center", + "<101,56,29>": "1" + }, + "<101,57>": "", + "<101,58>": "", + "<101,59>": "", + "<101,60>": "", + "<101,61>": "", + "<101,62>": "", + "<101,63>": "", + "<101,64>": "", + "<101,65>": "", + "<101,66>": "", + "<101,67>": "", + "<101,68>": "", + "<101,69>": "", + "<101,70>": "", + "<101,71>": "", + "<101,72>": "", + "<101,73>": "", + "<101,74>": "", + "<101,75>": "", + "<101,76>": "", + "<101,77>": "", + "<101,78>": "", + "<101,79>": "", + "<101,80>": "", + "<101,81>": "", + "<101,82>": "", + "<101,83>": "", + "<101,84>": "", + "<101,85>": "", + "<101,86>": "", + "<101,87>": "", + "<101,88>": "", + "<101,89>": "", + "<101,90>": "", + "<101,91>": "", + "<101,92>": "", + "<101,93>": "", + "<101,94>": "", + "<101,95>": "", + "<101,96>": "", + "<101,97>": "", + "<101,98>": "", + "<101,99>": "", + "<101,100>": "", + "<101,101>": "", + "<101,102>": "", + "<101,103>": "", + "<101,104>": "", + "<101,105>": "", + "<101,106>": "", + "<101,107>": "", + "<101,108>": "" + }, + "<102>": { + "<102,1>": "OLE_INFO_RESOURCE_TITLE", + "<102,2>": "", + "<102,3>": "OLECONTROL.SRP.Picture.1", + "<102,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<102,5>": "-181", + "<102,6>": "94:2", + "<102,7>": "10", + "<102,8>": "10", + "<102,9>": "SRP.Picture.1", + "<102,10>": { + "<102,10,1>": "0x56000000", + "<102,10,2>": "0x0" + }, + "<102,11>": { + "<102,11,1>": "0x1000", + "<102,11,2>": "0x80000000" + }, + "<102,12>": "82", + "<102,13>": { + "<102,13,1>": "-2", + "<102,13,2>": "-2", + "<102,13,3>": "" + }, + "<102,14>": "0", + "<102,15>": { + "<102,15,1>": { + "<102,15,1,1>": "Segoe UI", + "<102,15,1,2>": "-12", + "<102,15,1,3>": "400", + "<102,15,1,4>": "0", + "<102,15,1,5>": "0", + "<102,15,1,6>": "0", + "<102,15,1,7>": "0", + "<102,15,1,8>": "34", + "<102,15,1,9>": "0", + "<102,15,1,10>": "3", + "<102,15,1,11>": "2", + "<102,15,1,12>": "1", + "<102,15,1,13>": "0", + "<102,15,1,14>": "0" + } + }, + "<102,16>": "", + "<102,17>": "", + "<102,18>": { + "<102,18,1>": { + "<102,18,1,1>": "R", + "<102,18,1,2>": "EXECUTE", + "<102,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<102,18,1,4>": { + "<102,18,1,4,1>": "@SELF", + "<102,18,1,4,2>": "@EVENT", + "<102,18,1,4,3>": "@PARAM1", + "<102,18,1,4,4>": "@PARAM2", + "<102,18,1,4,5>": "@PARAM3", + "<102,18,1,4,6>": "@PARAM4", + "<102,18,1,4,7>": "@PARAM5", + "<102,18,1,4,8>": "@PARAM6" + }, + "<102,18,1,5>": "", + "<102,18,1,6>": "", + "<102,18,1,7>": "", + "<102,18,1,8>": "", + "<102,18,1,9>": "", + "<102,18,1,10>": "", + "<102,18,1,11>": "", + "<102,18,1,12>": "", + "<102,18,1,13>": "", + "<102,18,1,14>": "", + "<102,18,1,15>": "STPROC" + } + }, + "<102,19>": "OLE", + "<102,20>": "", + "<102,21>": "", + "<102,22>": "", + "<102,23>": "", + "<102,24>": "", + "<102,25>": "", + "<102,26>": "", + "<102,27>": "", + "<102,28>": "", + "<102,29>": "", + "<102,30>": "", + "<102,31>": "", + "<102,32>": "", + "<102,33>": "", + "<102,34>": "", + "<102,35>": "", + "<102,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF1442004D00500053005C00530052005000480054005400500049006E0066006F002E0070006E006700FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<102,37>": "", + "<102,38>": "", + "<102,39>": "", + "<102,40>": "", + "<102,41>": "", + "<102,42>": "", + "<102,43>": "", + "<102,44>": "", + "<102,45>": "", + "<102,46>": "", + "<102,47>": "", + "<102,48>": "", + "<102,49>": "", + "<102,50>": "", + "<102,51>": "", + "<102,52>": "", + "<102,53>": "", + "<102,54>": "", + "<102,55>": { + "<102,55,1>": "OLE.Animated", + "<102,55,2>": "OLE.AnimationDelay", + "<102,55,3>": "OLE.AutoLoadDropFile", + "<102,55,4>": "OLE.BackgroundColor", + "<102,55,5>": "OLE.BorderAlignment", + "<102,55,6>": "OLE.BorderType", + "<102,55,7>": "OLE.Caption", + "<102,55,8>": "OLE.CaptionColor", + "<102,55,9>": "OLE.CaptionHorzAlign", + "<102,55,10>": "OLE.CaptionHorzOffset", + "<102,55,11>": "OLE.CaptionVertAlign", + "<102,55,12>": "OLE.CaptionVertOffset", + "<102,55,13>": "OLE.ControlPart", + "<102,55,14>": "OLE.FontBold", + "<102,55,15>": "OLE.FontItalic", + "<102,55,16>": "OLE.FontName", + "<102,55,17>": "OLE.FontSize", + "<102,55,18>": "OLE.FontUnderlined", + "<102,55,19>": "OLE.Frame", + "<102,55,20>": "OLE.FrameCount", + "<102,55,21>": "OLE.HorzAlign", + "<102,55,22>": "OLE.Image", + "<102,55,23>": "OLE.ImageHorzOffset", + "<102,55,24>": "OLE.ImageVertOffset", + "<102,55,25>": "OLE.Layout", + "<102,55,26>": "OLE.ResizeUsingGDIPlus", + "<102,55,27>": "OLE.TransparentColor", + "<102,55,28>": "OLE.VertAlign", + "<102,55,29>": "OLE.Zoom" + }, + "<102,56>": { + "<102,56,1>": "0", + "<102,56,2>": "50", + "<102,56,3>": "0", + "<102,56,4>": "None", + "<102,56,5>": "All", + "<102,56,6>": "None", + "<102,56,7>": "", + "<102,56,8>": "None", + "<102,56,9>": "Center", + "<102,56,10>": "0", + "<102,56,11>": "Center", + "<102,56,12>": "0", + "<102,56,13>": "None", + "<102,56,14>": "0", + "<102,56,15>": "0", + "<102,56,16>": "Segoe UI", + "<102,56,17>": "8", + "<102,56,18>": "0", + "<102,56,19>": "1", + "<102,56,20>": "1", + "<102,56,21>": "Center", + "<102,56,22>": "BMPS\\SRPHTTPInfo.png", + "<102,56,23>": "0", + "<102,56,24>": "0", + "<102,56,25>": "Clip", + "<102,56,26>": "1", + "<102,56,27>": "Auto", + "<102,56,28>": "Center", + "<102,56,29>": "1" + }, + "<102,57>": "", + "<102,58>": "", + "<102,59>": "", + "<102,60>": "", + "<102,61>": "", + "<102,62>": "", + "<102,63>": "", + "<102,64>": "", + "<102,65>": "", + "<102,66>": "", + "<102,67>": "", + "<102,68>": "", + "<102,69>": "", + "<102,70>": "", + "<102,71>": "", + "<102,72>": "", + "<102,73>": "", + "<102,74>": "", + "<102,75>": "", + "<102,76>": "", + "<102,77>": "", + "<102,78>": "", + "<102,79>": "", + "<102,80>": "", + "<102,81>": "", + "<102,82>": "", + "<102,83>": "", + "<102,84>": "", + "<102,85>": "", + "<102,86>": "", + "<102,87>": "", + "<102,88>": "", + "<102,89>": "", + "<102,90>": "", + "<102,91>": "", + "<102,92>": "", + "<102,93>": "", + "<102,94>": "", + "<102,95>": "", + "<102,96>": "", + "<102,97>": "", + "<102,98>": "", + "<102,99>": "", + "<102,100>": "", + "<102,101>": "", + "<102,102>": "", + "<102,103>": "", + "<102,104>": "", + "<102,105>": "", + "<102,106>": "", + "<102,107>": "", + "<102,108>": "" + }, + "<103>": { + "<103,1>": "STA_SRP_HTTP_FRAMEWORK_VERSION", + "<103,2>": "", + "<103,3>": "STATIC", + "<103,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<103,5>": "7", + "<103,6>": "-25", + "<103,7>": "234", + "<103,8>": "16", + "<103,9>": "SRP HTTP Framework v.#", + "<103,10>": { + "<103,10,1>": "0x56000000", + "<103,10,2>": "0x0" + }, + "<103,11>": { + "<103,11,1>": "0x12000", + "<103,11,2>": "0x80000000" + }, + "<103,12>": "104", + "<103,13>": { + "<103,13,1>": "-1", + "<103,13,2>": "-1", + "<103,13,3>": "" + }, + "<103,14>": "0", + "<103,15>": { + "<103,15,1>": { + "<103,15,1,1>": "Segoe UI", + "<103,15,1,2>": "-12", + "<103,15,1,3>": "400", + "<103,15,1,4>": "0", + "<103,15,1,5>": "0", + "<103,15,1,6>": "0", + "<103,15,1,7>": "0", + "<103,15,1,8>": "34", + "<103,15,1,9>": "0", + "<103,15,1,10>": "3", + "<103,15,1,11>": "2", + "<103,15,1,12>": "1", + "<103,15,1,13>": "0", + "<103,15,1,14>": "0" + } + }, + "<103,16>": "", + "<103,17>": "", + "<103,18>": "", + "<103,19>": "", + "<103,20>": "", + "<103,21>": "", + "<103,22>": "", + "<103,23>": "", + "<103,24>": "", + "<103,25>": "", + "<103,26>": "", + "<103,27>": "", + "<103,28>": "<>", + "<103,29>": "<>", + "<103,30>": "", + "<103,31>": "", + "<103,32>": "", + "<103,33>": "", + "<103,34>": "", + "<103,35>": "", + "<103,36>": "", + "<103,37>": "", + "<103,38>": "", + "<103,39>": "", + "<103,40>": "", + "<103,41>": "", + "<103,42>": "", + "<103,43>": "", + "<103,44>": "", + "<103,45>": "", + "<103,46>": "", + "<103,47>": "", + "<103,48>": "", + "<103,49>": "", + "<103,50>": "", + "<103,51>": "", + "<103,52>": "", + "<103,53>": "", + "<103,54>": "", + "<103,55>": "", + "<103,56>": "", + "<103,57>": "", + "<103,58>": "", + "<103,59>": "", + "<103,60>": "", + "<103,61>": "", + "<103,62>": "0", + "<103,63>": { + "<103,63,1>": "", + "<103,63,2>": "", + "<103,63,3>": "", + "<103,63,4>": "", + "<103,63,5>": "", + "<103,63,6>": "", + "<103,63,7>": "", + "<103,63,8>": "" + }, + "<103,64>": { + "<103,64,1>": "", + "<103,64,2>": "", + "<103,64,3>": "" + }, + "<103,65>": "-2", + "<103,66>": "", + "<103,67>": "", + "<103,68>": "", + "<103,69>": "", + "<103,70>": "", + "<103,71>": "", + "<103,72>": "", + "<103,73>": "", + "<103,74>": "", + "<103,75>": "", + "<103,76>": "", + "<103,77>": "", + "<103,78>": "", + "<103,79>": "", + "<103,80>": "", + "<103,81>": "", + "<103,82>": "", + "<103,83>": "", + "<103,84>": "", + "<103,85>": "", + "<103,86>": "", + "<103,87>": "", + "<103,88>": "", + "<103,89>": "", + "<103,90>": "0", + "<103,91>": "0", + "<103,92>": "", + "<103,93>": "", + "<103,94>": "", + "<103,95>": "", + "<103,96>": "", + "<103,97>": "", + "<103,98>": "", + "<103,99>": "", + "<103,100>": "", + "<103,101>": "", + "<103,102>": "", + "<103,103>": "", + "<103,104>": "", + "<103,105>": "", + "<103,106>": "", + "<103,107>": "", + "<103,108>": "" + }, + "<104>": { + "<104,1>": "OLE_PUB_CONTRACT", + "<104,2>": "", + "<104,3>": "OLECONTROL.SRP.Button.1", + "<104,4>": "NDW_HTTP_FRAMEWORK_SETUP", + "<104,5>": "-234", + "<104,6>": "111:2", + "<104,7>": "10", + "<104,8>": "10", + "<104,9>": "SRP.Button.1", + "<104,10>": { + "<104,10,1>": "0x56000000", + "<104,10,2>": "0x0" + }, + "<104,11>": { + "<104,11,1>": "0x1000", + "<104,11,2>": "0x80000000" + }, + "<104,12>": "83", + "<104,13>": { + "<104,13,1>": "-2", + "<104,13,2>": "-2", + "<104,13,3>": "" + }, + "<104,14>": "0", + "<104,15>": { + "<104,15,1>": { + "<104,15,1,1>": "Segoe UI", + "<104,15,1,2>": "-12", + "<104,15,1,3>": "400", + "<104,15,1,4>": "0", + "<104,15,1,5>": "0", + "<104,15,1,6>": "0", + "<104,15,1,7>": "0", + "<104,15,1,8>": "34", + "<104,15,1,9>": "0", + "<104,15,1,10>": "3", + "<104,15,1,11>": "2", + "<104,15,1,12>": "1", + "<104,15,1,13>": "0", + "<104,15,1,14>": "0" + } + }, + "<104,16>": "", + "<104,17>": "", + "<104,18>": { + "<104,18,1>": { + "<104,18,1,1>": "R", + "<104,18,1,2>": "EXECUTE", + "<104,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<104,18,1,4>": { + "<104,18,1,4,1>": "@SELF", + "<104,18,1,4,2>": "@EVENT", + "<104,18,1,4,3>": "@PARAM1", + "<104,18,1,4,4>": "@PARAM2", + "<104,18,1,4,5>": "@PARAM3", + "<104,18,1,4,6>": "@PARAM4", + "<104,18,1,4,7>": "@PARAM5", + "<104,18,1,4,8>": "@PARAM6" + }, + "<104,18,1,5>": "", + "<104,18,1,6>": "", + "<104,18,1,7>": "", + "<104,18,1,8>": "", + "<104,18,1,9>": "", + "<104,18,1,10>": "", + "<104,18,1,11>": "", + "<104,18,1,12>": "", + "<104,18,1,13>": "", + "<104,18,1,14>": "", + "<104,18,1,15>": "STPROC" + } + }, + "<104,19>": "OLE", + "<104,20>": "", + "<104,21>": "", + "<104,22>": "", + "<104,23>": "", + "<104,24>": "", + "<104,25>": "", + "<104,26>": "", + "<104,27>": "", + "<104,28>": "", + "<104,29>": "", + "<104,30>": "", + "<104,31>": "", + "<104,32>": "", + "<104,33>": "", + "<104,34>": "", + "<104,35>": "", + "<104,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF012D0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003200FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF105300740061006E006400610072006400200054006F006F006C00620061007200FFFEFF00FFFEFF044100750074006F00000000000000000000000000", + "<104,37>": "", + "<104,38>": "", + "<104,39>": "", + "<104,40>": "", + "<104,41>": "", + "<104,42>": "", + "<104,43>": "", + "<104,44>": "", + "<104,45>": "", + "<104,46>": "", + "<104,47>": "", + "<104,48>": "", + "<104,49>": "", + "<104,50>": "", + "<104,51>": "", + "<104,52>": "", + "<104,53>": "", + "<104,54>": "", + "<104,55>": { + "<104,55,1>": "OLE.ButtonType", + "<104,55,2>": "OLE.Cancel", + "<104,55,3>": "OLE.Caption", + "<104,55,4>": "OLE.Default", + "<104,55,5>": "OLE.FontBold", + "<104,55,6>": "OLE.FontItalic", + "<104,55,7>": "OLE.FontName", + "<104,55,8>": "OLE.FontSize", + "<104,55,9>": "OLE.FontUnderlined", + "<104,55,10>": "OLE.IconFrameCount", + "<104,55,11>": "OLE.IconHeight", + "<104,55,12>": "OLE.IconPath", + "<104,55,13>": "OLE.IconSizeToFit", + "<104,55,14>": "OLE.IconWidth", + "<104,55,15>": "OLE.State", + "<104,55,16>": "OLE.StatusBarText", + "<104,55,17>": "OLE.Style", + "<104,55,18>": "OLE.ToolTip", + "<104,55,19>": "OLE.TransparentColor" + }, + "<104,56>": { + "<104,56,1>": "Normal", + "<104,56,2>": "0", + "<104,56,3>": "-", + "<104,56,4>": "0", + "<104,56,5>": "0", + "<104,56,6>": "0", + "<104,56,7>": "Segoe UI", + "<104,56,8>": "9", + "<104,56,9>": "0", + "<104,56,10>": "1", + "<104,56,11>": "0", + "<104,56,12>": "", + "<104,56,13>": "0", + "<104,56,14>": "0", + "<104,56,15>": "0", + "<104,56,16>": "", + "<104,56,17>": "Standard Toolbar", + "<104,56,18>": "", + "<104,56,19>": "Auto" + }, + "<104,57>": "", + "<104,58>": "", + "<104,59>": "", + "<104,60>": "", + "<104,61>": "", + "<104,62>": "", + "<104,63>": "", + "<104,64>": "", + "<104,65>": "", + "<104,66>": "", + "<104,67>": "", + "<104,68>": "", + "<104,69>": "", + "<104,70>": "", + "<104,71>": "", + "<104,72>": "", + "<104,73>": "", + "<104,74>": "", + "<104,75>": "", + "<104,76>": "", + "<104,77>": "", + "<104,78>": "", + "<104,79>": "", + "<104,80>": "", + "<104,81>": "", + "<104,82>": "", + "<104,83>": "", + "<104,84>": "", + "<104,85>": "", + "<104,86>": "", + "<104,87>": "", + "<104,88>": "", + "<104,89>": "", + "<104,90>": "", + "<104,91>": "", + "<104,92>": "", + "<104,93>": "", + "<104,94>": "", + "<104,95>": "", + "<104,96>": "", + "<104,97>": "", + "<104,98>": "", + "<104,99>": "", + "<104,100>": "", + "<104,101>": "", + "<104,102>": "", + "<104,103>": "", + "<104,104>": "", + "<104,105>": "", + "<104,106>": "", + "<104,107>": "", + "<104,108>": "" + } + }, + "record4": { + "<1>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS.json b/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS.json new file mode 100644 index 0000000..b32d633 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS.json @@ -0,0 +1,3203 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "16", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_HTTP_LOGS", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "237", + "<1,6>": "122", + "<1,7>": "-1521", + "<1,8>": "-757", + "<1,9>": "HTTP Logs", + "<1,10>": { + "<1,10,1>": "0x84CF0000", + "<1,10,2>": "0x100" + }, + "<1,11>": { + "<1,11,1>": "0xC000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "", + "<1,13>": { + "<1,13,1>": "-2", + "<1,13,2>": "-2", + "<1,13,3>": "" + }, + "<1,14>": "", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "", + "<1,18,1,7>": "", + "<1,18,1,8>": "", + "<1,18,1,9>": "", + "<1,18,1,10>": "", + "<1,18,1,11>": "", + "<1,18,1,12>": "", + "<1,18,1,13>": "", + "<1,18,1,14>": "", + "<1,18,1,15>": "STPROC" + } + }, + "<1,19>": "CREATE", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "", + "<1,24,6>": "0", + "<1,24,7>": "", + "<1,24,8>": "", + "<1,24,9>": "", + "<1,24,10>": "0", + "<1,24,11>": "0", + "<1,24,12>": "0", + "<1,24,13>": "0", + "<1,24,14>": "0", + "<1,24,15>": "0", + "<1,24,16>": "0", + "<1,24,17>": "0" + }, + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "FRAMEWORKS*IMAGE*ICO*SRP", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0X10001", + "<1,37,2>": "0X10001" + }, + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": { + "<1,62,1>": "0", + "<1,62,2>": "", + "<1,62,3>": "", + "<1,62,4>": "0", + "<1,62,5>": "0", + "<1,62,6>": "0", + "<1,62,7>": "", + "<1,62,8>": "0.50", + "<1,62,9>": "5.00", + "<1,62,10>": "0.00" + }, + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "0", + "<1,107>": "", + "<1,108>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "EDL_SEARCH_TEXT", + "<1,2>": "", + "<1,3>": "EDITFIELD", + "<1,4>": "NDW_HTTP_LOGS", + "<1,5>": "229", + "<1,6>": "11", + "<1,7>": "-753", + "<1,8>": "23", + "<1,9>": "", + "<1,10>": { + "<1,10,1>": "0x56000080", + "<1,10,2>": "0x200" + }, + "<1,11>": { + "<1,11,1>": "0x4004", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "1", + "<1,13>": { + "<1,13,1>": "-2", + "<1,13,2>": "-2", + "<1,13,3>": "" + }, + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Segoe UI", + "<1,15,1,2>": "-12", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "", + "<1,18,1,7>": "", + "<1,18,1,8>": "", + "<1,18,1,9>": "", + "<1,18,1,10>": "", + "<1,18,1,11>": "", + "<1,18,1,12>": "", + "<1,18,1,13>": "", + "<1,18,1,14>": "", + "<1,18,1,15>": "STPROC" + } + }, + "<1,19>": "LOSTFOCUS", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "<>", + "<1,31>": "0", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": { + "<1,36,1>": "0", + "<1,36,2>": "0" + }, + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": "0", + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "", + "<1,107>": "", + "<1,108>": "" + }, + "<2>": { + "<2,1>": "STA_FROM", + "<2,2>": "", + "<2,3>": "STATIC", + "<2,4>": "NDW_HTTP_LOGS", + "<2,5>": "-680", + "<2,6>": "14", + "<2,7>": "30", + "<2,8>": "17", + "<2,9>": "&From:", + "<2,10>": { + "<2,10,1>": "0x56000000", + "<2,10,2>": "0x0" + }, + "<2,11>": { + "<2,11,1>": "0x1000", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "15", + "<2,13>": { + "<2,13,1>": "-1", + "<2,13,2>": "-1", + "<2,13,3>": "" + }, + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Segoe UI", + "<2,15,1,2>": "-12", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": "", + "<2,19>": "", + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "", + "<2,26>": "", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "", + "<2,31>": "", + "<2,32>": "", + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": "", + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "", + "<2,53>": "", + "<2,54>": "", + "<2,55>": "", + "<2,56>": "", + "<2,57>": "", + "<2,58>": "", + "<2,59>": "", + "<2,60>": "", + "<2,61>": "", + "<2,62>": "0", + "<2,63>": { + "<2,63,1>": "", + "<2,63,2>": "", + "<2,63,3>": "", + "<2,63,4>": "", + "<2,63,5>": "", + "<2,63,6>": "", + "<2,63,7>": "", + "<2,63,8>": "" + }, + "<2,64>": { + "<2,64,1>": "", + "<2,64,2>": "", + "<2,64,3>": "" + }, + "<2,65>": "-2", + "<2,66>": "", + "<2,67>": "", + "<2,68>": "", + "<2,69>": "", + "<2,70>": "", + "<2,71>": "", + "<2,72>": "", + "<2,73>": "", + "<2,74>": "", + "<2,75>": "", + "<2,76>": "", + "<2,77>": "", + "<2,78>": "", + "<2,79>": "", + "<2,80>": "", + "<2,81>": "", + "<2,82>": "", + "<2,83>": "", + "<2,84>": "", + "<2,85>": "", + "<2,86>": "", + "<2,87>": "", + "<2,88>": "", + "<2,89>": "", + "<2,90>": "0", + "<2,91>": "0", + "<2,92>": "", + "<2,93>": "", + "<2,94>": "", + "<2,95>": "", + "<2,96>": "", + "<2,97>": "", + "<2,98>": "", + "<2,99>": "", + "<2,100>": "", + "<2,101>": "", + "<2,102>": "", + "<2,103>": "", + "<2,104>": "", + "<2,105>": "", + "<2,106>": "", + "<2,107>": "", + "<2,108>": "" + }, + "<3>": { + "<3,1>": "EDL_START_DATE", + "<3,2>": "", + "<3,3>": "EDITFIELD", + "<3,4>": "NDW_HTTP_LOGS", + "<3,5>": "-643", + "<3,6>": "11", + "<3,7>": "109", + "<3,8>": "23", + "<3,9>": "", + "<3,10>": { + "<3,10,1>": "0x56000081", + "<3,10,2>": "0x200" + }, + "<3,11>": { + "<3,11,1>": "0x1000", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "2", + "<3,13>": { + "<3,13,1>": "-2", + "<3,13,2>": "-2", + "<3,13,3>": "" + }, + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Segoe UI", + "<3,15,1,2>": "-12", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": { + "<3,18,1>": { + "<3,18,1,1>": "R", + "<3,18,1,2>": "EXECUTE", + "<3,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<3,18,1,4>": { + "<3,18,1,4,1>": "@SELF", + "<3,18,1,4,2>": "@EVENT", + "<3,18,1,4,3>": "@PARAM1", + "<3,18,1,4,4>": "@PARAM2", + "<3,18,1,4,5>": "@PARAM3", + "<3,18,1,4,6>": "@PARAM4", + "<3,18,1,4,7>": "@PARAM5", + "<3,18,1,4,8>": "@PARAM6" + }, + "<3,18,1,5>": "", + "<3,18,1,6>": "", + "<3,18,1,7>": "", + "<3,18,1,8>": "", + "<3,18,1,9>": "", + "<3,18,1,10>": "", + "<3,18,1,11>": "", + "<3,18,1,12>": "", + "<3,18,1,13>": "", + "<3,18,1,14>": "", + "<3,18,1,15>": "STPROC" + }, + "<3,18,2>": { + "<3,18,2,1>": "R", + "<3,18,2,2>": "EXECUTE", + "<3,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<3,18,2,4>": { + "<3,18,2,4,1>": "@SELF", + "<3,18,2,4,2>": "@EVENT", + "<3,18,2,4,3>": "@PARAM1", + "<3,18,2,4,4>": "@PARAM2", + "<3,18,2,4,5>": "@PARAM3", + "<3,18,2,4,6>": "@PARAM4", + "<3,18,2,4,7>": "@PARAM5", + "<3,18,2,4,8>": "@PARAM6" + }, + "<3,18,2,5>": "", + "<3,18,2,6>": "", + "<3,18,2,7>": "", + "<3,18,2,8>": "", + "<3,18,2,9>": "", + "<3,18,2,10>": "", + "<3,18,2,11>": "", + "<3,18,2,12>": "", + "<3,18,2,13>": "", + "<3,18,2,14>": "", + "<3,18,2,15>": "STPROC" + } + }, + "<3,19>": { + "<3,19,1>": "OPTIONS", + "<3,19,2>": "LOSTFOCUS" + }, + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "", + "<3,26>": "", + "<3,27>": "", + "<3,28>": { + "<3,28,1>": { + "<3,28,1,1>": { + "<3,28,1,1,1>": "(D)", + "<3,28,1,1,2>": "(DJS-)" + } + } + }, + "<3,29>": "DJS-", + "<3,30>": "<>", + "<3,31>": "0", + "<3,32>": "", + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": { + "<3,36,1>": "0", + "<3,36,2>": "0" + }, + "<3,37>": "", + "<3,38>": "", + "<3,39>": "", + "<3,40>": "", + "<3,41>": "", + "<3,42>": "", + "<3,43>": "", + "<3,44>": "", + "<3,45>": "", + "<3,46>": "", + "<3,47>": "", + "<3,48>": "", + "<3,49>": "", + "<3,50>": "", + "<3,51>": "", + "<3,52>": "", + "<3,53>": "", + "<3,54>": "", + "<3,55>": "", + "<3,56>": "", + "<3,57>": "", + "<3,58>": "", + "<3,59>": "", + "<3,60>": "", + "<3,61>": "", + "<3,62>": "0", + "<3,63>": "", + "<3,64>": "", + "<3,65>": "", + "<3,66>": "", + "<3,67>": "", + "<3,68>": "", + "<3,69>": "", + "<3,70>": "", + "<3,71>": "", + "<3,72>": "", + "<3,73>": "", + "<3,74>": "", + "<3,75>": "", + "<3,76>": "", + "<3,77>": "", + "<3,78>": "", + "<3,79>": "", + "<3,80>": "", + "<3,81>": "", + "<3,82>": "", + "<3,83>": "", + "<3,84>": "", + "<3,85>": "", + "<3,86>": "", + "<3,87>": "", + "<3,88>": "", + "<3,89>": "", + "<3,90>": "", + "<3,91>": "", + "<3,92>": "", + "<3,93>": "", + "<3,94>": "", + "<3,95>": "", + "<3,96>": "", + "<3,97>": "", + "<3,98>": "", + "<3,99>": "", + "<3,100>": "", + "<3,101>": "", + "<3,102>": "", + "<3,103>": "", + "<3,104>": "", + "<3,105>": "", + "<3,106>": "", + "<3,107>": "", + "<3,108>": "" + }, + "<4>": { + "<4,1>": "EDL_START_TIME", + "<4,2>": "", + "<4,3>": "EDITFIELD", + "<4,4>": "NDW_HTTP_LOGS", + "<4,5>": "-528", + "<4,6>": "11", + "<4,7>": "110", + "<4,8>": "23", + "<4,9>": "", + "<4,10>": { + "<4,10,1>": "0x56000081", + "<4,10,2>": "0x200" + }, + "<4,11>": { + "<4,11,1>": "0x1000", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "3", + "<4,13>": { + "<4,13,1>": "-2", + "<4,13,2>": "-2", + "<4,13,3>": "" + }, + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Segoe UI", + "<4,15,1,2>": "-12", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "R", + "<4,18,1,2>": "EXECUTE", + "<4,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<4,18,1,4>": { + "<4,18,1,4,1>": "@SELF", + "<4,18,1,4,2>": "@EVENT", + "<4,18,1,4,3>": "@PARAM1", + "<4,18,1,4,4>": "@PARAM2", + "<4,18,1,4,5>": "@PARAM3", + "<4,18,1,4,6>": "@PARAM4", + "<4,18,1,4,7>": "@PARAM5", + "<4,18,1,4,8>": "@PARAM6" + }, + "<4,18,1,5>": "", + "<4,18,1,6>": "", + "<4,18,1,7>": "", + "<4,18,1,8>": "", + "<4,18,1,9>": "", + "<4,18,1,10>": "", + "<4,18,1,11>": "", + "<4,18,1,12>": "", + "<4,18,1,13>": "", + "<4,18,1,14>": "", + "<4,18,1,15>": "STPROC" + } + }, + "<4,19>": "LOSTFOCUS", + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "", + "<4,26>": "", + "<4,27>": "", + "<4,28>": "(MT)", + "<4,29>": "MTHS", + "<4,30>": "<>", + "<4,31>": "0", + "<4,32>": "", + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": { + "<4,36,1>": "0", + "<4,36,2>": "0" + }, + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "", + "<4,41>": "", + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "", + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": "", + "<4,61>": "", + "<4,62>": "0", + "<4,63>": "", + "<4,64>": "", + "<4,65>": "", + "<4,66>": "", + "<4,67>": "", + "<4,68>": "", + "<4,69>": "", + "<4,70>": "", + "<4,71>": "", + "<4,72>": "", + "<4,73>": "", + "<4,74>": "", + "<4,75>": "", + "<4,76>": "", + "<4,77>": "", + "<4,78>": "", + "<4,79>": "", + "<4,80>": "", + "<4,81>": "", + "<4,82>": "", + "<4,83>": "", + "<4,84>": "", + "<4,85>": "", + "<4,86>": "", + "<4,87>": "", + "<4,88>": "", + "<4,89>": "", + "<4,90>": "", + "<4,91>": "", + "<4,92>": "", + "<4,93>": "", + "<4,94>": "", + "<4,95>": "", + "<4,96>": "", + "<4,97>": "", + "<4,98>": "", + "<4,99>": "", + "<4,100>": "", + "<4,101>": "", + "<4,102>": "", + "<4,103>": "", + "<4,104>": "", + "<4,105>": "", + "<4,106>": "", + "<4,107>": "", + "<4,108>": "" + }, + "<5>": { + "<5,1>": "STA_TO", + "<5,2>": "", + "<5,3>": "STATIC", + "<5,4>": "NDW_HTTP_LOGS", + "<5,5>": "-404", + "<5,6>": "14", + "<5,7>": "20", + "<5,8>": "17", + "<5,9>": "&To:", + "<5,10>": { + "<5,10,1>": "0x56000000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0x1000", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "16", + "<5,13>": { + "<5,13,1>": "-1", + "<5,13,2>": "-1", + "<5,13,3>": "" + }, + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Segoe UI", + "<5,15,1,2>": "-12", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": "", + "<5,19>": "", + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "", + "<5,26>": "", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "", + "<5,31>": "", + "<5,32>": "", + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "", + "<5,56>": "", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "", + "<5,61>": "", + "<5,62>": "0", + "<5,63>": { + "<5,63,1>": "", + "<5,63,2>": "", + "<5,63,3>": "", + "<5,63,4>": "", + "<5,63,5>": "", + "<5,63,6>": "", + "<5,63,7>": "", + "<5,63,8>": "" + }, + "<5,64>": { + "<5,64,1>": "", + "<5,64,2>": "", + "<5,64,3>": "" + }, + "<5,65>": "-2", + "<5,66>": "", + "<5,67>": "", + "<5,68>": "", + "<5,69>": "", + "<5,70>": "", + "<5,71>": "", + "<5,72>": "", + "<5,73>": "", + "<5,74>": "", + "<5,75>": "", + "<5,76>": "", + "<5,77>": "", + "<5,78>": "", + "<5,79>": "", + "<5,80>": "", + "<5,81>": "", + "<5,82>": "", + "<5,83>": "", + "<5,84>": "", + "<5,85>": "", + "<5,86>": "", + "<5,87>": "", + "<5,88>": "", + "<5,89>": "", + "<5,90>": "0", + "<5,91>": "0", + "<5,92>": "", + "<5,93>": "", + "<5,94>": "", + "<5,95>": "", + "<5,96>": "", + "<5,97>": "", + "<5,98>": "", + "<5,99>": "", + "<5,100>": "", + "<5,101>": "", + "<5,102>": "", + "<5,103>": "", + "<5,104>": "", + "<5,105>": "", + "<5,106>": "", + "<5,107>": "", + "<5,108>": "" + }, + "<6>": { + "<6,1>": "EDL_END_DATE", + "<6,2>": "", + "<6,3>": "EDITFIELD", + "<6,4>": "NDW_HTTP_LOGS", + "<6,5>": "-382", + "<6,6>": "11", + "<6,7>": "109", + "<6,8>": "23", + "<6,9>": "", + "<6,10>": { + "<6,10,1>": "0x56000081", + "<6,10,2>": "0x200" + }, + "<6,11>": { + "<6,11,1>": "0x1000", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "4", + "<6,13>": { + "<6,13,1>": "-2", + "<6,13,2>": "-2", + "<6,13,3>": "" + }, + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Segoe UI", + "<6,15,1,2>": "-12", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": { + "<6,18,1>": { + "<6,18,1,1>": "R", + "<6,18,1,2>": "EXECUTE", + "<6,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<6,18,1,4>": { + "<6,18,1,4,1>": "@SELF", + "<6,18,1,4,2>": "@EVENT", + "<6,18,1,4,3>": "@PARAM1", + "<6,18,1,4,4>": "@PARAM2", + "<6,18,1,4,5>": "@PARAM3", + "<6,18,1,4,6>": "@PARAM4", + "<6,18,1,4,7>": "@PARAM5", + "<6,18,1,4,8>": "@PARAM6" + }, + "<6,18,1,5>": "", + "<6,18,1,6>": "", + "<6,18,1,7>": "", + "<6,18,1,8>": "", + "<6,18,1,9>": "", + "<6,18,1,10>": "", + "<6,18,1,11>": "", + "<6,18,1,12>": "", + "<6,18,1,13>": "", + "<6,18,1,14>": "", + "<6,18,1,15>": "STPROC" + }, + "<6,18,2>": { + "<6,18,2,1>": "R", + "<6,18,2,2>": "EXECUTE", + "<6,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<6,18,2,4>": { + "<6,18,2,4,1>": "@SELF", + "<6,18,2,4,2>": "@EVENT", + "<6,18,2,4,3>": "@PARAM1", + "<6,18,2,4,4>": "@PARAM2", + "<6,18,2,4,5>": "@PARAM3", + "<6,18,2,4,6>": "@PARAM4", + "<6,18,2,4,7>": "@PARAM5", + "<6,18,2,4,8>": "@PARAM6" + }, + "<6,18,2,5>": "", + "<6,18,2,6>": "", + "<6,18,2,7>": "", + "<6,18,2,8>": "", + "<6,18,2,9>": "", + "<6,18,2,10>": "", + "<6,18,2,11>": "", + "<6,18,2,12>": "", + "<6,18,2,13>": "", + "<6,18,2,14>": "", + "<6,18,2,15>": "STPROC" + } + }, + "<6,19>": { + "<6,19,1>": "OPTIONS", + "<6,19,2>": "LOSTFOCUS" + }, + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "", + "<6,26>": "", + "<6,27>": "", + "<6,28>": { + "<6,28,1>": { + "<6,28,1,1>": { + "<6,28,1,1,1>": "(D)", + "<6,28,1,1,2>": "(DJS-)" + } + } + }, + "<6,29>": "DJS-", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": "", + "<6,33>": "", + "<6,34>": "", + "<6,35>": "", + "<6,36>": { + "<6,36,1>": "0", + "<6,36,2>": "0" + }, + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": "", + "<6,56>": "", + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "", + "<6,61>": "", + "<6,62>": "0", + "<6,63>": "", + "<6,64>": "", + "<6,65>": "", + "<6,66>": "", + "<6,67>": "", + "<6,68>": "", + "<6,69>": "", + "<6,70>": "", + "<6,71>": "", + "<6,72>": "", + "<6,73>": "", + "<6,74>": "", + "<6,75>": "", + "<6,76>": "", + "<6,77>": "", + "<6,78>": "", + "<6,79>": "", + "<6,80>": "", + "<6,81>": "", + "<6,82>": "", + "<6,83>": "", + "<6,84>": "", + "<6,85>": "", + "<6,86>": "", + "<6,87>": "", + "<6,88>": "", + "<6,89>": "", + "<6,90>": "", + "<6,91>": "", + "<6,92>": "", + "<6,93>": "", + "<6,94>": "", + "<6,95>": "", + "<6,96>": "", + "<6,97>": "", + "<6,98>": "", + "<6,99>": "", + "<6,100>": "", + "<6,101>": "", + "<6,102>": "", + "<6,103>": "", + "<6,104>": "", + "<6,105>": "", + "<6,106>": "", + "<6,107>": "", + "<6,108>": "" + }, + "<7>": { + "<7,1>": "EDL_END_TIME", + "<7,2>": "", + "<7,3>": "EDITFIELD", + "<7,4>": "NDW_HTTP_LOGS", + "<7,5>": "-266", + "<7,6>": "11", + "<7,7>": "110", + "<7,8>": "23", + "<7,9>": "", + "<7,10>": { + "<7,10,1>": "0x56000081", + "<7,10,2>": "0x200" + }, + "<7,11>": { + "<7,11,1>": "0x1000", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "5", + "<7,13>": { + "<7,13,1>": "-2", + "<7,13,2>": "-2", + "<7,13,3>": "" + }, + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Segoe UI", + "<7,15,1,2>": "-12", + "<7,15,1,3>": "400", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": { + "<7,18,1>": { + "<7,18,1,1>": "R", + "<7,18,1,2>": "EXECUTE", + "<7,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<7,18,1,4>": { + "<7,18,1,4,1>": "@SELF", + "<7,18,1,4,2>": "@EVENT", + "<7,18,1,4,3>": "@PARAM1", + "<7,18,1,4,4>": "@PARAM2", + "<7,18,1,4,5>": "@PARAM3", + "<7,18,1,4,6>": "@PARAM4", + "<7,18,1,4,7>": "@PARAM5", + "<7,18,1,4,8>": "@PARAM6" + }, + "<7,18,1,5>": "", + "<7,18,1,6>": "", + "<7,18,1,7>": "", + "<7,18,1,8>": "", + "<7,18,1,9>": "", + "<7,18,1,10>": "", + "<7,18,1,11>": "", + "<7,18,1,12>": "", + "<7,18,1,13>": "", + "<7,18,1,14>": "", + "<7,18,1,15>": "STPROC" + } + }, + "<7,19>": "LOSTFOCUS", + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "", + "<7,26>": "", + "<7,27>": "", + "<7,28>": "(MT)", + "<7,29>": "MTHS", + "<7,30>": "<>", + "<7,31>": "0", + "<7,32>": "", + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": { + "<7,36,1>": "0", + "<7,36,2>": "0" + }, + "<7,37>": "", + "<7,38>": "", + "<7,39>": "", + "<7,40>": "", + "<7,41>": "", + "<7,42>": "", + "<7,43>": "", + "<7,44>": "", + "<7,45>": "", + "<7,46>": "", + "<7,47>": "", + "<7,48>": "", + "<7,49>": "", + "<7,50>": "", + "<7,51>": "", + "<7,52>": "", + "<7,53>": "", + "<7,54>": "", + "<7,55>": "", + "<7,56>": "", + "<7,57>": "", + "<7,58>": "", + "<7,59>": "", + "<7,60>": "", + "<7,61>": "", + "<7,62>": "0", + "<7,63>": "", + "<7,64>": "", + "<7,65>": "", + "<7,66>": "", + "<7,67>": "", + "<7,68>": "", + "<7,69>": "", + "<7,70>": "", + "<7,71>": "", + "<7,72>": "", + "<7,73>": "", + "<7,74>": "", + "<7,75>": "", + "<7,76>": "", + "<7,77>": "", + "<7,78>": "", + "<7,79>": "", + "<7,80>": "", + "<7,81>": "", + "<7,82>": "", + "<7,83>": "", + "<7,84>": "", + "<7,85>": "", + "<7,86>": "", + "<7,87>": "", + "<7,88>": "", + "<7,89>": "", + "<7,90>": "", + "<7,91>": "", + "<7,92>": "", + "<7,93>": "", + "<7,94>": "", + "<7,95>": "", + "<7,96>": "", + "<7,97>": "", + "<7,98>": "", + "<7,99>": "", + "<7,100>": "", + "<7,101>": "", + "<7,102>": "", + "<7,103>": "", + "<7,104>": "", + "<7,105>": "", + "<7,106>": "", + "<7,107>": "", + "<7,108>": "" + }, + "<8>": { + "<8,1>": "OLE_RPT_LOGTABLE", + "<8,2>": "", + "<8,3>": "OLECONTROL.SRP.ReportTable.1", + "<8,4>": "NDW_HTTP_LOGS", + "<8,5>": "229", + "<8,6>": "46", + "<8,7>": "-11", + "<8,8>": "-11", + "<8,9>": "SRP.ReportTable.1", + "<8,10>": { + "<8,10,1>": "0x56000000", + "<8,10,2>": "0x0" + }, + "<8,11>": { + "<8,11,1>": "0xC000", + "<8,11,2>": "0x80000000" + }, + "<8,12>": "6", + "<8,13>": { + "<8,13,1>": "-2", + "<8,13,2>": "-2", + "<8,13,3>": "" + }, + "<8,14>": "0", + "<8,15>": { + "<8,15,1>": { + "<8,15,1,1>": "Segoe UI", + "<8,15,1,2>": "-12", + "<8,15,1,3>": "400", + "<8,15,1,4>": "0", + "<8,15,1,5>": "0", + "<8,15,1,6>": "0", + "<8,15,1,7>": "0", + "<8,15,1,8>": "34", + "<8,15,1,9>": "0", + "<8,15,1,10>": "3", + "<8,15,1,11>": "2", + "<8,15,1,12>": "1", + "<8,15,1,13>": "0", + "<8,15,1,14>": "0" + } + }, + "<8,16>": "", + "<8,17>": "", + "<8,18>": { + "<8,18,1>": { + "<8,18,1,1>": "R", + "<8,18,1,2>": "EXECUTE", + "<8,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<8,18,1,4>": { + "<8,18,1,4,1>": "@SELF", + "<8,18,1,4,2>": "@EVENT", + "<8,18,1,4,3>": "@PARAM1", + "<8,18,1,4,4>": "@PARAM2", + "<8,18,1,4,5>": "@PARAM3", + "<8,18,1,4,6>": "@PARAM4", + "<8,18,1,4,7>": "@PARAM5", + "<8,18,1,4,8>": "@PARAM6" + }, + "<8,18,1,5>": "", + "<8,18,1,6>": "", + "<8,18,1,7>": "", + "<8,18,1,8>": "", + "<8,18,1,9>": "", + "<8,18,1,10>": "", + "<8,18,1,11>": "", + "<8,18,1,12>": "", + "<8,18,1,13>": "", + "<8,18,1,14>": "", + "<8,18,1,15>": "STPROC" + } + }, + "<8,19>": "OLE", + "<8,20>": "", + "<8,21>": "", + "<8,22>": "", + "<8,23>": "", + "<8,24>": "", + "<8,25>": "", + "<8,26>": "", + "<8,27>": "", + "<8,28>": "", + "<8,29>": "", + "<8,30>": "", + "<8,31>": "", + "<8,32>": "", + "<8,33>": "", + "<8,34>": "", + "<8,35>": "", + "<8,36>": "00000100658400005948000000000000", + "<8,37>": "", + "<8,38>": "", + "<8,39>": "", + "<8,40>": "", + "<8,41>": "", + "<8,42>": "", + "<8,43>": "", + "<8,44>": "", + "<8,45>": "", + "<8,46>": "", + "<8,47>": "", + "<8,48>": "", + "<8,49>": "", + "<8,50>": "", + "<8,51>": "", + "<8,52>": "", + "<8,53>": "", + "<8,54>": "", + "<8,55>": "OLE.Border", + "<8,56>": "XP", + "<8,57>": "", + "<8,58>": "", + "<8,59>": "", + "<8,60>": "", + "<8,61>": "", + "<8,62>": "", + "<8,63>": "", + "<8,64>": "", + "<8,65>": "", + "<8,66>": "", + "<8,67>": "", + "<8,68>": "", + "<8,69>": "", + "<8,70>": "", + "<8,71>": "", + "<8,72>": "", + "<8,73>": "", + "<8,74>": "", + "<8,75>": "", + "<8,76>": "", + "<8,77>": "", + "<8,78>": "", + "<8,79>": "", + "<8,80>": "", + "<8,81>": "", + "<8,82>": "", + "<8,83>": "", + "<8,84>": "", + "<8,85>": "", + "<8,86>": "", + "<8,87>": "", + "<8,88>": "", + "<8,89>": "", + "<8,90>": "", + "<8,91>": "", + "<8,92>": "", + "<8,93>": "", + "<8,94>": "", + "<8,95>": "", + "<8,96>": "", + "<8,97>": "", + "<8,98>": "", + "<8,99>": "", + "<8,100>": "", + "<8,101>": "", + "<8,102>": "", + "<8,103>": "", + "<8,104>": "", + "<8,105>": "", + "<8,106>": "", + "<8,107>": "", + "<8,108>": "" + }, + "<9>": { + "<9,1>": "OLE_ACTION_BAR", + "<9,2>": "", + "<9,3>": "OLECONTROL.SRP.ShortcutBar.1", + "<9,4>": "NDW_HTTP_LOGS", + "<9,5>": "11", + "<9,6>": "11", + "<9,7>": "202", + "<9,8>": "-11", + "<9,9>": "SRP.ShortcutBar.1", + "<9,10>": { + "<9,10,1>": "0x56000000", + "<9,10,2>": "0x0" + }, + "<9,11>": { + "<9,11,1>": "0x18000", + "<9,11,2>": "0x80000000" + }, + "<9,12>": "7", + "<9,13>": { + "<9,13,1>": "16053492", + "<9,13,2>": "16053492", + "<9,13,3>": "" + }, + "<9,14>": "0", + "<9,15>": { + "<9,15,1>": { + "<9,15,1,1>": "Tahoma", + "<9,15,1,2>": "-11", + "<9,15,1,3>": "400", + "<9,15,1,4>": "0", + "<9,15,1,5>": "0", + "<9,15,1,6>": "0", + "<9,15,1,7>": "0", + "<9,15,1,8>": "34", + "<9,15,1,9>": "0", + "<9,15,1,10>": "3", + "<9,15,1,11>": "2", + "<9,15,1,12>": "1", + "<9,15,1,13>": "0", + "<9,15,1,14>": "0" + } + }, + "<9,16>": "", + "<9,17>": "", + "<9,18>": { + "<9,18,1>": { + "<9,18,1,1>": "R", + "<9,18,1,2>": "EXECUTE", + "<9,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<9,18,1,4>": { + "<9,18,1,4,1>": "@SELF", + "<9,18,1,4,2>": "@EVENT", + "<9,18,1,4,3>": "@PARAM1", + "<9,18,1,4,4>": "@PARAM2", + "<9,18,1,4,5>": "@PARAM3", + "<9,18,1,4,6>": "@PARAM4", + "<9,18,1,4,7>": "@PARAM5", + "<9,18,1,4,8>": "@PARAM6" + }, + "<9,18,1,5>": "", + "<9,18,1,6>": "", + "<9,18,1,7>": "", + "<9,18,1,8>": "", + "<9,18,1,9>": "", + "<9,18,1,10>": "", + "<9,18,1,11>": "", + "<9,18,1,12>": "", + "<9,18,1,13>": "", + "<9,18,1,14>": "", + "<9,18,1,15>": "STPROC" + } + }, + "<9,19>": "OLE", + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "", + "<9,26>": "", + "<9,27>": "", + "<9,28>": "", + "<9,29>": "", + "<9,30>": "", + "<9,31>": "", + "<9,32>": "", + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "020000000000000000000000FFFEFF054E006500760065007200FFFEFF084500780070006C006F00720065007200FFFEFF0758005000200046006C006100740001000000FFFEFF07440065006600610075006C007400FFFEFF07440065006600610075006C007400FFFEFF0E4F0066006600690063006500320030003000370042006C0075006500", + "<9,37>": "", + "<9,38>": "", + "<9,39>": "", + "<9,40>": "", + "<9,41>": "", + "<9,42>": "", + "<9,43>": "", + "<9,44>": "", + "<9,45>": "", + "<9,46>": "", + "<9,47>": "", + "<9,48>": "", + "<9,49>": "", + "<9,50>": "", + "<9,51>": "", + "<9,52>": "", + "<9,53>": "", + "<9,54>": "", + "<9,55>": { + "<9,55,1>": "OLE.AcceptFocus", + "<9,55,2>": "OLE.Animation", + "<9,55,3>": "OLE.Behavior", + "<9,55,4>": "OLE.Border", + "<9,55,5>": "OLE.GroupCount", + "<9,55,6>": "OLE.HotTrackStyle", + "<9,55,7>": "OLE.Layout", + "<9,55,8>": "OLE.Theme" + }, + "<9,56>": { + "<9,56,1>": "0", + "<9,56,2>": "Never", + "<9,56,3>": "Explorer", + "<9,56,4>": "XP Flat", + "<9,56,5>": "1", + "<9,56,6>": "Default", + "<9,56,7>": "Default", + "<9,56,8>": "Office2007Blue" + }, + "<9,57>": "", + "<9,58>": "", + "<9,59>": "", + "<9,60>": "", + "<9,61>": "", + "<9,62>": "", + "<9,63>": "", + "<9,64>": "", + "<9,65>": "", + "<9,66>": "", + "<9,67>": "", + "<9,68>": "", + "<9,69>": "", + "<9,70>": "", + "<9,71>": "", + "<9,72>": "", + "<9,73>": "", + "<9,74>": "", + "<9,75>": "", + "<9,76>": "", + "<9,77>": "", + "<9,78>": "", + "<9,79>": "", + "<9,80>": "", + "<9,81>": "", + "<9,82>": "", + "<9,83>": "", + "<9,84>": "", + "<9,85>": "", + "<9,86>": "", + "<9,87>": "", + "<9,88>": "", + "<9,89>": "", + "<9,90>": "", + "<9,91>": "", + "<9,92>": "", + "<9,93>": "", + "<9,94>": "", + "<9,95>": "", + "<9,96>": "", + "<9,97>": "", + "<9,98>": "", + "<9,99>": "", + "<9,100>": "", + "<9,101>": "", + "<9,102>": "", + "<9,103>": "", + "<9,104>": "", + "<9,105>": "", + "<9,106>": "", + "<9,107>": "", + "<9,108>": "" + }, + "<10>": { + "<10,1>": "OLE_SUBCLASS", + "<10,2>": "", + "<10,3>": "OLECONTROL.SRP.Subclass.1", + "<10,4>": "NDW_HTTP_LOGS", + "<10,5>": "90", + "<10,6>": "4", + "<10,7>": "114", + "<10,8>": "23", + "<10,9>": "SRP.Subclass.1", + "<10,10>": { + "<10,10,1>": "0x46000000", + "<10,10,2>": "0x0" + }, + "<10,11>": { + "<10,11,1>": "0x0", + "<10,11,2>": "0x80000000" + }, + "<10,12>": "8", + "<10,13>": { + "<10,13,1>": "-2", + "<10,13,2>": "-2", + "<10,13,3>": "" + }, + "<10,14>": "0", + "<10,15>": { + "<10,15,1>": { + "<10,15,1,1>": "Segoe UI", + "<10,15,1,2>": "-12", + "<10,15,1,3>": "400", + "<10,15,1,4>": "0", + "<10,15,1,5>": "0", + "<10,15,1,6>": "0", + "<10,15,1,7>": "0", + "<10,15,1,8>": "34", + "<10,15,1,9>": "0", + "<10,15,1,10>": "3", + "<10,15,1,11>": "2", + "<10,15,1,12>": "1", + "<10,15,1,13>": "0", + "<10,15,1,14>": "0" + } + }, + "<10,16>": "", + "<10,17>": "", + "<10,18>": { + "<10,18,1>": { + "<10,18,1,1>": "R", + "<10,18,1,2>": "EXECUTE", + "<10,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<10,18,1,4>": { + "<10,18,1,4,1>": "@SELF", + "<10,18,1,4,2>": "@EVENT", + "<10,18,1,4,3>": "@PARAM1", + "<10,18,1,4,4>": "@PARAM2", + "<10,18,1,4,5>": "@PARAM3", + "<10,18,1,4,6>": "@PARAM4", + "<10,18,1,4,7>": "@PARAM5", + "<10,18,1,4,8>": "@PARAM6" + }, + "<10,18,1,5>": "", + "<10,18,1,6>": "", + "<10,18,1,7>": "", + "<10,18,1,8>": "", + "<10,18,1,9>": "", + "<10,18,1,10>": "", + "<10,18,1,11>": "", + "<10,18,1,12>": "", + "<10,18,1,13>": "", + "<10,18,1,14>": "", + "<10,18,1,15>": "STPROC" + } + }, + "<10,19>": "OLE", + "<10,20>": "", + "<10,21>": "", + "<10,22>": "", + "<10,23>": "", + "<10,24>": "", + "<10,25>": "", + "<10,26>": "", + "<10,27>": "", + "<10,28>": "", + "<10,29>": "", + "<10,30>": "", + "<10,31>": "", + "<10,32>": "", + "<10,33>": "", + "<10,34>": "", + "<10,35>": "", + "<10,36>": "", + "<10,37>": "", + "<10,38>": "", + "<10,39>": "", + "<10,40>": "", + "<10,41>": "", + "<10,42>": "", + "<10,43>": "", + "<10,44>": "", + "<10,45>": "", + "<10,46>": "", + "<10,47>": "", + "<10,48>": "", + "<10,49>": "", + "<10,50>": "", + "<10,51>": "", + "<10,52>": "", + "<10,53>": "", + "<10,54>": "", + "<10,55>": "OLE.Border", + "<10,56>": "None", + "<10,57>": "", + "<10,58>": "", + "<10,59>": "", + "<10,60>": "", + "<10,61>": "", + "<10,62>": "", + "<10,63>": "", + "<10,64>": "", + "<10,65>": "", + "<10,66>": "", + "<10,67>": "", + "<10,68>": "", + "<10,69>": "", + "<10,70>": "", + "<10,71>": "", + "<10,72>": "", + "<10,73>": "", + "<10,74>": "", + "<10,75>": "", + "<10,76>": "", + "<10,77>": "", + "<10,78>": "", + "<10,79>": "", + "<10,80>": "", + "<10,81>": "", + "<10,82>": "", + "<10,83>": "", + "<10,84>": "", + "<10,85>": "", + "<10,86>": "", + "<10,87>": "", + "<10,88>": "", + "<10,89>": "", + "<10,90>": "", + "<10,91>": "", + "<10,92>": "", + "<10,93>": "", + "<10,94>": "", + "<10,95>": "", + "<10,96>": "", + "<10,97>": "", + "<10,98>": "", + "<10,99>": "", + "<10,100>": "", + "<10,101>": "", + "<10,102>": "", + "<10,103>": "", + "<10,104>": "", + "<10,105>": "", + "<10,106>": "", + "<10,107>": "", + "<10,108>": "" + }, + "<11>": { + "<11,1>": "EDL_LOG_COUNT", + "<11,2>": "", + "<11,3>": "EDITFIELD", + "<11,4>": "NDW_HTTP_LOGS", + "<11,5>": "-130", + "<11,6>": "11", + "<11,7>": "119", + "<11,8>": "23", + "<11,9>": "0 Logs Found", + "<11,10>": { + "<11,10,1>": "0x56000081", + "<11,10,2>": "0x200" + }, + "<11,11>": { + "<11,11,1>": "0x81000", + "<11,11,2>": "0x80000000" + }, + "<11,12>": "9", + "<11,13>": { + "<11,13,1>": "15724527", + "<11,13,2>": "15724527", + "<11,13,3>": "" + }, + "<11,14>": "8388608", + "<11,15>": { + "<11,15,1>": { + "<11,15,1,1>": "Segoe UI", + "<11,15,1,2>": "-12", + "<11,15,1,3>": "400", + "<11,15,1,4>": "0", + "<11,15,1,5>": "0", + "<11,15,1,6>": "0", + "<11,15,1,7>": "0", + "<11,15,1,8>": "34", + "<11,15,1,9>": "0", + "<11,15,1,10>": "3", + "<11,15,1,11>": "2", + "<11,15,1,12>": "1", + "<11,15,1,13>": "0", + "<11,15,1,14>": "0" + } + }, + "<11,16>": "", + "<11,17>": "", + "<11,18>": { + "<11,18,1>": { + "<11,18,1,1>": "R", + "<11,18,1,2>": "EXECUTE", + "<11,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<11,18,1,4>": { + "<11,18,1,4,1>": "@SELF", + "<11,18,1,4,2>": "@EVENT", + "<11,18,1,4,3>": "@PARAM1", + "<11,18,1,4,4>": "@PARAM2", + "<11,18,1,4,5>": "@PARAM3", + "<11,18,1,4,6>": "@PARAM4", + "<11,18,1,4,7>": "@PARAM5", + "<11,18,1,4,8>": "@PARAM6" + }, + "<11,18,1,5>": "", + "<11,18,1,6>": "", + "<11,18,1,7>": "", + "<11,18,1,8>": "", + "<11,18,1,9>": "", + "<11,18,1,10>": "", + "<11,18,1,11>": "", + "<11,18,1,12>": "", + "<11,18,1,13>": "", + "<11,18,1,14>": "", + "<11,18,1,15>": "STPROC" + } + }, + "<11,19>": "LOSTFOCUS", + "<11,20>": "", + "<11,21>": "", + "<11,22>": "", + "<11,23>": "", + "<11,24>": "", + "<11,25>": "", + "<11,26>": "", + "<11,27>": "", + "<11,28>": "<>", + "<11,29>": "<>", + "<11,30>": "<>", + "<11,31>": "0", + "<11,32>": "", + "<11,33>": "", + "<11,34>": "", + "<11,35>": "", + "<11,36>": { + "<11,36,1>": "0", + "<11,36,2>": "0" + }, + "<11,37>": "", + "<11,38>": "", + "<11,39>": "", + "<11,40>": "", + "<11,41>": "", + "<11,42>": "", + "<11,43>": "", + "<11,44>": "", + "<11,45>": "", + "<11,46>": "", + "<11,47>": "", + "<11,48>": "", + "<11,49>": "", + "<11,50>": "", + "<11,51>": "", + "<11,52>": "", + "<11,53>": "", + "<11,54>": "", + "<11,55>": "", + "<11,56>": "", + "<11,57>": "", + "<11,58>": "", + "<11,59>": "", + "<11,60>": "", + "<11,61>": "", + "<11,62>": "0", + "<11,63>": "", + "<11,64>": "", + "<11,65>": "", + "<11,66>": "", + "<11,67>": "", + "<11,68>": "", + "<11,69>": "", + "<11,70>": "", + "<11,71>": "", + "<11,72>": "", + "<11,73>": "", + "<11,74>": "", + "<11,75>": "", + "<11,76>": "", + "<11,77>": "", + "<11,78>": "", + "<11,79>": "", + "<11,80>": "", + "<11,81>": "", + "<11,82>": "", + "<11,83>": "", + "<11,84>": "", + "<11,85>": "", + "<11,86>": "", + "<11,87>": "", + "<11,88>": "", + "<11,89>": "", + "<11,90>": "", + "<11,91>": "", + "<11,92>": "", + "<11,93>": "", + "<11,94>": "", + "<11,95>": "", + "<11,96>": "", + "<11,97>": "", + "<11,98>": "", + "<11,99>": "", + "<11,100>": "", + "<11,101>": "", + "<11,102>": "", + "<11,103>": "", + "<11,104>": "", + "<11,105>": "", + "<11,106>": "", + "<11,107>": "", + "<11,108>": "" + }, + "<12>": { + "<12,1>": "OLE_PIC_VDIV_1", + "<12,2>": "", + "<12,3>": "OLECONTROL.SRP.Picture.1", + "<12,4>": "NDW_HTTP_LOGS", + "<12,5>": "-694", + "<12,6>": "11", + "<12,7>": "3", + "<12,8>": "23", + "<12,9>": "SRP.Picture.1", + "<12,10>": { + "<12,10,1>": "0x56000000", + "<12,10,2>": "0x0" + }, + "<12,11>": { + "<12,11,1>": "0x1000", + "<12,11,2>": "0x80000000" + }, + "<12,12>": "10", + "<12,13>": { + "<12,13,1>": "-2", + "<12,13,2>": "-2", + "<12,13,3>": "" + }, + "<12,14>": "0", + "<12,15>": { + "<12,15,1>": { + "<12,15,1,1>": "Segoe UI", + "<12,15,1,2>": "-12", + "<12,15,1,3>": "400", + "<12,15,1,4>": "0", + "<12,15,1,5>": "0", + "<12,15,1,6>": "0", + "<12,15,1,7>": "0", + "<12,15,1,8>": "34", + "<12,15,1,9>": "0", + "<12,15,1,10>": "3", + "<12,15,1,11>": "2", + "<12,15,1,12>": "1", + "<12,15,1,13>": "0", + "<12,15,1,14>": "0" + } + }, + "<12,16>": "", + "<12,17>": "", + "<12,18>": "", + "<12,19>": "", + "<12,20>": "", + "<12,21>": "", + "<12,22>": "", + "<12,23>": "", + "<12,24>": "", + "<12,25>": "", + "<12,26>": "", + "<12,27>": "", + "<12,28>": "", + "<12,29>": "", + "<12,30>": "", + "<12,31>": "", + "<12,32>": "", + "<12,33>": "", + "<12,34>": "", + "<12,35>": "", + "<12,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF1056006500720074006900630061006C00200044006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<12,37>": "", + "<12,38>": "", + "<12,39>": "", + "<12,40>": "", + "<12,41>": "", + "<12,42>": "", + "<12,43>": "", + "<12,44>": "", + "<12,45>": "", + "<12,46>": "", + "<12,47>": "", + "<12,48>": "", + "<12,49>": "", + "<12,50>": "", + "<12,51>": "", + "<12,52>": "", + "<12,53>": "", + "<12,54>": "", + "<12,55>": { + "<12,55,1>": "OLE.Animated", + "<12,55,2>": "OLE.AnimationDelay", + "<12,55,3>": "OLE.AutoLoadDropFile", + "<12,55,4>": "OLE.BackgroundColor", + "<12,55,5>": "OLE.BorderAlignment", + "<12,55,6>": "OLE.BorderType", + "<12,55,7>": "OLE.Caption", + "<12,55,8>": "OLE.CaptionColor", + "<12,55,9>": "OLE.CaptionHorzAlign", + "<12,55,10>": "OLE.CaptionHorzOffset", + "<12,55,11>": "OLE.CaptionVertAlign", + "<12,55,12>": "OLE.CaptionVertOffset", + "<12,55,13>": "OLE.ControlPart", + "<12,55,14>": "OLE.FontBold", + "<12,55,15>": "OLE.FontItalic", + "<12,55,16>": "OLE.FontName", + "<12,55,17>": "OLE.FontSize", + "<12,55,18>": "OLE.FontUnderlined", + "<12,55,19>": "OLE.Frame", + "<12,55,20>": "OLE.FrameCount", + "<12,55,21>": "OLE.HorzAlign", + "<12,55,22>": "OLE.Image", + "<12,55,23>": "OLE.ImageHorzOffset", + "<12,55,24>": "OLE.ImageVertOffset", + "<12,55,25>": "OLE.Layout", + "<12,55,26>": "OLE.ResizeUsingGDIPlus", + "<12,55,27>": "OLE.TransparentColor", + "<12,55,28>": "OLE.VertAlign", + "<12,55,29>": "OLE.Zoom" + }, + "<12,56>": { + "<12,56,1>": "0", + "<12,56,2>": "50", + "<12,56,3>": "0", + "<12,56,4>": "None", + "<12,56,5>": "All", + "<12,56,6>": "None", + "<12,56,7>": "", + "<12,56,8>": "None", + "<12,56,9>": "Center", + "<12,56,10>": "0", + "<12,56,11>": "Center", + "<12,56,12>": "0", + "<12,56,13>": "Vertical Divider", + "<12,56,14>": "0", + "<12,56,15>": "0", + "<12,56,16>": "Segoe UI", + "<12,56,17>": "8", + "<12,56,18>": "0", + "<12,56,19>": "1", + "<12,56,20>": "1", + "<12,56,21>": "Center", + "<12,56,22>": "", + "<12,56,23>": "0", + "<12,56,24>": "0", + "<12,56,25>": "Clip", + "<12,56,26>": "1", + "<12,56,27>": "Auto", + "<12,56,28>": "Center", + "<12,56,29>": "1" + }, + "<12,57>": "", + "<12,58>": "", + "<12,59>": "", + "<12,60>": "", + "<12,61>": "", + "<12,62>": "", + "<12,63>": "", + "<12,64>": "", + "<12,65>": "", + "<12,66>": "", + "<12,67>": "", + "<12,68>": "", + "<12,69>": "", + "<12,70>": "", + "<12,71>": "", + "<12,72>": "", + "<12,73>": "", + "<12,74>": "", + "<12,75>": "", + "<12,76>": "", + "<12,77>": "", + "<12,78>": "", + "<12,79>": "", + "<12,80>": "", + "<12,81>": "", + "<12,82>": "", + "<12,83>": "", + "<12,84>": "", + "<12,85>": "", + "<12,86>": "", + "<12,87>": "", + "<12,88>": "", + "<12,89>": "", + "<12,90>": "", + "<12,91>": "", + "<12,92>": "", + "<12,93>": "", + "<12,94>": "", + "<12,95>": "", + "<12,96>": "", + "<12,97>": "", + "<12,98>": "", + "<12,99>": "", + "<12,100>": "", + "<12,101>": "", + "<12,102>": "", + "<12,103>": "", + "<12,104>": "", + "<12,105>": "", + "<12,106>": "", + "<12,107>": "", + "<12,108>": "" + }, + "<13>": { + "<13,1>": "OLE_PIC_VDIV_2", + "<13,2>": "", + "<13,3>": "OLECONTROL.SRP.Picture.1", + "<13,4>": "NDW_HTTP_LOGS", + "<13,5>": "-144", + "<13,6>": "11", + "<13,7>": "3", + "<13,8>": "23", + "<13,9>": "SRP.Picture.1", + "<13,10>": { + "<13,10,1>": "0x56000000", + "<13,10,2>": "0x0" + }, + "<13,11>": { + "<13,11,1>": "0x1000", + "<13,11,2>": "0x80000000" + }, + "<13,12>": "11", + "<13,13>": { + "<13,13,1>": "-2", + "<13,13,2>": "-2", + "<13,13,3>": "" + }, + "<13,14>": "0", + "<13,15>": { + "<13,15,1>": { + "<13,15,1,1>": "Segoe UI", + "<13,15,1,2>": "-12", + "<13,15,1,3>": "400", + "<13,15,1,4>": "0", + "<13,15,1,5>": "0", + "<13,15,1,6>": "0", + "<13,15,1,7>": "0", + "<13,15,1,8>": "34", + "<13,15,1,9>": "0", + "<13,15,1,10>": "3", + "<13,15,1,11>": "2", + "<13,15,1,12>": "1", + "<13,15,1,13>": "0", + "<13,15,1,14>": "0" + } + }, + "<13,16>": "", + "<13,17>": "", + "<13,18>": "", + "<13,19>": "", + "<13,20>": "", + "<13,21>": "", + "<13,22>": "", + "<13,23>": "", + "<13,24>": "", + "<13,25>": "", + "<13,26>": "", + "<13,27>": "", + "<13,28>": "", + "<13,29>": "", + "<13,30>": "", + "<13,31>": "", + "<13,32>": "", + "<13,33>": "", + "<13,34>": "", + "<13,35>": "", + "<13,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF1056006500720074006900630061006C00200044006900760069006400650072000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03500000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<13,37>": "", + "<13,38>": "", + "<13,39>": "", + "<13,40>": "", + "<13,41>": "", + "<13,42>": "", + "<13,43>": "", + "<13,44>": "", + "<13,45>": "", + "<13,46>": "", + "<13,47>": "", + "<13,48>": "", + "<13,49>": "", + "<13,50>": "", + "<13,51>": "", + "<13,52>": "", + "<13,53>": "", + "<13,54>": "", + "<13,55>": { + "<13,55,1>": "OLE.Animated", + "<13,55,2>": "OLE.AnimationDelay", + "<13,55,3>": "OLE.AutoLoadDropFile", + "<13,55,4>": "OLE.BackgroundColor", + "<13,55,5>": "OLE.BorderAlignment", + "<13,55,6>": "OLE.BorderType", + "<13,55,7>": "OLE.Caption", + "<13,55,8>": "OLE.CaptionColor", + "<13,55,9>": "OLE.CaptionHorzAlign", + "<13,55,10>": "OLE.CaptionHorzOffset", + "<13,55,11>": "OLE.CaptionVertAlign", + "<13,55,12>": "OLE.CaptionVertOffset", + "<13,55,13>": "OLE.ControlPart", + "<13,55,14>": "OLE.FontBold", + "<13,55,15>": "OLE.FontItalic", + "<13,55,16>": "OLE.FontName", + "<13,55,17>": "OLE.FontSize", + "<13,55,18>": "OLE.FontUnderlined", + "<13,55,19>": "OLE.Frame", + "<13,55,20>": "OLE.FrameCount", + "<13,55,21>": "OLE.HorzAlign", + "<13,55,22>": "OLE.Image", + "<13,55,23>": "OLE.ImageHorzOffset", + "<13,55,24>": "OLE.ImageVertOffset", + "<13,55,25>": "OLE.Layout", + "<13,55,26>": "OLE.ResizeUsingGDIPlus", + "<13,55,27>": "OLE.TransparentColor", + "<13,55,28>": "OLE.VertAlign", + "<13,55,29>": "OLE.Zoom" + }, + "<13,56>": { + "<13,56,1>": "0", + "<13,56,2>": "50", + "<13,56,3>": "0", + "<13,56,4>": "None", + "<13,56,5>": "All", + "<13,56,6>": "None", + "<13,56,7>": "", + "<13,56,8>": "None", + "<13,56,9>": "Center", + "<13,56,10>": "0", + "<13,56,11>": "Center", + "<13,56,12>": "0", + "<13,56,13>": "Vertical Divider", + "<13,56,14>": "0", + "<13,56,15>": "0", + "<13,56,16>": "Segoe UI", + "<13,56,17>": "8", + "<13,56,18>": "0", + "<13,56,19>": "1", + "<13,56,20>": "1", + "<13,56,21>": "Center", + "<13,56,22>": "", + "<13,56,23>": "0", + "<13,56,24>": "0", + "<13,56,25>": "Clip", + "<13,56,26>": "1", + "<13,56,27>": "Auto", + "<13,56,28>": "Center", + "<13,56,29>": "1" + }, + "<13,57>": "", + "<13,58>": "", + "<13,59>": "", + "<13,60>": "", + "<13,61>": "", + "<13,62>": "", + "<13,63>": "", + "<13,64>": "", + "<13,65>": "", + "<13,66>": "", + "<13,67>": "", + "<13,68>": "", + "<13,69>": "", + "<13,70>": "", + "<13,71>": "", + "<13,72>": "", + "<13,73>": "", + "<13,74>": "", + "<13,75>": "", + "<13,76>": "", + "<13,77>": "", + "<13,78>": "", + "<13,79>": "", + "<13,80>": "", + "<13,81>": "", + "<13,82>": "", + "<13,83>": "", + "<13,84>": "", + "<13,85>": "", + "<13,86>": "", + "<13,87>": "", + "<13,88>": "", + "<13,89>": "", + "<13,90>": "", + "<13,91>": "", + "<13,92>": "", + "<13,93>": "", + "<13,94>": "", + "<13,95>": "", + "<13,96>": "", + "<13,97>": "", + "<13,98>": "", + "<13,99>": "", + "<13,100>": "", + "<13,101>": "", + "<13,102>": "", + "<13,103>": "", + "<13,104>": "", + "<13,105>": "", + "<13,106>": "", + "<13,107>": "", + "<13,108>": "" + }, + "<14>": { + "<14,1>": "OLE_PUB_FIND_NEXT", + "<14,2>": "", + "<14,3>": "OLECONTROL.SRP.Button.1", + "<14,4>": "NDW_HTTP_LOGS", + "<14,5>": "-730", + "<14,6>": "11", + "<14,7>": "23", + "<14,8>": "23", + "<14,9>": "SRP.Button.1", + "<14,10>": { + "<14,10,1>": "0x56000000", + "<14,10,2>": "0x0" + }, + "<14,11>": { + "<14,11,1>": "0x1000", + "<14,11,2>": "0x80000000" + }, + "<14,12>": "12", + "<14,13>": { + "<14,13,1>": "-2", + "<14,13,2>": "-2", + "<14,13,3>": "" + }, + "<14,14>": "0", + "<14,15>": { + "<14,15,1>": { + "<14,15,1,1>": "Segoe UI", + "<14,15,1,2>": "-12", + "<14,15,1,3>": "400", + "<14,15,1,4>": "0", + "<14,15,1,5>": "0", + "<14,15,1,6>": "0", + "<14,15,1,7>": "0", + "<14,15,1,8>": "34", + "<14,15,1,9>": "0", + "<14,15,1,10>": "3", + "<14,15,1,11>": "2", + "<14,15,1,12>": "1", + "<14,15,1,13>": "0", + "<14,15,1,14>": "0" + } + }, + "<14,16>": "", + "<14,17>": "", + "<14,18>": { + "<14,18,1>": { + "<14,18,1,1>": "R", + "<14,18,1,2>": "EXECUTE", + "<14,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<14,18,1,4>": { + "<14,18,1,4,1>": "@SELF", + "<14,18,1,4,2>": "@EVENT", + "<14,18,1,4,3>": "@PARAM1", + "<14,18,1,4,4>": "@PARAM2", + "<14,18,1,4,5>": "@PARAM3", + "<14,18,1,4,6>": "@PARAM4", + "<14,18,1,4,7>": "@PARAM5", + "<14,18,1,4,8>": "@PARAM6" + }, + "<14,18,1,5>": "", + "<14,18,1,6>": "", + "<14,18,1,7>": "", + "<14,18,1,8>": "", + "<14,18,1,9>": "", + "<14,18,1,10>": "", + "<14,18,1,11>": "", + "<14,18,1,12>": "", + "<14,18,1,13>": "", + "<14,18,1,14>": "", + "<14,18,1,15>": "STPROC" + } + }, + "<14,19>": "OLE", + "<14,20>": "", + "<14,21>": "", + "<14,22>": "", + "<14,23>": "", + "<14,24>": "", + "<14,25>": "", + "<14,26>": "", + "<14,27>": "", + "<14,28>": "", + "<14,29>": "", + "<14,30>": "", + "<14,31>": "", + "<14,32>": "", + "<14,33>": "", + "<14,34>": "", + "<14,35>": "", + "<14,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF013E0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF0D5300740061006E006400610072006400200046006C0061007400FFFEFF0E460069006E00640020004E0065007800740020002800460033002900FFFEFF044100750074006F00000000000000000000000000", + "<14,37>": "", + "<14,38>": "", + "<14,39>": "", + "<14,40>": "", + "<14,41>": "", + "<14,42>": "", + "<14,43>": "", + "<14,44>": "", + "<14,45>": "", + "<14,46>": "", + "<14,47>": "", + "<14,48>": "", + "<14,49>": "", + "<14,50>": "", + "<14,51>": "", + "<14,52>": "", + "<14,53>": "", + "<14,54>": "", + "<14,55>": { + "<14,55,1>": "OLE.ButtonType", + "<14,55,2>": "OLE.Cancel", + "<14,55,3>": "OLE.Caption", + "<14,55,4>": "OLE.Default", + "<14,55,5>": "OLE.FontBold", + "<14,55,6>": "OLE.FontItalic", + "<14,55,7>": "OLE.FontName", + "<14,55,8>": "OLE.FontSize", + "<14,55,9>": "OLE.FontUnderlined", + "<14,55,10>": "OLE.IconFrameCount", + "<14,55,11>": "OLE.IconHeight", + "<14,55,12>": "OLE.IconPath", + "<14,55,13>": "OLE.IconSizeToFit", + "<14,55,14>": "OLE.IconWidth", + "<14,55,15>": "OLE.State", + "<14,55,16>": "OLE.StatusBarText", + "<14,55,17>": "OLE.Style", + "<14,55,18>": "OLE.ToolTip", + "<14,55,19>": "OLE.TransparentColor" + }, + "<14,56>": { + "<14,56,1>": "Normal", + "<14,56,2>": "0", + "<14,56,3>": ">", + "<14,56,4>": "0", + "<14,56,5>": "0", + "<14,56,6>": "0", + "<14,56,7>": "Segoe UI", + "<14,56,8>": "8", + "<14,56,9>": "0", + "<14,56,10>": "1", + "<14,56,11>": "0", + "<14,56,12>": "", + "<14,56,13>": "0", + "<14,56,14>": "0", + "<14,56,15>": "0", + "<14,56,16>": "", + "<14,56,17>": "Standard Flat", + "<14,56,18>": "Find Next (F3)", + "<14,56,19>": "Auto" + }, + "<14,57>": "", + "<14,58>": "", + "<14,59>": "", + "<14,60>": "", + "<14,61>": "", + "<14,62>": "", + "<14,63>": "", + "<14,64>": "", + "<14,65>": "", + "<14,66>": "", + "<14,67>": "", + "<14,68>": "", + "<14,69>": "", + "<14,70>": "", + "<14,71>": "", + "<14,72>": "", + "<14,73>": "", + "<14,74>": "", + "<14,75>": "", + "<14,76>": "", + "<14,77>": "", + "<14,78>": "", + "<14,79>": "", + "<14,80>": "", + "<14,81>": "", + "<14,82>": "", + "<14,83>": "", + "<14,84>": "", + "<14,85>": "", + "<14,86>": "", + "<14,87>": "", + "<14,88>": "", + "<14,89>": "", + "<14,90>": "", + "<14,91>": "", + "<14,92>": "", + "<14,93>": "", + "<14,94>": "", + "<14,95>": "", + "<14,96>": "", + "<14,97>": "", + "<14,98>": "", + "<14,99>": "", + "<14,100>": "", + "<14,101>": "", + "<14,102>": "", + "<14,103>": "", + "<14,104>": "", + "<14,105>": "", + "<14,106>": "", + "<14,107>": "", + "<14,108>": "" + }, + "<15>": { + "<15,1>": "OLE_PUB_FIND_PREVIOUS", + "<15,2>": "", + "<15,3>": "OLECONTROL.SRP.Button.1", + "<15,4>": "NDW_HTTP_LOGS", + "<15,5>": "-753", + "<15,6>": "11", + "<15,7>": "23", + "<15,8>": "23", + "<15,9>": "SRP.Button.1", + "<15,10>": { + "<15,10,1>": "0x56000000", + "<15,10,2>": "0x0" + }, + "<15,11>": { + "<15,11,1>": "0x1000", + "<15,11,2>": "0x80000000" + }, + "<15,12>": "13", + "<15,13>": { + "<15,13,1>": "-2", + "<15,13,2>": "-2", + "<15,13,3>": "" + }, + "<15,14>": "0", + "<15,15>": { + "<15,15,1>": { + "<15,15,1,1>": "Segoe UI", + "<15,15,1,2>": "-12", + "<15,15,1,3>": "400", + "<15,15,1,4>": "0", + "<15,15,1,5>": "0", + "<15,15,1,6>": "0", + "<15,15,1,7>": "0", + "<15,15,1,8>": "34", + "<15,15,1,9>": "0", + "<15,15,1,10>": "3", + "<15,15,1,11>": "2", + "<15,15,1,12>": "1", + "<15,15,1,13>": "0", + "<15,15,1,14>": "0" + } + }, + "<15,16>": "", + "<15,17>": "", + "<15,18>": { + "<15,18,1>": { + "<15,18,1,1>": "R", + "<15,18,1,2>": "EXECUTE", + "<15,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<15,18,1,4>": { + "<15,18,1,4,1>": "@SELF", + "<15,18,1,4,2>": "@EVENT", + "<15,18,1,4,3>": "@PARAM1", + "<15,18,1,4,4>": "@PARAM2", + "<15,18,1,4,5>": "@PARAM3", + "<15,18,1,4,6>": "@PARAM4", + "<15,18,1,4,7>": "@PARAM5", + "<15,18,1,4,8>": "@PARAM6" + }, + "<15,18,1,5>": "", + "<15,18,1,6>": "", + "<15,18,1,7>": "", + "<15,18,1,8>": "", + "<15,18,1,9>": "", + "<15,18,1,10>": "", + "<15,18,1,11>": "", + "<15,18,1,12>": "", + "<15,18,1,13>": "", + "<15,18,1,14>": "", + "<15,18,1,15>": "STPROC" + } + }, + "<15,19>": "OLE", + "<15,20>": "", + "<15,21>": "", + "<15,22>": "", + "<15,23>": "", + "<15,24>": "", + "<15,25>": "", + "<15,26>": "", + "<15,27>": "", + "<15,28>": "", + "<15,29>": "", + "<15,30>": "", + "<15,31>": "", + "<15,32>": "", + "<15,33>": "", + "<15,34>": "", + "<15,35>": "", + "<15,36>": "0300000000000000FFFEFF064E006F0072006D0061006C0000000000FFFEFF013C0000000000FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000FFFEFF02FEF0310000000000FFFEFF00FFFEFF0D5300740061006E006400610072006400200046006C0061007400FFFEFF12460069006E0064002000500072006500760069006F007500730020002800460034002900FFFEFF044100750074006F00000000000000000000000000", + "<15,37>": "", + "<15,38>": "", + "<15,39>": "", + "<15,40>": "", + "<15,41>": "", + "<15,42>": "", + "<15,43>": "", + "<15,44>": "", + "<15,45>": "", + "<15,46>": "", + "<15,47>": "", + "<15,48>": "", + "<15,49>": "", + "<15,50>": "", + "<15,51>": "", + "<15,52>": "", + "<15,53>": "", + "<15,54>": "", + "<15,55>": { + "<15,55,1>": "OLE.ButtonType", + "<15,55,2>": "OLE.Cancel", + "<15,55,3>": "OLE.Caption", + "<15,55,4>": "OLE.Default", + "<15,55,5>": "OLE.FontBold", + "<15,55,6>": "OLE.FontItalic", + "<15,55,7>": "OLE.FontName", + "<15,55,8>": "OLE.FontSize", + "<15,55,9>": "OLE.FontUnderlined", + "<15,55,10>": "OLE.IconFrameCount", + "<15,55,11>": "OLE.IconHeight", + "<15,55,12>": "OLE.IconPath", + "<15,55,13>": "OLE.IconSizeToFit", + "<15,55,14>": "OLE.IconWidth", + "<15,55,15>": "OLE.State", + "<15,55,16>": "OLE.StatusBarText", + "<15,55,17>": "OLE.Style", + "<15,55,18>": "OLE.ToolTip", + "<15,55,19>": "OLE.TransparentColor" + }, + "<15,56>": { + "<15,56,1>": "Normal", + "<15,56,2>": "0", + "<15,56,3>": "<", + "<15,56,4>": "0", + "<15,56,5>": "0", + "<15,56,6>": "0", + "<15,56,7>": "Segoe UI", + "<15,56,8>": "8", + "<15,56,9>": "0", + "<15,56,10>": "1", + "<15,56,11>": "0", + "<15,56,12>": "", + "<15,56,13>": "0", + "<15,56,14>": "0", + "<15,56,15>": "0", + "<15,56,16>": "", + "<15,56,17>": "Standard Flat", + "<15,56,18>": "Find Previous (F4)", + "<15,56,19>": "Auto" + }, + "<15,57>": "", + "<15,58>": "", + "<15,59>": "", + "<15,60>": "", + "<15,61>": "", + "<15,62>": "", + "<15,63>": "", + "<15,64>": "", + "<15,65>": "", + "<15,66>": "", + "<15,67>": "", + "<15,68>": "", + "<15,69>": "", + "<15,70>": "", + "<15,71>": "", + "<15,72>": "", + "<15,73>": "", + "<15,74>": "", + "<15,75>": "", + "<15,76>": "", + "<15,77>": "", + "<15,78>": "", + "<15,79>": "", + "<15,80>": "", + "<15,81>": "", + "<15,82>": "", + "<15,83>": "", + "<15,84>": "", + "<15,85>": "", + "<15,86>": "", + "<15,87>": "", + "<15,88>": "", + "<15,89>": "", + "<15,90>": "", + "<15,91>": "", + "<15,92>": "", + "<15,93>": "", + "<15,94>": "", + "<15,95>": "", + "<15,96>": "", + "<15,97>": "", + "<15,98>": "", + "<15,99>": "", + "<15,100>": "", + "<15,101>": "", + "<15,102>": "", + "<15,103>": "", + "<15,104>": "", + "<15,105>": "", + "<15,106>": "", + "<15,107>": "", + "<15,108>": "" + }, + "<16>": { + "<16,1>": "OLE_PIC_MESSAGE", + "<16,2>": "", + "<16,3>": "OLECONTROL.SRP.Picture.1", + "<16,4>": "NDW_HTTP_LOGS", + "<16,5>": "229", + "<16,6>": "46", + "<16,7>": "-11", + "<16,8>": "-11", + "<16,9>": "SRP.Picture.1", + "<16,10>": { + "<16,10,1>": "0x46000000", + "<16,10,2>": "0x0" + }, + "<16,11>": { + "<16,11,1>": "0xC000", + "<16,11,2>": "0x80000000" + }, + "<16,12>": "14", + "<16,13>": { + "<16,13,1>": "-2", + "<16,13,2>": "-2", + "<16,13,3>": "" + }, + "<16,14>": "0", + "<16,15>": { + "<16,15,1>": { + "<16,15,1,1>": "Tahoma", + "<16,15,1,2>": "-11", + "<16,15,1,3>": "400", + "<16,15,1,4>": "0", + "<16,15,1,5>": "0", + "<16,15,1,6>": "0", + "<16,15,1,7>": "0", + "<16,15,1,8>": "34", + "<16,15,1,9>": "0", + "<16,15,1,10>": "3", + "<16,15,1,11>": "2", + "<16,15,1,12>": "1", + "<16,15,1,13>": "0", + "<16,15,1,14>": "0" + } + }, + "<16,16>": "", + "<16,17>": "", + "<16,18>": "", + "<16,19>": "", + "<16,20>": "", + "<16,21>": "", + "<16,22>": "", + "<16,23>": "", + "<16,24>": "", + "<16,25>": "", + "<16,26>": "", + "<16,27>": "", + "<16,28>": "", + "<16,29>": "", + "<16,30>": "", + "<16,31>": "", + "<16,32>": "", + "<16,33>": "", + "<16,34>": "", + "<16,35>": "", + "<16,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF044E006F006E0065000100000001000000FFFEFF0D430065006E00740065007200FEF0430065006E00740065007200FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF00FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E007400650072000000000000000000000000000000000001000000", + "<16,37>": "", + "<16,38>": "", + "<16,39>": "", + "<16,40>": "", + "<16,41>": "", + "<16,42>": "", + "<16,43>": "", + "<16,44>": "", + "<16,45>": "", + "<16,46>": "", + "<16,47>": "", + "<16,48>": "", + "<16,49>": "", + "<16,50>": "", + "<16,51>": "", + "<16,52>": "", + "<16,53>": "", + "<16,54>": "", + "<16,55>": { + "<16,55,1>": "OLE.Animated", + "<16,55,2>": "OLE.AnimationDelay", + "<16,55,3>": "OLE.AutoLoadDropFile", + "<16,55,4>": "OLE.BackgroundColor", + "<16,55,5>": "OLE.BorderAlignment", + "<16,55,6>": "OLE.BorderType", + "<16,55,7>": "OLE.Caption", + "<16,55,8>": "OLE.CaptionColor", + "<16,55,9>": "OLE.CaptionHorzAlign", + "<16,55,10>": "OLE.CaptionHorzOffset", + "<16,55,11>": "OLE.CaptionVertAlign", + "<16,55,12>": "OLE.CaptionVertOffset", + "<16,55,13>": "OLE.ControlPart", + "<16,55,14>": "OLE.FontBold", + "<16,55,15>": "OLE.FontItalic", + "<16,55,16>": "OLE.FontName", + "<16,55,17>": "OLE.FontSize", + "<16,55,18>": "OLE.FontUnderlined", + "<16,55,19>": "OLE.Frame", + "<16,55,20>": "OLE.FrameCount", + "<16,55,21>": "OLE.HorzAlign", + "<16,55,22>": "OLE.Image", + "<16,55,23>": "OLE.ImageHorzOffset", + "<16,55,24>": "OLE.ImageVertOffset", + "<16,55,25>": "OLE.Layout", + "<16,55,26>": "OLE.ResizeUsingGDIPlus", + "<16,55,27>": "OLE.TransparentColor", + "<16,55,28>": "OLE.VertAlign", + "<16,55,29>": "OLE.Zoom" + }, + "<16,56>": { + "<16,56,1>": "0", + "<16,56,2>": "50", + "<16,56,3>": "0", + "<16,56,4>": "None", + "<16,56,5>": "All", + "<16,56,6>": "None", + "<16,56,7>": "", + "<16,56,8>": "None", + "<16,56,9>": "Center", + "<16,56,10>": "0", + "<16,56,11>": "Center", + "<16,56,12>": "0", + "<16,56,13>": "None", + "<16,56,14>": "0", + "<16,56,15>": "0", + "<16,56,16>": "Segoe UI", + "<16,56,17>": "8", + "<16,56,18>": "0", + "<16,56,19>": "1", + "<16,56,20>": "1", + "<16,56,21>": "Center", + "<16,56,22>": "", + "<16,56,23>": "0", + "<16,56,24>": "0", + "<16,56,25>": "Clip", + "<16,56,26>": "1", + "<16,56,27>": "Auto", + "<16,56,28>": "Center", + "<16,56,29>": "1" + }, + "<16,57>": "", + "<16,58>": "", + "<16,59>": "", + "<16,60>": "", + "<16,61>": "", + "<16,62>": "", + "<16,63>": "", + "<16,64>": "", + "<16,65>": "", + "<16,66>": "", + "<16,67>": "", + "<16,68>": "", + "<16,69>": "", + "<16,70>": "", + "<16,71>": "", + "<16,72>": "", + "<16,73>": "", + "<16,74>": "", + "<16,75>": "", + "<16,76>": "", + "<16,77>": "", + "<16,78>": "", + "<16,79>": "", + "<16,80>": "", + "<16,81>": "", + "<16,82>": "", + "<16,83>": "", + "<16,84>": "", + "<16,85>": "", + "<16,86>": "", + "<16,87>": "", + "<16,88>": "", + "<16,89>": "", + "<16,90>": "", + "<16,91>": "", + "<16,92>": "", + "<16,93>": "", + "<16,94>": "", + "<16,95>": "", + "<16,96>": "", + "<16,97>": "", + "<16,98>": "", + "<16,99>": "", + "<16,100>": "", + "<16,101>": "", + "<16,102>": "", + "<16,103>": "", + "<16,104>": "", + "<16,105>": "", + "<16,106>": "", + "<16,107>": "", + "<16,108>": "" + } + }, + "record4": { + "<1>": { + "<1,1>": { + "<1,1,1>": "MENU", + "<1,1,2>": "3", + "<1,1,3>": "", + "<1,1,4>": "", + "<1,1,5>": "0", + "<1,1,6>": "0", + "<1,1,7>": "0", + "<1,1,8>": "0", + "<1,1,9>": "4", + "<1,1,10>": "", + "<1,1,11>": "0", + "<1,1,12>": "" + }, + "<1,2>": { + "<1,2,1>": "ITEM", + "<1,2,2>": "", + "<1,2,3>": "", + "<1,2,4>": "Filter Text\tCtrl+F", + "<1,2,5>": "0", + "<1,2,6>": "0", + "<1,2,7>": "1", + "<1,2,8>": "582", + "<1,2,9>": "", + "<1,2,10>": "", + "<1,2,11>": "0", + "<1,2,12>": "" + }, + "<1,3>": { + "<1,3,1>": "ITEM", + "<1,3,2>": "", + "<1,3,3>": "", + "<1,3,4>": "Find Next\tF3", + "<1,3,5>": "0", + "<1,3,6>": "0", + "<1,3,7>": "1", + "<1,3,8>": "114", + "<1,3,9>": "", + "<1,3,10>": "", + "<1,3,11>": "0", + "<1,3,12>": "" + }, + "<1,4>": { + "<1,4,1>": "ITEM", + "<1,4,2>": "", + "<1,4,3>": "", + "<1,4,4>": "Find Previous\tF4", + "<1,4,5>": "0", + "<1,4,6>": "0", + "<1,4,7>": "1", + "<1,4,8>": "115", + "<1,4,9>": "", + "<1,4,10>": "", + "<1,4,11>": "0", + "<1,4,12>": "" + } + }, + "<2>": { + "<2,1>": "", + "<2,2>": { + "<2,2,1>": { + "<2,2,1,1>": "R", + "<2,2,1,2>": "EXECUTE", + "<2,2,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,2,1,4>": { + "<2,2,1,4,1>": "@SELF", + "<2,2,1,4,2>": "@EVENT", + "<2,2,1,4,3>": "@PARAM1", + "<2,2,1,4,4>": "@PARAM2", + "<2,2,1,4,5>": "@PARAM3", + "<2,2,1,4,6>": "@PARAM4", + "<2,2,1,4,7>": "@PARAM5", + "<2,2,1,4,8>": "@PARAM6" + }, + "<2,2,1,5>": "", + "<2,2,1,6>": "" + }, + "<2,2,2>": { + "<2,2,2,1>": "R", + "<2,2,2,2>": "EXECUTE", + "<2,2,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,2,2,4>": { + "<2,2,2,4,1>": "@SELF", + "<2,2,2,4,2>": "@EVENT", + "<2,2,2,4,3>": "@PARAM1", + "<2,2,2,4,4>": "@PARAM2", + "<2,2,2,4,5>": "@PARAM3", + "<2,2,2,4,6>": "@PARAM4", + "<2,2,2,4,7>": "@PARAM5", + "<2,2,2,4,8>": "@PARAM6" + }, + "<2,2,2,5>": "", + "<2,2,2,6>": "" + }, + "<2,2,3>": { + "<2,2,3,1>": "R", + "<2,2,3,2>": "EXECUTE", + "<2,2,3,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,2,3,4>": { + "<2,2,3,4,1>": "@SELF", + "<2,2,3,4,2>": "@EVENT", + "<2,2,3,4,3>": "@PARAM1", + "<2,2,3,4,4>": "@PARAM2", + "<2,2,3,4,5>": "@PARAM3", + "<2,2,3,4,6>": "@PARAM4", + "<2,2,3,4,7>": "@PARAM5", + "<2,2,3,4,8>": "@PARAM6" + }, + "<2,2,3,5>": "", + "<2,2,3,6>": "" + }, + "<2,2,4>": "" + }, + "<2,3>": { + "<2,3,1>": "FILTER_TEXT", + "<2,3,2>": "FIND_NEXT", + "<2,3,3>": "FIND_PREVIOUS", + "<2,3,4>": "" + }, + "<2,4>": "0" + } + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS_ARCHIVE_DATE.json b/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS_ARCHIVE_DATE.json new file mode 100644 index 0000000..6f4d412 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_HTTP_LOGS_ARCHIVE_DATE.json @@ -0,0 +1,1246 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "6", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "318", + "<1,6>": "170", + "<1,7>": "-176", + "<1,8>": "-95", + "<1,9>": "HTTP Logs", + "<1,10>": { + "<1,10,1>": "0x84C80000", + "<1,10,2>": "0x101" + }, + "<1,11>": { + "<1,11,1>": "0xC000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "", + "<1,13>": { + "<1,13,1>": "-2", + "<1,13,2>": "-2", + "<1,13,3>": "" + }, + "<1,14>": "", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "", + "<1,18,1,7>": "", + "<1,18,1,8>": "", + "<1,18,1,9>": "", + "<1,18,1,10>": "", + "<1,18,1,11>": "", + "<1,18,1,12>": "", + "<1,18,1,13>": "", + "<1,18,1,14>": "", + "<1,18,1,15>": "STPROC" + } + }, + "<1,19>": "CREATE", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "", + "<1,24,6>": "0", + "<1,24,7>": "", + "<1,24,8>": "", + "<1,24,9>": "", + "<1,24,10>": "0", + "<1,24,11>": "0", + "<1,24,12>": "0", + "<1,24,13>": "0", + "<1,24,14>": "0", + "<1,24,15>": "0", + "<1,24,16>": "0", + "<1,24,17>": "0" + }, + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "FRAMEWORKS*IMAGE*ICO*SRP", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0X10001", + "<1,37,2>": "0X10001" + }, + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": { + "<1,62,1>": "0", + "<1,62,2>": "", + "<1,62,3>": "", + "<1,62,4>": "0", + "<1,62,5>": "0", + "<1,62,6>": "0", + "<1,62,7>": "", + "<1,62,8>": "0.50", + "<1,62,9>": "5.00", + "<1,62,10>": "0.00" + }, + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "0", + "<1,107>": "", + "<1,108>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "STA_DATE", + "<1,2>": "", + "<1,3>": "STATIC", + "<1,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<1,5>": "19", + "<1,6>": "36", + "<1,7>": "30", + "<1,8>": "17", + "<1,9>": "&Date:", + "<1,10>": { + "<1,10,1>": "0x56000000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x0", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "6", + "<1,13>": { + "<1,13,1>": "-1", + "<1,13,2>": "-1", + "<1,13,3>": "" + }, + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Segoe UI", + "<1,15,1,2>": "-12", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": "0", + "<1,63>": { + "<1,63,1>": "", + "<1,63,2>": "", + "<1,63,3>": "", + "<1,63,4>": "", + "<1,63,5>": "", + "<1,63,6>": "", + "<1,63,7>": "", + "<1,63,8>": "" + }, + "<1,64>": { + "<1,64,1>": "", + "<1,64,2>": "", + "<1,64,3>": "" + }, + "<1,65>": "-2", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "0", + "<1,91>": "0", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "", + "<1,107>": "", + "<1,108>": "" + }, + "<2>": { + "<2,1>": "EDL_DATE", + "<2,2>": "", + "<2,3>": "EDITFIELD", + "<2,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<2,5>": "56", + "<2,6>": "33", + "<2,7>": "109", + "<2,8>": "23", + "<2,9>": "", + "<2,10>": { + "<2,10,1>": "0x56000081", + "<2,10,2>": "0x200" + }, + "<2,11>": { + "<2,11,1>": "0x4", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "1", + "<2,13>": { + "<2,13,1>": "-2", + "<2,13,2>": "-2", + "<2,13,3>": "" + }, + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Segoe UI", + "<2,15,1,2>": "-12", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": { + "<2,18,1>": { + "<2,18,1,1>": "R", + "<2,18,1,2>": "EXECUTE", + "<2,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,1,4>": { + "<2,18,1,4,1>": "@SELF", + "<2,18,1,4,2>": "@EVENT", + "<2,18,1,4,3>": "@PARAM1", + "<2,18,1,4,4>": "@PARAM2", + "<2,18,1,4,5>": "@PARAM3", + "<2,18,1,4,6>": "@PARAM4", + "<2,18,1,4,7>": "@PARAM5", + "<2,18,1,4,8>": "@PARAM6" + }, + "<2,18,1,5>": "", + "<2,18,1,6>": "", + "<2,18,1,7>": "", + "<2,18,1,8>": "", + "<2,18,1,9>": "", + "<2,18,1,10>": "", + "<2,18,1,11>": "", + "<2,18,1,12>": "", + "<2,18,1,13>": "", + "<2,18,1,14>": "", + "<2,18,1,15>": "STPROC" + }, + "<2,18,2>": { + "<2,18,2,1>": "R", + "<2,18,2,2>": "EXECUTE", + "<2,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,2,4>": { + "<2,18,2,4,1>": "@SELF", + "<2,18,2,4,2>": "@EVENT", + "<2,18,2,4,3>": "@PARAM1", + "<2,18,2,4,4>": "@PARAM2", + "<2,18,2,4,5>": "@PARAM3", + "<2,18,2,4,6>": "@PARAM4", + "<2,18,2,4,7>": "@PARAM5", + "<2,18,2,4,8>": "@PARAM6" + }, + "<2,18,2,5>": "", + "<2,18,2,6>": "", + "<2,18,2,7>": "", + "<2,18,2,8>": "", + "<2,18,2,9>": "", + "<2,18,2,10>": "", + "<2,18,2,11>": "", + "<2,18,2,12>": "", + "<2,18,2,13>": "", + "<2,18,2,14>": "", + "<2,18,2,15>": "STPROC" + } + }, + "<2,19>": { + "<2,19,1>": "OPTIONS", + "<2,19,2>": "LOSTFOCUS" + }, + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "", + "<2,26>": "", + "<2,27>": "", + "<2,28>": { + "<2,28,1>": { + "<2,28,1,1>": { + "<2,28,1,1,1>": "(D)", + "<2,28,1,1,2>": "(DJS-)" + } + } + }, + "<2,29>": "DJS-", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": "", + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": { + "<2,36,1>": "0", + "<2,36,2>": "0" + }, + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "", + "<2,53>": "", + "<2,54>": "", + "<2,55>": "", + "<2,56>": "", + "<2,57>": "", + "<2,58>": "", + "<2,59>": "", + "<2,60>": "", + "<2,61>": "", + "<2,62>": "0", + "<2,63>": "", + "<2,64>": "", + "<2,65>": "", + "<2,66>": "", + "<2,67>": "", + "<2,68>": "", + "<2,69>": "", + "<2,70>": "", + "<2,71>": "", + "<2,72>": "", + "<2,73>": "", + "<2,74>": "", + "<2,75>": "", + "<2,76>": "", + "<2,77>": "", + "<2,78>": "", + "<2,79>": "", + "<2,80>": "", + "<2,81>": "", + "<2,82>": "", + "<2,83>": "", + "<2,84>": "", + "<2,85>": "", + "<2,86>": "", + "<2,87>": "", + "<2,88>": "", + "<2,89>": "", + "<2,90>": "", + "<2,91>": "", + "<2,92>": "", + "<2,93>": "", + "<2,94>": "", + "<2,95>": "", + "<2,96>": "", + "<2,97>": "", + "<2,98>": "", + "<2,99>": "", + "<2,100>": "", + "<2,101>": "", + "<2,102>": "", + "<2,103>": "", + "<2,104>": "", + "<2,105>": "", + "<2,106>": "", + "<2,107>": "", + "<2,108>": "" + }, + "<3>": { + "<3,1>": "PUB_OK", + "<3,2>": "", + "<3,3>": "PUSHBUTTON", + "<3,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<3,5>": "-165", + "<3,6>": "-29", + "<3,7>": "75", + "<3,8>": "23", + "<3,9>": "&OK", + "<3,10>": { + "<3,10,1>": "0x56002300", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0x13000", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "2", + "<3,13>": { + "<3,13,1>": "16053492", + "<3,13,2>": "16053492", + "<3,13,3>": "0" + }, + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Segoe UI", + "<3,15,1,2>": "-11", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": { + "<3,18,1>": { + "<3,18,1,1>": "R", + "<3,18,1,2>": "EXECUTE", + "<3,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<3,18,1,4>": { + "<3,18,1,4,1>": "@SELF", + "<3,18,1,4,2>": "@EVENT", + "<3,18,1,4,3>": "@PARAM1", + "<3,18,1,4,4>": "@PARAM2", + "<3,18,1,4,5>": "@PARAM3", + "<3,18,1,4,6>": "@PARAM4", + "<3,18,1,4,7>": "@PARAM5", + "<3,18,1,4,8>": "@PARAM6" + }, + "<3,18,1,5>": "", + "<3,18,1,6>": "", + "<3,18,1,7>": "", + "<3,18,1,8>": "", + "<3,18,1,9>": "", + "<3,18,1,10>": "", + "<3,18,1,11>": "", + "<3,18,1,12>": "", + "<3,18,1,13>": "", + "<3,18,1,14>": "", + "<3,18,1,15>": "STPROC" + } + }, + "<3,19>": "CLICK", + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "", + "<3,26>": "", + "<3,27>": "", + "<3,28>": "", + "<3,29>": "", + "<3,30>": "", + "<3,31>": "", + "<3,32>": "", + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "", + "<3,37>": "", + "<3,38>": "", + "<3,39>": "", + "<3,40>": "1", + "<3,41>": { + "<3,41,1>": "", + "<3,41,2>": "-1" + }, + "<3,42>": "", + "<3,43>": "", + "<3,44>": "", + "<3,45>": "", + "<3,46>": "", + "<3,47>": "", + "<3,48>": "", + "<3,49>": "", + "<3,50>": "", + "<3,51>": "", + "<3,52>": "", + "<3,53>": "", + "<3,54>": "", + "<3,55>": "", + "<3,56>": "", + "<3,57>": "", + "<3,58>": "", + "<3,59>": "", + "<3,60>": "", + "<3,61>": "", + "<3,62>": "0", + "<3,63>": "", + "<3,64>": { + "<3,64,1>": "-2", + "<3,64,2>": "-2", + "<3,64,3>": "0" + }, + "<3,65>": "-2", + "<3,66>": "", + "<3,67>": "", + "<3,68>": "", + "<3,69>": "", + "<3,70>": "", + "<3,71>": "", + "<3,72>": "", + "<3,73>": "", + "<3,74>": "", + "<3,75>": "", + "<3,76>": "", + "<3,77>": "", + "<3,78>": "", + "<3,79>": "", + "<3,80>": "", + "<3,81>": "", + "<3,82>": "", + "<3,83>": "", + "<3,84>": "", + "<3,85>": "", + "<3,86>": "", + "<3,87>": "", + "<3,88>": "", + "<3,89>": "", + "<3,90>": "0", + "<3,91>": "0", + "<3,92>": "", + "<3,93>": "", + "<3,94>": "", + "<3,95>": "", + "<3,96>": "", + "<3,97>": "", + "<3,98>": "", + "<3,99>": "", + "<3,100>": "", + "<3,101>": "", + "<3,102>": "", + "<3,103>": "", + "<3,104>": "", + "<3,105>": "", + "<3,106>": "", + "<3,107>": "", + "<3,108>": "" + }, + "<4>": { + "<4,1>": "PUB_CANCEL", + "<4,2>": "", + "<4,3>": "PUSHBUTTON", + "<4,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<4,5>": "-86", + "<4,6>": "-29", + "<4,7>": "75", + "<4,8>": "23", + "<4,9>": "&Cancel", + "<4,10>": { + "<4,10,1>": "0x56002300", + "<4,10,2>": "0x0" + }, + "<4,11>": { + "<4,11,1>": "0x13002", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "3", + "<4,13>": { + "<4,13,1>": "16053492", + "<4,13,2>": "16053492", + "<4,13,3>": "0" + }, + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Segoe UI", + "<4,15,1,2>": "-11", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": { + "<4,18,1>": { + "<4,18,1,1>": "E", + "<4,18,1,2>": "CLOSE", + "<4,18,1,3>": "@WINDOW", + "<4,18,1,4>": "", + "<4,18,1,5>": "", + "<4,18,1,6>": "", + "<4,18,1,7>": "", + "<4,18,1,8>": "", + "<4,18,1,9>": "", + "<4,18,1,10>": "", + "<4,18,1,11>": "", + "<4,18,1,12>": "", + "<4,18,1,13>": "", + "<4,18,1,14>": "", + "<4,18,1,15>": "GEN" + } + }, + "<4,19>": "CLICK", + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "", + "<4,26>": "", + "<4,27>": "", + "<4,28>": "", + "<4,29>": "", + "<4,30>": "", + "<4,31>": "", + "<4,32>": "", + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": "", + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "0", + "<4,41>": { + "<4,41,1>": "", + "<4,41,2>": "-1" + }, + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "", + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": "", + "<4,61>": "", + "<4,62>": "0", + "<4,63>": "", + "<4,64>": { + "<4,64,1>": "-2", + "<4,64,2>": "-2", + "<4,64,3>": "0" + }, + "<4,65>": "-2", + "<4,66>": "", + "<4,67>": "", + "<4,68>": "", + "<4,69>": "", + "<4,70>": "", + "<4,71>": "", + "<4,72>": "", + "<4,73>": "", + "<4,74>": "", + "<4,75>": "", + "<4,76>": "", + "<4,77>": "", + "<4,78>": "", + "<4,79>": "", + "<4,80>": "", + "<4,81>": "", + "<4,82>": "", + "<4,83>": "", + "<4,84>": "", + "<4,85>": "", + "<4,86>": "", + "<4,87>": "", + "<4,88>": "", + "<4,89>": "", + "<4,90>": "0", + "<4,91>": "0", + "<4,92>": "", + "<4,93>": "", + "<4,94>": "", + "<4,95>": "", + "<4,96>": "", + "<4,97>": "", + "<4,98>": "", + "<4,99>": "", + "<4,100>": "", + "<4,101>": "", + "<4,102>": "", + "<4,103>": "", + "<4,104>": "", + "<4,105>": "", + "<4,106>": "", + "<4,107>": "", + "<4,108>": "" + }, + "<5>": { + "<5,1>": "OLE_SUBCLASS", + "<5,2>": "", + "<5,3>": "OLECONTROL.SRP.Subclass.1", + "<5,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<5,5>": "90", + "<5,6>": "4", + "<5,7>": "114", + "<5,8>": "23", + "<5,9>": "SRP.Subclass.1", + "<5,10>": { + "<5,10,1>": "0x46000000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0x0", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "4", + "<5,13>": { + "<5,13,1>": "-2", + "<5,13,2>": "-2", + "<5,13,3>": "" + }, + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Segoe UI", + "<5,15,1,2>": "-12", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": { + "<5,18,1>": { + "<5,18,1,1>": "R", + "<5,18,1,2>": "EXECUTE", + "<5,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<5,18,1,4>": { + "<5,18,1,4,1>": "@SELF", + "<5,18,1,4,2>": "@EVENT", + "<5,18,1,4,3>": "@PARAM1", + "<5,18,1,4,4>": "@PARAM2", + "<5,18,1,4,5>": "@PARAM3", + "<5,18,1,4,6>": "@PARAM4", + "<5,18,1,4,7>": "@PARAM5", + "<5,18,1,4,8>": "@PARAM6" + }, + "<5,18,1,5>": "", + "<5,18,1,6>": "", + "<5,18,1,7>": "", + "<5,18,1,8>": "", + "<5,18,1,9>": "", + "<5,18,1,10>": "", + "<5,18,1,11>": "", + "<5,18,1,12>": "", + "<5,18,1,13>": "", + "<5,18,1,14>": "", + "<5,18,1,15>": "STPROC" + } + }, + "<5,19>": "OLE", + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "", + "<5,26>": "", + "<5,27>": "", + "<5,28>": "", + "<5,29>": "", + "<5,30>": "", + "<5,31>": "", + "<5,32>": "", + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "OLE.Border", + "<5,56>": "None", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "", + "<5,61>": "", + "<5,62>": "", + "<5,63>": "", + "<5,64>": "", + "<5,65>": "", + "<5,66>": "", + "<5,67>": "", + "<5,68>": "", + "<5,69>": "", + "<5,70>": "", + "<5,71>": "", + "<5,72>": "", + "<5,73>": "", + "<5,74>": "", + "<5,75>": "", + "<5,76>": "", + "<5,77>": "", + "<5,78>": "", + "<5,79>": "", + "<5,80>": "", + "<5,81>": "", + "<5,82>": "", + "<5,83>": "", + "<5,84>": "", + "<5,85>": "", + "<5,86>": "", + "<5,87>": "", + "<5,88>": "", + "<5,89>": "", + "<5,90>": "", + "<5,91>": "", + "<5,92>": "", + "<5,93>": "", + "<5,94>": "", + "<5,95>": "", + "<5,96>": "", + "<5,97>": "", + "<5,98>": "", + "<5,99>": "", + "<5,100>": "", + "<5,101>": "", + "<5,102>": "", + "<5,103>": "", + "<5,104>": "", + "<5,105>": "", + "<5,106>": "", + "<5,107>": "", + "<5,108>": "" + }, + "<6>": { + "<6,1>": "OLE_PIC_RESOURCE_HDIVIDER", + "<6,2>": "", + "<6,3>": "OLECONTROL.SRP.Picture.1", + "<6,4>": "NDW_HTTP_LOGS_ARCHIVE_DATE", + "<6,5>": "11", + "<6,6>": "11", + "<6,7>": "-11", + "<6,8>": "13", + "<6,9>": "SRP.Picture.1", + "<6,10>": { + "<6,10,1>": "0x56000000", + "<6,10,2>": "0x0" + }, + "<6,11>": { + "<6,11,1>": "0x4000", + "<6,11,2>": "0x80000000" + }, + "<6,12>": "5", + "<6,13>": { + "<6,13,1>": "-2", + "<6,13,2>": "-2", + "<6,13,3>": "" + }, + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Tahoma", + "<6,15,1,2>": "-11", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": "", + "<6,19>": "", + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "", + "<6,26>": "", + "<6,27>": "", + "<6,28>": "", + "<6,29>": "", + "<6,30>": "", + "<6,31>": "", + "<6,32>": "", + "<6,33>": "", + "<6,34>": "", + "<6,35>": "", + "<6,36>": "05000000000000000000000032000000FFFEFF044E006F006E006500FFFEFF0341006C006C00FFFEFF044E006F006E006500FFFEFF0744006900760069006400650072000100000001000000FFFEFF0B430065006E00740065007200FEF04C00650066007400FFFEFF00FFFEFF0443006C0069007000FFFEFF044100750074006F00FFFEFF1945006E00740065007200200065006E00640069006E0067002000610072006300680069007600650020006400610074006500FFFEFF044E006F006E006500FFFEFF225300650067006F006500200055004900FCF02D0031003100FCF0340030003000FCF03000FCF03000FCF03000FCF03100FCF03000FCF03000FCF03000FCF03000FCF03000000000000000F03FFFFEFF0D430065006E00740065007200FEF0430065006E00740065007200F7FFFFFF00000000000000000000000001000000", + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": { + "<6,55,1>": "OLE.Animated", + "<6,55,2>": "OLE.AnimationDelay", + "<6,55,3>": "OLE.AutoLoadDropFile", + "<6,55,4>": "OLE.BackgroundColor", + "<6,55,5>": "OLE.BorderAlignment", + "<6,55,6>": "OLE.BorderType", + "<6,55,7>": "OLE.Caption", + "<6,55,8>": "OLE.CaptionColor", + "<6,55,9>": "OLE.CaptionHorzAlign", + "<6,55,10>": "OLE.CaptionHorzOffset", + "<6,55,11>": "OLE.CaptionVertAlign", + "<6,55,12>": "OLE.CaptionVertOffset", + "<6,55,13>": "OLE.ControlPart", + "<6,55,14>": "OLE.FontBold", + "<6,55,15>": "OLE.FontItalic", + "<6,55,16>": "OLE.FontName", + "<6,55,17>": "OLE.FontSize", + "<6,55,18>": "OLE.FontUnderlined", + "<6,55,19>": "OLE.Frame", + "<6,55,20>": "OLE.FrameCount", + "<6,55,21>": "OLE.HorzAlign", + "<6,55,22>": "OLE.Image", + "<6,55,23>": "OLE.ImageHorzOffset", + "<6,55,24>": "OLE.ImageVertOffset", + "<6,55,25>": "OLE.Layout", + "<6,55,26>": "OLE.ResizeUsingGDIPlus", + "<6,55,27>": "OLE.TransparentColor", + "<6,55,28>": "OLE.VertAlign", + "<6,55,29>": "OLE.Zoom" + }, + "<6,56>": { + "<6,56,1>": "0", + "<6,56,2>": "50", + "<6,56,3>": "0", + "<6,56,4>": "None", + "<6,56,5>": "All", + "<6,56,6>": "None", + "<6,56,7>": "Enter ending archive date", + "<6,56,8>": "None", + "<6,56,9>": "Center", + "<6,56,10>": "-9", + "<6,56,11>": "Center", + "<6,56,12>": "0", + "<6,56,13>": "Divider", + "<6,56,14>": "0", + "<6,56,15>": "0", + "<6,56,16>": "Segoe UI", + "<6,56,17>": "8", + "<6,56,18>": "0", + "<6,56,19>": "1", + "<6,56,20>": "1", + "<6,56,21>": "Left", + "<6,56,22>": "", + "<6,56,23>": "0", + "<6,56,24>": "0", + "<6,56,25>": "Clip", + "<6,56,26>": "1", + "<6,56,27>": "Auto", + "<6,56,28>": "Center", + "<6,56,29>": "1" + }, + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "", + "<6,61>": "", + "<6,62>": "", + "<6,63>": "", + "<6,64>": "", + "<6,65>": "", + "<6,66>": "", + "<6,67>": "", + "<6,68>": "", + "<6,69>": "", + "<6,70>": "", + "<6,71>": "", + "<6,72>": "", + "<6,73>": "", + "<6,74>": "", + "<6,75>": "", + "<6,76>": "", + "<6,77>": "", + "<6,78>": "", + "<6,79>": "", + "<6,80>": "", + "<6,81>": "", + "<6,82>": "", + "<6,83>": "", + "<6,84>": "", + "<6,85>": "", + "<6,86>": "", + "<6,87>": "", + "<6,88>": "", + "<6,89>": "", + "<6,90>": "", + "<6,91>": "", + "<6,92>": "", + "<6,93>": "", + "<6,94>": "", + "<6,95>": "", + "<6,96>": "", + "<6,97>": "", + "<6,98>": "", + "<6,99>": "", + "<6,100>": "", + "<6,101>": "", + "<6,102>": "", + "<6,103>": "", + "<6,104>": "", + "<6,105>": "", + "<6,106>": "", + "<6,107>": "", + "<6,108>": "" + } + }, + "record4": { + "<1>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/OIWIN/NDW_WEB_ACCOUNTS.json b/FRAMEWORKS/OIWIN/NDW_WEB_ACCOUNTS.json new file mode 100644 index 0000000..ef8bbc6 --- /dev/null +++ b/FRAMEWORKS/OIWIN/NDW_WEB_ACCOUNTS.json @@ -0,0 +1,4826 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "1010", + "<2>": "31", + "<3>": "" + }, + "record2": { + "<1>": { + "<1,1>": "NDW_WEB_ACCOUNTS", + "<1,2>": "", + "<1,3>": "WINDOW", + "<1,4>": "", + "<1,5>": "380", + "<1,6>": "121", + "<1,7>": "-564", + "<1,8>": "-435", + "<1,9>": "Web Accounts", + "<1,10>": { + "<1,10,1>": "0x82CF0000", + "<1,10,2>": "0x100" + }, + "<1,11>": { + "<1,11,1>": "0xC000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "", + "<1,13>": { + "<1,13,1>": "16053492", + "<1,13,2>": "16777215", + "<1,13,3>": "1" + }, + "<1,14>": "", + "<1,15>": "", + "<1,16>": "", + "<1,17>": "", + "<1,18>": { + "<1,18,1>": { + "<1,18,1,1>": "R", + "<1,18,1,2>": "EXECUTE", + "<1,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<1,18,1,4>": { + "<1,18,1,4,1>": "@SELF", + "<1,18,1,4,2>": "@EVENT", + "<1,18,1,4,3>": "@PARAM1", + "<1,18,1,4,4>": "@PARAM2", + "<1,18,1,4,5>": "@PARAM3", + "<1,18,1,4,6>": "@PARAM4", + "<1,18,1,4,7>": "@PARAM5", + "<1,18,1,4,8>": "@PARAM6" + }, + "<1,18,1,5>": "", + "<1,18,1,6>": "", + "<1,18,1,7>": "", + "<1,18,1,8>": "", + "<1,18,1,9>": "", + "<1,18,1,10>": "", + "<1,18,1,11>": "", + "<1,18,1,12>": "", + "<1,18,1,13>": "", + "<1,18,1,14>": "", + "<1,18,1,15>": "STPROC" + }, + "<1,18,2>": { + "<1,18,2,1>": "E", + "<1,18,2,2>": "CLOSE", + "<1,18,2,3>": "@WINDOW", + "<1,18,2,4>": "", + "<1,18,2,5>": "", + "<1,18,2,6>": "", + "<1,18,2,7>": "", + "<1,18,2,8>": "", + "<1,18,2,9>": "", + "<1,18,2,10>": "", + "<1,18,2,11>": "", + "<1,18,2,12>": "", + "<1,18,2,13>": "", + "<1,18,2,14>": "", + "<1,18,2,15>": "GEN" + } + }, + "<1,19>": { + "<1,19,1>": "CREATE", + "<1,19,2>": "TIMER" + }, + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": { + "<1,24,1>": "", + "<1,24,2>": "0", + "<1,24,3>": "0", + "<1,24,4>": "0", + "<1,24,5>": "", + "<1,24,6>": "0", + "<1,24,7>": "", + "<1,24,8>": "", + "<1,24,9>": "", + "<1,24,10>": "0", + "<1,24,11>": "0", + "<1,24,12>": "0", + "<1,24,13>": "0", + "<1,24,14>": "0", + "<1,24,15>": "0", + "<1,24,16>": "0", + "<1,24,17>": "0" + }, + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "", + "<1,29>": "", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "FRAMEWORKS*IMAGE*ICO*SRP", + "<1,35>": "", + "<1,36>": "", + "<1,37>": { + "<1,37,1>": "0X10001", + "<1,37,2>": "0X10001" + }, + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": { + "<1,62,1>": "0", + "<1,62,2>": "", + "<1,62,3>": "", + "<1,62,4>": "0", + "<1,62,5>": "0", + "<1,62,6>": "0", + "<1,62,7>": "", + "<1,62,8>": "0.50", + "<1,62,9>": "5.00", + "<1,62,10>": "0.00" + }, + "<1,63>": "", + "<1,64>": "", + "<1,65>": "", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "", + "<1,91>": "", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "0", + "<1,107>": "", + "<1,108>": "" + } + }, + "record3": { + "<1>": { + "<1,1>": "STA_ID", + "<1,2>": "", + "<1,3>": "STATIC", + "<1,4>": "NDW_WEB_ACCOUNTS", + "<1,5>": "229", + "<1,6>": "14", + "<1,7>": "39", + "<1,8>": "15", + "<1,9>": "ID:", + "<1,10>": { + "<1,10,1>": "0x56000000", + "<1,10,2>": "0x0" + }, + "<1,11>": { + "<1,11,1>": "0x10000", + "<1,11,2>": "0x80000000" + }, + "<1,12>": "18", + "<1,13>": { + "<1,13,1>": "-1", + "<1,13,2>": "-1", + "<1,13,3>": "" + }, + "<1,14>": "0", + "<1,15>": { + "<1,15,1>": { + "<1,15,1,1>": "Segoe UI", + "<1,15,1,2>": "-12", + "<1,15,1,3>": "400", + "<1,15,1,4>": "0", + "<1,15,1,5>": "0", + "<1,15,1,6>": "0", + "<1,15,1,7>": "0", + "<1,15,1,8>": "34", + "<1,15,1,9>": "0", + "<1,15,1,10>": "3", + "<1,15,1,11>": "2", + "<1,15,1,12>": "1", + "<1,15,1,13>": "0", + "<1,15,1,14>": "0" + } + }, + "<1,16>": "", + "<1,17>": "", + "<1,18>": "", + "<1,19>": "", + "<1,20>": "", + "<1,21>": "", + "<1,22>": "", + "<1,23>": "", + "<1,24>": "", + "<1,25>": "", + "<1,26>": "", + "<1,27>": "", + "<1,28>": "<>", + "<1,29>": "<>", + "<1,30>": "", + "<1,31>": "", + "<1,32>": "", + "<1,33>": "", + "<1,34>": "", + "<1,35>": "", + "<1,36>": "", + "<1,37>": "", + "<1,38>": "", + "<1,39>": "", + "<1,40>": "", + "<1,41>": "", + "<1,42>": "", + "<1,43>": "", + "<1,44>": "", + "<1,45>": "", + "<1,46>": "", + "<1,47>": "", + "<1,48>": "", + "<1,49>": "", + "<1,50>": "", + "<1,51>": "", + "<1,52>": "", + "<1,53>": "", + "<1,54>": "", + "<1,55>": "", + "<1,56>": "", + "<1,57>": "", + "<1,58>": "", + "<1,59>": "", + "<1,60>": "", + "<1,61>": "", + "<1,62>": "0", + "<1,63>": { + "<1,63,1>": "", + "<1,63,2>": "", + "<1,63,3>": "", + "<1,63,4>": "", + "<1,63,5>": "", + "<1,63,6>": "", + "<1,63,7>": "", + "<1,63,8>": "" + }, + "<1,64>": { + "<1,64,1>": "", + "<1,64,2>": "", + "<1,64,3>": "" + }, + "<1,65>": "-2", + "<1,66>": "", + "<1,67>": "", + "<1,68>": "", + "<1,69>": "", + "<1,70>": "", + "<1,71>": "", + "<1,72>": "", + "<1,73>": "", + "<1,74>": "", + "<1,75>": "", + "<1,76>": "", + "<1,77>": "", + "<1,78>": "", + "<1,79>": "", + "<1,80>": "", + "<1,81>": "", + "<1,82>": "", + "<1,83>": "", + "<1,84>": "", + "<1,85>": "", + "<1,86>": "", + "<1,87>": "", + "<1,88>": "", + "<1,89>": "", + "<1,90>": "0", + "<1,91>": "0", + "<1,92>": "", + "<1,93>": "", + "<1,94>": "", + "<1,95>": "", + "<1,96>": "", + "<1,97>": "", + "<1,98>": "", + "<1,99>": "", + "<1,100>": "", + "<1,101>": "", + "<1,102>": "", + "<1,103>": "", + "<1,104>": "", + "<1,105>": "", + "<1,106>": "", + "<1,107>": "", + "<1,108>": "" + }, + "<2>": { + "<2,1>": "EDL_ID", + "<2,2>": "", + "<2,3>": "EDITFIELD", + "<2,4>": "NDW_WEB_ACCOUNTS", + "<2,5>": "377", + "<2,6>": "11", + "<2,7>": "-11", + "<2,8>": "23", + "<2,9>": "", + "<2,10>": { + "<2,10,1>": "0x56000080", + "<2,10,2>": "0x200" + }, + "<2,11>": { + "<2,11,1>": "0x14004", + "<2,11,2>": "0x80000000" + }, + "<2,12>": "1", + "<2,13>": { + "<2,13,1>": "-2", + "<2,13,2>": "-2", + "<2,13,3>": "" + }, + "<2,14>": "0", + "<2,15>": { + "<2,15,1>": { + "<2,15,1,1>": "Segoe UI", + "<2,15,1,2>": "-12", + "<2,15,1,3>": "400", + "<2,15,1,4>": "0", + "<2,15,1,5>": "0", + "<2,15,1,6>": "0", + "<2,15,1,7>": "0", + "<2,15,1,8>": "34", + "<2,15,1,9>": "0", + "<2,15,1,10>": "3", + "<2,15,1,11>": "2", + "<2,15,1,12>": "1", + "<2,15,1,13>": "0", + "<2,15,1,14>": "0" + } + }, + "<2,16>": "", + "<2,17>": "", + "<2,18>": { + "<2,18,1>": { + "<2,18,1,1>": "R", + "<2,18,1,2>": "EXECUTE", + "<2,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,1,4>": { + "<2,18,1,4,1>": "@SELF", + "<2,18,1,4,2>": "@EVENT", + "<2,18,1,4,3>": "@PARAM1", + "<2,18,1,4,4>": "@PARAM2", + "<2,18,1,4,5>": "@PARAM3", + "<2,18,1,4,6>": "@PARAM4", + "<2,18,1,4,7>": "@PARAM5", + "<2,18,1,4,8>": "@PARAM6" + }, + "<2,18,1,5>": "", + "<2,18,1,6>": "", + "<2,18,1,7>": "", + "<2,18,1,8>": "", + "<2,18,1,9>": "", + "<2,18,1,10>": "", + "<2,18,1,11>": "", + "<2,18,1,12>": "", + "<2,18,1,13>": "", + "<2,18,1,14>": "", + "<2,18,1,15>": "STPROC" + }, + "<2,18,2>": { + "<2,18,2,1>": "R", + "<2,18,2,2>": "EXECUTE", + "<2,18,2,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<2,18,2,4>": { + "<2,18,2,4,1>": "@SELF", + "<2,18,2,4,2>": "@EVENT", + "<2,18,2,4,3>": "@PARAM1", + "<2,18,2,4,4>": "@PARAM2", + "<2,18,2,4,5>": "@PARAM3", + "<2,18,2,4,6>": "@PARAM4", + "<2,18,2,4,7>": "@PARAM5", + "<2,18,2,4,8>": "@PARAM6" + }, + "<2,18,2,5>": "", + "<2,18,2,6>": "", + "<2,18,2,7>": "", + "<2,18,2,8>": "", + "<2,18,2,9>": "", + "<2,18,2,10>": "", + "<2,18,2,11>": "", + "<2,18,2,12>": "", + "<2,18,2,13>": "", + "<2,18,2,14>": "", + "<2,18,2,15>": "STPROC" + } + }, + "<2,19>": { + "<2,19,1>": "OPTIONS", + "<2,19,2>": "LOSTFOCUS" + }, + "<2,20>": "", + "<2,21>": "", + "<2,22>": "", + "<2,23>": "", + "<2,24>": "", + "<2,25>": "", + "<2,26>": "", + "<2,27>": "", + "<2,28>": "<>", + "<2,29>": "<>", + "<2,30>": "<>", + "<2,31>": "0", + "<2,32>": "", + "<2,33>": "", + "<2,34>": "", + "<2,35>": "", + "<2,36>": { + "<2,36,1>": "0", + "<2,36,2>": "0" + }, + "<2,37>": "", + "<2,38>": "", + "<2,39>": "", + "<2,40>": "", + "<2,41>": "", + "<2,42>": "", + "<2,43>": "", + "<2,44>": "", + "<2,45>": "", + "<2,46>": "", + "<2,47>": "", + "<2,48>": "", + "<2,49>": "", + "<2,50>": "", + "<2,51>": "", + "<2,52>": "", + "<2,53>": "", + "<2,54>": "", + "<2,55>": "", + "<2,56>": "", + "<2,57>": "", + "<2,58>": "", + "<2,59>": "", + "<2,60>": "", + "<2,61>": "", + "<2,62>": "0", + "<2,63>": "", + "<2,64>": "", + "<2,65>": "", + "<2,66>": "", + "<2,67>": "", + "<2,68>": "", + "<2,69>": "", + "<2,70>": "", + "<2,71>": "", + "<2,72>": "", + "<2,73>": "", + "<2,74>": "", + "<2,75>": "", + "<2,76>": "", + "<2,77>": "", + "<2,78>": "", + "<2,79>": "", + "<2,80>": "", + "<2,81>": "", + "<2,82>": "", + "<2,83>": "", + "<2,84>": "", + "<2,85>": "", + "<2,86>": "", + "<2,87>": "", + "<2,88>": "", + "<2,89>": "", + "<2,90>": "", + "<2,91>": "", + "<2,92>": "", + "<2,93>": "", + "<2,94>": "", + "<2,95>": "", + "<2,96>": "", + "<2,97>": "", + "<2,98>": "", + "<2,99>": "", + "<2,100>": "", + "<2,101>": "", + "<2,102>": "", + "<2,103>": "", + "<2,104>": "", + "<2,105>": "", + "<2,106>": "", + "<2,107>": "", + "<2,108>": "" + }, + "<3>": { + "<3,1>": "STA_NAME", + "<3,2>": "", + "<3,3>": "STATIC", + "<3,4>": "NDW_WEB_ACCOUNTS", + "<3,5>": "229", + "<3,6>": "44", + "<3,7>": "39", + "<3,8>": "15", + "<3,9>": "Name:", + "<3,10>": { + "<3,10,1>": "0x56000000", + "<3,10,2>": "0x0" + }, + "<3,11>": { + "<3,11,1>": "0x10000", + "<3,11,2>": "0x80000000" + }, + "<3,12>": "19", + "<3,13>": { + "<3,13,1>": "-1", + "<3,13,2>": "-1", + "<3,13,3>": "" + }, + "<3,14>": "0", + "<3,15>": { + "<3,15,1>": { + "<3,15,1,1>": "Segoe UI", + "<3,15,1,2>": "-12", + "<3,15,1,3>": "400", + "<3,15,1,4>": "0", + "<3,15,1,5>": "0", + "<3,15,1,6>": "0", + "<3,15,1,7>": "0", + "<3,15,1,8>": "34", + "<3,15,1,9>": "0", + "<3,15,1,10>": "3", + "<3,15,1,11>": "2", + "<3,15,1,12>": "1", + "<3,15,1,13>": "0", + "<3,15,1,14>": "0" + } + }, + "<3,16>": "", + "<3,17>": "", + "<3,18>": "", + "<3,19>": "", + "<3,20>": "", + "<3,21>": "", + "<3,22>": "", + "<3,23>": "", + "<3,24>": "", + "<3,25>": "", + "<3,26>": "", + "<3,27>": "", + "<3,28>": "<>", + "<3,29>": "<>", + "<3,30>": "", + "<3,31>": "", + "<3,32>": "", + "<3,33>": "", + "<3,34>": "", + "<3,35>": "", + "<3,36>": "", + "<3,37>": "", + "<3,38>": "", + "<3,39>": "", + "<3,40>": "", + "<3,41>": "", + "<3,42>": "", + "<3,43>": "", + "<3,44>": "", + "<3,45>": "", + "<3,46>": "", + "<3,47>": "", + "<3,48>": "", + "<3,49>": "", + "<3,50>": "", + "<3,51>": "", + "<3,52>": "", + "<3,53>": "", + "<3,54>": "", + "<3,55>": "", + "<3,56>": "", + "<3,57>": "", + "<3,58>": "", + "<3,59>": "", + "<3,60>": "", + "<3,61>": "", + "<3,62>": "0", + "<3,63>": { + "<3,63,1>": "", + "<3,63,2>": "", + "<3,63,3>": "", + "<3,63,4>": "", + "<3,63,5>": "", + "<3,63,6>": "", + "<3,63,7>": "", + "<3,63,8>": "" + }, + "<3,64>": { + "<3,64,1>": "", + "<3,64,2>": "", + "<3,64,3>": "" + }, + "<3,65>": "-2", + "<3,66>": "", + "<3,67>": "", + "<3,68>": "", + "<3,69>": "", + "<3,70>": "", + "<3,71>": "", + "<3,72>": "", + "<3,73>": "", + "<3,74>": "", + "<3,75>": "", + "<3,76>": "", + "<3,77>": "", + "<3,78>": "", + "<3,79>": "", + "<3,80>": "", + "<3,81>": "", + "<3,82>": "", + "<3,83>": "", + "<3,84>": "", + "<3,85>": "", + "<3,86>": "", + "<3,87>": "", + "<3,88>": "", + "<3,89>": "", + "<3,90>": "0", + "<3,91>": "0", + "<3,92>": "", + "<3,93>": "", + "<3,94>": "", + "<3,95>": "", + "<3,96>": "", + "<3,97>": "", + "<3,98>": "", + "<3,99>": "", + "<3,100>": "", + "<3,101>": "", + "<3,102>": "", + "<3,103>": "", + "<3,104>": "", + "<3,105>": "", + "<3,106>": "", + "<3,107>": "", + "<3,108>": "" + }, + "<4>": { + "<4,1>": "EDL_NAME", + "<4,2>": "", + "<4,3>": "EDITFIELD", + "<4,4>": "NDW_WEB_ACCOUNTS", + "<4,5>": "377", + "<4,6>": "41", + "<4,7>": "-11", + "<4,8>": "23", + "<4,9>": "", + "<4,10>": { + "<4,10,1>": "0x56000080", + "<4,10,2>": "0x200" + }, + "<4,11>": { + "<4,11,1>": "0x14000", + "<4,11,2>": "0x80000000" + }, + "<4,12>": "2", + "<4,13>": { + "<4,13,1>": "-2", + "<4,13,2>": "-2", + "<4,13,3>": "" + }, + "<4,14>": "0", + "<4,15>": { + "<4,15,1>": { + "<4,15,1,1>": "Segoe UI", + "<4,15,1,2>": "-12", + "<4,15,1,3>": "400", + "<4,15,1,4>": "0", + "<4,15,1,5>": "0", + "<4,15,1,6>": "0", + "<4,15,1,7>": "0", + "<4,15,1,8>": "34", + "<4,15,1,9>": "0", + "<4,15,1,10>": "3", + "<4,15,1,11>": "2", + "<4,15,1,12>": "1", + "<4,15,1,13>": "0", + "<4,15,1,14>": "0" + } + }, + "<4,16>": "", + "<4,17>": "", + "<4,18>": "", + "<4,19>": "", + "<4,20>": "", + "<4,21>": "", + "<4,22>": "", + "<4,23>": "", + "<4,24>": "", + "<4,25>": "", + "<4,26>": "", + "<4,27>": "", + "<4,28>": "<>", + "<4,29>": "<>", + "<4,30>": "<>", + "<4,31>": "1", + "<4,32>": "", + "<4,33>": "", + "<4,34>": "", + "<4,35>": "", + "<4,36>": { + "<4,36,1>": "0", + "<4,36,2>": "0" + }, + "<4,37>": "", + "<4,38>": "", + "<4,39>": "", + "<4,40>": "", + "<4,41>": "", + "<4,42>": "", + "<4,43>": "", + "<4,44>": "", + "<4,45>": "", + "<4,46>": "", + "<4,47>": "", + "<4,48>": "", + "<4,49>": "", + "<4,50>": "", + "<4,51>": "", + "<4,52>": "", + "<4,53>": "", + "<4,54>": "", + "<4,55>": "", + "<4,56>": "", + "<4,57>": "", + "<4,58>": "", + "<4,59>": "", + "<4,60>": "", + "<4,61>": "", + "<4,62>": "0", + "<4,63>": "", + "<4,64>": "", + "<4,65>": "", + "<4,66>": "", + "<4,67>": "", + "<4,68>": "", + "<4,69>": "", + "<4,70>": "", + "<4,71>": "", + "<4,72>": "", + "<4,73>": "", + "<4,74>": "", + "<4,75>": "", + "<4,76>": "", + "<4,77>": "", + "<4,78>": "", + "<4,79>": "", + "<4,80>": "", + "<4,81>": "", + "<4,82>": "", + "<4,83>": "", + "<4,84>": "", + "<4,85>": "", + "<4,86>": "", + "<4,87>": "", + "<4,88>": "", + "<4,89>": "", + "<4,90>": "", + "<4,91>": "", + "<4,92>": "", + "<4,93>": "", + "<4,94>": "", + "<4,95>": "", + "<4,96>": "", + "<4,97>": "", + "<4,98>": "", + "<4,99>": "", + "<4,100>": "", + "<4,101>": "", + "<4,102>": "", + "<4,103>": "", + "<4,104>": "", + "<4,105>": "", + "<4,106>": "", + "<4,107>": "", + "<4,108>": "" + }, + "<5>": { + "<5,1>": "STA_ACCOUNT_ENABLED", + "<5,2>": "", + "<5,3>": "STATIC", + "<5,4>": "NDW_WEB_ACCOUNTS", + "<5,5>": "229", + "<5,6>": "74", + "<5,7>": "95", + "<5,8>": "15", + "<5,9>": "Account Enabled:", + "<5,10>": { + "<5,10,1>": "0x56000000", + "<5,10,2>": "0x0" + }, + "<5,11>": { + "<5,11,1>": "0x10000", + "<5,11,2>": "0x80000000" + }, + "<5,12>": "20", + "<5,13>": { + "<5,13,1>": "-1", + "<5,13,2>": "-1", + "<5,13,3>": "" + }, + "<5,14>": "0", + "<5,15>": { + "<5,15,1>": { + "<5,15,1,1>": "Segoe UI", + "<5,15,1,2>": "-12", + "<5,15,1,3>": "400", + "<5,15,1,4>": "0", + "<5,15,1,5>": "0", + "<5,15,1,6>": "0", + "<5,15,1,7>": "0", + "<5,15,1,8>": "34", + "<5,15,1,9>": "0", + "<5,15,1,10>": "3", + "<5,15,1,11>": "2", + "<5,15,1,12>": "1", + "<5,15,1,13>": "0", + "<5,15,1,14>": "0" + } + }, + "<5,16>": "", + "<5,17>": "", + "<5,18>": "", + "<5,19>": "", + "<5,20>": "", + "<5,21>": "", + "<5,22>": "", + "<5,23>": "", + "<5,24>": "", + "<5,25>": "", + "<5,26>": "", + "<5,27>": "", + "<5,28>": "<>", + "<5,29>": "<>", + "<5,30>": "", + "<5,31>": "", + "<5,32>": "", + "<5,33>": "", + "<5,34>": "", + "<5,35>": "", + "<5,36>": "", + "<5,37>": "", + "<5,38>": "", + "<5,39>": "", + "<5,40>": "", + "<5,41>": "", + "<5,42>": "", + "<5,43>": "", + "<5,44>": "", + "<5,45>": "", + "<5,46>": "", + "<5,47>": "", + "<5,48>": "", + "<5,49>": "", + "<5,50>": "", + "<5,51>": "", + "<5,52>": "", + "<5,53>": "", + "<5,54>": "", + "<5,55>": "", + "<5,56>": "", + "<5,57>": "", + "<5,58>": "", + "<5,59>": "", + "<5,60>": "", + "<5,61>": "", + "<5,62>": "0", + "<5,63>": { + "<5,63,1>": "", + "<5,63,2>": "", + "<5,63,3>": "", + "<5,63,4>": "", + "<5,63,5>": "", + "<5,63,6>": "", + "<5,63,7>": "", + "<5,63,8>": "" + }, + "<5,64>": { + "<5,64,1>": "", + "<5,64,2>": "", + "<5,64,3>": "" + }, + "<5,65>": "-2", + "<5,66>": "", + "<5,67>": "", + "<5,68>": "", + "<5,69>": "", + "<5,70>": "", + "<5,71>": "", + "<5,72>": "", + "<5,73>": "", + "<5,74>": "", + "<5,75>": "", + "<5,76>": "", + "<5,77>": "", + "<5,78>": "", + "<5,79>": "", + "<5,80>": "", + "<5,81>": "", + "<5,82>": "", + "<5,83>": "", + "<5,84>": "", + "<5,85>": "", + "<5,86>": "", + "<5,87>": "", + "<5,88>": "", + "<5,89>": "", + "<5,90>": "0", + "<5,91>": "0", + "<5,92>": "", + "<5,93>": "", + "<5,94>": "", + "<5,95>": "", + "<5,96>": "", + "<5,97>": "", + "<5,98>": "", + "<5,99>": "", + "<5,100>": "", + "<5,101>": "", + "<5,102>": "", + "<5,103>": "", + "<5,104>": "", + "<5,105>": "", + "<5,106>": "", + "<5,107>": "", + "<5,108>": "" + }, + "<6>": { + "<6,1>": "COB_ACCOUNT_ENABLED", + "<6,2>": "", + "<6,3>": "COMBOBOX", + "<6,4>": "NDW_WEB_ACCOUNTS", + "<6,5>": "377", + "<6,6>": "71", + "<6,7>": "-11", + "<6,8>": "60", + "<6,9>": "No", + "<6,10>": { + "<6,10,1>": "0x56000003", + "<6,10,2>": "0x0" + }, + "<6,11>": { + "<6,11,1>": "0x4000", + "<6,11,2>": "0x80000C00" + }, + "<6,12>": "3", + "<6,13>": { + "<6,13,1>": "-2", + "<6,13,2>": "-2", + "<6,13,3>": "" + }, + "<6,14>": "0", + "<6,15>": { + "<6,15,1>": { + "<6,15,1,1>": "Segoe UI", + "<6,15,1,2>": "-12", + "<6,15,1,3>": "400", + "<6,15,1,4>": "0", + "<6,15,1,5>": "0", + "<6,15,1,6>": "0", + "<6,15,1,7>": "0", + "<6,15,1,8>": "34", + "<6,15,1,9>": "0", + "<6,15,1,10>": "3", + "<6,15,1,11>": "2", + "<6,15,1,12>": "1", + "<6,15,1,13>": "0", + "<6,15,1,14>": "0" + } + }, + "<6,16>": "", + "<6,17>": "", + "<6,18>": "", + "<6,19>": "", + "<6,20>": "", + "<6,21>": "", + "<6,22>": "", + "<6,23>": "", + "<6,24>": "", + "<6,25>": "", + "<6,26>": "", + "<6,27>": "", + "<6,28>": "(B)", + "<6,29>": "B", + "<6,30>": "<>", + "<6,31>": "0", + "<6,32>": "", + "<6,33>": "", + "<6,34>": "", + "<6,35>": { + "<6,35,1>": "Yes", + "<6,35,2>": "No" + }, + "<6,36>": "", + "<6,37>": "", + "<6,38>": "", + "<6,39>": "", + "<6,40>": "", + "<6,41>": "", + "<6,42>": "", + "<6,43>": "", + "<6,44>": "", + "<6,45>": "", + "<6,46>": "", + "<6,47>": "", + "<6,48>": "", + "<6,49>": "", + "<6,50>": "", + "<6,51>": "", + "<6,52>": "", + "<6,53>": "", + "<6,54>": "", + "<6,55>": "", + "<6,56>": "", + "<6,57>": "", + "<6,58>": "", + "<6,59>": "", + "<6,60>": "", + "<6,61>": "", + "<6,62>": "0", + "<6,63>": "", + "<6,64>": { + "<6,64,1>": "", + "<6,64,2>": "", + "<6,64,3>": "" + }, + "<6,65>": "-2", + "<6,66>": { + "<6,66,1>": "", + "<6,66,2>": "", + "<6,66,3>": "" + }, + "<6,67>": "-2", + "<6,68>": "", + "<6,69>": "", + "<6,70>": "", + "<6,71>": "", + "<6,72>": "", + "<6,73>": "", + "<6,74>": "", + "<6,75>": "", + "<6,76>": "", + "<6,77>": "", + "<6,78>": "", + "<6,79>": "", + "<6,80>": "", + "<6,81>": "", + "<6,82>": "", + "<6,83>": "", + "<6,84>": "", + "<6,85>": "", + "<6,86>": "", + "<6,87>": "", + "<6,88>": "", + "<6,89>": "", + "<6,90>": "", + "<6,91>": "", + "<6,92>": "", + "<6,93>": "", + "<6,94>": "", + "<6,95>": "", + "<6,96>": "", + "<6,97>": "", + "<6,98>": "", + "<6,99>": "", + "<6,100>": "", + "<6,101>": "", + "<6,102>": "", + "<6,103>": "", + "<6,104>": "", + "<6,105>": "", + "<6,106>": "", + "<6,107>": "", + "<6,108>": "" + }, + "<7>": { + "<7,1>": "STA_CURRENT_PASSWORD", + "<7,2>": "", + "<7,3>": "STATIC", + "<7,4>": "NDW_WEB_ACCOUNTS", + "<7,5>": "229", + "<7,6>": "104", + "<7,7>": "98", + "<7,8>": "15", + "<7,9>": "Current Password:", + "<7,10>": { + "<7,10,1>": "0x56000000", + "<7,10,2>": "0x0" + }, + "<7,11>": { + "<7,11,1>": "0x10000", + "<7,11,2>": "0x80000000" + }, + "<7,12>": "21", + "<7,13>": { + "<7,13,1>": "-1", + "<7,13,2>": "-1", + "<7,13,3>": "" + }, + "<7,14>": "0", + "<7,15>": { + "<7,15,1>": { + "<7,15,1,1>": "Segoe UI", + "<7,15,1,2>": "-12", + "<7,15,1,3>": "400", + "<7,15,1,4>": "0", + "<7,15,1,5>": "0", + "<7,15,1,6>": "0", + "<7,15,1,7>": "0", + "<7,15,1,8>": "34", + "<7,15,1,9>": "0", + "<7,15,1,10>": "3", + "<7,15,1,11>": "2", + "<7,15,1,12>": "1", + "<7,15,1,13>": "0", + "<7,15,1,14>": "0" + } + }, + "<7,16>": "", + "<7,17>": "", + "<7,18>": "", + "<7,19>": "", + "<7,20>": "", + "<7,21>": "", + "<7,22>": "", + "<7,23>": "", + "<7,24>": "", + "<7,25>": "", + "<7,26>": "", + "<7,27>": "", + "<7,28>": "<>", + "<7,29>": "<>", + "<7,30>": "", + "<7,31>": "", + "<7,32>": "", + "<7,33>": "", + "<7,34>": "", + "<7,35>": "", + "<7,36>": "", + "<7,37>": "", + "<7,38>": "", + "<7,39>": "", + "<7,40>": "", + "<7,41>": "", + "<7,42>": "", + "<7,43>": "", + "<7,44>": "", + "<7,45>": "", + "<7,46>": "", + "<7,47>": "", + "<7,48>": "", + "<7,49>": "", + "<7,50>": "", + "<7,51>": "", + "<7,52>": "", + "<7,53>": "", + "<7,54>": "", + "<7,55>": "", + "<7,56>": "", + "<7,57>": "", + "<7,58>": "", + "<7,59>": "", + "<7,60>": "", + "<7,61>": "", + "<7,62>": "0", + "<7,63>": { + "<7,63,1>": "", + "<7,63,2>": "", + "<7,63,3>": "", + "<7,63,4>": "", + "<7,63,5>": "", + "<7,63,6>": "", + "<7,63,7>": "", + "<7,63,8>": "" + }, + "<7,64>": { + "<7,64,1>": "", + "<7,64,2>": "", + "<7,64,3>": "" + }, + "<7,65>": "-2", + "<7,66>": "", + "<7,67>": "", + "<7,68>": "", + "<7,69>": "", + "<7,70>": "", + "<7,71>": "", + "<7,72>": "", + "<7,73>": "", + "<7,74>": "", + "<7,75>": "", + "<7,76>": "", + "<7,77>": "", + "<7,78>": "", + "<7,79>": "", + "<7,80>": "", + "<7,81>": "", + "<7,82>": "", + "<7,83>": "", + "<7,84>": "", + "<7,85>": "", + "<7,86>": "", + "<7,87>": "", + "<7,88>": "", + "<7,89>": "", + "<7,90>": "0", + "<7,91>": "0", + "<7,92>": "", + "<7,93>": "", + "<7,94>": "", + "<7,95>": "", + "<7,96>": "", + "<7,97>": "", + "<7,98>": "", + "<7,99>": "", + "<7,100>": "", + "<7,101>": "", + "<7,102>": "", + "<7,103>": "", + "<7,104>": "", + "<7,105>": "", + "<7,106>": "", + "<7,107>": "", + "<7,108>": "" + }, + "<8>": { + "<8,1>": "EDL_CURRENT_PASSWORD", + "<8,2>": "", + "<8,3>": "EDITFIELD", + "<8,4>": "NDW_WEB_ACCOUNTS", + "<8,5>": "377", + "<8,6>": "101", + "<8,7>": "-11", + "<8,8>": "23", + "<8,9>": "", + "<8,10>": { + "<8,10,1>": "0x56000080", + "<8,10,2>": "0x200" + }, + "<8,11>": { + "<8,11,1>": "0x14000", + "<8,11,2>": "0x80000000" + }, + "<8,12>": "4", + "<8,13>": { + "<8,13,1>": "-2", + "<8,13,2>": "-2", + "<8,13,3>": "" + }, + "<8,14>": "0", + "<8,15>": { + "<8,15,1>": { + "<8,15,1,1>": "Segoe UI", + "<8,15,1,2>": "-12", + "<8,15,1,3>": "400", + "<8,15,1,4>": "0", + "<8,15,1,5>": "0", + "<8,15,1,6>": "0", + "<8,15,1,7>": "0", + "<8,15,1,8>": "34", + "<8,15,1,9>": "0", + "<8,15,1,10>": "3", + "<8,15,1,11>": "2", + "<8,15,1,12>": "1", + "<8,15,1,13>": "0", + "<8,15,1,14>": "0" + } + }, + "<8,16>": "", + "<8,17>": "", + "<8,18>": "", + "<8,19>": "", + "<8,20>": "", + "<8,21>": "", + "<8,22>": "", + "<8,23>": "", + "<8,24>": "", + "<8,25>": "", + "<8,26>": "", + "<8,27>": "", + "<8,28>": "<>", + "<8,29>": "<>", + "<8,30>": "<>", + "<8,31>": "0", + "<8,32>": "", + "<8,33>": "", + "<8,34>": "", + "<8,35>": "", + "<8,36>": { + "<8,36,1>": "0", + "<8,36,2>": "0" + }, + "<8,37>": "", + "<8,38>": "", + "<8,39>": "", + "<8,40>": "", + "<8,41>": "", + "<8,42>": "", + "<8,43>": "", + "<8,44>": "", + "<8,45>": "", + "<8,46>": "", + "<8,47>": "", + "<8,48>": "", + "<8,49>": "", + "<8,50>": "", + "<8,51>": "", + "<8,52>": "", + "<8,53>": "", + "<8,54>": "", + "<8,55>": "", + "<8,56>": "", + "<8,57>": "", + "<8,58>": "", + "<8,59>": "", + "<8,60>": "", + "<8,61>": "", + "<8,62>": "0", + "<8,63>": "", + "<8,64>": "", + "<8,65>": "", + "<8,66>": "", + "<8,67>": "", + "<8,68>": "", + "<8,69>": "", + "<8,70>": "", + "<8,71>": "", + "<8,72>": "", + "<8,73>": "", + "<8,74>": "", + "<8,75>": "", + "<8,76>": "", + "<8,77>": "", + "<8,78>": "", + "<8,79>": "", + "<8,80>": "", + "<8,81>": "", + "<8,82>": "", + "<8,83>": "", + "<8,84>": "", + "<8,85>": "", + "<8,86>": "", + "<8,87>": "", + "<8,88>": "", + "<8,89>": "", + "<8,90>": "", + "<8,91>": "", + "<8,92>": "", + "<8,93>": "", + "<8,94>": "", + "<8,95>": "", + "<8,96>": "", + "<8,97>": "", + "<8,98>": "", + "<8,99>": "", + "<8,100>": "", + "<8,101>": "", + "<8,102>": "", + "<8,103>": "", + "<8,104>": "", + "<8,105>": "", + "<8,106>": "", + "<8,107>": "", + "<8,108>": "" + }, + "<9>": { + "<9,1>": "STA_CURRENT_PASSWORD_CREATE_DATE", + "<9,2>": "", + "<9,3>": "STATIC", + "<9,4>": "NDW_WEB_ACCOUNTS", + "<9,5>": "229", + "<9,6>": "134", + "<9,7>": "98", + "<9,8>": "15", + "<9,9>": "Create Date:", + "<9,10>": { + "<9,10,1>": "0x56000000", + "<9,10,2>": "0x0" + }, + "<9,11>": { + "<9,11,1>": "0x10000", + "<9,11,2>": "0x80000000" + }, + "<9,12>": "22", + "<9,13>": { + "<9,13,1>": "-1", + "<9,13,2>": "-1", + "<9,13,3>": "" + }, + "<9,14>": "0", + "<9,15>": { + "<9,15,1>": { + "<9,15,1,1>": "Segoe UI", + "<9,15,1,2>": "-12", + "<9,15,1,3>": "400", + "<9,15,1,4>": "0", + "<9,15,1,5>": "0", + "<9,15,1,6>": "0", + "<9,15,1,7>": "0", + "<9,15,1,8>": "34", + "<9,15,1,9>": "0", + "<9,15,1,10>": "3", + "<9,15,1,11>": "2", + "<9,15,1,12>": "1", + "<9,15,1,13>": "0", + "<9,15,1,14>": "0" + } + }, + "<9,16>": "", + "<9,17>": "", + "<9,18>": "", + "<9,19>": "", + "<9,20>": "", + "<9,21>": "", + "<9,22>": "", + "<9,23>": "", + "<9,24>": "", + "<9,25>": "", + "<9,26>": "", + "<9,27>": "", + "<9,28>": "<>", + "<9,29>": "<>", + "<9,30>": "", + "<9,31>": "", + "<9,32>": "", + "<9,33>": "", + "<9,34>": "", + "<9,35>": "", + "<9,36>": "", + "<9,37>": "", + "<9,38>": "", + "<9,39>": "", + "<9,40>": "", + "<9,41>": "", + "<9,42>": "", + "<9,43>": "", + "<9,44>": "", + "<9,45>": "", + "<9,46>": "", + "<9,47>": "", + "<9,48>": "", + "<9,49>": "", + "<9,50>": "", + "<9,51>": "", + "<9,52>": "", + "<9,53>": "", + "<9,54>": "", + "<9,55>": "", + "<9,56>": "", + "<9,57>": "", + "<9,58>": "", + "<9,59>": "", + "<9,60>": "", + "<9,61>": "", + "<9,62>": "0", + "<9,63>": { + "<9,63,1>": "", + "<9,63,2>": "", + "<9,63,3>": "", + "<9,63,4>": "", + "<9,63,5>": "", + "<9,63,6>": "", + "<9,63,7>": "", + "<9,63,8>": "" + }, + "<9,64>": { + "<9,64,1>": "", + "<9,64,2>": "", + "<9,64,3>": "" + }, + "<9,65>": "-2", + "<9,66>": "", + "<9,67>": "", + "<9,68>": "", + "<9,69>": "", + "<9,70>": "", + "<9,71>": "", + "<9,72>": "", + "<9,73>": "", + "<9,74>": "", + "<9,75>": "", + "<9,76>": "", + "<9,77>": "", + "<9,78>": "", + "<9,79>": "", + "<9,80>": "", + "<9,81>": "", + "<9,82>": "", + "<9,83>": "", + "<9,84>": "", + "<9,85>": "", + "<9,86>": "", + "<9,87>": "", + "<9,88>": "", + "<9,89>": "", + "<9,90>": "0", + "<9,91>": "0", + "<9,92>": "", + "<9,93>": "", + "<9,94>": "", + "<9,95>": "", + "<9,96>": "", + "<9,97>": "", + "<9,98>": "", + "<9,99>": "", + "<9,100>": "", + "<9,101>": "", + "<9,102>": "", + "<9,103>": "", + "<9,104>": "", + "<9,105>": "", + "<9,106>": "", + "<9,107>": "", + "<9,108>": "" + }, + "<10>": { + "<10,1>": "EDL_CURRENT_PASSWORD_CREATE_DATE", + "<10,2>": "", + "<10,3>": "EDITFIELD", + "<10,4>": "NDW_WEB_ACCOUNTS", + "<10,5>": "377", + "<10,6>": "131", + "<10,7>": "-11", + "<10,8>": "23", + "<10,9>": "", + "<10,10>": { + "<10,10,1>": "0x56000080", + "<10,10,2>": "0x200" + }, + "<10,11>": { + "<10,11,1>": "0x14000", + "<10,11,2>": "0x80000000" + }, + "<10,12>": "5", + "<10,13>": { + "<10,13,1>": "-2", + "<10,13,2>": "-2", + "<10,13,3>": "" + }, + "<10,14>": "0", + "<10,15>": { + "<10,15,1>": { + "<10,15,1,1>": "Segoe UI", + "<10,15,1,2>": "-12", + "<10,15,1,3>": "400", + "<10,15,1,4>": "0", + "<10,15,1,5>": "0", + "<10,15,1,6>": "0", + "<10,15,1,7>": "0", + "<10,15,1,8>": "34", + "<10,15,1,9>": "0", + "<10,15,1,10>": "3", + "<10,15,1,11>": "2", + "<10,15,1,12>": "1", + "<10,15,1,13>": "0", + "<10,15,1,14>": "0" + } + }, + "<10,16>": "", + "<10,17>": "", + "<10,18>": "", + "<10,19>": "", + "<10,20>": "", + "<10,21>": "", + "<10,22>": "", + "<10,23>": "", + "<10,24>": "", + "<10,25>": "", + "<10,26>": "", + "<10,27>": "", + "<10,28>": "(D)", + "<10,29>": "D4/", + "<10,30>": "<>", + "<10,31>": "0", + "<10,32>": "", + "<10,33>": "", + "<10,34>": "", + "<10,35>": "", + "<10,36>": { + "<10,36,1>": "0", + "<10,36,2>": "0" + }, + "<10,37>": "", + "<10,38>": "", + "<10,39>": "", + "<10,40>": "", + "<10,41>": "", + "<10,42>": "", + "<10,43>": "", + "<10,44>": "", + "<10,45>": "", + "<10,46>": "", + "<10,47>": "", + "<10,48>": "", + "<10,49>": "", + "<10,50>": "", + "<10,51>": "", + "<10,52>": "", + "<10,53>": "", + "<10,54>": "", + "<10,55>": "", + "<10,56>": "", + "<10,57>": "", + "<10,58>": "", + "<10,59>": "", + "<10,60>": "", + "<10,61>": "", + "<10,62>": "0", + "<10,63>": "", + "<10,64>": "", + "<10,65>": "", + "<10,66>": "", + "<10,67>": "", + "<10,68>": "", + "<10,69>": "", + "<10,70>": "", + "<10,71>": "", + "<10,72>": "", + "<10,73>": "", + "<10,74>": "", + "<10,75>": "", + "<10,76>": "", + "<10,77>": "", + "<10,78>": "", + "<10,79>": "", + "<10,80>": "", + "<10,81>": "", + "<10,82>": "", + "<10,83>": "", + "<10,84>": "", + "<10,85>": "", + "<10,86>": "", + "<10,87>": "", + "<10,88>": "", + "<10,89>": "", + "<10,90>": "", + "<10,91>": "", + "<10,92>": "", + "<10,93>": "", + "<10,94>": "", + "<10,95>": "", + "<10,96>": "", + "<10,97>": "", + "<10,98>": "", + "<10,99>": "", + "<10,100>": "", + "<10,101>": "", + "<10,102>": "", + "<10,103>": "", + "<10,104>": "", + "<10,105>": "", + "<10,106>": "", + "<10,107>": "", + "<10,108>": "" + }, + "<11>": { + "<11,1>": "STA_CURRENT_PASSWORD_CREATE_TIME", + "<11,2>": "", + "<11,3>": "STATIC", + "<11,4>": "NDW_WEB_ACCOUNTS", + "<11,5>": "229", + "<11,6>": "164", + "<11,7>": "98", + "<11,8>": "15", + "<11,9>": "Create Time:", + "<11,10>": { + "<11,10,1>": "0x56000000", + "<11,10,2>": "0x0" + }, + "<11,11>": { + "<11,11,1>": "0x10000", + "<11,11,2>": "0x80000000" + }, + "<11,12>": "23", + "<11,13>": { + "<11,13,1>": "-1", + "<11,13,2>": "-1", + "<11,13,3>": "" + }, + "<11,14>": "0", + "<11,15>": { + "<11,15,1>": { + "<11,15,1,1>": "Segoe UI", + "<11,15,1,2>": "-12", + "<11,15,1,3>": "400", + "<11,15,1,4>": "0", + "<11,15,1,5>": "0", + "<11,15,1,6>": "0", + "<11,15,1,7>": "0", + "<11,15,1,8>": "34", + "<11,15,1,9>": "0", + "<11,15,1,10>": "3", + "<11,15,1,11>": "2", + "<11,15,1,12>": "1", + "<11,15,1,13>": "0", + "<11,15,1,14>": "0" + } + }, + "<11,16>": "", + "<11,17>": "", + "<11,18>": "", + "<11,19>": "", + "<11,20>": "", + "<11,21>": "", + "<11,22>": "", + "<11,23>": "", + "<11,24>": "", + "<11,25>": "", + "<11,26>": "", + "<11,27>": "", + "<11,28>": "<>", + "<11,29>": "<>", + "<11,30>": "", + "<11,31>": "", + "<11,32>": "", + "<11,33>": "", + "<11,34>": "", + "<11,35>": "", + "<11,36>": "", + "<11,37>": "", + "<11,38>": "", + "<11,39>": "", + "<11,40>": "", + "<11,41>": "", + "<11,42>": "", + "<11,43>": "", + "<11,44>": "", + "<11,45>": "", + "<11,46>": "", + "<11,47>": "", + "<11,48>": "", + "<11,49>": "", + "<11,50>": "", + "<11,51>": "", + "<11,52>": "", + "<11,53>": "", + "<11,54>": "", + "<11,55>": "", + "<11,56>": "", + "<11,57>": "", + "<11,58>": "", + "<11,59>": "", + "<11,60>": "", + "<11,61>": "", + "<11,62>": "0", + "<11,63>": { + "<11,63,1>": "", + "<11,63,2>": "", + "<11,63,3>": "", + "<11,63,4>": "", + "<11,63,5>": "", + "<11,63,6>": "", + "<11,63,7>": "", + "<11,63,8>": "" + }, + "<11,64>": { + "<11,64,1>": "", + "<11,64,2>": "", + "<11,64,3>": "" + }, + "<11,65>": "-2", + "<11,66>": "", + "<11,67>": "", + "<11,68>": "", + "<11,69>": "", + "<11,70>": "", + "<11,71>": "", + "<11,72>": "", + "<11,73>": "", + "<11,74>": "", + "<11,75>": "", + "<11,76>": "", + "<11,77>": "", + "<11,78>": "", + "<11,79>": "", + "<11,80>": "", + "<11,81>": "", + "<11,82>": "", + "<11,83>": "", + "<11,84>": "", + "<11,85>": "", + "<11,86>": "", + "<11,87>": "", + "<11,88>": "", + "<11,89>": "", + "<11,90>": "0", + "<11,91>": "0", + "<11,92>": "", + "<11,93>": "", + "<11,94>": "", + "<11,95>": "", + "<11,96>": "", + "<11,97>": "", + "<11,98>": "", + "<11,99>": "", + "<11,100>": "", + "<11,101>": "", + "<11,102>": "", + "<11,103>": "", + "<11,104>": "", + "<11,105>": "", + "<11,106>": "", + "<11,107>": "", + "<11,108>": "" + }, + "<12>": { + "<12,1>": "EDL_CURRENT_PASSWORD_CREATE_TIME", + "<12,2>": "", + "<12,3>": "EDITFIELD", + "<12,4>": "NDW_WEB_ACCOUNTS", + "<12,5>": "377", + "<12,6>": "161", + "<12,7>": "-11", + "<12,8>": "23", + "<12,9>": "", + "<12,10>": { + "<12,10,1>": "0x56000080", + "<12,10,2>": "0x200" + }, + "<12,11>": { + "<12,11,1>": "0x14000", + "<12,11,2>": "0x80000000" + }, + "<12,12>": "6", + "<12,13>": { + "<12,13,1>": "-2", + "<12,13,2>": "-2", + "<12,13,3>": "" + }, + "<12,14>": "0", + "<12,15>": { + "<12,15,1>": { + "<12,15,1,1>": "Segoe UI", + "<12,15,1,2>": "-12", + "<12,15,1,3>": "400", + "<12,15,1,4>": "0", + "<12,15,1,5>": "0", + "<12,15,1,6>": "0", + "<12,15,1,7>": "0", + "<12,15,1,8>": "34", + "<12,15,1,9>": "0", + "<12,15,1,10>": "3", + "<12,15,1,11>": "2", + "<12,15,1,12>": "1", + "<12,15,1,13>": "0", + "<12,15,1,14>": "0" + } + }, + "<12,16>": "", + "<12,17>": "", + "<12,18>": "", + "<12,19>": "", + "<12,20>": "", + "<12,21>": "", + "<12,22>": "", + "<12,23>": "", + "<12,24>": "", + "<12,25>": "", + "<12,26>": "", + "<12,27>": "", + "<12,28>": "(MT)", + "<12,29>": "MTHS", + "<12,30>": "<>", + "<12,31>": "0", + "<12,32>": "", + "<12,33>": "", + "<12,34>": "", + "<12,35>": "", + "<12,36>": { + "<12,36,1>": "0", + "<12,36,2>": "0" + }, + "<12,37>": "", + "<12,38>": "", + "<12,39>": "", + "<12,40>": "", + "<12,41>": "", + "<12,42>": "", + "<12,43>": "", + "<12,44>": "", + "<12,45>": "", + "<12,46>": "", + "<12,47>": "", + "<12,48>": "", + "<12,49>": "", + "<12,50>": "", + "<12,51>": "", + "<12,52>": "", + "<12,53>": "", + "<12,54>": "", + "<12,55>": "", + "<12,56>": "", + "<12,57>": "", + "<12,58>": "", + "<12,59>": "", + "<12,60>": "", + "<12,61>": "", + "<12,62>": "0", + "<12,63>": "", + "<12,64>": "", + "<12,65>": "", + "<12,66>": "", + "<12,67>": "", + "<12,68>": "", + "<12,69>": "", + "<12,70>": "", + "<12,71>": "", + "<12,72>": "", + "<12,73>": "", + "<12,74>": "", + "<12,75>": "", + "<12,76>": "", + "<12,77>": "", + "<12,78>": "", + "<12,79>": "", + "<12,80>": "", + "<12,81>": "", + "<12,82>": "", + "<12,83>": "", + "<12,84>": "", + "<12,85>": "", + "<12,86>": "", + "<12,87>": "", + "<12,88>": "", + "<12,89>": "", + "<12,90>": "", + "<12,91>": "", + "<12,92>": "", + "<12,93>": "", + "<12,94>": "", + "<12,95>": "", + "<12,96>": "", + "<12,97>": "", + "<12,98>": "", + "<12,99>": "", + "<12,100>": "", + "<12,101>": "", + "<12,102>": "", + "<12,103>": "", + "<12,104>": "", + "<12,105>": "", + "<12,106>": "", + "<12,107>": "", + "<12,108>": "" + }, + "<13>": { + "<13,1>": "STA_CURRENT_PASSWORD_EXPIRE_DATE", + "<13,2>": "", + "<13,3>": "STATIC", + "<13,4>": "NDW_WEB_ACCOUNTS", + "<13,5>": "229", + "<13,6>": "194", + "<13,7>": "98", + "<13,8>": "15", + "<13,9>": "Expire Date:", + "<13,10>": { + "<13,10,1>": "0x56000000", + "<13,10,2>": "0x0" + }, + "<13,11>": { + "<13,11,1>": "0x10000", + "<13,11,2>": "0x80000000" + }, + "<13,12>": "24", + "<13,13>": { + "<13,13,1>": "-1", + "<13,13,2>": "-1", + "<13,13,3>": "" + }, + "<13,14>": "0", + "<13,15>": { + "<13,15,1>": { + "<13,15,1,1>": "Segoe UI", + "<13,15,1,2>": "-12", + "<13,15,1,3>": "400", + "<13,15,1,4>": "0", + "<13,15,1,5>": "0", + "<13,15,1,6>": "0", + "<13,15,1,7>": "0", + "<13,15,1,8>": "34", + "<13,15,1,9>": "0", + "<13,15,1,10>": "3", + "<13,15,1,11>": "2", + "<13,15,1,12>": "1", + "<13,15,1,13>": "0", + "<13,15,1,14>": "0" + } + }, + "<13,16>": "", + "<13,17>": "", + "<13,18>": "", + "<13,19>": "", + "<13,20>": "", + "<13,21>": "", + "<13,22>": "", + "<13,23>": "", + "<13,24>": "", + "<13,25>": "", + "<13,26>": "", + "<13,27>": "", + "<13,28>": "<>", + "<13,29>": "<>", + "<13,30>": "", + "<13,31>": "", + "<13,32>": "", + "<13,33>": "", + "<13,34>": "", + "<13,35>": "", + "<13,36>": "", + "<13,37>": "", + "<13,38>": "", + "<13,39>": "", + "<13,40>": "", + "<13,41>": "", + "<13,42>": "", + "<13,43>": "", + "<13,44>": "", + "<13,45>": "", + "<13,46>": "", + "<13,47>": "", + "<13,48>": "", + "<13,49>": "", + "<13,50>": "", + "<13,51>": "", + "<13,52>": "", + "<13,53>": "", + "<13,54>": "", + "<13,55>": "", + "<13,56>": "", + "<13,57>": "", + "<13,58>": "", + "<13,59>": "", + "<13,60>": "", + "<13,61>": "", + "<13,62>": "0", + "<13,63>": { + "<13,63,1>": "", + "<13,63,2>": "", + "<13,63,3>": "", + "<13,63,4>": "", + "<13,63,5>": "", + "<13,63,6>": "", + "<13,63,7>": "", + "<13,63,8>": "" + }, + "<13,64>": { + "<13,64,1>": "", + "<13,64,2>": "", + "<13,64,3>": "" + }, + "<13,65>": "-2", + "<13,66>": "", + "<13,67>": "", + "<13,68>": "", + "<13,69>": "", + "<13,70>": "", + "<13,71>": "", + "<13,72>": "", + "<13,73>": "", + "<13,74>": "", + "<13,75>": "", + "<13,76>": "", + "<13,77>": "", + "<13,78>": "", + "<13,79>": "", + "<13,80>": "", + "<13,81>": "", + "<13,82>": "", + "<13,83>": "", + "<13,84>": "", + "<13,85>": "", + "<13,86>": "", + "<13,87>": "", + "<13,88>": "", + "<13,89>": "", + "<13,90>": "0", + "<13,91>": "0", + "<13,92>": "", + "<13,93>": "", + "<13,94>": "", + "<13,95>": "", + "<13,96>": "", + "<13,97>": "", + "<13,98>": "", + "<13,99>": "", + "<13,100>": "", + "<13,101>": "", + "<13,102>": "", + "<13,103>": "", + "<13,104>": "", + "<13,105>": "", + "<13,106>": "", + "<13,107>": "", + "<13,108>": "" + }, + "<14>": { + "<14,1>": "EDL_CURRENT_PASSWORD_EXPIRE_DATE", + "<14,2>": "", + "<14,3>": "EDITFIELD", + "<14,4>": "NDW_WEB_ACCOUNTS", + "<14,5>": "377", + "<14,6>": "191", + "<14,7>": "-11", + "<14,8>": "23", + "<14,9>": "", + "<14,10>": { + "<14,10,1>": "0x56000080", + "<14,10,2>": "0x200" + }, + "<14,11>": { + "<14,11,1>": "0x14000", + "<14,11,2>": "0x80000000" + }, + "<14,12>": "7", + "<14,13>": { + "<14,13,1>": "-2", + "<14,13,2>": "-2", + "<14,13,3>": "" + }, + "<14,14>": "0", + "<14,15>": { + "<14,15,1>": { + "<14,15,1,1>": "Segoe UI", + "<14,15,1,2>": "-12", + "<14,15,1,3>": "400", + "<14,15,1,4>": "0", + "<14,15,1,5>": "0", + "<14,15,1,6>": "0", + "<14,15,1,7>": "0", + "<14,15,1,8>": "34", + "<14,15,1,9>": "0", + "<14,15,1,10>": "3", + "<14,15,1,11>": "2", + "<14,15,1,12>": "1", + "<14,15,1,13>": "0", + "<14,15,1,14>": "0" + } + }, + "<14,16>": "", + "<14,17>": "", + "<14,18>": "", + "<14,19>": "", + "<14,20>": "", + "<14,21>": "", + "<14,22>": "", + "<14,23>": "", + "<14,24>": "", + "<14,25>": "", + "<14,26>": "", + "<14,27>": "", + "<14,28>": "(D)", + "<14,29>": "D4/", + "<14,30>": "<>", + "<14,31>": "0", + "<14,32>": "", + "<14,33>": "", + "<14,34>": "", + "<14,35>": "", + "<14,36>": { + "<14,36,1>": "0", + "<14,36,2>": "0" + }, + "<14,37>": "", + "<14,38>": "", + "<14,39>": "", + "<14,40>": "", + "<14,41>": "", + "<14,42>": "", + "<14,43>": "", + "<14,44>": "", + "<14,45>": "", + "<14,46>": "", + "<14,47>": "", + "<14,48>": "", + "<14,49>": "", + "<14,50>": "", + "<14,51>": "", + "<14,52>": "", + "<14,53>": "", + "<14,54>": "", + "<14,55>": "", + "<14,56>": "", + "<14,57>": "", + "<14,58>": "", + "<14,59>": "", + "<14,60>": "", + "<14,61>": "", + "<14,62>": "0", + "<14,63>": "", + "<14,64>": "", + "<14,65>": "", + "<14,66>": "", + "<14,67>": "", + "<14,68>": "", + "<14,69>": "", + "<14,70>": "", + "<14,71>": "", + "<14,72>": "", + "<14,73>": "", + "<14,74>": "", + "<14,75>": "", + "<14,76>": "", + "<14,77>": "", + "<14,78>": "", + "<14,79>": "", + "<14,80>": "", + "<14,81>": "", + "<14,82>": "", + "<14,83>": "", + "<14,84>": "", + "<14,85>": "", + "<14,86>": "", + "<14,87>": "", + "<14,88>": "", + "<14,89>": "", + "<14,90>": "", + "<14,91>": "", + "<14,92>": "", + "<14,93>": "", + "<14,94>": "", + "<14,95>": "", + "<14,96>": "", + "<14,97>": "", + "<14,98>": "", + "<14,99>": "", + "<14,100>": "", + "<14,101>": "", + "<14,102>": "", + "<14,103>": "", + "<14,104>": "", + "<14,105>": "", + "<14,106>": "", + "<14,107>": "", + "<14,108>": "" + }, + "<15>": { + "<15,1>": "STA_CURRENT_PASSWORD_EXPIRE_TIME", + "<15,2>": "", + "<15,3>": "STATIC", + "<15,4>": "NDW_WEB_ACCOUNTS", + "<15,5>": "229", + "<15,6>": "224", + "<15,7>": "98", + "<15,8>": "15", + "<15,9>": "Expire Time:", + "<15,10>": { + "<15,10,1>": "0x56000000", + "<15,10,2>": "0x0" + }, + "<15,11>": { + "<15,11,1>": "0x10000", + "<15,11,2>": "0x80000000" + }, + "<15,12>": "25", + "<15,13>": { + "<15,13,1>": "-1", + "<15,13,2>": "-1", + "<15,13,3>": "" + }, + "<15,14>": "0", + "<15,15>": { + "<15,15,1>": { + "<15,15,1,1>": "Segoe UI", + "<15,15,1,2>": "-12", + "<15,15,1,3>": "400", + "<15,15,1,4>": "0", + "<15,15,1,5>": "0", + "<15,15,1,6>": "0", + "<15,15,1,7>": "0", + "<15,15,1,8>": "34", + "<15,15,1,9>": "0", + "<15,15,1,10>": "3", + "<15,15,1,11>": "2", + "<15,15,1,12>": "1", + "<15,15,1,13>": "0", + "<15,15,1,14>": "0" + } + }, + "<15,16>": "", + "<15,17>": "", + "<15,18>": "", + "<15,19>": "", + "<15,20>": "", + "<15,21>": "", + "<15,22>": "", + "<15,23>": "", + "<15,24>": "", + "<15,25>": "", + "<15,26>": "", + "<15,27>": "", + "<15,28>": "<>", + "<15,29>": "<>", + "<15,30>": "", + "<15,31>": "", + "<15,32>": "", + "<15,33>": "", + "<15,34>": "", + "<15,35>": "", + "<15,36>": "", + "<15,37>": "", + "<15,38>": "", + "<15,39>": "", + "<15,40>": "", + "<15,41>": "", + "<15,42>": "", + "<15,43>": "", + "<15,44>": "", + "<15,45>": "", + "<15,46>": "", + "<15,47>": "", + "<15,48>": "", + "<15,49>": "", + "<15,50>": "", + "<15,51>": "", + "<15,52>": "", + "<15,53>": "", + "<15,54>": "", + "<15,55>": "", + "<15,56>": "", + "<15,57>": "", + "<15,58>": "", + "<15,59>": "", + "<15,60>": "", + "<15,61>": "", + "<15,62>": "0", + "<15,63>": { + "<15,63,1>": "", + "<15,63,2>": "", + "<15,63,3>": "", + "<15,63,4>": "", + "<15,63,5>": "", + "<15,63,6>": "", + "<15,63,7>": "", + "<15,63,8>": "" + }, + "<15,64>": { + "<15,64,1>": "", + "<15,64,2>": "", + "<15,64,3>": "" + }, + "<15,65>": "-2", + "<15,66>": "", + "<15,67>": "", + "<15,68>": "", + "<15,69>": "", + "<15,70>": "", + "<15,71>": "", + "<15,72>": "", + "<15,73>": "", + "<15,74>": "", + "<15,75>": "", + "<15,76>": "", + "<15,77>": "", + "<15,78>": "", + "<15,79>": "", + "<15,80>": "", + "<15,81>": "", + "<15,82>": "", + "<15,83>": "", + "<15,84>": "", + "<15,85>": "", + "<15,86>": "", + "<15,87>": "", + "<15,88>": "", + "<15,89>": "", + "<15,90>": "0", + "<15,91>": "0", + "<15,92>": "", + "<15,93>": "", + "<15,94>": "", + "<15,95>": "", + "<15,96>": "", + "<15,97>": "", + "<15,98>": "", + "<15,99>": "", + "<15,100>": "", + "<15,101>": "", + "<15,102>": "", + "<15,103>": "", + "<15,104>": "", + "<15,105>": "", + "<15,106>": "", + "<15,107>": "", + "<15,108>": "" + }, + "<16>": { + "<16,1>": "EDL_CURRENT_PASSWORD_EXPIRE_TIME", + "<16,2>": "", + "<16,3>": "EDITFIELD", + "<16,4>": "NDW_WEB_ACCOUNTS", + "<16,5>": "377", + "<16,6>": "221", + "<16,7>": "-11", + "<16,8>": "23", + "<16,9>": "", + "<16,10>": { + "<16,10,1>": "0x56000080", + "<16,10,2>": "0x200" + }, + "<16,11>": { + "<16,11,1>": "0x14000", + "<16,11,2>": "0x80000000" + }, + "<16,12>": "8", + "<16,13>": { + "<16,13,1>": "-2", + "<16,13,2>": "-2", + "<16,13,3>": "" + }, + "<16,14>": "0", + "<16,15>": { + "<16,15,1>": { + "<16,15,1,1>": "Segoe UI", + "<16,15,1,2>": "-12", + "<16,15,1,3>": "400", + "<16,15,1,4>": "0", + "<16,15,1,5>": "0", + "<16,15,1,6>": "0", + "<16,15,1,7>": "0", + "<16,15,1,8>": "34", + "<16,15,1,9>": "0", + "<16,15,1,10>": "3", + "<16,15,1,11>": "2", + "<16,15,1,12>": "1", + "<16,15,1,13>": "0", + "<16,15,1,14>": "0" + } + }, + "<16,16>": "", + "<16,17>": "", + "<16,18>": "", + "<16,19>": "", + "<16,20>": "", + "<16,21>": "", + "<16,22>": "", + "<16,23>": "", + "<16,24>": "", + "<16,25>": "", + "<16,26>": "", + "<16,27>": "", + "<16,28>": "(MT)", + "<16,29>": "MTHS", + "<16,30>": "<>", + "<16,31>": "0", + "<16,32>": "", + "<16,33>": "", + "<16,34>": "", + "<16,35>": "", + "<16,36>": { + "<16,36,1>": "0", + "<16,36,2>": "0" + }, + "<16,37>": "", + "<16,38>": "", + "<16,39>": "", + "<16,40>": "", + "<16,41>": "", + "<16,42>": "", + "<16,43>": "", + "<16,44>": "", + "<16,45>": "", + "<16,46>": "", + "<16,47>": "", + "<16,48>": "", + "<16,49>": "", + "<16,50>": "", + "<16,51>": "", + "<16,52>": "", + "<16,53>": "", + "<16,54>": "", + "<16,55>": "", + "<16,56>": "", + "<16,57>": "", + "<16,58>": "", + "<16,59>": "", + "<16,60>": "", + "<16,61>": "", + "<16,62>": "0", + "<16,63>": "", + "<16,64>": "", + "<16,65>": "", + "<16,66>": "", + "<16,67>": "", + "<16,68>": "", + "<16,69>": "", + "<16,70>": "", + "<16,71>": "", + "<16,72>": "", + "<16,73>": "", + "<16,74>": "", + "<16,75>": "", + "<16,76>": "", + "<16,77>": "", + "<16,78>": "", + "<16,79>": "", + "<16,80>": "", + "<16,81>": "", + "<16,82>": "", + "<16,83>": "", + "<16,84>": "", + "<16,85>": "", + "<16,86>": "", + "<16,87>": "", + "<16,88>": "", + "<16,89>": "", + "<16,90>": "", + "<16,91>": "", + "<16,92>": "", + "<16,93>": "", + "<16,94>": "", + "<16,95>": "", + "<16,96>": "", + "<16,97>": "", + "<16,98>": "", + "<16,99>": "", + "<16,100>": "", + "<16,101>": "", + "<16,102>": "", + "<16,103>": "", + "<16,104>": "", + "<16,105>": "", + "<16,106>": "", + "<16,107>": "", + "<16,108>": "" + }, + "<17>": { + "<17,1>": "STA_OLD_PASSWORD", + "<17,2>": "", + "<17,3>": "STATIC", + "<17,4>": "NDW_WEB_ACCOUNTS", + "<17,5>": "229", + "<17,6>": "254", + "<17,7>": "98", + "<17,8>": "15", + "<17,9>": "Old Password:", + "<17,10>": { + "<17,10,1>": "0x56000000", + "<17,10,2>": "0x0" + }, + "<17,11>": { + "<17,11,1>": "0x10000", + "<17,11,2>": "0x80000000" + }, + "<17,12>": "26", + "<17,13>": { + "<17,13,1>": "-1", + "<17,13,2>": "-1", + "<17,13,3>": "" + }, + "<17,14>": "0", + "<17,15>": { + "<17,15,1>": { + "<17,15,1,1>": "Segoe UI", + "<17,15,1,2>": "-12", + "<17,15,1,3>": "400", + "<17,15,1,4>": "0", + "<17,15,1,5>": "0", + "<17,15,1,6>": "0", + "<17,15,1,7>": "0", + "<17,15,1,8>": "34", + "<17,15,1,9>": "0", + "<17,15,1,10>": "3", + "<17,15,1,11>": "2", + "<17,15,1,12>": "1", + "<17,15,1,13>": "0", + "<17,15,1,14>": "0" + } + }, + "<17,16>": "", + "<17,17>": "", + "<17,18>": "", + "<17,19>": "", + "<17,20>": "", + "<17,21>": "", + "<17,22>": "", + "<17,23>": "", + "<17,24>": "", + "<17,25>": "", + "<17,26>": "", + "<17,27>": "", + "<17,28>": "<>", + "<17,29>": "<>", + "<17,30>": "", + "<17,31>": "", + "<17,32>": "", + "<17,33>": "", + "<17,34>": "", + "<17,35>": "", + "<17,36>": "", + "<17,37>": "", + "<17,38>": "", + "<17,39>": "", + "<17,40>": "", + "<17,41>": "", + "<17,42>": "", + "<17,43>": "", + "<17,44>": "", + "<17,45>": "", + "<17,46>": "", + "<17,47>": "", + "<17,48>": "", + "<17,49>": "", + "<17,50>": "", + "<17,51>": "", + "<17,52>": "", + "<17,53>": "", + "<17,54>": "", + "<17,55>": "", + "<17,56>": "", + "<17,57>": "", + "<17,58>": "", + "<17,59>": "", + "<17,60>": "", + "<17,61>": "", + "<17,62>": "0", + "<17,63>": { + "<17,63,1>": "", + "<17,63,2>": "", + "<17,63,3>": "", + "<17,63,4>": "", + "<17,63,5>": "", + "<17,63,6>": "", + "<17,63,7>": "", + "<17,63,8>": "" + }, + "<17,64>": { + "<17,64,1>": "", + "<17,64,2>": "", + "<17,64,3>": "" + }, + "<17,65>": "-2", + "<17,66>": "", + "<17,67>": "", + "<17,68>": "", + "<17,69>": "", + "<17,70>": "", + "<17,71>": "", + "<17,72>": "", + "<17,73>": "", + "<17,74>": "", + "<17,75>": "", + "<17,76>": "", + "<17,77>": "", + "<17,78>": "", + "<17,79>": "", + "<17,80>": "", + "<17,81>": "", + "<17,82>": "", + "<17,83>": "", + "<17,84>": "", + "<17,85>": "", + "<17,86>": "", + "<17,87>": "", + "<17,88>": "", + "<17,89>": "", + "<17,90>": "0", + "<17,91>": "0", + "<17,92>": "", + "<17,93>": "", + "<17,94>": "", + "<17,95>": "", + "<17,96>": "", + "<17,97>": "", + "<17,98>": "", + "<17,99>": "", + "<17,100>": "", + "<17,101>": "", + "<17,102>": "", + "<17,103>": "", + "<17,104>": "", + "<17,105>": "", + "<17,106>": "", + "<17,107>": "", + "<17,108>": "" + }, + "<18>": { + "<18,1>": "EDL_OLD_PASSWORD", + "<18,2>": "", + "<18,3>": "EDITFIELD", + "<18,4>": "NDW_WEB_ACCOUNTS", + "<18,5>": "377", + "<18,6>": "251", + "<18,7>": "-11", + "<18,8>": "23", + "<18,9>": "", + "<18,10>": { + "<18,10,1>": "0x56000080", + "<18,10,2>": "0x200" + }, + "<18,11>": { + "<18,11,1>": "0x14000", + "<18,11,2>": "0x80000000" + }, + "<18,12>": "9", + "<18,13>": { + "<18,13,1>": "-2", + "<18,13,2>": "-2", + "<18,13,3>": "" + }, + "<18,14>": "0", + "<18,15>": { + "<18,15,1>": { + "<18,15,1,1>": "Segoe UI", + "<18,15,1,2>": "-12", + "<18,15,1,3>": "400", + "<18,15,1,4>": "0", + "<18,15,1,5>": "0", + "<18,15,1,6>": "0", + "<18,15,1,7>": "0", + "<18,15,1,8>": "34", + "<18,15,1,9>": "0", + "<18,15,1,10>": "3", + "<18,15,1,11>": "2", + "<18,15,1,12>": "1", + "<18,15,1,13>": "0", + "<18,15,1,14>": "0" + } + }, + "<18,16>": "", + "<18,17>": "", + "<18,18>": "", + "<18,19>": "", + "<18,20>": "", + "<18,21>": "", + "<18,22>": "", + "<18,23>": "", + "<18,24>": "", + "<18,25>": "", + "<18,26>": "", + "<18,27>": "", + "<18,28>": "<>", + "<18,29>": "<>", + "<18,30>": "<>", + "<18,31>": "0", + "<18,32>": "", + "<18,33>": "", + "<18,34>": "", + "<18,35>": "", + "<18,36>": { + "<18,36,1>": "0", + "<18,36,2>": "0" + }, + "<18,37>": "", + "<18,38>": "", + "<18,39>": "", + "<18,40>": "", + "<18,41>": "", + "<18,42>": "", + "<18,43>": "", + "<18,44>": "", + "<18,45>": "", + "<18,46>": "", + "<18,47>": "", + "<18,48>": "", + "<18,49>": "", + "<18,50>": "", + "<18,51>": "", + "<18,52>": "", + "<18,53>": "", + "<18,54>": "", + "<18,55>": "", + "<18,56>": "", + "<18,57>": "", + "<18,58>": "", + "<18,59>": "", + "<18,60>": "", + "<18,61>": "", + "<18,62>": "0", + "<18,63>": "", + "<18,64>": "", + "<18,65>": "", + "<18,66>": "", + "<18,67>": "", + "<18,68>": "", + "<18,69>": "", + "<18,70>": "", + "<18,71>": "", + "<18,72>": "", + "<18,73>": "", + "<18,74>": "", + "<18,75>": "", + "<18,76>": "", + "<18,77>": "", + "<18,78>": "", + "<18,79>": "", + "<18,80>": "", + "<18,81>": "", + "<18,82>": "", + "<18,83>": "", + "<18,84>": "", + "<18,85>": "", + "<18,86>": "", + "<18,87>": "", + "<18,88>": "", + "<18,89>": "", + "<18,90>": "", + "<18,91>": "", + "<18,92>": "", + "<18,93>": "", + "<18,94>": "", + "<18,95>": "", + "<18,96>": "", + "<18,97>": "", + "<18,98>": "", + "<18,99>": "", + "<18,100>": "", + "<18,101>": "", + "<18,102>": "", + "<18,103>": "", + "<18,104>": "", + "<18,105>": "", + "<18,106>": "", + "<18,107>": "", + "<18,108>": "" + }, + "<19>": { + "<19,1>": "STA_OLD_PASSWORD_CREATE_DATE", + "<19,2>": "", + "<19,3>": "STATIC", + "<19,4>": "NDW_WEB_ACCOUNTS", + "<19,5>": "229", + "<19,6>": "284", + "<19,7>": "98", + "<19,8>": "15", + "<19,9>": "Create Date:", + "<19,10>": { + "<19,10,1>": "0x56000000", + "<19,10,2>": "0x0" + }, + "<19,11>": { + "<19,11,1>": "0x10000", + "<19,11,2>": "0x80000000" + }, + "<19,12>": "27", + "<19,13>": { + "<19,13,1>": "-1", + "<19,13,2>": "-1", + "<19,13,3>": "" + }, + "<19,14>": "0", + "<19,15>": { + "<19,15,1>": { + "<19,15,1,1>": "Segoe UI", + "<19,15,1,2>": "-12", + "<19,15,1,3>": "400", + "<19,15,1,4>": "0", + "<19,15,1,5>": "0", + "<19,15,1,6>": "0", + "<19,15,1,7>": "0", + "<19,15,1,8>": "34", + "<19,15,1,9>": "0", + "<19,15,1,10>": "3", + "<19,15,1,11>": "2", + "<19,15,1,12>": "1", + "<19,15,1,13>": "0", + "<19,15,1,14>": "0" + } + }, + "<19,16>": "", + "<19,17>": "", + "<19,18>": "", + "<19,19>": "", + "<19,20>": "", + "<19,21>": "", + "<19,22>": "", + "<19,23>": "", + "<19,24>": "", + "<19,25>": "", + "<19,26>": "", + "<19,27>": "", + "<19,28>": "<>", + "<19,29>": "<>", + "<19,30>": "", + "<19,31>": "", + "<19,32>": "", + "<19,33>": "", + "<19,34>": "", + "<19,35>": "", + "<19,36>": "", + "<19,37>": "", + "<19,38>": "", + "<19,39>": "", + "<19,40>": "", + "<19,41>": "", + "<19,42>": "", + "<19,43>": "", + "<19,44>": "", + "<19,45>": "", + "<19,46>": "", + "<19,47>": "", + "<19,48>": "", + "<19,49>": "", + "<19,50>": "", + "<19,51>": "", + "<19,52>": "", + "<19,53>": "", + "<19,54>": "", + "<19,55>": "", + "<19,56>": "", + "<19,57>": "", + "<19,58>": "", + "<19,59>": "", + "<19,60>": "", + "<19,61>": "", + "<19,62>": "0", + "<19,63>": { + "<19,63,1>": "", + "<19,63,2>": "", + "<19,63,3>": "", + "<19,63,4>": "", + "<19,63,5>": "", + "<19,63,6>": "", + "<19,63,7>": "", + "<19,63,8>": "" + }, + "<19,64>": { + "<19,64,1>": "", + "<19,64,2>": "", + "<19,64,3>": "" + }, + "<19,65>": "-2", + "<19,66>": "", + "<19,67>": "", + "<19,68>": "", + "<19,69>": "", + "<19,70>": "", + "<19,71>": "", + "<19,72>": "", + "<19,73>": "", + "<19,74>": "", + "<19,75>": "", + "<19,76>": "", + "<19,77>": "", + "<19,78>": "", + "<19,79>": "", + "<19,80>": "", + "<19,81>": "", + "<19,82>": "", + "<19,83>": "", + "<19,84>": "", + "<19,85>": "", + "<19,86>": "", + "<19,87>": "", + "<19,88>": "", + "<19,89>": "", + "<19,90>": "0", + "<19,91>": "0", + "<19,92>": "", + "<19,93>": "", + "<19,94>": "", + "<19,95>": "", + "<19,96>": "", + "<19,97>": "", + "<19,98>": "", + "<19,99>": "", + "<19,100>": "", + "<19,101>": "", + "<19,102>": "", + "<19,103>": "", + "<19,104>": "", + "<19,105>": "", + "<19,106>": "", + "<19,107>": "", + "<19,108>": "" + }, + "<20>": { + "<20,1>": "EDL_OLD_PASSWORD_CREATE_DATE", + "<20,2>": "", + "<20,3>": "EDITFIELD", + "<20,4>": "NDW_WEB_ACCOUNTS", + "<20,5>": "377", + "<20,6>": "281", + "<20,7>": "-11", + "<20,8>": "23", + "<20,9>": "", + "<20,10>": { + "<20,10,1>": "0x56000080", + "<20,10,2>": "0x200" + }, + "<20,11>": { + "<20,11,1>": "0x14000", + "<20,11,2>": "0x80000000" + }, + "<20,12>": "10", + "<20,13>": { + "<20,13,1>": "-2", + "<20,13,2>": "-2", + "<20,13,3>": "" + }, + "<20,14>": "0", + "<20,15>": { + "<20,15,1>": { + "<20,15,1,1>": "Segoe UI", + "<20,15,1,2>": "-12", + "<20,15,1,3>": "400", + "<20,15,1,4>": "0", + "<20,15,1,5>": "0", + "<20,15,1,6>": "0", + "<20,15,1,7>": "0", + "<20,15,1,8>": "34", + "<20,15,1,9>": "0", + "<20,15,1,10>": "3", + "<20,15,1,11>": "2", + "<20,15,1,12>": "1", + "<20,15,1,13>": "0", + "<20,15,1,14>": "0" + } + }, + "<20,16>": "", + "<20,17>": "", + "<20,18>": "", + "<20,19>": "", + "<20,20>": "", + "<20,21>": "", + "<20,22>": "", + "<20,23>": "", + "<20,24>": "", + "<20,25>": "", + "<20,26>": "", + "<20,27>": "", + "<20,28>": "(D)", + "<20,29>": "D4/", + "<20,30>": "<>", + "<20,31>": "0", + "<20,32>": "", + "<20,33>": "", + "<20,34>": "", + "<20,35>": "", + "<20,36>": { + "<20,36,1>": "0", + "<20,36,2>": "0" + }, + "<20,37>": "", + "<20,38>": "", + "<20,39>": "", + "<20,40>": "", + "<20,41>": "", + "<20,42>": "", + "<20,43>": "", + "<20,44>": "", + "<20,45>": "", + "<20,46>": "", + "<20,47>": "", + "<20,48>": "", + "<20,49>": "", + "<20,50>": "", + "<20,51>": "", + "<20,52>": "", + "<20,53>": "", + "<20,54>": "", + "<20,55>": "", + "<20,56>": "", + "<20,57>": "", + "<20,58>": "", + "<20,59>": "", + "<20,60>": "", + "<20,61>": "", + "<20,62>": "0", + "<20,63>": "", + "<20,64>": "", + "<20,65>": "", + "<20,66>": "", + "<20,67>": "", + "<20,68>": "", + "<20,69>": "", + "<20,70>": "", + "<20,71>": "", + "<20,72>": "", + "<20,73>": "", + "<20,74>": "", + "<20,75>": "", + "<20,76>": "", + "<20,77>": "", + "<20,78>": "", + "<20,79>": "", + "<20,80>": "", + "<20,81>": "", + "<20,82>": "", + "<20,83>": "", + "<20,84>": "", + "<20,85>": "", + "<20,86>": "", + "<20,87>": "", + "<20,88>": "", + "<20,89>": "", + "<20,90>": "", + "<20,91>": "", + "<20,92>": "", + "<20,93>": "", + "<20,94>": "", + "<20,95>": "", + "<20,96>": "", + "<20,97>": "", + "<20,98>": "", + "<20,99>": "", + "<20,100>": "", + "<20,101>": "", + "<20,102>": "", + "<20,103>": "", + "<20,104>": "", + "<20,105>": "", + "<20,106>": "", + "<20,107>": "", + "<20,108>": "" + }, + "<21>": { + "<21,1>": "STA_OLD_PASSWORD_CREATE_TIME", + "<21,2>": "", + "<21,3>": "STATIC", + "<21,4>": "NDW_WEB_ACCOUNTS", + "<21,5>": "229", + "<21,6>": "314", + "<21,7>": "98", + "<21,8>": "15", + "<21,9>": "Create Time:", + "<21,10>": { + "<21,10,1>": "0x56000000", + "<21,10,2>": "0x0" + }, + "<21,11>": { + "<21,11,1>": "0x10000", + "<21,11,2>": "0x80000000" + }, + "<21,12>": "28", + "<21,13>": { + "<21,13,1>": "-1", + "<21,13,2>": "-1", + "<21,13,3>": "" + }, + "<21,14>": "0", + "<21,15>": { + "<21,15,1>": { + "<21,15,1,1>": "Segoe UI", + "<21,15,1,2>": "-12", + "<21,15,1,3>": "400", + "<21,15,1,4>": "0", + "<21,15,1,5>": "0", + "<21,15,1,6>": "0", + "<21,15,1,7>": "0", + "<21,15,1,8>": "34", + "<21,15,1,9>": "0", + "<21,15,1,10>": "3", + "<21,15,1,11>": "2", + "<21,15,1,12>": "1", + "<21,15,1,13>": "0", + "<21,15,1,14>": "0" + } + }, + "<21,16>": "", + "<21,17>": "", + "<21,18>": "", + "<21,19>": "", + "<21,20>": "", + "<21,21>": "", + "<21,22>": "", + "<21,23>": "", + "<21,24>": "", + "<21,25>": "", + "<21,26>": "", + "<21,27>": "", + "<21,28>": "<>", + "<21,29>": "<>", + "<21,30>": "", + "<21,31>": "", + "<21,32>": "", + "<21,33>": "", + "<21,34>": "", + "<21,35>": "", + "<21,36>": "", + "<21,37>": "", + "<21,38>": "", + "<21,39>": "", + "<21,40>": "", + "<21,41>": "", + "<21,42>": "", + "<21,43>": "", + "<21,44>": "", + "<21,45>": "", + "<21,46>": "", + "<21,47>": "", + "<21,48>": "", + "<21,49>": "", + "<21,50>": "", + "<21,51>": "", + "<21,52>": "", + "<21,53>": "", + "<21,54>": "", + "<21,55>": "", + "<21,56>": "", + "<21,57>": "", + "<21,58>": "", + "<21,59>": "", + "<21,60>": "", + "<21,61>": "", + "<21,62>": "0", + "<21,63>": { + "<21,63,1>": "", + "<21,63,2>": "", + "<21,63,3>": "", + "<21,63,4>": "", + "<21,63,5>": "", + "<21,63,6>": "", + "<21,63,7>": "", + "<21,63,8>": "" + }, + "<21,64>": { + "<21,64,1>": "", + "<21,64,2>": "", + "<21,64,3>": "" + }, + "<21,65>": "-2", + "<21,66>": "", + "<21,67>": "", + "<21,68>": "", + "<21,69>": "", + "<21,70>": "", + "<21,71>": "", + "<21,72>": "", + "<21,73>": "", + "<21,74>": "", + "<21,75>": "", + "<21,76>": "", + "<21,77>": "", + "<21,78>": "", + "<21,79>": "", + "<21,80>": "", + "<21,81>": "", + "<21,82>": "", + "<21,83>": "", + "<21,84>": "", + "<21,85>": "", + "<21,86>": "", + "<21,87>": "", + "<21,88>": "", + "<21,89>": "", + "<21,90>": "0", + "<21,91>": "0", + "<21,92>": "", + "<21,93>": "", + "<21,94>": "", + "<21,95>": "", + "<21,96>": "", + "<21,97>": "", + "<21,98>": "", + "<21,99>": "", + "<21,100>": "", + "<21,101>": "", + "<21,102>": "", + "<21,103>": "", + "<21,104>": "", + "<21,105>": "", + "<21,106>": "", + "<21,107>": "", + "<21,108>": "" + }, + "<22>": { + "<22,1>": "EDL_OLD_PASSWORD_CREATE_TIME", + "<22,2>": "", + "<22,3>": "EDITFIELD", + "<22,4>": "NDW_WEB_ACCOUNTS", + "<22,5>": "377", + "<22,6>": "311", + "<22,7>": "-11", + "<22,8>": "23", + "<22,9>": "", + "<22,10>": { + "<22,10,1>": "0x56000080", + "<22,10,2>": "0x200" + }, + "<22,11>": { + "<22,11,1>": "0x14000", + "<22,11,2>": "0x80000000" + }, + "<22,12>": "11", + "<22,13>": { + "<22,13,1>": "-2", + "<22,13,2>": "-2", + "<22,13,3>": "" + }, + "<22,14>": "0", + "<22,15>": { + "<22,15,1>": { + "<22,15,1,1>": "Segoe UI", + "<22,15,1,2>": "-12", + "<22,15,1,3>": "400", + "<22,15,1,4>": "0", + "<22,15,1,5>": "0", + "<22,15,1,6>": "0", + "<22,15,1,7>": "0", + "<22,15,1,8>": "34", + "<22,15,1,9>": "0", + "<22,15,1,10>": "3", + "<22,15,1,11>": "2", + "<22,15,1,12>": "1", + "<22,15,1,13>": "0", + "<22,15,1,14>": "0" + } + }, + "<22,16>": "", + "<22,17>": "", + "<22,18>": "", + "<22,19>": "", + "<22,20>": "", + "<22,21>": "", + "<22,22>": "", + "<22,23>": "", + "<22,24>": "", + "<22,25>": "", + "<22,26>": "", + "<22,27>": "", + "<22,28>": "(MT)", + "<22,29>": "MTHS", + "<22,30>": "<>", + "<22,31>": "0", + "<22,32>": "", + "<22,33>": "", + "<22,34>": "", + "<22,35>": "", + "<22,36>": { + "<22,36,1>": "0", + "<22,36,2>": "0" + }, + "<22,37>": "", + "<22,38>": "", + "<22,39>": "", + "<22,40>": "", + "<22,41>": "", + "<22,42>": "", + "<22,43>": "", + "<22,44>": "", + "<22,45>": "", + "<22,46>": "", + "<22,47>": "", + "<22,48>": "", + "<22,49>": "", + "<22,50>": "", + "<22,51>": "", + "<22,52>": "", + "<22,53>": "", + "<22,54>": "", + "<22,55>": "", + "<22,56>": "", + "<22,57>": "", + "<22,58>": "", + "<22,59>": "", + "<22,60>": "", + "<22,61>": "", + "<22,62>": "0", + "<22,63>": "", + "<22,64>": "", + "<22,65>": "", + "<22,66>": "", + "<22,67>": "", + "<22,68>": "", + "<22,69>": "", + "<22,70>": "", + "<22,71>": "", + "<22,72>": "", + "<22,73>": "", + "<22,74>": "", + "<22,75>": "", + "<22,76>": "", + "<22,77>": "", + "<22,78>": "", + "<22,79>": "", + "<22,80>": "", + "<22,81>": "", + "<22,82>": "", + "<22,83>": "", + "<22,84>": "", + "<22,85>": "", + "<22,86>": "", + "<22,87>": "", + "<22,88>": "", + "<22,89>": "", + "<22,90>": "", + "<22,91>": "", + "<22,92>": "", + "<22,93>": "", + "<22,94>": "", + "<22,95>": "", + "<22,96>": "", + "<22,97>": "", + "<22,98>": "", + "<22,99>": "", + "<22,100>": "", + "<22,101>": "", + "<22,102>": "", + "<22,103>": "", + "<22,104>": "", + "<22,105>": "", + "<22,106>": "", + "<22,107>": "", + "<22,108>": "" + }, + "<23>": { + "<23,1>": "STA_OLD_PASSWORD_EXPIRE_DATE", + "<23,2>": "", + "<23,3>": "STATIC", + "<23,4>": "NDW_WEB_ACCOUNTS", + "<23,5>": "229", + "<23,6>": "344", + "<23,7>": "98", + "<23,8>": "15", + "<23,9>": "Expire Date:", + "<23,10>": { + "<23,10,1>": "0x56000000", + "<23,10,2>": "0x0" + }, + "<23,11>": { + "<23,11,1>": "0x10000", + "<23,11,2>": "0x80000000" + }, + "<23,12>": "29", + "<23,13>": { + "<23,13,1>": "-1", + "<23,13,2>": "-1", + "<23,13,3>": "" + }, + "<23,14>": "0", + "<23,15>": { + "<23,15,1>": { + "<23,15,1,1>": "Segoe UI", + "<23,15,1,2>": "-12", + "<23,15,1,3>": "400", + "<23,15,1,4>": "0", + "<23,15,1,5>": "0", + "<23,15,1,6>": "0", + "<23,15,1,7>": "0", + "<23,15,1,8>": "34", + "<23,15,1,9>": "0", + "<23,15,1,10>": "3", + "<23,15,1,11>": "2", + "<23,15,1,12>": "1", + "<23,15,1,13>": "0", + "<23,15,1,14>": "0" + } + }, + "<23,16>": "", + "<23,17>": "", + "<23,18>": "", + "<23,19>": "", + "<23,20>": "", + "<23,21>": "", + "<23,22>": "", + "<23,23>": "", + "<23,24>": "", + "<23,25>": "", + "<23,26>": "", + "<23,27>": "", + "<23,28>": "<>", + "<23,29>": "<>", + "<23,30>": "", + "<23,31>": "", + "<23,32>": "", + "<23,33>": "", + "<23,34>": "", + "<23,35>": "", + "<23,36>": "", + "<23,37>": "", + "<23,38>": "", + "<23,39>": "", + "<23,40>": "", + "<23,41>": "", + "<23,42>": "", + "<23,43>": "", + "<23,44>": "", + "<23,45>": "", + "<23,46>": "", + "<23,47>": "", + "<23,48>": "", + "<23,49>": "", + "<23,50>": "", + "<23,51>": "", + "<23,52>": "", + "<23,53>": "", + "<23,54>": "", + "<23,55>": "", + "<23,56>": "", + "<23,57>": "", + "<23,58>": "", + "<23,59>": "", + "<23,60>": "", + "<23,61>": "", + "<23,62>": "0", + "<23,63>": { + "<23,63,1>": "", + "<23,63,2>": "", + "<23,63,3>": "", + "<23,63,4>": "", + "<23,63,5>": "", + "<23,63,6>": "", + "<23,63,7>": "", + "<23,63,8>": "" + }, + "<23,64>": { + "<23,64,1>": "", + "<23,64,2>": "", + "<23,64,3>": "" + }, + "<23,65>": "-2", + "<23,66>": "", + "<23,67>": "", + "<23,68>": "", + "<23,69>": "", + "<23,70>": "", + "<23,71>": "", + "<23,72>": "", + "<23,73>": "", + "<23,74>": "", + "<23,75>": "", + "<23,76>": "", + "<23,77>": "", + "<23,78>": "", + "<23,79>": "", + "<23,80>": "", + "<23,81>": "", + "<23,82>": "", + "<23,83>": "", + "<23,84>": "", + "<23,85>": "", + "<23,86>": "", + "<23,87>": "", + "<23,88>": "", + "<23,89>": "", + "<23,90>": "0", + "<23,91>": "0", + "<23,92>": "", + "<23,93>": "", + "<23,94>": "", + "<23,95>": "", + "<23,96>": "", + "<23,97>": "", + "<23,98>": "", + "<23,99>": "", + "<23,100>": "", + "<23,101>": "", + "<23,102>": "", + "<23,103>": "", + "<23,104>": "", + "<23,105>": "", + "<23,106>": "", + "<23,107>": "", + "<23,108>": "" + }, + "<24>": { + "<24,1>": "EDL_OLD_PASSWORD_EXPIRE_DATE", + "<24,2>": "", + "<24,3>": "EDITFIELD", + "<24,4>": "NDW_WEB_ACCOUNTS", + "<24,5>": "377", + "<24,6>": "341", + "<24,7>": "-11", + "<24,8>": "23", + "<24,9>": "", + "<24,10>": { + "<24,10,1>": "0x56000080", + "<24,10,2>": "0x200" + }, + "<24,11>": { + "<24,11,1>": "0x14000", + "<24,11,2>": "0x80000000" + }, + "<24,12>": "12", + "<24,13>": { + "<24,13,1>": "-2", + "<24,13,2>": "-2", + "<24,13,3>": "" + }, + "<24,14>": "0", + "<24,15>": { + "<24,15,1>": { + "<24,15,1,1>": "Segoe UI", + "<24,15,1,2>": "-12", + "<24,15,1,3>": "400", + "<24,15,1,4>": "0", + "<24,15,1,5>": "0", + "<24,15,1,6>": "0", + "<24,15,1,7>": "0", + "<24,15,1,8>": "34", + "<24,15,1,9>": "0", + "<24,15,1,10>": "3", + "<24,15,1,11>": "2", + "<24,15,1,12>": "1", + "<24,15,1,13>": "0", + "<24,15,1,14>": "0" + } + }, + "<24,16>": "", + "<24,17>": "", + "<24,18>": "", + "<24,19>": "", + "<24,20>": "", + "<24,21>": "", + "<24,22>": "", + "<24,23>": "", + "<24,24>": "", + "<24,25>": "", + "<24,26>": "", + "<24,27>": "", + "<24,28>": "(D)", + "<24,29>": "D4/", + "<24,30>": "<>", + "<24,31>": "0", + "<24,32>": "", + "<24,33>": "", + "<24,34>": "", + "<24,35>": "", + "<24,36>": { + "<24,36,1>": "0", + "<24,36,2>": "0" + }, + "<24,37>": "", + "<24,38>": "", + "<24,39>": "", + "<24,40>": "", + "<24,41>": "", + "<24,42>": "", + "<24,43>": "", + "<24,44>": "", + "<24,45>": "", + "<24,46>": "", + "<24,47>": "", + "<24,48>": "", + "<24,49>": "", + "<24,50>": "", + "<24,51>": "", + "<24,52>": "", + "<24,53>": "", + "<24,54>": "", + "<24,55>": "", + "<24,56>": "", + "<24,57>": "", + "<24,58>": "", + "<24,59>": "", + "<24,60>": "", + "<24,61>": "", + "<24,62>": "0", + "<24,63>": "", + "<24,64>": "", + "<24,65>": "", + "<24,66>": "", + "<24,67>": "", + "<24,68>": "", + "<24,69>": "", + "<24,70>": "", + "<24,71>": "", + "<24,72>": "", + "<24,73>": "", + "<24,74>": "", + "<24,75>": "", + "<24,76>": "", + "<24,77>": "", + "<24,78>": "", + "<24,79>": "", + "<24,80>": "", + "<24,81>": "", + "<24,82>": "", + "<24,83>": "", + "<24,84>": "", + "<24,85>": "", + "<24,86>": "", + "<24,87>": "", + "<24,88>": "", + "<24,89>": "", + "<24,90>": "", + "<24,91>": "", + "<24,92>": "", + "<24,93>": "", + "<24,94>": "", + "<24,95>": "", + "<24,96>": "", + "<24,97>": "", + "<24,98>": "", + "<24,99>": "", + "<24,100>": "", + "<24,101>": "", + "<24,102>": "", + "<24,103>": "", + "<24,104>": "", + "<24,105>": "", + "<24,106>": "", + "<24,107>": "", + "<24,108>": "" + }, + "<25>": { + "<25,1>": "STA_OLD_PASSWORD_EXPIRE_TIME", + "<25,2>": "", + "<25,3>": "STATIC", + "<25,4>": "NDW_WEB_ACCOUNTS", + "<25,5>": "229", + "<25,6>": "374", + "<25,7>": "98", + "<25,8>": "15", + "<25,9>": "Expire Time:", + "<25,10>": { + "<25,10,1>": "0x56000000", + "<25,10,2>": "0x0" + }, + "<25,11>": { + "<25,11,1>": "0x10000", + "<25,11,2>": "0x80000000" + }, + "<25,12>": "30", + "<25,13>": { + "<25,13,1>": "-1", + "<25,13,2>": "-1", + "<25,13,3>": "" + }, + "<25,14>": "0", + "<25,15>": { + "<25,15,1>": { + "<25,15,1,1>": "Segoe UI", + "<25,15,1,2>": "-12", + "<25,15,1,3>": "400", + "<25,15,1,4>": "0", + "<25,15,1,5>": "0", + "<25,15,1,6>": "0", + "<25,15,1,7>": "0", + "<25,15,1,8>": "34", + "<25,15,1,9>": "0", + "<25,15,1,10>": "3", + "<25,15,1,11>": "2", + "<25,15,1,12>": "1", + "<25,15,1,13>": "0", + "<25,15,1,14>": "0" + } + }, + "<25,16>": "", + "<25,17>": "", + "<25,18>": "", + "<25,19>": "", + "<25,20>": "", + "<25,21>": "", + "<25,22>": "", + "<25,23>": "", + "<25,24>": "", + "<25,25>": "", + "<25,26>": "", + "<25,27>": "", + "<25,28>": "<>", + "<25,29>": "<>", + "<25,30>": "", + "<25,31>": "", + "<25,32>": "", + "<25,33>": "", + "<25,34>": "", + "<25,35>": "", + "<25,36>": "", + "<25,37>": "", + "<25,38>": "", + "<25,39>": "", + "<25,40>": "", + "<25,41>": "", + "<25,42>": "", + "<25,43>": "", + "<25,44>": "", + "<25,45>": "", + "<25,46>": "", + "<25,47>": "", + "<25,48>": "", + "<25,49>": "", + "<25,50>": "", + "<25,51>": "", + "<25,52>": "", + "<25,53>": "", + "<25,54>": "", + "<25,55>": "", + "<25,56>": "", + "<25,57>": "", + "<25,58>": "", + "<25,59>": "", + "<25,60>": "", + "<25,61>": "", + "<25,62>": "0", + "<25,63>": { + "<25,63,1>": "", + "<25,63,2>": "", + "<25,63,3>": "", + "<25,63,4>": "", + "<25,63,5>": "", + "<25,63,6>": "", + "<25,63,7>": "", + "<25,63,8>": "" + }, + "<25,64>": { + "<25,64,1>": "", + "<25,64,2>": "", + "<25,64,3>": "" + }, + "<25,65>": "-2", + "<25,66>": "", + "<25,67>": "", + "<25,68>": "", + "<25,69>": "", + "<25,70>": "", + "<25,71>": "", + "<25,72>": "", + "<25,73>": "", + "<25,74>": "", + "<25,75>": "", + "<25,76>": "", + "<25,77>": "", + "<25,78>": "", + "<25,79>": "", + "<25,80>": "", + "<25,81>": "", + "<25,82>": "", + "<25,83>": "", + "<25,84>": "", + "<25,85>": "", + "<25,86>": "", + "<25,87>": "", + "<25,88>": "", + "<25,89>": "", + "<25,90>": "0", + "<25,91>": "0", + "<25,92>": "", + "<25,93>": "", + "<25,94>": "", + "<25,95>": "", + "<25,96>": "", + "<25,97>": "", + "<25,98>": "", + "<25,99>": "", + "<25,100>": "", + "<25,101>": "", + "<25,102>": "", + "<25,103>": "", + "<25,104>": "", + "<25,105>": "", + "<25,106>": "", + "<25,107>": "", + "<25,108>": "" + }, + "<26>": { + "<26,1>": "EDL_OLD_PASSWORD_EXPIRE_TIME", + "<26,2>": "", + "<26,3>": "EDITFIELD", + "<26,4>": "NDW_WEB_ACCOUNTS", + "<26,5>": "377", + "<26,6>": "371", + "<26,7>": "-11", + "<26,8>": "23", + "<26,9>": "", + "<26,10>": { + "<26,10,1>": "0x56000080", + "<26,10,2>": "0x200" + }, + "<26,11>": { + "<26,11,1>": "0x14000", + "<26,11,2>": "0x80000000" + }, + "<26,12>": "13", + "<26,13>": { + "<26,13,1>": "-2", + "<26,13,2>": "-2", + "<26,13,3>": "" + }, + "<26,14>": "0", + "<26,15>": { + "<26,15,1>": { + "<26,15,1,1>": "Segoe UI", + "<26,15,1,2>": "-12", + "<26,15,1,3>": "400", + "<26,15,1,4>": "0", + "<26,15,1,5>": "0", + "<26,15,1,6>": "0", + "<26,15,1,7>": "0", + "<26,15,1,8>": "34", + "<26,15,1,9>": "0", + "<26,15,1,10>": "3", + "<26,15,1,11>": "2", + "<26,15,1,12>": "1", + "<26,15,1,13>": "0", + "<26,15,1,14>": "0" + } + }, + "<26,16>": "", + "<26,17>": "", + "<26,18>": "", + "<26,19>": "", + "<26,20>": "", + "<26,21>": "", + "<26,22>": "", + "<26,23>": "", + "<26,24>": "", + "<26,25>": "", + "<26,26>": "", + "<26,27>": "", + "<26,28>": "(MT)", + "<26,29>": "MTHS", + "<26,30>": "<>", + "<26,31>": "0", + "<26,32>": "", + "<26,33>": "", + "<26,34>": "", + "<26,35>": "", + "<26,36>": { + "<26,36,1>": "0", + "<26,36,2>": "0" + }, + "<26,37>": "", + "<26,38>": "", + "<26,39>": "", + "<26,40>": "", + "<26,41>": "", + "<26,42>": "", + "<26,43>": "", + "<26,44>": "", + "<26,45>": "", + "<26,46>": "", + "<26,47>": "", + "<26,48>": "", + "<26,49>": "", + "<26,50>": "", + "<26,51>": "", + "<26,52>": "", + "<26,53>": "", + "<26,54>": "", + "<26,55>": "", + "<26,56>": "", + "<26,57>": "", + "<26,58>": "", + "<26,59>": "", + "<26,60>": "", + "<26,61>": "", + "<26,62>": "0", + "<26,63>": "", + "<26,64>": "", + "<26,65>": "", + "<26,66>": "", + "<26,67>": "", + "<26,68>": "", + "<26,69>": "", + "<26,70>": "", + "<26,71>": "", + "<26,72>": "", + "<26,73>": "", + "<26,74>": "", + "<26,75>": "", + "<26,76>": "", + "<26,77>": "", + "<26,78>": "", + "<26,79>": "", + "<26,80>": "", + "<26,81>": "", + "<26,82>": "", + "<26,83>": "", + "<26,84>": "", + "<26,85>": "", + "<26,86>": "", + "<26,87>": "", + "<26,88>": "", + "<26,89>": "", + "<26,90>": "", + "<26,91>": "", + "<26,92>": "", + "<26,93>": "", + "<26,94>": "", + "<26,95>": "", + "<26,96>": "", + "<26,97>": "", + "<26,98>": "", + "<26,99>": "", + "<26,100>": "", + "<26,101>": "", + "<26,102>": "", + "<26,103>": "", + "<26,104>": "", + "<26,105>": "", + "<26,106>": "", + "<26,107>": "", + "<26,108>": "" + }, + "<27>": { + "<27,1>": "STA_INVALID_PASSWORD_ATTEMPTS", + "<27,2>": "", + "<27,3>": "STATIC", + "<27,4>": "NDW_WEB_ACCOUNTS", + "<27,5>": "229", + "<27,6>": "404", + "<27,7>": "145", + "<27,8>": "15", + "<27,9>": "Invalid Password Attempts:", + "<27,10>": { + "<27,10,1>": "0x56000000", + "<27,10,2>": "0x0" + }, + "<27,11>": { + "<27,11,1>": "0x10000", + "<27,11,2>": "0x80000000" + }, + "<27,12>": "31", + "<27,13>": { + "<27,13,1>": "-1", + "<27,13,2>": "-1", + "<27,13,3>": "" + }, + "<27,14>": "0", + "<27,15>": { + "<27,15,1>": { + "<27,15,1,1>": "Segoe UI", + "<27,15,1,2>": "-12", + "<27,15,1,3>": "400", + "<27,15,1,4>": "0", + "<27,15,1,5>": "0", + "<27,15,1,6>": "0", + "<27,15,1,7>": "0", + "<27,15,1,8>": "34", + "<27,15,1,9>": "0", + "<27,15,1,10>": "3", + "<27,15,1,11>": "2", + "<27,15,1,12>": "1", + "<27,15,1,13>": "0", + "<27,15,1,14>": "0" + } + }, + "<27,16>": "", + "<27,17>": "", + "<27,18>": "", + "<27,19>": "", + "<27,20>": "", + "<27,21>": "", + "<27,22>": "", + "<27,23>": "", + "<27,24>": "", + "<27,25>": "", + "<27,26>": "", + "<27,27>": "", + "<27,28>": "<>", + "<27,29>": "<>", + "<27,30>": "", + "<27,31>": "", + "<27,32>": "", + "<27,33>": "", + "<27,34>": "", + "<27,35>": "", + "<27,36>": "", + "<27,37>": "", + "<27,38>": "", + "<27,39>": "", + "<27,40>": "", + "<27,41>": "", + "<27,42>": "", + "<27,43>": "", + "<27,44>": "", + "<27,45>": "", + "<27,46>": "", + "<27,47>": "", + "<27,48>": "", + "<27,49>": "", + "<27,50>": "", + "<27,51>": "", + "<27,52>": "", + "<27,53>": "", + "<27,54>": "", + "<27,55>": "", + "<27,56>": "", + "<27,57>": "", + "<27,58>": "", + "<27,59>": "", + "<27,60>": "", + "<27,61>": "", + "<27,62>": "0", + "<27,63>": { + "<27,63,1>": "", + "<27,63,2>": "", + "<27,63,3>": "", + "<27,63,4>": "", + "<27,63,5>": "", + "<27,63,6>": "", + "<27,63,7>": "", + "<27,63,8>": "" + }, + "<27,64>": { + "<27,64,1>": "", + "<27,64,2>": "", + "<27,64,3>": "" + }, + "<27,65>": "-2", + "<27,66>": "", + "<27,67>": "", + "<27,68>": "", + "<27,69>": "", + "<27,70>": "", + "<27,71>": "", + "<27,72>": "", + "<27,73>": "", + "<27,74>": "", + "<27,75>": "", + "<27,76>": "", + "<27,77>": "", + "<27,78>": "", + "<27,79>": "", + "<27,80>": "", + "<27,81>": "", + "<27,82>": "", + "<27,83>": "", + "<27,84>": "", + "<27,85>": "", + "<27,86>": "", + "<27,87>": "", + "<27,88>": "", + "<27,89>": "", + "<27,90>": "0", + "<27,91>": "0", + "<27,92>": "", + "<27,93>": "", + "<27,94>": "", + "<27,95>": "", + "<27,96>": "", + "<27,97>": "", + "<27,98>": "", + "<27,99>": "", + "<27,100>": "", + "<27,101>": "", + "<27,102>": "", + "<27,103>": "", + "<27,104>": "", + "<27,105>": "", + "<27,106>": "", + "<27,107>": "", + "<27,108>": "" + }, + "<28>": { + "<28,1>": "EDL_INVALID_PASSWORD_ATTEMPTS", + "<28,2>": "", + "<28,3>": "EDITFIELD", + "<28,4>": "NDW_WEB_ACCOUNTS", + "<28,5>": "377", + "<28,6>": "401", + "<28,7>": "-11", + "<28,8>": "23", + "<28,9>": "", + "<28,10>": { + "<28,10,1>": "0x56000080", + "<28,10,2>": "0x200" + }, + "<28,11>": { + "<28,11,1>": "0x14000", + "<28,11,2>": "0x80000000" + }, + "<28,12>": "14", + "<28,13>": { + "<28,13,1>": "-2", + "<28,13,2>": "-2", + "<28,13,3>": "" + }, + "<28,14>": "0", + "<28,15>": { + "<28,15,1>": { + "<28,15,1,1>": "Segoe UI", + "<28,15,1,2>": "-12", + "<28,15,1,3>": "400", + "<28,15,1,4>": "0", + "<28,15,1,5>": "0", + "<28,15,1,6>": "0", + "<28,15,1,7>": "0", + "<28,15,1,8>": "34", + "<28,15,1,9>": "0", + "<28,15,1,10>": "3", + "<28,15,1,11>": "2", + "<28,15,1,12>": "1", + "<28,15,1,13>": "0", + "<28,15,1,14>": "0" + } + }, + "<28,16>": "", + "<28,17>": "", + "<28,18>": "", + "<28,19>": "", + "<28,20>": "", + "<28,21>": "", + "<28,22>": "", + "<28,23>": "", + "<28,24>": "", + "<28,25>": "", + "<28,26>": "", + "<28,27>": "", + "<28,28>": "(MD0)", + "<28,29>": "MD0", + "<28,30>": "<>", + "<28,31>": "0", + "<28,32>": "", + "<28,33>": "", + "<28,34>": "", + "<28,35>": "", + "<28,36>": { + "<28,36,1>": "0", + "<28,36,2>": "0" + }, + "<28,37>": "", + "<28,38>": "", + "<28,39>": "", + "<28,40>": "", + "<28,41>": "", + "<28,42>": "", + "<28,43>": "", + "<28,44>": "", + "<28,45>": "", + "<28,46>": "", + "<28,47>": "", + "<28,48>": "", + "<28,49>": "", + "<28,50>": "", + "<28,51>": "", + "<28,52>": "", + "<28,53>": "", + "<28,54>": "", + "<28,55>": "", + "<28,56>": "", + "<28,57>": "", + "<28,58>": "", + "<28,59>": "", + "<28,60>": "", + "<28,61>": "", + "<28,62>": "0", + "<28,63>": "", + "<28,64>": "", + "<28,65>": "", + "<28,66>": "", + "<28,67>": "", + "<28,68>": "", + "<28,69>": "", + "<28,70>": "", + "<28,71>": "", + "<28,72>": "", + "<28,73>": "", + "<28,74>": "", + "<28,75>": "", + "<28,76>": "", + "<28,77>": "", + "<28,78>": "", + "<28,79>": "", + "<28,80>": "", + "<28,81>": "", + "<28,82>": "", + "<28,83>": "", + "<28,84>": "", + "<28,85>": "", + "<28,86>": "", + "<28,87>": "", + "<28,88>": "", + "<28,89>": "", + "<28,90>": "", + "<28,91>": "", + "<28,92>": "", + "<28,93>": "", + "<28,94>": "", + "<28,95>": "", + "<28,96>": "", + "<28,97>": "", + "<28,98>": "", + "<28,99>": "", + "<28,100>": "", + "<28,101>": "", + "<28,102>": "", + "<28,103>": "", + "<28,104>": "", + "<28,105>": "", + "<28,106>": "", + "<28,107>": "", + "<28,108>": "" + }, + "<29>": { + "<29,1>": "OLE_ACTION_BAR", + "<29,2>": "", + "<29,3>": "OLECONTROL.SRP.ShortcutBar.1", + "<29,4>": "NDW_WEB_ACCOUNTS", + "<29,5>": "11", + "<29,6>": "11", + "<29,7>": "202", + "<29,8>": "-11", + "<29,9>": "SRP.ShortcutBar.1", + "<29,10>": { + "<29,10,1>": "0x56000000", + "<29,10,2>": "0x0" + }, + "<29,11>": { + "<29,11,1>": "0x18000", + "<29,11,2>": "0x80000000" + }, + "<29,12>": "15", + "<29,13>": { + "<29,13,1>": "16053492", + "<29,13,2>": "16053492", + "<29,13,3>": "" + }, + "<29,14>": "0", + "<29,15>": { + "<29,15,1>": { + "<29,15,1,1>": "Tahoma", + "<29,15,1,2>": "-11", + "<29,15,1,3>": "400", + "<29,15,1,4>": "0", + "<29,15,1,5>": "0", + "<29,15,1,6>": "0", + "<29,15,1,7>": "0", + "<29,15,1,8>": "34", + "<29,15,1,9>": "0", + "<29,15,1,10>": "3", + "<29,15,1,11>": "2", + "<29,15,1,12>": "1", + "<29,15,1,13>": "0", + "<29,15,1,14>": "0" + } + }, + "<29,16>": "", + "<29,17>": "", + "<29,18>": { + "<29,18,1>": { + "<29,18,1,1>": "R", + "<29,18,1,2>": "EXECUTE", + "<29,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<29,18,1,4>": { + "<29,18,1,4,1>": "@SELF", + "<29,18,1,4,2>": "@EVENT", + "<29,18,1,4,3>": "@PARAM1", + "<29,18,1,4,4>": "@PARAM2", + "<29,18,1,4,5>": "@PARAM3", + "<29,18,1,4,6>": "@PARAM4", + "<29,18,1,4,7>": "@PARAM5", + "<29,18,1,4,8>": "@PARAM6" + }, + "<29,18,1,5>": "", + "<29,18,1,6>": "", + "<29,18,1,7>": "", + "<29,18,1,8>": "", + "<29,18,1,9>": "", + "<29,18,1,10>": "", + "<29,18,1,11>": "", + "<29,18,1,12>": "", + "<29,18,1,13>": "", + "<29,18,1,14>": "", + "<29,18,1,15>": "STPROC" + } + }, + "<29,19>": "OLE", + "<29,20>": "", + "<29,21>": "", + "<29,22>": "", + "<29,23>": "", + "<29,24>": "", + "<29,25>": "", + "<29,26>": "", + "<29,27>": "", + "<29,28>": "", + "<29,29>": "", + "<29,30>": "", + "<29,31>": "", + "<29,32>": "", + "<29,33>": "", + "<29,34>": "", + "<29,35>": "", + "<29,36>": "020000000000000000000000FFFEFF054E006500760065007200FFFEFF084500780070006C006F00720065007200FFFEFF0758005000200046006C006100740003000000FFFEFF07440065006600610075006C007400FFFEFF07440065006600610075006C007400FFFEFF0E4F0066006600690063006500320030003000370042006C0075006500", + "<29,37>": "", + "<29,38>": "", + "<29,39>": "", + "<29,40>": "", + "<29,41>": "", + "<29,42>": "", + "<29,43>": "", + "<29,44>": "", + "<29,45>": "", + "<29,46>": "", + "<29,47>": "", + "<29,48>": "", + "<29,49>": "", + "<29,50>": "", + "<29,51>": "", + "<29,52>": "", + "<29,53>": "", + "<29,54>": "", + "<29,55>": { + "<29,55,1>": "OLE.AcceptFocus", + "<29,55,2>": "OLE.Animation", + "<29,55,3>": "OLE.Behavior", + "<29,55,4>": "OLE.Border", + "<29,55,5>": "OLE.GroupCount", + "<29,55,6>": "OLE.HotTrackStyle", + "<29,55,7>": "OLE.Layout", + "<29,55,8>": "OLE.Theme" + }, + "<29,56>": { + "<29,56,1>": "0", + "<29,56,2>": "Never", + "<29,56,3>": "Explorer", + "<29,56,4>": "XP Flat", + "<29,56,5>": "3", + "<29,56,6>": "Default", + "<29,56,7>": "Default", + "<29,56,8>": "Office2007Blue" + }, + "<29,57>": "", + "<29,58>": "", + "<29,59>": "", + "<29,60>": "", + "<29,61>": "", + "<29,62>": "", + "<29,63>": "", + "<29,64>": "", + "<29,65>": "", + "<29,66>": "", + "<29,67>": "", + "<29,68>": "", + "<29,69>": "", + "<29,70>": "", + "<29,71>": "", + "<29,72>": "", + "<29,73>": "", + "<29,74>": "", + "<29,75>": "", + "<29,76>": "", + "<29,77>": "", + "<29,78>": "", + "<29,79>": "", + "<29,80>": "", + "<29,81>": "", + "<29,82>": "", + "<29,83>": "", + "<29,84>": "", + "<29,85>": "", + "<29,86>": "", + "<29,87>": "", + "<29,88>": "", + "<29,89>": "", + "<29,90>": "", + "<29,91>": "", + "<29,92>": "", + "<29,93>": "", + "<29,94>": "", + "<29,95>": "", + "<29,96>": "", + "<29,97>": "", + "<29,98>": "", + "<29,99>": "", + "<29,100>": "", + "<29,101>": "", + "<29,102>": "", + "<29,103>": "", + "<29,104>": "", + "<29,105>": "", + "<29,106>": "", + "<29,107>": "", + "<29,108>": "" + }, + "<30>": { + "<30,1>": "OLE_POPUP", + "<30,2>": "", + "<30,3>": "OLECONTROL.SRP.Popup.1", + "<30,4>": "NDW_WEB_ACCOUNTS", + "<30,5>": "498", + "<30,6>": "9", + "<30,7>": "123", + "<30,8>": "20", + "<30,9>": "SRP.Popup.1", + "<30,10>": { + "<30,10,1>": "0x46000000", + "<30,10,2>": "0x0" + }, + "<30,11>": { + "<30,11,1>": "0x0", + "<30,11,2>": "0x80000000" + }, + "<30,12>": "16", + "<30,13>": { + "<30,13,1>": "16053492", + "<30,13,2>": "16053492", + "<30,13,3>": "" + }, + "<30,14>": "0", + "<30,15>": { + "<30,15,1>": { + "<30,15,1,1>": "Tahoma", + "<30,15,1,2>": "-11", + "<30,15,1,3>": "400", + "<30,15,1,4>": "0", + "<30,15,1,5>": "0", + "<30,15,1,6>": "0", + "<30,15,1,7>": "0", + "<30,15,1,8>": "34", + "<30,15,1,9>": "0", + "<30,15,1,10>": "3", + "<30,15,1,11>": "2", + "<30,15,1,12>": "1", + "<30,15,1,13>": "0", + "<30,15,1,14>": "0" + } + }, + "<30,16>": "", + "<30,17>": "", + "<30,18>": "", + "<30,19>": "", + "<30,20>": "", + "<30,21>": "", + "<30,22>": "", + "<30,23>": "", + "<30,24>": "", + "<30,25>": "", + "<30,26>": "", + "<30,27>": "", + "<30,28>": "", + "<30,29>": "", + "<30,30>": "", + "<30,31>": "", + "<30,32>": "", + "<30,33>": "", + "<30,34>": "", + "<30,35>": "", + "<30,36>": "", + "<30,37>": "", + "<30,38>": "", + "<30,39>": "", + "<30,40>": "", + "<30,41>": "", + "<30,42>": "", + "<30,43>": "", + "<30,44>": "", + "<30,45>": "", + "<30,46>": "", + "<30,47>": "", + "<30,48>": "", + "<30,49>": "", + "<30,50>": "", + "<30,51>": "", + "<30,52>": "", + "<30,53>": "", + "<30,54>": "", + "<30,55>": "OLE.Border", + "<30,56>": "None", + "<30,57>": "", + "<30,58>": "", + "<30,59>": "", + "<30,60>": "", + "<30,61>": "", + "<30,62>": "", + "<30,63>": "", + "<30,64>": "", + "<30,65>": "", + "<30,66>": "", + "<30,67>": "", + "<30,68>": "", + "<30,69>": "", + "<30,70>": "", + "<30,71>": "", + "<30,72>": "", + "<30,73>": "", + "<30,74>": "", + "<30,75>": "", + "<30,76>": "", + "<30,77>": "", + "<30,78>": "", + "<30,79>": "", + "<30,80>": "", + "<30,81>": "", + "<30,82>": "", + "<30,83>": "", + "<30,84>": "", + "<30,85>": "", + "<30,86>": "", + "<30,87>": "", + "<30,88>": "", + "<30,89>": "", + "<30,90>": "", + "<30,91>": "", + "<30,92>": "", + "<30,93>": "", + "<30,94>": "", + "<30,95>": "", + "<30,96>": "", + "<30,97>": "", + "<30,98>": "", + "<30,99>": "", + "<30,100>": "", + "<30,101>": "", + "<30,102>": "", + "<30,103>": "", + "<30,104>": "", + "<30,105>": "", + "<30,106>": "", + "<30,107>": "", + "<30,108>": "" + }, + "<31>": { + "<31,1>": "OLE_SUBCLASS", + "<31,2>": "", + "<31,3>": "OLECONTROL.SRP.Subclass.1", + "<31,4>": "NDW_WEB_ACCOUNTS", + "<31,5>": "90", + "<31,6>": "4", + "<31,7>": "114", + "<31,8>": "23", + "<31,9>": "SRP.Subclass.1", + "<31,10>": { + "<31,10,1>": "0x46000000", + "<31,10,2>": "0x0" + }, + "<31,11>": { + "<31,11,1>": "0x0", + "<31,11,2>": "0x80000000" + }, + "<31,12>": "17", + "<31,13>": { + "<31,13,1>": "-2", + "<31,13,2>": "-2", + "<31,13,3>": "" + }, + "<31,14>": "0", + "<31,15>": { + "<31,15,1>": { + "<31,15,1,1>": "Segoe UI", + "<31,15,1,2>": "-12", + "<31,15,1,3>": "400", + "<31,15,1,4>": "0", + "<31,15,1,5>": "0", + "<31,15,1,6>": "0", + "<31,15,1,7>": "0", + "<31,15,1,8>": "34", + "<31,15,1,9>": "0", + "<31,15,1,10>": "3", + "<31,15,1,11>": "2", + "<31,15,1,12>": "1", + "<31,15,1,13>": "0", + "<31,15,1,14>": "0" + } + }, + "<31,16>": "", + "<31,17>": "", + "<31,18>": { + "<31,18,1>": { + "<31,18,1,1>": "R", + "<31,18,1,2>": "EXECUTE", + "<31,18,1,3>": "SYSPROG*STPROCEXE**OBJ_CALL_EVENT", + "<31,18,1,4>": { + "<31,18,1,4,1>": "@SELF", + "<31,18,1,4,2>": "@EVENT", + "<31,18,1,4,3>": "@PARAM1", + "<31,18,1,4,4>": "@PARAM2", + "<31,18,1,4,5>": "@PARAM3", + "<31,18,1,4,6>": "@PARAM4", + "<31,18,1,4,7>": "@PARAM5", + "<31,18,1,4,8>": "@PARAM6" + }, + "<31,18,1,5>": "", + "<31,18,1,6>": "", + "<31,18,1,7>": "", + "<31,18,1,8>": "", + "<31,18,1,9>": "", + "<31,18,1,10>": "", + "<31,18,1,11>": "", + "<31,18,1,12>": "", + "<31,18,1,13>": "", + "<31,18,1,14>": "", + "<31,18,1,15>": "STPROC" + } + }, + "<31,19>": "OLE", + "<31,20>": "", + "<31,21>": "", + "<31,22>": "", + "<31,23>": "", + "<31,24>": "", + "<31,25>": "", + "<31,26>": "", + "<31,27>": "", + "<31,28>": "", + "<31,29>": "", + "<31,30>": "", + "<31,31>": "", + "<31,32>": "", + "<31,33>": "", + "<31,34>": "", + "<31,35>": "", + "<31,36>": "", + "<31,37>": "", + "<31,38>": "", + "<31,39>": "", + "<31,40>": "", + "<31,41>": "", + "<31,42>": "", + "<31,43>": "", + "<31,44>": "", + "<31,45>": "", + "<31,46>": "", + "<31,47>": "", + "<31,48>": "", + "<31,49>": "", + "<31,50>": "", + "<31,51>": "", + "<31,52>": "", + "<31,53>": "", + "<31,54>": "", + "<31,55>": "OLE.Border", + "<31,56>": "None", + "<31,57>": "", + "<31,58>": "", + "<31,59>": "", + "<31,60>": "", + "<31,61>": "", + "<31,62>": "", + "<31,63>": "", + "<31,64>": "", + "<31,65>": "", + "<31,66>": "", + "<31,67>": "", + "<31,68>": "", + "<31,69>": "", + "<31,70>": "", + "<31,71>": "", + "<31,72>": "", + "<31,73>": "", + "<31,74>": "", + "<31,75>": "", + "<31,76>": "", + "<31,77>": "", + "<31,78>": "", + "<31,79>": "", + "<31,80>": "", + "<31,81>": "", + "<31,82>": "", + "<31,83>": "", + "<31,84>": "", + "<31,85>": "", + "<31,86>": "", + "<31,87>": "", + "<31,88>": "", + "<31,89>": "", + "<31,90>": "", + "<31,91>": "", + "<31,92>": "", + "<31,93>": "", + "<31,94>": "", + "<31,95>": "", + "<31,96>": "", + "<31,97>": "", + "<31,98>": "", + "<31,99>": "", + "<31,100>": "", + "<31,101>": "", + "<31,102>": "", + "<31,103>": "", + "<31,104>": "", + "<31,105>": "", + "<31,106>": "", + "<31,107>": "", + "<31,108>": "" + } + }, + "record4": { + "<1>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/POPUP/WEB_ACCOUNTS.json b/FRAMEWORKS/POPUP/WEB_ACCOUNTS.json new file mode 100644 index 0000000..8087eb8 --- /dev/null +++ b/FRAMEWORKS/POPUP/WEB_ACCOUNTS.json @@ -0,0 +1,99 @@ +{ + "header": { + "version": 1, + "type": "record" + }, + "body": { + "record1": { + "<1>": "-1", + "<2>": "-1", + "<3>": "-1", + "<4>": "-1", + "<5>": "16777215", + "<6>": { + "<6,1>": { + "<6,1,1>": "Segoe UI", + "<6,1,2>": "-12", + "<6,1,3>": "400", + "<6,1,4>": "0", + "<6,1,5>": "0", + "<6,1,6>": "0", + "<6,1,7>": "0", + "<6,1,8>": "34", + "<6,1,9>": "0", + "<6,1,10>": "3", + "<6,1,11>": "2", + "<6,1,12>": "1", + "<6,1,13>": "11", + "<6,1,14>": "2", + "<6,1,15>": "0", + "<6,1,16>": "0" + } + }, + "<7>": "WEB_ACCOUNTS", + "<8>": "BY NAME BY @ID", + "<9>": { + "<9,1>": { + "<9,1,1>": "ID", + "<9,1,2>": "10", + "<9,1,3>": "L", + "<9,1,4>": "C", + "<9,1,5>": "", + "<9,1,6>": "ID" + }, + "<9,2>": { + "<9,2,1>": "NAME", + "<9,2,2>": "20", + "<9,2,3>": "L", + "<9,2,4>": "C", + "<9,2,5>": "", + "<9,2,6>": "Name" + }, + "<9,3>": { + "<9,3,1>": "ACCOUNT_ENABLED", + "<9,3,2>": "10", + "<9,3,3>": "L", + "<9,3,4>": "C", + "<9,3,5>": "B", + "<9,3,6>": "Enabled" + } + }, + "<10>": "T", + "<11>": "1", + "<12>": "Web Accounts", + "<13>": "1", + "<14>": "F", + "<15>": "1", + "<16>": "1", + "<17>": "1", + "<18>": "1", + "<19>": "1", + "<20>": "1", + "<21>": "1", + "<22>": "0", + "<23>": "0", + "<24>": "0", + "<25>": "0", + "<26>": "", + "<27>": "", + "<28>": "", + "<29>": "0", + "<30>": "0", + "<31>": "0", + "<32>": "1", + "<33>": "0", + "<34>": "-2", + "<35>": "-2", + "<36>": "", + "<37>": "", + "<38>": "", + "<39>": "", + "<40>": "-2", + "<41>": "1000", + "<42>": "", + "<43>": "", + "<44>": "", + "<45>": "" + } + } +} \ No newline at end of file diff --git a/FRAMEWORKS/STPROC/APIROOT_API.txt b/FRAMEWORKS/STPROC/APIROOT_API.txt new file mode 100644 index 0000000..59606f2 --- /dev/null +++ b/FRAMEWORKS/STPROC/APIROOT_API.txt @@ -0,0 +1,100 @@ +Function APIRoot_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : APIRoot_API + + Description : API logic for the Apiroot resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + the SelfURL. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure [.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - APIROOT.POST + - APIROOT.ID.PUT + - APIROOT.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/19/18 dmb Original programmer. + 04/09/19 dmb [SRPFW-271] Update the APIROOT.GET API to verify that the AuthenticatedAccountID has a value + before adding the resetPassword form action. + 04/29/19 dmb Update the APIROOT.GET API to verify the sub-resource has at least one HTTP method before + adding it. + 05/28/19 dmb [SRPFW-274] Replace all references to AddLinkRelationship with AddLinkRelation. + 07/16/19 dmb [SRPFW-277] Retrofit APIROOT.GET API to use the HTTP_Resource_Manager_Services module. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + 01/26/20 dmb [SRPFW-296] Update the APIROOT.GET API so link relations are templated whenever possible. + 02/13/20 dmb [SRPFW-311] Fix a minor typo in the APIROOT.GET API. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS +$insert HTTP_FRAMEWORK_SETUP_EQUATES + +Declare function Database_Services, HTTP_Resource_Manager_Services + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API APIROOT.HEAD +API APIROOT.GET + + objResource = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + HTTP_Resource_Services('AddLinkRelation', objResource, 'self', FullEndpointURL) + RootResources = HTTP_Resource_Manager_Services('GetResourceChildren', FullEndpointURL, 'RESOURCE') + For Each Resource in RootResources using @FM + Methods = HTTP_Resource_Manager_Services('GetResourceProperty', Resource, 'METHODS') + If Methods NE '' then + Name = HTTP_Resource_Manager_Services('GetResourceProperty', Resource, 'NAME') + Title = HTTP_Resource_Manager_Services('GetResourceProperty', Resource, 'TITLE') + HTTP_Resource_Services('AddLinkRelation', objResource, Name, FullEndpointURL : '/' : Resource[-1, 'B/'], Title, True$) + end + Next Resource + end + + If Error_Services('NoError') then + AuthenticatedAccountID = HTTP_Authentication_Services('GetAuthenticatedAccountID') + If AuthenticatedAccountID NE '' then + HTTP_Resource_Services('AddFormAction', objResource, 'resetPassword', 'PATCH', FullEndpointURL : '/webaccounts/' : AuthenticatedAccountID : '/password', 'Reset Password', 'value', '' : @VM : True$ : @VM : True$) + end + end + + If Error_Services('NoError') then + Services = HTTP_Resource_Services('GetSerializedResource', objResource) + HTTP_Services('SetResponseBody', Services, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api diff --git a/FRAMEWORKS/STPROC/AUDIT_MANAGER.txt b/FRAMEWORKS/STPROC/AUDIT_MANAGER.txt new file mode 100644 index 0000000..17914c1 --- /dev/null +++ b/FRAMEWORKS/STPROC/AUDIT_MANAGER.txt @@ -0,0 +1,210 @@ +Subroutine Audit_Manager(ID, Table, CurrentRecord, OrigRecord, Activity) + +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Audit_Manager + + Description : Updates the Audit table to track modifications of a record. + + Notes : This process is normally called by the Audit_Manager_MFS. It handles all of the audit trail + management logic. + + Parameters : + AutoSet [in] -- Allows automatic setting of the SYSTEM_MAINTENANCE record without user intervention. + SysFlag [out] -- Returns True if the flag was set to stop people from logging in. Returns False if people + are still allowed to log into the application. + + ID [in] -- ID of the record. + Table [in] -- Table name where the record being audited is stored. + CurrentRecord [in/out] -- Current record as it will be written to disk. If the Activity is "Write" then the + audit fields will be updated. + OrigRecord [in] -- If called by Audit_Manager_MFS then this is the original record, otherwise this + represents a marker for special audit tracking. + Activity [in] -- Identifies the audit activity being performed: Read, Write, Delete, or anything else + if called directly for special audit tracking. + + + + History : (Date, Initials, Notes) + 05/19/05 axf Initial Program (Original Program MFS_Update_History). + 11/26/07 dmb Code clean-up and refactoring. + 04/05/13 dmb Repalce SECURITY_EQUATES with Memory Services to get login security. - [SRPFW-9] + +***********************************************************************************************************************/ + +$insert APP_INSERTS + +Declare Subroutine Msg, Lock_Record +Declare Function RetStack, Memory_Services + +If Assigned(ID) else ID = "" +If Assigned(Table) else Table = "" +If Assigned(CurrentRecord) else CurrentRecord = "" +If Assigned(OrigRecord) else OrigRecord = "" + +AuditManagerTable = "APP_INFO" + +Convert @Lower_Case to @Upper_Case In Table +AuditTable = 'AUDIT_' : Table +Username = @USERNAME + +* Declare function GetNetworkUsername +* If GetNetworkUsername() EQ "dbakke1" AND Activity _NEC "READ" then debug + +Open AuditTable to HistoryCheck then + RecordTracker = No$ + Locked_handle = "" + Temp_activity = "" + Success = "" + Details = "" + New = No$ + TrackActivity = No$ + + CallProgName = RetStack()<2> + + Gosub App_Info + + If TrackActivity EQ Yes$ then Gosub Main_Process +End + +Return + +App_Info: + Fields = "" + Num_fields = 0 + Open AuditManagerTable to hAIT then + ReadO App_record from hAIT, "AUDIT_MANAGER_SETTINGS" then + Locate Table in App_record<1> using @VM setting vPos then + Begin Case + Case ID EQ "" + // Do nothing. + + Case CallProgName[1, 18] NE "AUDIT_MANAGER_MFS*" + // Program is being called directly from a stored procedure. + If App_record<6,vPos> EQ Yes$ Then + If CurrentRecord NE "" Then + TrackActivity = Yes$ + RecordTracker = Yes$ ; // Flag to indicate that special audit tracking is ocurring + Marker = OrigRecord + OrigRecord = CurrentRecord + End + End + + Case Activity EQ "Write" + If App_record<3,vPos> EQ Yes$ Then + TrackActivity = Yes$ + Locate Table in App_record<1> using @VM setting Position then + StartField = App_record<2, Position> + If StartField Then + CurrentRecord = Username + CurrentRecord = Date() + CurrentRecord = Time() + End + End + End + + Case Activity EQ "Delete" + If App_record<4,vPos> EQ Yes$ Then TrackActivity = Yes$ + + Case Activity EQ "Read" + If App_record<5,vPos> EQ Yes$ Then TrackActivity = Yes$ + + End Case + end else +* Msg("|Unable to locate the ":Table:" information|in the Audit Manager Settings.|") + end + end else +* Msg("|Unable to read the Audit Manager Settings Record.|") + end + end else +* Msg("|Unable to open the App_Info Table.|") + end +return + + +Main_Process: + Lock_Record(AuditTable, Locked_handle, ID, Lock$, No$, Yes$, Success) + If Success then + Read AuditTrail from Locked_handle, ID then + Num_items = Count(AuditTrail<1>, @VM) + (AuditTrail<1> NE "") +* If Len(AuditTrail) GT 250000 then +* For DelNumItems = 1 to 100 +* For Loop = 1 to 8 +* AuditTrail = Delete(AuditTrail, Loop, Num_items, 0) +* Next Loop +* Num_items -= 1 +* Next DelNumItems +* end + end else + AuditTrail = "" + New = Yes$ + end + Current_date = Date() + Current_time = Time() + Seq = "DR" + StationName = @Station + MacAddress = "" + + Locate Current_date in AuditTrail<1> by Seq Using @VM setting Pos else Null + AuditTrail<1> = Insert(AuditTrail<1>, 1, Pos, 0, Current_Date) + AuditTrail<2> = Insert(AuditTrail<2>, 1, Pos, 0, Current_Time) + AuditTrail<3> = Insert(AuditTrail<3>, 1, Pos, 0, Username) + AuditTrail<4> = Insert(AuditTrail<4>, 1, Pos, 0, StationName) + AuditTrail<5> = Insert(AuditTrail<5>, 1, Pos, 0, MacAddress) + AuditTrail<8> = Insert(AuditTrail<8>, 1, Pos, 0, Activity) + AuditTrail<9> = "AUDIT TRACKING RECORD" + + If RecordTracker EQ Yes$ Then + // Special audit tracking is occuring. Store the current program + // and the special marker in the audit trail entry. + AuditTrail<6> = Insert(AuditTrail<6>, 1, Pos, 0, RetStack()<2>) + AuditTrail<7> = Insert(AuditTrail<7>, 1, Pos, 0, Marker) + AuditTrail<10> = "PROGRAM TRACKER" + End Else + AuditTrail<6> = Insert(AuditTrail<6>, 1, Pos, 0, "") + AuditTrail<7> = Insert(AuditTrail<7>, 1, Pos, 0, "") + AuditTrail<10> = AuditTrail<10> + End + + // Update the Audit Trail record. + Write AuditTrail to Locked_handle, ID Then + If Activity NE "Read" Then + // Only create an audit record if the Activity isn't Read. + AuditRecord = OrigRecord + If MacAddress EQ "" Then MacAddress = @Station + StoredRecId = ID:"*":MacAddress:"*":Current_Date:"*":Current_Time + Write AuditRecord To Locked_handle, StoredRecId Then + Read RecentlyUpdatedList from Locked_handle, "%RECENTLY_UPDATED%" Else + RecentlyUpdatedList = "" + End + Locate ID in RecentlyUpdatedList using @FM setting UpdatePos Then + RecentlyUpdatedList = Delete(RecentlyUpdatedList, UpdatePos, 0, 0) + End + If RecentlyUpdatedList EQ "" then + RecentlyUpdatedList = ID + End Else + RecentlyUpdatedList = ID:@FM:RecentlyUpdatedList + If Count(RecentlyUpdatedList, @FM) GT 499 then + RecentlyUpdatedList = Field(RecentlyUpdatedList, @FM, 1, 500) + end + End + Write RecentlyUpdatedList to Locked_handle, "%RECENTLY_UPDATED%" Else +* Msg("|Unable to Write the record %RECENTLY_UPDATED%|to the ":AuditTable:".|") + End + End Else +* Msg("|Unable to Write the record ":StoredRecId:"|to the ":AuditTable:".|") + End + End + End Else +* Msg("|Unable to Write the record ":ID:"|to the ":AuditTable:".|") + End + Lock_Record(AuditTable, Locked_handle, ID, Unlock$) + End Else +* Msg("|Unable to update ":AuditTable:" log.|") + end +return + + diff --git a/FRAMEWORKS/STPROC/AUDIT_MANAGER_MFS.txt b/FRAMEWORKS/STPROC/AUDIT_MANAGER_MFS.txt new file mode 100644 index 0000000..13fd488 --- /dev/null +++ b/FRAMEWORKS/STPROC/AUDIT_MANAGER_MFS.txt @@ -0,0 +1,265 @@ +Function Audit_Manager_MFS(Code, BFS, Handle, Name, FMC, Record, Status) + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// This program is proprietary and is not to be used by or disclosed to others, nor is it to +// be copied without written permission from SRP Computer Solutions, Inc. +// +// Name : Audit_Manager_MFS +// +// Description: MFS for tracking the audit history of a particular record. +// +// Notes: This routine primarily passes all essential information into the Audit_Manager +// stored procedure. This way changes to the core functionality can be made +// without having to restart OpenInsight (which is necessary for changes directly +// in MFS procedures.) +// +// A check is first made to see if corresponding audit table exists for the +// database table that triggered this MFS. Audit tables use a naming convention +// of AUDIT_Tablename. therefore, if the CUSTOMERS table is being audited then +// there should be an AUDIT_CUSTOMERS table available. Audit features are managed +// by the DBW_AUDIT_MANAGER form. +// +// Parameters: +// Code [in] -- An integer value indicating the operation to be performed (1 = read a +// record, 4 = delete a record, 11 = open a file, etc.) +// BFS [in] -- The list of MFSs and the BFS name for the current file or volume. This +// is a subvalue mark-delimited array, with the current MFS name as the +// first value in the array, and the BFS name as the last value. +// Handle [in] -- The file handle of the file or media map being accessed. +// Name [in] -- The name (key) of the record or file being accessed. +// FMC [in] -- Various functions. +// Record [in] -- The entire record (for record-oriented functions) or a newly-created +// handle (for "get handle" functions). +// Status [in] -- A return code indicating the success or failure of an operation. +// +// History (Date, Initials, Notes) +// 01/04/00 pcs Original programmer +// 01/20/00 pcs CLEARFILE requires the Arev table name to be removed before processing +// 05/20/05 axf Process will now also track the accessing of records. +// 11/26/07 dmb Code clean-up. No functional changes were made. +// +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +$insert APP_INSERTS +$INSERT FILE.SYSTEM.EQUATES +$INSERT FSERRORS_HDR + +Declare Subroutine Msg, Audit_Manager + +ON CODE GOSUB READ.RECORD,READO.RECORD,WRITE.RECORD,DELETE.RECORD,LOCK.RECORD,UNLOCK.RECORD,SELECT,READNEXT,CLEARSELECT,CLEARFILE,OPEN.FILE,CREATE.FILE,RENAME.FILE,MOVE.FILE,DELETE.FILE,OPEN.MEDIA,CREATE.MEDIA,READ.MEDIA,WRITE.MEDIA,UNLOCK.ALL,FLUSH,INSTALL,RESERVED,RESERVED,RESERVED,OMNI.SCRIPT,CLOSE.MEDIA,RECORD.COUNT, REMAKE.FILE,CREATE.INDEX,DELETE.INDEX,UPDATE.INDEX,SELECT.INDEX,READNEXT.INDEX + +Return + +READ.RECORD: + // Added Check_Update_History Gosub + Activity = "Read" + GoSub Check_Update_History + GoSub Remove_Arev_Table_Name +return + +READO.RECORD: + // Added Check_Update_History Gosub + Activity = "Read" + GoSub Check_Update_History + GoSub Remove_Arev_Table_Name +return + +CREATE.MEDIA: + GoSub Call_NextFS +return + +OPEN.MEDIA: + GoSub Call_NextFS +return + +READ.MEDIA: + GoSub Call_NextFS +return + +WRITE.MEDIA: + GoSub Call_NextFS +return + +CLOSE.MEDIA: + GoSub Call_NextFS +return + +CLEARFILE: + GoSub Remove_Arev_Table_Name +return + +CREATE.FILE: + GoSub Call_NextFS +return + +DELETE.FILE: + GoSub Call_NextFS +return + +MOVE.FILE: + GoSub Call_NextFS +return + +OPEN.FILE: + // Attaching Arev Table name to Handle for checking purposes + GoSub Call_NextFS + If Index(RECORD, @TM, 1) EQ 0 then + RECORD = NAME:@TM:RECORD + end +return + +REMAKE.FILE: + GoSub Call_NextFS +return + +RENAME.FILE: + GoSub Call_NextFS +return + +SELECT: + GoSub Remove_Arev_Table_Name +return + +READNEXT: + GoSub Remove_Arev_Table_Name +return + +CLEARSELECT: + GoSub Remove_Arev_Table_Name +return + +LOCK.RECORD: + GoSub Remove_Arev_Table_Name +return + +UNLOCK.RECORD: + GoSub Remove_Arev_Table_Name +return + +CREATE.INDEX: + GoSub Remove_Arev_Table_Name +return + +UPDATE.INDEX: + GoSub Remove_Arev_Table_Name +return + +DELETE.INDEX: + GoSub Remove_Arev_Table_Name +return + +SELECT.INDEX: + GoSub Remove_Arev_Table_Name +return + +READNEXT.INDEX: + GoSub Remove_Arev_Table_Name +return + +RESERVED: + GoSub Call_NextFS +return + +OMNI.SCRIPT: + GoSub Remove_Arev_Table_Name +return + +RECORD.COUNT: + GoSub Remove_Arev_Table_Name +return + +LOCK.SEMAPHORE: + GoSub Call_NextFS +return + +UNLOCK.SEMAPHORE: + GoSub Call_NextFS +return + +SET.USER.SEMAPHORE: + GoSub Call_NextFS +return + +WRITE.RECORD: + GoSub Prep_Vars + Activity = "Write" + GoSub Check_Update_History + GoSub Remove_Arev_Table_Name +return + +DELETE.RECORD: + Activity = "Delete" + GoSub Check_Update_History + GoSub Remove_Arev_Table_Name +return + +NEXT_FS: + GoSub Call_NextFS +return + +// Install, unlock all and flush are called directly, no need to call next FS. +INSTALL: + STATUS = TRUE$ +return + +FLUSH: + STATUS = TRUE$ +return + +UNLOCK.ALL: + STATUS = TRUE$ +return + +Prep_Vars: + TempUseTable = Field(HANDLE, @TM, 1) + UseTable = Field(TempUseTable, "*", 1) + UseID = Name +return + +Check_Update_History: + Temp_File_Name = Field(HANDLE, @TM, 1) + FileName = Field(Temp_File_Name, "*", 1) + Real_Handle = Field(HANDLE, @TM, 2) + History_table = "AUDIT_":FileName + Open History_table to HistoryCheck then + GoSub Get_Original_Record + Audit_Manager(Name, FileName, Record, OrigRecord, Activity) + end +return + +Get_Original_Record: + OrigRecord = "" + CALL RTP57(READO.RECORD, "RTP57", Real_Handle, NAME, FMC, OrigRecord, Temp_status) + // If Temp_status is Null then it is a new record or an error reading. +return + +Call_NextFS: + FS = DELETE(BFS, 1, 1, 1) + NEXTFS = FS<1, 1, 1> + @FILE.ERROR = "" + CALL @NEXTFS(CODE, FS, HANDLE, NAME, FMC, RECORD, STATUS) +return + +Remove_Arev_Table_Name: +* FileName = Field(HANDLE, @TM, 1) +* If FileName EQ HANDLE then +* Real_Handle = HANDLE +* end else +* Real_Handle = Field(HANDLE, @TM, 2) +* end + FS = DELETE(BFS, 1, 1, 1) + NEXTFS = FS<1, 1, 1> + @FILE.ERROR = "" + + If Index(FS, @SVM, 1) GT 0 then + Real_Handle = HANDLE + end else + Real_Handle = Field(HANDLE, @TM, 2) + end + + CALL @NEXTFS(CODE, FS, Real_Handle, NAME, FMC, RECORD, STATUS) +return + diff --git a/FRAMEWORKS/STPROC/CONTACTS_API.txt b/FRAMEWORKS/STPROC/CONTACTS_API.txt new file mode 100644 index 0000000..75e1e45 --- /dev/null +++ b/FRAMEWORKS/STPROC/CONTACTS_API.txt @@ -0,0 +1,284 @@ +Function Contacts_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Contacts_API + + Description : API logic for the Contacts resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + the SelfURL. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure [.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Contacts.POST + - Contacts.ID.PUT + - Contacts.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/17/18 dmb Original programmer. + 04/09/19 dmb [SRPFW-271] Replace FullEndpointURL with FullEndpointURLNoQuery in the GetObjects service + within the Contacts.GET API to avoid query params in the embedded object self URLs. + 05/28/19 dmb [SRPFW-274] Replace all references to AddLinkRelationships with AddLinkRelations. + 05/31/19 dmb [SRPFW-276] Update contacts.ID.GET API by removing unnecessary call to the GetDatabaseItem + service. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS +$insert CONTACTS_EQUATES + +Declare function Database_Services +Declare subroutine RList + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API contacts.HEAD +API contacts.GET + + DisplayColumnNames = 'first_name' : @FM : 'last_name' : @FM : 'email' + + If HTTP_Services('GetHTTPGetString') NE '' then + // This means the URL ends with /contacts?{property}={value}. The client is searching for one or more contacts + // that match the query parameters. This is equivalent to doing a filtered RLIST search. + + // Get the query string passed into the URL. + GetString = HTTP_Services('GetHTTPGetString') + // Get the name of the property being queried. + Property = GetString[1, 'F='] + // Get the value being searched for. + Value = HTTP_Services('GetQueryField', Property) + // Get the database columns for the table. + ColumnNames = HTTP_Resource_Services('GetColumnNames', 'CONTACTS') + ColumnName = Property + Convert @Lower_Case to @Upper_Case in ColumnName + // Verify the property matches a valid column in the table. + Locate ColumnName in ColumnNames using @FM setting fPos then + // Use the GetDatabaseItems service to perform the search and prepare the HAL+JSON response. If a more complex + // or optimized solution is needed, then replace the following with custom code. + Filter = 'SELECT CONTACTS WITH ' : ColumnName : ' CONTAINING ' : Quote(Value) + // The GetDatabaseItems service will return all database column values unless otherwise specified. Since a query + // search might generated several results, it is sometimes best to pass in just those columns that are important + // for the query result. + Locate ColumnName in DisplayColumnNames using @FM setting fPos else + // Make sure the property being searched is included in the columns being returned. + DisplayColumnNames := @FM : Property + end + end else + // This is not a valid property, which means the URL does not resolve. Set a 404 error. Add a description if + // desired. + Error_Services('Add', ColumnName : ' is not a valid column in the CONTACTS table.') + HTTP_Services('SetResponseError', '', '', 404, Error_Services('GetMessage'), FullEndpointURL) + end + end else + // This means the URL ends with /contacts. The client is requesting all resources available at this URL. + // This is equivalent to performing an unfiltered SELECT statement. Pass in an empty filter. + Filter = '' + end + + If Error_Services('NoError') then + objResource = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + objContacts = HTTP_Resource_Services('GetObjects', 'CONTACTS', Filter, DisplayColumnNames, '', '', '', '', FullEndpointURLNoQuery) + HTTP_Resource_Services('AddEmbeddedResources', objResource, 'contacts', objContacts) + // Add _links sub-properties for HAL implementation. + Rels = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : ParentURL + HTTP_Resource_Services('AddLinkRelations', objResource, Rels, URLs) + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end + +end api + + +API contacts.POST + +* HTTP_Resource_Services('PostDatabaseItem', 'CONTACTS', FullEndpointURL) +* Call Push.Session(Hold1, Hold2, Hold3, Hold4, Hold5, Hold6) +* Call Pop.Session(Hold1, Hold2, Hold3, Hold4, Hold5, Hold6) + +end api + + +API contacts.ID.HEAD +API contacts.ID.GET + + KeyID = EndpointSegment + + // Create a new specific contacts resource object using the passed in resource ID to initialize the content. + objResource = HTTP_Resource_Services('GetObject', 'CONTACTS', KeyID, '', '', '', '', '', '', '', '', 1) + + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + CollectionURL = ParentURL + Names = 'self,collection' + URLs = FullEndpointURL : ',' : CollectionURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + + If Error_Services('NoError') then + // If there is a picture related to this contact, add another _links sub-property for the URL. + PictureValue = SRP_JSON(objResource, 'GetValue', 'picture', '') + If PictureValue NE '' then + ImageURL = FullEndpointURL : '/picture' + HTTP_Resource_Services('AddLinkRelations', objResource, 'picture', ImageURL) + end + end + + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api + + +API contacts.ID.PATCH + + KeyID = EndpointSegment + HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID) + +end api + + +API contacts.ID.PUT + + KeyID = EndpointSegment + HTTP_Resource_Services('PutDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID) + +end api + + +API contacts.ID.DELETE + + KeyID = EndpointSegment + HTTP_Resource_Services('DeleteDatabaseItem', 'CONTACTS', KeyID) + +end api + + +API contacts.ID.first_name.HEAD +API contacts.ID.first_name.GET + + KeyID = ParentSegment + objResource = HTTP_Resource_Services('GetObject', 'CONTACTS', KeyID, 'first_name') + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + ResourceURL = ParentURL + Names = 'self' : @FM : 'resource' + URLs = FullEndpointURL : @FM : ResourceURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api + + +API contacts.ID.first_name.PATCH + + KeyID = ParentSegment + HAL = HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID, 'first_name') + +end api + + +API contacts.ID.last_name.HEAD +API contacts.ID.last_name.GET + + KeyID = ParentSegment + objResource = HTTP_Resource_Services('GetObject', 'CONTACTS', KeyID, 'last_name') + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + ResourceURL = ParentURL + Names = 'self' : @FM : 'resource' + URLs = FullEndpointURL : @FM : ResourceURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api + + +API contacts.ID.last_name.PATCH + + KeyID = ParentSegment + HAL = HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID, 'last_name') + +end api + + +API contacts.ID.first_name.PUT + + KeyID = ParentSegment + HAL = HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID, 'first_name') + +end api + + +API contacts.ID.last_name.PUT + + KeyID = ParentSegment + HAL = HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', FullEndpointURL, KeyID, 'last_name') + +end api diff --git a/FRAMEWORKS/STPROC/DATABASE_SERVICES.txt b/FRAMEWORKS/STPROC/DATABASE_SERVICES.txt new file mode 100644 index 0000000..c5533fb --- /dev/null +++ b/FRAMEWORKS/STPROC/DATABASE_SERVICES.txt @@ -0,0 +1,1046 @@ +Function Database_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Database_Services + + Description : Handler program for all Database services. + + Notes : Application errors should be logged using the Error Services module. There are a few methodological + assumptions built into way errors are managed which are important to understand in order to properly + work with Error Services: + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + History : (Date, Initials, Notes) + 03/27/17 dmb Original programmer. + 05/02/17 dmb Add error if WriteDatabaseRow is unable to lock row. + 10/31/17 dmb Add CalculateColumn and GetTableCommuter services. + 11/06/17 fjt [SRPFW-195] Added to FW v16.0.12 + 05/25/18 dmb Add GetUserLocks service. + 05/29/18 dmb Add IsKeyIDLocked, IsKeyIDSelfLocked, and UnlockKeyID services. + 10/09/18 djs Added ActivateRecord service, which sets @ID, @Record, and @DICT to enable {} shorthand. + 01/22/19 fjt [SRPFW-195] Updated to include codes in error reporting + 02/28/19 dmb [SRPFW-195] Add safety check in GetTableHandle to make sure the table's full + handle is still in @TABLES before using the cached handle. + 03/12/19 dmb [SRPFW-270] Add ClearTableHandle service so it is easy to remove the cached + table handle when situations such as aliasing a table from a different + volume occurs. + 03/12/19 dmb [SRPFW-270] Add SetTableAlias service to alias a table and call the + ClearTableHandle service if thealias was successful. + 05/03/19 dmb [SRPFW-273] Initialize TableName in the CalculateColumn service to prevent + potential VNAV errors. + 05/11/20 dmb [SRPFW-313] Add GetTableNames service. + 06/29/20 dmb [SRPFW-282] Update the GetTableNames service to support ExcludeDictionaries and + ExcludeIndexes arguments. + 08/04/20 djs Commented out UnlockKeyID service. This service causes OpenInsight to crash. Use + ReleaseKeyIDLock instead. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert SERVICE_SETUP +$insert VOL_TABLE_EQUATES +$insert RTI_LH_INFO_EQUATES + +Declare function Memory_Services, Database_Services, SRP_Encode, RetStack, RTI_LH_Info, SRP_Path, SRP_Array +Declare subroutine Memory_Services, Database_Services, Verify_LH, SRP_Stopwatch, Btree.Extract, Update_Index, Set_Status +Declare subroutine RTI_LH_Info, Alias_Table, Push.Select, Pop.Select + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// ActivateRecord +// +// TableName. The linear hash database table name. - [REQUIRED] +// KeyID. The KeyID to the database table. - [REQUIRED] +// +// Reads a data row for the indicated Key ID and database table. Sets @ID, @Record, and @DICT to enable {} shorthand. +//---------------------------------------------------------------------------------------------------------------------- +Service ActivateRecord(TableName, KeyID, NotExpired, ExpirationDuration, IgnoreMFSRoutines) + + If TableName NE '' AND KeyID NE '' then + @ID = KeyID + DictTable = '' + If TableName[1,5] _EQC 'DICT.' then + DictTable = TableName + TableName = TableName[-1, 'B.'] + end else + DictTable = 'DICT.':TableName + end + @DICT = Database_Services('GetTableHandle', DictTable) + If Error_Services('NoError') then + @Record = Database_Services('ReadDataRow',TableName,KeyID,NotExpired,ExpirationDuration,IgnoreMFSRoutines) + If Not(Error_Services('NoError')) then + Error_Services('Add','Error reading ':KeyID:' from the ':TableName:' table in the ':Service:' service.') + end + end else + Error_Services('Add', 'Error retrieving handle for the ':TableName:' table in the ':Service:' service.') + end + end + + Response = @Record + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// CalculateColumn +// +// Called directly from within a calculation column. The name of the table and column is derived from the call stack +// and the associated table commuter, if it exists, is called with the appropriate arguments. +//---------------------------------------------------------------------------------------------------------------------- +Service CalculateColumn() + + Response = '' + ColumnName = '' + TableName = '' + RetStack = RetStack() + For Each Item in RetStack using @FM + If Index(Item, 'DICT.MFS', 1) then + ColumnName = Item[2, \00\, 1] + CharPos = BCol2() + 1 + TableHandle = Item[CharPos, GetByteSize(Item), 1] + Locate TableHandle<1, 2> in @TABLES(TAB_HANDLE$) using @FM setting fPos then + TableName = @TABLES(0) ; // This technically returns the dictionary, but DICT. will be removed. + TableName[1, 5] = '' + end + end + Until (ColumnName NE '') OR (Item EQ '') + Next Item + + If TableName NE '' then + TableCommuter = Database_Services('GetTableCommuter', TableName) + If TableCommuter NE '' then + Response = Function(@TableCommuter('CalculateColumn', ColumnName)) + end + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ClearTableHandle +// +// TableName. The linear hash database table name. - [REQUIRED] +// +// Clears the table handle array array from cache. This will force the GetTableHandle service to call the Open statement +// again. +//---------------------------------------------------------------------------------------------------------------------- +Service ClearTableHandle(TableName) + + If TableName NE '' then + ServiceKeyID = ServiceModule : '*GetTableHandle' + ServiceKeyID := '*' : TableName + Memory_Services('SetValue', ServiceKeyID, '') + end else + Error_Services('Add', 'TableName was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// DeleteDataRow +// +// TableName. The linear hash database table name. - [REQUIRED] +// KeyID. The KeyID to the database table. - [REQUIRED] +// +// Deletes a data row for the indicated Key ID and database table. +//---------------------------------------------------------------------------------------------------------------------- +Service DeleteDataRow(TableName, KeyID, IgnoreSelfLock, IgnoreMFSRoutines) + + If TableName NE '' AND KeyID NE '' then + If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$ + If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$ + HaveLock = Database_Services('GetKeyIDLock', TableName, KeyID, IgnoreSelfLock) + If HaveLock EQ True$ then + TableHandle = Database_Services('GetTableHandle', TableName) + If IgnoreMFSRoutines then + MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited. + NumMFS = DCount(MFSList, @SVM) + For MFSCnt = NumMFS to 1 Step -1 + MFSRoutine = MFSList<0, 0, MFSCnt> + If (MFSRoutine NE 'SI.MFS') AND (MFSRoutine NE 'RTP57') then + MFSList = Delete(MFSList, 0, 0, MFSCnt) + end + Next MFSCnt + TableHandle<1, 1> = MFSList + end + + // [SRPFW-195] Updated / Added by GAC 18 May 2018 + If Error_Services('NoError') then + Delete TableHandle, KeyID then + Memory_Services('SetValue', ServiceModule : '*' : 'ReadDatarow' : '*' : TableName : '*' : KeyID, '') + end else + Error_Services('Add', 'Error deleting ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>) + end + end +* If Error_Services('NoError') then + Database_Services('ReleaseKeyIDLock', TableName, KeyID) +* end + + end else + Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetKeyIDLock +// +// Attempts to perform a semaphore lock on the indicated tablename and Key ID. +//---------------------------------------------------------------------------------------------------------------------- +Service GetKeyIDLock(TableName, KeyID, IgnoreSelfLock) + + HaveLock = False$ ; // Assume false for now. + + If TableName NE '' AND KeyID NE '' then + If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$ + TableHandle = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + Lock Tablehandle, KeyID then + HaveLock = True$ + end else + If IgnoreSelfLock EQ True$ then + Status = Status() + If Status EQ 1 then + HaveLock = True$ + end + end + end + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + + Response = HaveLock + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTableCommuter +// +// Returns the name of the indicated table's commuter module if it exists. If it does not exist then an empty string +// will be returned. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTableCommuter(TableName) + + ServiceKeyID := '*' : TableName + TableCommuter = Memory_Services('GetValue', ServiceKeyID) + + If TableCommuter EQ '' then + ObjExists = False$ ; // Assume the object code for the action handler does not exist for now. + For Each AppID in @AppId + If AppID _EQC 'SYSPROG' then + SysObjKey = '$' : TableName : '_ACTIONS' + end else + SysObjKey = '$' : TableName : '_ACTIONS' : '*' : AppID + end + ObjExists = Memory_Services('KeyExists', SysObjKey) + Until ObjExists + Next AppID + + If Not(ObjExists) then + For Each AppID in @AppId + If AppID _EQC 'SYSPROG' then + SysObjKey = '$' : TableName : '_ACTIONS' + end else + SysObjKey = '$' : TableName : '_ACTIONS' : '*' : AppID + end + OrigFileError = @FILE.ERROR + @FILE.ERROR = '' + BFS = 'RTP57' + // The handle to SYSOBJ is used to find object code before it gets called + ActionStatus = '' + Call @BFS(2, BFS, @FILE_SYSOBJ<1, 2>, SysObjKey, FMC, SysObjRecord, ActionStatus) + @FILE.ERROR = OrigFileError + If ActionStatus then ObjExists = True$ + Until ObjExists + Next AppID + end + + If (ObjExists) then + TableCommuter = TableName : '_ACTIONS' + Memory_Services('SetValue', ServiceKeyID, TableCommuter) + end + end + + Response = TableCommuter + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTableHandle +// +// TableName. The linear hash database table name. - [REQUIRED] +// +// Returns an array of information related to the database table being passed in. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTableHandle(TableName) + + TableHandle = '' + + If TableName NE '' then + ServiceKeyID := '*' : TableName + + Locate TableName in @Tables(tab_name$) using @FM setting fPos then + If @Tables(tab_handle$) NE '' then + // Only check for a cached handle if the table and its handle is still in @TABLES. Otherwise the handle is + // probably stale and will hang OI when utilized. + TableHandle = Memory_Services('GetValue', ServiceKeyID) + end + end + + If TableHandle EQ '' then + rv = Set_Status(0) + Open TableName to TableHandle then + Memory_Services('SetValue', ServiceKeyID, TableHandle) + end else + Error_Services('Add', 'Unable to open the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>) + end + end + end else + Error_Services('Add', 'TableName was missing in the ' : Service : ' service.') + end + + Response = TableHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTableNames +// +// ApplicationTablesOnly - Boolean flag to determine if only application database tables should be returned (i.e., +// exclude SYSTEM and non-RTP57 tables). Default is True. +// ExcludeDictionaries - Boolean flag to determine if dictionary tables should be excluded. Default is False. +// ExcludeIndexes - Boolean flag to determine if index tables should be excluded. Default is False. +// +// Returns an @FM list of currently attached OpenInsight database tables. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTableNames(ApplicationTablesOnly=BOOLEAN, ExcludeDictionaries=BOOLEAN, ExcludeIndexes=BOOLEAN) + + TableNames = '' ; // Initialize the return variable. + + If ApplicationTablesOnly NE False$ then ApplicationTablesOnly = True$ + If ExcludeDictionaries NE True$ then ExcludeDictionaries = False$ + If ExcludeIndexes NE True$ then ExcludeIndexes = False$ + + TableNames = @Tables(tab_name$) + TableTypes = @Tables(tab_vol_name$) + If ApplicationTablesOnly EQ True$ then + Tables = '' + For Each TableType in TableTypes using @FM setting fPos + TableName = TableNames + If (TableType[1, 'F*'] EQ 'RTP57') AND Not(TableType EQ 'RTP57*REVBOOT') AND Not(TableType EQ 'RTP57*O4WFILES') AND Not(TableType EQ 'RTP57*AREV_DIR') then + Tables := TableName : @FM + end + Next TableType + Tables[-1, 1] = '' + Transfer Tables to TableNames + end + If ExcludeDictionaries EQ True$ then + Tables = '' + For Each TableName in TableNames using @FM + If TableName[1, 5] NE 'DICT.' then + Tables := TableName : @FM + end + Next TableType + Tables[-1, 1] = '' + Transfer Tables to TableNames + end + If ExcludeIndexes EQ True$ then + Tables = '' + For Each TableName in TableNames using @FM + If TableName[1, 1] NE '!' then + Tables := TableName : @FM + end + Next TableType + Tables[-1, 1] = '' + Transfer Tables to TableNames + end + TableNames = SRP_Array('SortRows', TableNames, 'AL1', 'LIST', @FM, @VM) + + Response = TableNames + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTableProperties +// +// TableName. The linear hash database table name. - [REQUIRED] +// +// Returns an array of information related to the database table being passed in. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTableProperties(TableName) + + TableProperties = '' + + If TableName NE '' then + rv = Set_Status(0) + Locate TableName in @TABLES(tab_name$) using @FM setting fPos then + TableProperties<1> = @TABLES(tab_account$) ; // DatabaseID + TableProperties<2> = @TABLES(tab_file_sys$) ; // MFS/BFS List + VolumeID = @TABLES(tab_vol_name$) ; // Volume ID + Locate VolumeID in @VOLUMES(vol_name$) using @FM setting fPos then + TableProperties<3> = @VOLUMES(vol_label$) ; // Volume Label + TableProperties<4> = @VOLUMES(vol_location$) ; // Volume Path + TableProperties<5> = @VOLUMES(vol_file_sys$) ; // BFS + end + end else + Error_Services('Add', 'The ' : TableName : ' table is not attached and available to the ' : Service : ' service.') + end + end else + Error_Services('Add', 'TableName argument was missing in the ' : Service : ' service.') + end + + Response = TableProperties + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetUserLocks +// +// Returns a dynamic array of user lock information. Note, this can only be done with the UD 5. This can also cause +// instability with the current session and may require the Task Manager to close the session. +//---------------------------------------------------------------------------------------------------------------------- +Service GetUserLocks() + + UserLocks = RTI_LH_Info(CMD_LOCKS_INFO$, '') + + Response = UserLocks + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsKeyIDLocked +// +// Returns a Boolean flag of the lock status for the indicated table and Key ID. +//---------------------------------------------------------------------------------------------------------------------- +Service IsKeyIDLocked(TableName, KeyID, IgnoreSelfLock=BOOLEAN) + + If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$ + + KeyIDLocked = False$ ; // Assume false for now. + + If (TableName NE '') AND (KeyID NE '') then + Open TableName to hTable then + Lock hTable, KeyID then + // Able to lock Key ID. Unlock it right away. + Unlock hTable, KeyID else Null + end else + // Unable to lock Key ID. Evaluate the type of lock. + LockType = Status() + If LockType EQ 0 then + // Lock exists on another station. + KeyIDLocked = True$ + end else + // Lock exists on this station. Check to see if the Ignore Self Lock flag is set. + If Not(IgnoreSelfLock) then KeyIDLocked = True$ + end + end + end else + Error_Services('Add', 'Error opening the ' : TableName : ' table in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + + Response = KeyIDLocked + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsKeyIDSelfLocked +// +// Returns a Boolean flag of the self-lock status for the indicated table and Key ID. +//---------------------------------------------------------------------------------------------------------------------- +Service IsKeyIDSelfLocked(TableName, KeyID) + + KeyIDSelfLocked = False$ ; // Assume false for now. + + If (TableName NE '') AND (KeyID NE '') then + Open TableName to hTable then + Lock hTable, KeyID then + // Able to lock Key ID. Unlock it right away. + Unlock hTable, KeyID else Null + end else + // Unable to lock Key ID. Evaluate the type of lock. + LockType = Status() + If LockType EQ 1 then + // This Key ID is self-locked. + KeyIDSelfLocked = True$ + end + end + end else + Error_Services('Add', 'Error opening the ' : TableName : ' table in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + + Response = KeyIDSelfLocked + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ReadDataColumn +// +// TableName. The linear hash database table name. - [REQUIRED] +// KeyID. The KeyID to the database table. - [REQUIRED] +// ColumnNo. The index of the column that is to be read. - [REQUIRED] +// +// Reads a data column for the indicated Key ID and database table. +//---------------------------------------------------------------------------------------------------------------------- +Service ReadDataColumn(TableName, KeyID, ColumnNo, NotExpired, ExpirationDuration, IgnoreMFSRoutines) + + If NotExpired NE False$ then NotExpired = True$ + If (ExpirationDuration EQ '') OR (Not(Num(ExpirationDuration))) then ExpirationDuration = 0 + If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$ + + ServiceKeyID := '*' : TableName : '*' : KeyID : '*' : ColumnNo + DataColumn = Memory_Services('GetValue', ServiceKeyID, NotExpired, ExpirationDuration) + + If Num(ColumnNo) AND (ColumnNo GT 0) then + If TableName NE '' AND KeyID NE '' then + If DataColumn EQ '' then + TableHandle = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + If IgnoreMFSRoutines then + MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited. + NumMFS = DCount(MFSList, @SVM) + For MFSCnt = NumMFS to 1 Step -1 + MFSRoutine = MFSList<0, 0, MFSCnt> + If MFSRoutine NE 'RTP57' then + MFSList = Delete(MFSList, 0, 0, MFSCnt) + end + Next MFSCnt + TableHandle<1, 1> = MFSList + end + ReadV DataColumn from TableHandle, KeyID, ColumnNo then + Memory_Services('SetValue', ServiceKeyID, DataColumn) + end else + ErrorMsg = 'Error reading ' : KeyID : ' column number ' : ColumnNo : ' from the ' | + : TableName : ' table in the ' : Service : ' service.' + Error_Services('Add', ErrorMsg) + end + end + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'ColumnNo was not a number or was not greater than zero in the ' : Service : ' service.') + end + + Response = DataColumn + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ReadDataRow +// +// TableName - The linear hash database table name. - [REQUIRED] +// KeyID - The KeyID to the database table. - [REQUIRED] +// +// Reads a data row for the indicated Key ID and database table. +//---------------------------------------------------------------------------------------------------------------------- +Service ReadDataRow(TableName, KeyID, NotExpired, ExpirationDuration, IgnoreMFSRoutines) + + If NotExpired NE False$ then NotExpired = True$ + If (ExpirationDuration EQ '') OR (Not(Num(ExpirationDuration))) then ExpirationDuration = 0 + If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$ + + ServiceKeyID := '*' : TableName : '*' : KeyID + DataRow = Memory_Services('GetValue', ServiceKeyID, NotExpired, ExpirationDuration) + + If TableName NE '' AND KeyID NE '' then + If DataRow EQ '' then + TableHandle = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + If IgnoreMFSRoutines then + MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited. + NumMFS = DCount(MFSList, @SVM) + For MFSCnt = NumMFS to 1 Step -1 + MFSRoutine = MFSList<0, 0, MFSCnt> + If MFSRoutine NE 'RTP57' then + MFSList = Delete(MFSList, 0, 0, MFSCnt) + end + Next MFSCnt + TableHandle<1, 1> = MFSList + end + // [SRPFW-195] + Read DataRow from TableHandle, KeyID then + Memory_Services('SetValue', ServiceKeyID, DataRow) + end else + Error_Services('Add', 'Error reading ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>) + + end + end + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + + Response = DataRow + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ReleaseKeyIDLock +// +// Attempts to release a semaphore lock on the indicated tablename and Key ID. +//---------------------------------------------------------------------------------------------------------------------- +Service ReleaseKeyIDLock(TableName, KeyID) + + LockReleased = False$ ; // Assume false for now. + + If TableName NE '' AND KeyID NE '' then + TableHandle = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + UnLock Tablehandle, KeyID then + LockReleased = True$ + end else + Error_Services('Add', 'Unable to unlock the ' : KeyID : ' Key ID from the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>) + end + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + + Response = LockReleased + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SearchIndex +// +// TableName. The linear hash database table name. - [REQUIRED] +// ColumnName. The indexed column to search against. - [REQUIRED] +// SearchValue. The value being searched for. - [REQUIRED] +// UpdateIndex. Boolean flag to determine if the index for the indicated column should be updated before searching. +// - [OPTIONAL] +// +// Returns an @FM delimited list of Key IDs that match the search value. +//---------------------------------------------------------------------------------------------------------------------- +Service SearchIndex(TableName, ColumnName, SearchValue, UpdateIndex) + + If UpdateIndex NE True$ then UpdateIndex = False$ + + ServiceKeyID := '*' : TableName : '*' : ColumnName : '*' : SearchValue + ServiceKeyID = SRP_Encode(ServiceKeyID, 'BASE64') +* KeyIDList = Memory_Services('GetValue', ServiceKeyID, True$, 5) + KeyIDList = '' + + If TableName NE '' AND ColumnName NE '' AND SearchValue NE '' then + If KeyIDList EQ '' then + DictTableHandle = Database_Services('GetTableHandle', 'DICT.' : TableName) + If Error_Services('NoError') then + Set_Status(0) + If UpdateIndex then Update_Index(TableName, ColumnName 0) + Set_Status(0) + Flag = '' + Btree.Extract(ColumnName : @VM : SearchValue : @FM, Tablename, DictTableHandle, KeyIDList, 'S', Flag) + If Flag EQ 0 then + Convert @VM to @FM in KeyIDList + Memory_Services('SetValue', ServiceKeyID, KeyIDList) + end else + Error_Services('Add', 'Error in Btree.Extract search from the ' : TableName : ' table in the ' : Service : ' service.') + end + end + end + end else + Error_Services('Add', 'TableName, ColumnName, or SearchValue argument was missing in the ' : Service : ' service.') + end + + Response = KeyIDList + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetTableAlias +// +// TableName - The linear hash database table name. - [Required] +// AliasName - The alias name being set. - [Required] +// Volume - The location path or volume name where the table exists. - [Required] +// DatabaseID - Database ID of the table being aliased. Defaults to the current Database ID (@DBID) - [Optional] +// +// Attempts to create an alias for the indicated table, volume, and database. It returns a True$ if successful or a +// False$ if unsuccessful. +//---------------------------------------------------------------------------------------------------------------------- +Service SetTableAlias(TableName, AliasName, Volume, DatabaseID) + + Success = False$ ; // Assume not successful for now. + + If (TableName NE '') AND (AliasName NE '') AND (Volume NE '') then + Set_Status(0) + If DatabaseID EQ '' then DatabaseID = @DBID + Push.Select(F1, F2, F3, F4) ; // Protect cursors in case Alias_Table fails. + Alias_Table(Volume : '', DatabaseID : '', TableName : '', AliasName : '') + Pop.Select(F1, F2, F3, F4) ; // Restore cursors. + StatusCode = '' + If Get_Status(StatusCode) then + Error_Services('Add', 'Error calling the Alias_Table routine in the ' : Service : ' service. Status Code : ' : StatusCode) + end else + // Setting an alias could changes the handle so clear the cached handle to avoid it being stale. + Success = True$ + Database_Services('ClearTableHandle', AliasName) + end + Set_Status(0) + end else + Error_Services('Add', 'TableName, AliasName, or Volume argument was missing in the ' : Service : ' service.') + end + + Response = Success + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// UnlockKeyID +// +// Attempts to unlock the indicated Key ID from the indicated Table Name. Note, this can only be done with the UD 5. +//---------------------------------------------------------------------------------------------------------------------- +* Service UnlockKeyID(TableName, KeyID) +* +* KeyIDUnlocked = False$ ; // Assume false for now. +* +* Convert @Lower_Case to @Upper_Case in TableName +* +* If (TableName NE '') AND (KeyID NE '') then +* // First, do a sanity check to confirm that there is a lock on this Key ID. +* IsKeyIDLocked = Database_Services('IsKeyIDLocked', TableName, KeyID, False$) +* If Error_Services('NoError') AND (IsKeyIDLocked EQ False$) then +* // Key ID was not locked. +* KeyIDUnlocked = True$ +* end +* If KeyIDUnlocked NE True$ then +* // Key ID is still presumed to be locked. +* VolumePath = '' +* FileName = '' +* +* // Resolve the volume path for this table. +* hTableFull = Database_Services('ReadDataRow', 'SYSTABLES', TableName) +* VolumeName = hTableFull<1> +* VolumeRow = Database_Services('ReadDataRow', 'SYSVOLUMES', VolumeName) +* VolumePath = VolumeRow[-1, 'B' : @FM] +* VolumePath = VolumePath[-1, 'B' : \0D\] +* VolumePath[1, 12] = '' ; // Strip off the preceding bytes. +* If SRP_Path('IsRelative', VolumePath) then +* VolumePath = SRP_Path('Combine', Drive(), VolumePath) +* end +* VolumePath = SRP_Path('RemoveFilename', VolumePath) +* // Make sure there is a backslash since the RTI_LH_INFO API seems to use this. +* VolumePath = SRP_Path('AddBackslash', VolumePath) +* +* // Resolve the filename for this table. +* hTableFull = Database_Services('ReadDataRow', 'SYSTABLES', TableName) +* FileName = hTableFull[-1, 'B' : @FM] +* FileName = FileName[-1, 'B' : \0D\] +* FileName = FileName[1, @VM] +* If FileName _NEC 'SYSREPOS' then FileName[1, 12] = '' ; // Strip off the preceding bytes. +* FileName = FileName[-1, 'B' : '\'] +* // Make sure the filename is well formed. +* Begin Case +* Case (FileName[-3, 3] _EQC '.LK') OR (FileName[-3, 3] _EQC '.OV') +* FileName[-3, 3] = '' +* Case FileName _EQC 'SYSREPOS' +* FileName = 'REVREPOS' +* End Case +* +* If (VolumePath NE '') AND (FileName) NE '' then +* // Attempt to unlocked the Key ID. +* RTI_LH_Info(CMD_UNLOCK$, VolumePath, FileName, KeyID, FileName) +* // Confirm that the Key ID was unlocked. +* IsKeyIDLocked = Database_Services('IsKeyIDLocked', TableName, KeyID, False$) +* If Error_Services('NoError') AND (IsKeyIDLocked EQ False$) then +* // Key ID was not locked. +* KeyIDUnlocked = True$ +* end else +* // Unable to unlock the Key ID which could be because it is locked by this station. Try using the +* // Unlock statement. +* hTable = Database_Services('GetTableHandle', TableName) +* Unlock hTable, KeyID then +* KeyIDUnlocked = True$ +* end else +* Error_Services('Add', 'Unable to unlock ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service.') +* end +* end +* end else +* Error_Services('Add', 'No valid VolumePath or FileName was available in the ' : Service : ' service.') +* end +* end +* end else +* Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') +* end +* +* Response = KeyIDUnlocked +* +* end service + + +//---------------------------------------------------------------------------------------------------------------------- +// VerifyLH +// +// TableNames. One or more linear hash database tables to verify. List should be @FM delimited. - [OPTIONAL] +// SaveList. Name of a saved selection of linear hash database tables to verify. This argument will be ignored +// if TableNames is populated. - [OPTIONAL] +// +// Performs a health check against the indicated tables and returns back any issues. Note: This uses the Verify_LH +// subroutine to check for GFEs. All results are stored in the SYSLHVERIFY table with a KeyID of +// VolumeLabel*DatabaseID*TableName. Returns the list of groups that have GFEs or returns an empty string if there are +// none. The list of GFEs or empty strings will themselves be @FM delimited to correspond with the tables passed into +// this service. +//---------------------------------------------------------------------------------------------------------------------- +Service VerifyLH(Tablenames, SaveList) + + VerifyResults = '' + + If TableNames EQ '' then + TableNames = Xlate('SYSLISTS', SaveList, '', 'X') + If Index(TableNames<1>, @TM, 1) then + // This saved select has metadata in attribute 1. Remove it. + TableNames = Delete(TableNames, 1, 0, 0) + end + end + + If TableNames NE '' then + NumTables = DCount(TableNames, @FM) + For TableCnt = 1 to NumTables + TableName = TableNames + TableProperties = Database_Services('GetTableProperties', TableName) + If Error_Services('NoError') then + rv = Set_Status(0) + Verify_LH('', TableName, True$, False$, False$) + Open 'SYSLHVERIFY' to hSysLHVerify then + DatabaseID = TableProperties<1> + VolumeLabel = TableProperties<3> + LHVerifyKeyID = VolumeLabel : '*' : DatabaseID : '*' : TableName + Read LHVerifyRec from hSysLHVerify, LHVerifyKeyID then + VerifyResults = LHVerifyRec<2> + end + end else + Error_Services('Add', 'Error opening the SYSLHVERIFY table in the ' : Service : ' service.') + end + Begin Case + Case @File_Error NE '' + Error_Services('Add', 'Error verifying table ' : TableName : ': FS Error = ' : @File_Error<1>) + Case Get_Status() + Error_Services('Add', 'Get_Status error: ' : Get_Status()) + End Case + end + Next TableCnt + end else + Error_Services('Add', 'The TableName argument was missing in the ' : Service : ' service.') + end + + Response = VerifyResults + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// VerifyLHAll +// +// Performs a health check against all attached tables and returns back any issues. Returns two lists which are +// delimited by an @RM. The first list is an @FM list of attached tables. The second list is an @FM list of results +// (groups that have GFEs or an empty string if there are none). Items in each list correspond which each other based on +// their list position. +//---------------------------------------------------------------------------------------------------------------------- +Service VerifyLHAll() + + VerifyResults = '' + TableNames = @TABLES(0) + NumTables = DCount(TableNames, @FM) + + For TableCnt = 1 to NumTables + TableName = TableNames + VerifyResults := Database_Services('VerifyLH', TableName) : @FM + Next TableCnt + VerifyResults[-1, 1] = '' ; // Strip off the last @FM + + Response = TableNames : @RM : VerifyResults + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// WriteDataRow +// +// TableName. The linear hash database table name. - [REQUIRED] +// KeyID. The KeyID to the database table. - [REQUIRED] +// +// Writes a data row for the indicated Key ID and database table. +//---------------------------------------------------------------------------------------------------------------------- +Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks) + + If TableName NE '' AND KeyID NE '' then + If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$ + If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$ + If IgnoreAllLocks NE True$ then IgnoreAllLocks = False$ + If IgnoreAllLocks then + HaveLock = True$ + end else + HaveLock = Database_Services('GetKeyIDLock', TableName, KeyID, IgnoreSelfLock) + end + If HaveLock EQ True$ then + TableHandle = Database_Services('GetTableHandle', TableName) + If IgnoreMFSRoutines then + MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited. + NumMFS = DCount(MFSList, @SVM) + For MFSCnt = NumMFS to 1 Step -1 + MFSRoutine = MFSList<0, 0, MFSCnt> + If (MFSRoutine NE 'SI.MFS') AND (MFSRoutine NE 'RTP57') then + MFSList = Delete(MFSList, 0, 0, MFSCnt) + end + Next MFSCnt + TableHandle<1, 1> = MFSList + end + + // [SRPFW-195] Updated / added by GAC 18 May 2018 + If Error_Services('NoError') then + Write DataRow to TableHandle, KeyID then + Memory_Services('SetValue', ServiceModule : '*' : 'ReadDatarow' : '*' : TableName : '*' : KeyID, DataRow) + end else + ErrorMsg = Error_Services('GetMessage') + Error_Services('Add', 'Error writing ' : KeyID : ' to the ' : TableName : ' table in the ' : Service : ' service. Error message: ':ErrorMsg) + end + end +* If Error_Services('NoError') then + If IgnoreAllLocks EQ False$ then + Database_Services('ReleaseKeyIDLock', TableName, KeyID) + end +* end + end else + Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + +end service + +//---------------------------------------------------------------------------------------------------------------------- +// UnlockKeyID +// +// Attempts to unlock the indicated Key ID from the indicated Table Name. Note, this can only be done with the UD 5. +//---------------------------------------------------------------------------------------------------------------------- +Service UnlockKeyID(TableName, KeyID) + + KeyIDUnlocked = False$ ; // Assume false for now. + Convert @Lower_Case to @Upper_Case in TableName + + If (TableName NE '') AND (KeyID NE '') then + // First, do a sanity check to confirm that there is a lock on this Key ID. + IsKeyIDLocked = Database_Services('IsKeyIDLocked', TableName, KeyID, False$) + If Error_Services('NoError') AND (IsKeyIDLocked EQ False$) then + // Key ID was not locked. + KeyIDUnlocked = True$ + end + If KeyIDUnlocked NE True$ then + // Key ID is still presumed to be locked. + VolumePath = '' + FileName = '' + + // Resolve the volume path for this table. + hTableFull = Database_Services('ReadDataRow', 'SYSTABLES', TableName) + VolumeName = hTableFull<1> + VolumeRow = Database_Services('ReadDataRow', 'SYSVOLUMES', VolumeName) + VolumePath = VolumeRow[-1, 'B' : @FM] + VolumePath = VolumePath[-1, 'B' : \0D\] + VolumePath[1, 12] = '' ; // Strip off the preceding bytes. + If SRP_Path('IsRelative', VolumePath) then + VolumePath = SRP_Path('Combine', Drive(), VolumePath) + end + VolumePath = SRP_Path('RemoveFilename', VolumePath) + // Make sure there is a backslash since the RTI_LH_INFO API seems to use this. + VolumePath = SRP_Path('AddBackslash', VolumePath) + + // Resolve the filename for this table. + hTableFull = Database_Services('ReadDataRow', 'SYSTABLES', TableName) + FileName = hTableFull[-1, 'B' : @FM] + FileName = FileName[-1, 'B' : \0D\] + FileName = FileName[1, @VM] + If FileName _NEC 'SYSREPOS' then FileName[1, 12] = '' ; // Strip off the preceding bytes. + FileName = FileName[-1, 'B' : '\'] + // Make sure the filename is well formed. + Begin Case + Case (FileName[-3, 3] _EQC '.LK') OR (FileName[-3, 3] _EQC '.OV') + FileName[-3, 3] = '' + Case FileName _EQC 'SYSREPOS' + FileName = 'REVREPOS' + End Case + + If (VolumePath NE '') AND (FileName) NE '' then + // Attempt to unlocked the Key ID. + RTI_LH_Info(CMD_UNLOCK$, VolumePath, FileName, KeyID, FileName) + // Confirm that the Key ID was unlocked. + IsKeyIDLocked = Database_Services('IsKeyIDLocked', TableName, KeyID, False$) + If Error_Services('NoError') AND (IsKeyIDLocked EQ False$) then + // Key ID was not locked. + KeyIDUnlocked = True$ + end else + // Unable to unlock the Key ID which could be because it is locked by this station. Try using the + // Unlock statement. + hTable = Database_Services('GetTableHandle', TableName) + Unlock hTable, KeyID then + KeyIDUnlocked = True$ + end else + Error_Services('Add', 'Unable to unlock ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service.') + end + end + end else + Error_Services('Add', 'No valid VolumePath or FileName was available in the ' : Service : ' service.') + end + end + end else + Error_Services('Add', 'TableName or KeyID argument was missing in the ' : Service : ' service.') + end + Response = KeyIDUnlocked + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + diff --git a/FRAMEWORKS/STPROC/DBW_AUDIT_MANAGER_EVENTS.txt b/FRAMEWORKS/STPROC/DBW_AUDIT_MANAGER_EVENTS.txt new file mode 100644 index 0000000..ca9cfd8 --- /dev/null +++ b/FRAMEWORKS/STPROC/DBW_AUDIT_MANAGER_EVENTS.txt @@ -0,0 +1,1204 @@ +Function DBW_Audit_Manager_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// This program is proprietary and is not to be used by or disclosed to others, nor is it to +// be copied without written permission from SRP Computer Solutions, Inc. +// +// Name : DBW_Audit_Manager_Events +// +// Description: This function acts as a commuter module for all events related to this window. +// +// Notes: Commuter Modules are automatically called from the Promoted_Events function +// which is called by the application-specific promoted event handler. This makes +// it possible to add QuickEvents that need to execute Basic+ logic without having +// use the Form Designer to make the association, although this is limited to the +// events which are currently promoted. +// +// If the form needs to call the commuter module directly then the QuickEvent +// parameters should be formatted like this: +// +// '@SELF','@EVENT',['@PARAM1','@PARAMx'] +// +// Parameters: +// CtrlEntId [in] -- The fully qualified name of the control calling the promoted event +// Event [in] -- The event being executed. See the Notes section regarding "PRE" events +// Param1-15 [in] -- Additional event parameter holders +// EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to +// chain forward. See comments in EVENT_SETUP insert +// +// History (Date, Initials, Notes) +// 07/23/98 dmb Original programmer +// 04/06/10 rch Hard-code fonts in SRP EditTable to 8pt size for consistency on all systems. +// 11/02/10 rch Hard-code fonts in SRP EditTable to Tahoma for consistency on all systems. +// +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +$insert APP_INSERTS +$insert EVENT_SETUP +$insert MSG_EQUATES + +GoSub Get_MFS_Name +* MFSName = "AUDIT_MANAGER_MFS*":@APPID<1> +AuditManagerTable = "APP_INFO" +ID = Get_Property(@Window:".EDL_FIELD_TRACEABILITY", "TEXT") + +Declare subroutine V119, Attach_Table, Detach_table, SRP_Set_Prop_Array, SRP_Show_Window, Set_Status, Set_MFS, Define_Database, Create_Table, RTP5, +Declare subroutine Retstack, Delete_Table, Define_Database, Send_Message, Send_Event, Set_Property +Declare function Verify_Access, PopUp + +Begin Case + Case Control EQ Window + // This event is window specific. + + Begin Case + Case Event EQ "CREATE" ; GoSub CREATE + Case Event EQ "READ" ; GoSub READ + Case Event EQ "WRITE" ; GoSub WRITE + End Case + + Case Control EQ "EDT_AUDIT_TABLES" + + Begin Case + Case Event EQ "OnOptionClick" ; GoSub OnOptionClick.EDT_AUDIT_TABLES + Case Event EQ "BeforeUpdate" ; GoSub BeforeUpdate.EDT_AUDIT_TABLES + Case Event EQ "AfterUpdate" ; GoSub AfterUpdate.EDT_AUDIT_TABLES + Case Event EQ "OnCheckChanged" ; GoSub OnCheckChanged.EDT_AUDIT_TABLES + Case Event EQ "BeforeDeleteRecords" ; GoSub BeforeDeleteRecords.EDT_AUDIT_TABLES + Case Event EQ "BeforeInsertRecords" ; GoSub BeforeInsertRecords.EDT_AUDIT_TABLES + Case Event EQ "PosChanging" ; GoSub PosChanging.EDT_AUDIT_TABLES + End Case + +End Case + +If Assigned(EventFlow) else EventFlow = EVENT_CONTINUE$ + +Return EventFlow + +CREATE: + *--------------------------------------------------------------------------------------------------------------------------------------------- + * This is needed to lock down the three important columns and leave the ability to use the SELPOS properties + *--------------------------------------------------------------------------------------------------------------------------------------------- + Color = "3D Face L=90" + PropArray = @Window:".OLE_TAB" + PropArray<-1> = "OLE.TabCount" :@VM: 0 + PropArray<-1> = "OLE.Height" :@VM: "-8" + PropArray<-1> = "OLE.AllowXPTheme" :@VM: Yes$ + SRP_Set_Prop_Array(PropArray) + + PropArray = @Window:".EDT_AUDIT_TABLES" + PropArray<-1> = "OLE.WorkspaceBkColor" :@VM: "Window" + PropArray<-1> = "OLE.BorderType" :@VM: "XP" + PropArray<-1> = "OLE.Dimension<1>" :@VM: 7 ;* number of columns + PropArray<-1> = "OLE.Dimension<2>" :@VM: 20 ;* number of rows + PropArray<-1> = "OLE.HeaderColumn[1]<2>" :@VM: 0 ;* Visable (Column Numbers?) + PropArray<-1> = "OLE.HeaderFont[All;All]" :@VM: 'Tahoma':@SVM:8 ;* Hardcode to 8pt size + PropArray<-1> = "OLE.TitleList<1,1>" :@VM: "Table Name" ;* Table Name Column 1 + PropArray<-1> = "OLE.TitleList<1,2>" :@VM: "Modified by Pos" + PropArray<-1> = "OLE.TitleList<1,3>" :@VM: "Write" ;* Write Flag Column 2 + PropArray<-1> = "OLE.TitleList<1,4>" :@VM: "Delete" ;* Delete Flag Column 3 + PropArray<-1> = "OLE.TitleList<1,5>" :@VM: "Read" ;* Read Flag Column 4 + PropArray<-1> = "OLE.TitleList<1,6>" :@VM: "Tracker" + PropArray<-1> = "OLE.TitleList<1,7>" :@VM: "Status" ;* Temporary Column identifying whether the table is attached + PropArray<-1> = "OLE.CellType[1; All]" :@VM: "Option" + PropArray<-1> = "OLE.CellType[2; All]" :@VM: "Option" + PropArray<-1> = "OLE.CellType[3; All]" :@VM: "CHB" + PropArray<-1> = "OLE.CellType[4; All]" :@VM: "CHB" + PropArray<-1> = "OLE.CellType[5; All]" :@VM: "CHB" + PropArray<-1> = "OLE.CellType[6; All]" :@VM: "CHB" + PropArray<-1> = "OLE.QuickTabOut" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[1]<1>" :@VM: 140 + PropArray<-1> = "OLE.DataColumn[1]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[1]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[1]<4>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[2]<1>" :@VM: 90 + PropArray<-1> = "OLE.DataColumn[2]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[2]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[3]<1>" :@VM: 40 + PropArray<-1> = "OLE.DataColumn[3]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[3]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[4]<1>" :@VM: 40 + PropArray<-1> = "OLE.DataColumn[4]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[4]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[5]<1>" :@VM: 40 + PropArray<-1> = "OLE.DataColumn[5]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[5]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<1>" :@VM: 50 + PropArray<-1> = "OLE.DataColumn[6]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[7]<1>" :@VM: 90 + PropArray<-1> = "OLE.DataColumn[7]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[7]<3>" :@VM: 1 + PropArray<-1> = "OLE.CellAlignment[3;All]<2>" :@VM: "C" + PropArray<-1> = "OLE.CellAlignment[4;All]<2>" :@VM: "C" + PropArray<-1> = "OLE.CellAlignment[5;All]<2>" :@VM: "C" + PropArray<-1> = "OLE.CellAlignment[6;All]<2>" :@VM: "C" + PropArray<-1> = "OLE.CellColors[3;All]<2>" :@VM: Color + PropArray<-1> = "OLE.CellColors[4;All]<2>" :@VM: Color + PropArray<-1> = "OLE.CellColors[5;All]<2>" :@VM: Color + PropArray<-1> = "OLE.CellColors[6;All]<2>" :@VM: Color + PropArray<-1> = "OLE.CellFont[All;All]" :@VM: 'Tahoma':@SVM:8 + PropArray<-1> = "OLE.MinCellSize" :@VM: 16 + SRP_Set_Prop_Array(PropArray) + + Qualifier = "" + Qualifier<1> = Yes$ + Qualifier<4> = Yes$ + + Send_Message(@Window:".EDT_AUDIT_TABLES", "QUALIFY_EVENT", "ALL_OLES", Qualifier) + + Send_Event(@Window, "READ") + + SRP_Show_Window(@Window, "", "L", "T", Yes$, "", No$, No$) + +return + + +PosChanging.EDT_AUDIT_TABLES: + + PropArray = CtrlEntId + ColPos = Field(Param2, ";", 1, 1) + RowPos = Field(Param2, ";", 2, 1) + ByPassFlag = No$ + rv = Get_Property(CtrlEntId, "OLE.CellText[1;":RowPos:"]") + tVal = Get_Property(CtrlEntId, "OLE.CellText[7;":RowPos:"]") + + Begin Case + Case ColPos = 1 + If rv EQ "" Then + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellType[2;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellCheck[3;":RowPos:"]" :@VM: "" + PropArray<-1> = "OLE.CellCheck[4;":RowPos:"]" :@VM: "" + PropArray<-1> = "OLE.CellCheck[5;":RowPos:"]" :@VM: "" + PropArray<-1> = "OLE.CellCheck[6;":Rowpos:"]" :@VM: "" + PropArray<-1> = "OLE.CellText[7;":RowPos:"]" :@VM: "" + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "None" + PropArray<-1> = "OLE.CellProtection[2;":RowPos:"]" :@VM: "None" + PropArray<-1> = "OLE.CellProtection[7;":RowPos:"]" :@VM: "None" + End + Case Otherwise$ + If rv = "" Or tVal = "Not Attached" Then + PropArray<-1> = "OLE.CellType[2;":Rowpos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellProtection[2;":RowPos:"]" :@VM: "SEL" + PropArray<-1> = "OLE.CellProtection[7;":RowPos:"]" :@VM: "FULL" + End Else + PropArray<-1> = "OLE.CellType[2;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellProtection[2;":RowPos:"]" :@VM: "None" + Begin Case + Case tVal = "Activate" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellProtection[7;":RowPos:"]" :@VM: "SEL" + Case Otherwise$ + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "SEL" + PropArray<-1> = "OLE.CellProtection[7;":RowPos:"]" :@VM: "None" + End Case + End + End Case + SRP_Set_Prop_Array(PropArray) + +return + + +READ: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + rVal = Get_Property(@Window:".EDT_AUDIT_TBACK", "ARRAY") + MxVal = Count(rVal<1>, @VM) + (rVal<1> NE "") + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.Array", rVal) + CtrlEntId = @Window:".EDT_AUDIT_TABLES" + + Gosub Select_Table + + List = nTables + + fMore = Yes$ + Work = "" + + DisplayList = List + + NumItems = Count(List, @FM) + (List NE "") + For i = 1 to NumItems + Work := DisplayList:@FM:List:@RM + Next i + + V119("S", "", "A", "L", Work, "") + For i = 1 to NumItems + Line = Field(Work, @RM, i) + DisplayList = Line<1> + List = Line<2> + Next i + + Convert @FM to @VM in List + + Set_Property(@Window:".EDT_STOREINFO", "ARRAY", List) + + For X = 1 to MxVal + If rVal<1,X> NE "" Then + RowPos = X + ColPos = 2 + TableName = rVal<1,X> + Gosub Update_Row + End + Next X + + Set_Property("SYSTEM", "FOCUS", @Window:".EDT_AUDIT_TABLES") + Set_Property(@Window, "SAVEWARN", No$) + SRP_Show_Window(@Window, "", "L", "T", Yes$, "", No$, No$) + Set_Property(@Window:".EDT_AUDIT_TABLES", "NEXT", @Window:".EDT_AUDIT_TABLES") + +return + + +WRITE: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + If ID NE "" Then + Open AuditManagerTable to hAIT Then + cVal = Get_Property(@Window:".EDT_AUDIT_TABLES", "OLE.Array") + MxVals = Count(cVal<1>, @VM) + (cVal<1> NE "") + rVal = cVal + nPos = 0 + For nV = 1 to MxVals + TableName = cVal<1,nV> + cPos = "7;":nV + nPos += 1 + Begin Case + Case trim(cVal<7,nV>) = "" + For dC = 1 to 7 + rVal = Delete(rVal, dC, nPos, 0) + Next dC + nPos -= 1 + Case cVal<7,nV> = "Activate" + rVal<7,nPos> = "Active" + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[":cPos:"]", "Active") + Gosub Add_MFS + Case cVal<7,nV> = "Remove" + For dC = 1 to 7 + rVal = Delete(rVal, dC, nPos, 0) + Next dC + nPos -= 1 + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[":cPos:"]", "Removed") + Gosub Remove_MFS + Gosub Delete_Audit_Table + Case cVal<7,nV> = "Removed" + For dC = 1 to 7 + rVal = Delete(rVal, dC, nPos, 0) + Next dC + nPos -= 1 + Case cVal<7,nV> = "Suspend" + rVal<7,nPos> = "Suspended" + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[":cPos:"]", "Suspended") + Gosub Remove_MFS + End Case + Param1 = cPos + Gosub PosChanging.EDT_AUDIT_TABLES + Next MxVal + + Write rVal to hAIT, ID Else + RecId = ID + ErrorMsg = "WRITE" + Gosub MsgAlert + End + Gosub Select_Table + End Else + TableName = "APP INFO" + ErrorMsg = "OPEN" + Gosub MsgAlert + End + End + +return + + +BeforeUpdate.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + ColPos = Field(Param1, ";", 1) + RowPos = Field(Param1, ";", 2) + Begin Case + Case ColPos = 1 + AvailTables = Get_Property(@Window:".EDT_STOREINFO", "ARRAY") + CurrentTables = Get_Property(@Window:".EDT_AUDIT_TABLES", "OLE.Array") + Convert @Lower_Case to @Upper_Case In Param2 + Locate Param2 In CurrentTables<1> Using @VM Setting nPos Then + ErrorMsg = "UPDATE2" + TableName = Param2 + Gosub MsgAlert + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + End Else + Locate Param2 In AvailTables Using @VM Setting Pos Then + TableName = Param2 + Gosub Update_Row + End Else + ErrorMsg = "UPDATE" + TableName = Param2 + Gosub MsgAlert + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + End + End + Case ColPos = 2 + If Num(Param2) Else + Gosub Get_Dict_Items + Convert @Lower_Case to @Upper_Case in Param2 + Locate Param2 in Original_list Using @FM Setting dPos Else + M_st = "" + M_st<1> = Param2:" is not a Dictiony Item in the ":CurTable:" table." + M_st<4> = "*" + M_st<8> = "L" + M_st<9> = Msg_light_grey$ + M_st<11> = 350 + M_st<12> = "Record Search" + rv = Msg("", M_st) + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + End + End + + Case ColPos = 7 + End Case + +return + + +AfterUpdate.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + ColPos = Field(Param1, ";", 1) + RowPos = Field(Param1, ";", 2) + + Begin Case + Case ColPos = 1 + Convert @Lower_Case to @Upper_Case In Param2 + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[":Param2:"]", Param2) + Case ColPos = 2 + If Num(Param2) Else + Gosub Get_Dict_Items + Convert @Lower_Case to @Upper_Case in Param2 + Locate Param2 in Original_list Using @FM Setting dPos Then + Text = Param2 + Convert "," to @FM in Text + Convert ";" to @FM in Text + Gosub First_Caps + Convert @FM to @VM in Text + Cols = Text + Gosub Convert_Cols + End + End + End Case + Set_Property(@Window, "SAVEWARN", Yes$) + +return + +OnOptionClick.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + ColPos = Field(Param1, ";", 1) + RowPos = Field(Param1, ";", 2) + + Begin Case + Case ColPos = 1 + PopupVals = Get_Property(@Window:".EDT_STOREINFO", "ARRAY") + If PopupVals then + PopupStats = "" + PopupStats<1> = - 2 + PopupStats<2> = - 2 + PopupStats<3> = -1 + PopupStats<4> = -1 + PopupStats<5> = 16777215 + PopupStats<6> = "MS Sans Serif":@SVM:-11:@SVM:400:@SVM:0:@SVM:0:@SVM:6:@SVM:0:@SVM:33:@SVM:0:@SVM:0:@SVM:0:@SVM:0:@SVM:11:@SVM:2:@SVM:0:@SVM:12 + PopupStats<8> = PopupVals + PopupStats<9> = @SVM:30:@SVM:"L":@SVM:"L":@SVM:@SVM:"Table Names" + PopupStats<10> = "L" + PopupStats<11> = 1 + PopupStats<12> = "Audit Manager" + PopupStats<13> = 1 + PopupStats<14> = "F" + PopupStats<15> = 0 + PopupStats<16> = 0 + PopupStats<17> = 0 + PopupStats<18> = 1 + PopupStats<19> = 1 + PopupStats<20> = 1 + PopupStats<21> = 1 + PopupStats<22> = 1 + TableName = PopUp(@Window, PopupStats) + If TableName then + CurrentTables = Get_Property(@Window:".EDT_AUDIT_TABLES", "OLE.Array") + Locate TableName In CurrentTables<1> Using @VM Setting nPos Then + ErrorMsg = "UPDATE2" + Gosub MsgAlert + Set_Property(CtrlEntId, "OLE.CellText[":Param1:"]", "") + End Else + Gosub Update_Row + Set_Property(@Window, "SAVEWARN", Yes$) + End + End + End Else + T_name = Get_Property(@Window, "@TABLE_NAME") + M_st = "" + M_st<1> = "There are no Tables attached to application ":@AppId<1> + M_st<4> = "*" + M_st<8> = "L" + M_st<9> = Msg_light_grey$ + M_st<11> = 350 + M_st<12> = "Audit Manager" + rv = Msg("", M_st) + End + Case ColPos = 2 + Gosub Get_Dict_Items + If Fields then + P_st = "" + P_st<1> = -2 + P_st<2> = -2 + P_st<3> = -1 + P_st<4> = -1 + P_st<5> = 16777215 + P_st<6> = "MS Sans Serif":@SVM:-11:@SVM:400:@SVM:0:@SVM:0:@SVM:6:@SVM:0:@SVM:33:@SVM:0:@SVM:0:@SVM:0:@SVM:0:@SVM:11:@SVM:2:@SVM:0:@SVM:12 + P_st<8> = Display_list + P_st<9> = @SVM:30:@SVM:"L":@SVM:"L":@SVM:@SVM:"Column Names" + P_st<10> = "L" + P_st<11> = 1 + P_st<12> = "Available Columns in the ":CurTable:" Table" + P_st<13> = 1 + P_st<14> = "F" + P_st<15> = 1 + P_st<16> = 0 + P_st<17> = 0 + P_st<18> = 1 + P_st<19> = 1 + P_st<20> = 1 + P_st<21> = 1 + P_st<28> = CurSelInfo + Cols = PopUp(@Window, P_st) + Gosub Convert_Cols + end else + M_st = "" + M_st<1> = "There are no columns defined for ":CurTable:"." + M_st<4> = "*" + M_st<8> = "L" + M_st<9> = Msg_light_grey$ + M_st<11> = 350 + M_st<12> = "Record Search" + rv = Msg("", M_st) + end + + Case ColPos = 7 + rv = Get_Property(CtrlEntId, "OLE.CellText[":Param1:"]") + Begin Case + Case rv = "" + DiplayList = "" + Case rv = "Active" + DisplayList = "Suspend":@VM:"Remove" + Case rv = "Suspend" + DisplayList = "Active":@VM:"Remove" + Case rv = "Suspended" + DisplayList = "Activate":@VM:"Remove" + Case rv = "Remove" + DisplayList = "Active":@VM:"Suspend" + Case rv = "Removed" + DisplayList = "Activate" + End Case + If DisplayList NE "" Then + PopupStats = "" + PopupStats<1> = - 2 + PopupStats<2> = - 2 + PopupStats<3> = -1 + PopupStats<4> = -1 + PopupStats<5> = 16777215 + PopupStats<6> = "MS Sans Serif":@SVM:-11:@SVM:400:@SVM:0:@SVM:0:@SVM:6:@SVM:0:@SVM:33:@SVM:0:@SVM:0:@SVM:0:@SVM:0:@SVM:11:@SVM:2:@SVM:0:@SVM:12 + PopupStats<8> = DisplayList + PopupStats<9> = @SVM:10:@SVM:"L":@SVM:"L":@SVM:@SVM:"Status" + PopupStats<10> = "L" + PopupStats<11> = 1 + PopupStats<12> = "Audit Manager" + PopupStats<13> = 1 + PopupStats<14> = "F" + PopupStats<15> = 0 + PopupStats<16> = 0 + PopupStats<17> = 0 + PopupStats<18> = 1 + PopupStats<19> = 1 + PopupStats<20> = 1 + PopupStats<21> = 1 + PopupStats<22> = 0 + StatusName = PopUp(@Window, PopupStats) + If StatusName Then + OKtoContinue = Yes$ + If StatusName = "Remove" Then + TableName = Get_Property(CtrlEntId, "OLE.CellText[1;":RowPos:"]") + * AuditTableName = "AUDIT_":TableName + ErrorMsg = "WARNING" + Gosub MsgAlert + If retVal NE Yes$ Then OKtoContinue = No$ + End + If OKtoContinue = Yes$ Then + Set_Property(CtrlEntId, "OLE.CellText[":Param1:"]", StatusName) + Set_Property(@Window, "SAVEWARN", Yes$) + End + End + End + End Case + +return + + +OnCheckChanged.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + RowPos = Field(Param1, ";", 2, 1) + rv = Get_Property(CtrlEntId, "OLE.CellText[1;":RowPos:"]") + If rv EQ "" Then Set_Property(CtrlEntId, "OLE.CellCheck[":Param1:"]", "") + + Set_Property(@Window, "SAVEWARN", Yes$) + +return + + +BeforeDeleteRecords.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + rv = Get_Property(CtrlEntId, "OLE.CellText[7;":Param1:"]") + Begin Case + Case rv = "Activate" + Set_Property(CtrlEntId, "OLE.Cancel", No$) + Set_Property(@Window, "SAVEWARN", Yes$) + Case rv = "" + Set_Property(CtrlEntId, "OLE.Cancel", No$) + Set_Property(@Window, "SAVEWARN", Yes$) + Case Otherwise$ + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + End Case + +return + + +BeforeInsertRecords.EDT_AUDIT_TABLES: + *------------------------------------------------------------------------------------------------------------------------------------- + * User will not be permitted to insert rows + *------------------------------------------------------------------------------------------------------------------------------------- + + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + +return + + + +GOTFOCUS.EDT_MFS_INFO: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + FullWrite = Verify_Access(Window) + If FullWrite then + SelPos = Get_Property(CtrlEntId, "SELPOS") + Col = SelPos<1> + Row = SelPos<2> + If (Col EQ 1) or (Col EQ 2) or (Col EQ 3) then + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", Yes$) + end else + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", No$) + end + end +return + +*---------------------------------- +* Internal Processes +*---------------------------------- + +Select_Table: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + Files = "" + GoSub Get_MFS_Name + * MFSName = "AUDIT_MANAGER_MFS*":@APPID<1> + /* Determine which volumes are attached with this application. */ + Volumes = @Volumes + rVal = Get_Property(@Window:".EDT_AUDIT_TABLES", "OLE.Array") + CurTables = rVal<1> + CurPosData = rVal<2> + TrueVolumes = "" + NumVolumes = Count(Volumes, @FM) + (Volumes NE "") + For VolLoop = 1 to NumVolumes + /* We need to skip over the system volumes (Memory_Resident, Syscolumns, Revboot, and Repository) */ + VolPart1 = Field(Volumes, "*", 1, 1) + VolPart2 = Field(Volumes, "*", 2, 1) + If VolPart1 EQ "RTP57" then + If VolPart2 NE "MEMORY_RESIDENT" AND VolPart2 NE "SYSCOLUMNS" AND VolPart2 NE "REVBOOT" AND VolPart2 NE "REPOSITORY" then + TrueVolumes<-1> = VolPart2 + end + end + Next VolLoop + + /* Pull in all tables */ + Tables = @Tables(0) + UpdatedTables = "" + NumTruVols = Count(TrueVolumes, @FM) + (TrueVolumes NE "") + AppName = @APPID<1> + vAppNames = @APPID + For VolLoop = 1 to NumTruVols + Attach_table(TrueVolumes, "REVMEDIA", "", "") + Open "REVMEDIA" to hRT then + Number_tables = Count(Tables, @FM) + (Tables NE "") + For Loop = 1 to Number_tables + Table = Tables + If (Table[1, 1] NE "!") AND (Table[1, 4] NE "DICT") then + If (@APPID EQ "SYSPROG") OR (Table[1, 3] NE "SYS") then + Begin Case + Case Table EQ "ACCESSIBLE_COLUMNS" + Case Table EQ AuditManagerTable + Case Otherwise$ + RevID = Table:"*":AppName + ReadO RevRec from hRT, RevID then + MFSLine = RevRec<2> + Locate MFSName in MFSLine using @VM setting MFSPos then + Files := Table:@RM + End Else + UpdatedTables<-1> = Table + End + End Else + vAppNames<1> = "GLOBAL" + FoundTable = No$ + MaxApps = Count(vAppNames, @FM) + (vAppNames NE "") + For X = 1 to MaxApps + RevID = Table:"*":vAppNames + ReadO RevRec from hRT, RevID then + MFSLine = RevRec<2> + Locate MFSName in MFSLine using @VM setting MFSPos then + FoundTable = Yes$ + Files := Table:@RM + End Else + FoundTable = Yes$ + UpdatedTables<-1> = Table + End + End + Until FoundTable EQ Yes$ + Next X + If FoundTable EQ No$ Then UpdatedTables<-1> = Table + End + End Case + End + End + Next Loop + Tables = UpdatedTables + UpdatedTables = "" + Detach_table("REVMEDIA") + End else + ErrorMsg = "OPEN" + TableName = "REVMEDIA" + Gosub MsgAlert + End + Next VolLoop + + V119("S", "", "A", "L", Files, Flag) + Convert @RM to @VM in Files + Files[-1, 1] = "" + Set_Property(@Window:".EDT_MFS_TABLES", "ARRAY", Files) + + MaxTables = Count(Files<1>, @VM) + (Files<1> NE "") + For X = 1 to MaxTables + Locate Files<1,X> in CurTables Using @VM Setting TablePos Else + Tables<-1> = Files<1,X> + End + + Locate "AUDIT_":Files<1,X> in Tables Using @FM Setting fPos Then + Tables = Delete(Tables, fPos, 0, 0) + End + Next X + + nTables = "" + MaxTables = Count(Tables, @FM) + (Tables NE "") + For X = 1 To MaxTables + Locate Tables in CurTables Using @VM Setting TablePos Else + nTables<-1> = Tables + End + Next X + +return + + +First_Caps: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + FM_Count = Count(Text, @FM) + (Text NE "") + For FM = 1 to FM_Count + VM_Count = Count(Text, @VM) + (Text NE "") + For VM = 1 to VM_Count + Temp = Text + Convert "_" to " " in Temp + Convert @Upper_case to @Lower_case in Temp + Len_temp = Len(Temp) + For Pos = 1 to Len_temp + Cur_char = Temp[Pos, 1] + If (Pos EQ 1) OR (Temp[(Pos - 1), 1] EQ " ") then + Convert @Lower_case to @Upper_case in Cur_char + end + Temp[Pos, 1] = Cur_char + Next Pos + Text = Temp + Next VM + Next FM +return + + +Update_Row: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + If TableName then + Set_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[1;":RowPos:"]", TableName) + mVAl = Get_Property(@Window:".EDT_MFS_TABLES", "ARRAY") + AuditTable = "AUDIT_":TableName + v.AuditTable = TableExists(AuditTable) + v.TableName = TableExists(TableName) + ByPassCheck = No$ + PropArray = CtrlEntId + If v.TableName Then + If v.AuditTable Then + Locate TableName in mVal<1> Using @VM Setting Pos Then + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellText[7;":RowPos:"]" :@VM: "Active" + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "SEL" + tVal = Get_Property(@Window:".EDT_AUDIT_TABLES", "OLE.CellText[7;":RowPos:"]") + If tVal= "" Else ByPassCheck = Yes$ + End Else + If Event = "READ" Then + Begin Case + Case rVal<7, RowPos> = "" + Status = "Activate" + Button = "TXT" + Case Otherwise$ + Status = "Suspended" + Button = "OPT" + End Case + End Else + Status = "Active" + Button = "TXT" + End + + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: Button + PropArray<-1> = "OLE.CellText[7;":RowPos:"]" :@VM: Status + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "None" + End + End Else + PropArray = CtrlEntId + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellText[7;":RowPos:"]" :@VM: "Activate" + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "None" + End + End Else + PropArray = CtrlEntId + PropArray<-1> = "OLE.CellType[1;":Rowpos:"]" :@VM: "OPT" + PropArray<-1> = "OLE.CellType[7;":RowPos:"]" :@VM: "TXT" + PropArray<-1> = "OLE.CellText[7;":RowPos:"]" :@VM: "Not Attached" + PropArray<-1> = "OLE.CellProtection[1;":RowPos:"]" :@VM: "None" + End + + If ByPassCheck = No$ Then + PropArray<-1> = "OLE.CellCheck[3;":RowPos:"]" :@VM: 1 + PropArray<-1> = "OLE.CellCheck[4;":RowPos:"]" :@VM: 1 + PropArray<-1> = "OLE.CellCheck[5;":RowPos:"]" :@VM: 0 + End + + SRP_Set_Prop_Array(PropArray) + + Set_Property(@Window, "SAVEWARN", Yes$) + End + +return + + +Delete_Audit_Table: + *------------------------------------------------------------------------------------------------------------------------------------- + * Deletes the selected table(s) and redefines the database + *------------------------------------------------------------------------------------------------------------------------------------- + + AuditTableName = "AUDIT_":TableName + Set_Status(FALSE$) + Delete_Table(AuditTableName, 0, 0) + + Set_Status(FALSE$) + Define_Database(@DBID, TRUE$, "", "") + +return + + +Get_Dict_Items: + + CurTable = Get_Property(CtrlEntID, "OLE.CellText[1;":RowPos:"]") + CurPosInfo = Get_Property(CtrlEntID, "OLE.CellText[2;":RowPos:"]") + RowCounter = 1 + // The %FIELDS% stores all the column names and column positions for the entire table. + Open "DICT.":CurTable to @DICT then + ReadO Fields from @DICT, "%FIELDS%" else Fields = "" + Display_list = "" + CurPosList = "" + Field_list = Fields<3> + DataType = Fields<4> + Pos_list = Fields<5> + Num_fields = Count(Field_list, @VM) + (Field_list NE "") + // Only allow those data Non-ID fields be shown in the popup. + For Fields_loop = 1 to Num_fields + If DataType<0, Fields_loop> EQ "F" then + If Pos_list<0, Fields_loop> GT 0 then + Display_list = Field_list<0, Fields_loop> + CurPosList = Pos_list<0, Fields_loop> + RowCounter += 1 + end + end + Next Fields_loop + // Pre-select all columns currently in the record. + CurSelInfo = "" + Swap "," with @FM in CurPosInfo + NumCols = Count(CurPosInfo, @FM) + (CurPosInfo NE "") + For ColPos = 1 to NumCols + CurPos = CurPosInfo + Locate CurPos in CurPosList using @FM setting ListPos then + CurSelInfo<0, -1> = ListPos + end + Next ColPos + Original_list = Display_list + Transfer Display_list to Text + GoSub First_Caps + Transfer Text to Display_list + Swap @FM with @VM in Display_list + End Else + @DICT = "" + Fields = "" + M_st = "" + M_st<1> = "There are Dictionary Table defined for ":CurTable:"." + M_st<4> = "*" + M_st<8> = "L" + M_st<9> = Msg_light_grey$ + M_st<11> = 350 + M_st<12> = "Record Search" + rv = Msg("", M_st) + End +return + + +Convert_Cols: + + If Cols then + Set_Property(@Window, "SAVEWARN", Yes$) + SelectedPos = "" + NumCols = Count(Cols, @VM) + (Cols NE "") + For ColLoop = 1 to NumCols + CurCol = Cols<0, ColLoop> + Locate CurCol in Display_list using @VM setting ListPos then + SelectedPos<0, -1> = CurPosList + end + Next ColLoop + Swap @VM with @RM in SelectedPos + SelectedPos := @RM + V119("S", "", "A", "R", SelectedPos, Flag) + Convert @RM to "," in SelectedPos + SelectedPos[-1, 1] = "" + Set_Property(CtrlEntId, "OLE.CellText[2;":RowPos:"]", SelectedPos) + End + +return + + +Add_MFS: + *------------------------------------------------------------------------------------------------------------------------------------- + * Creates the Audit_Table, Adds the Audit_MFS + *------------------------------------------------------------------------------------------------------------------------------------- + + * Create Audit Table + AttribList = "1000,400,10,1024,80" + Convert "," to @FM in AttribList + TableLoc = "" + AuditTable = "AUDIT_":TableName + + Attach_Table("APPDATA", AuditTable, "", "") + * Define or attach a database + TestTable = @AppId<1>:"*DBTABLE**":AuditTable + rv = TableExists(TestTable) + If rv EQ No$ Then + Open "SYSREPOS" to SysReposName Then + Read TestRecord From SysReposName, TestTable Then + Attach_Table(TestRecord<4,1>, AuditTable, TestRecord<4,3>, "") + If Get_Status(StatusCode) Then + // Incase the process failed to attach the audit table. Will Create/Recreate the Audit Table + Create_Table("APPDATA", AuditTable, Yes$, @APPID<1>, AttribList, "") + Create_Table("APPDATA", AuditTable, "", @APPID<1>, AttribList, "") + End Else + Define_Database(TestRecord<4,3>, 0, "", "") + End + End Else + * Create the Audit Table + Create_Table("APPDATA", AuditTable, Yes$, @APPID<1>, AttribList, "") + Create_Table("APPDATA", AuditTable, "", @APPID<1>, AttribList, "") + End + End + End + + * first remove Old Audit Manager (in case it's in the media map) + MFSName = "AUDIT_MFS" + Set_Status(FALSE$) + Set_MFS(TableName, MFSName, 5) + + * Second current Audit Manager MFS it (in case it is already in the media map) + GoSub Get_MFS_Name + * MFSName = "AUDIT_MANAGER_MFS*":@APPID<1> + Set_Status(FALSE$) + Set_MFS(TableName, MFSName, 5) + + * Now add the MFS + Set_Status(FALSE$) + Set_MFS(TableName, MFSName, 1) + + If Get_Status(Code) Then + ErrorMsg = "AUDIT" + Gosub MsgAlert + End + + * update database definition + Set_Status(FALSE$) + Define_Database(@DBID, TRUE$, "", "") + + If Get_Status(Code) Then + ErrorMsg = "DEFINE" + Gosub MsgAlert + End Else + * Generating Dictionary Items + Gosub Table_Format_Array + End + +return + + +Remove_MFS: + *------------------------------------------------------------------------------------------------------------------------------------- + * Removes MFS from the RevTable + *------------------------------------------------------------------------------------------------------------------------------------- + GoSub Get_MFS_Name + Set_Status(FALSE$) + Set_MFS(TableName, MFSName, 5) + +return + + +Table_Format_Array: + *------------------------------------------------------------------------------------------------------------------------------------- + * Creates the Dictionary Items for the Audit_Table + *------------------------------------------------------------------------------------------------------------------------------------- + v.Array = "" + + id.Array.Id = "ID" + v.Array<1,1> = "F" + v.Array<1,2> = 0 + v.Array<1,3> = "Id" + v.Array<1,4> = "S" + v.Array<1,5> = 0 + v.Array<1,9> = "L" + v.Array<1,10> = 20 + v.Array<1,12> = "VARCHAR(255)" + v.Array<1,28> = 1 + v.Array<1,31> = 0 + v.Array<1,34> = 0 + + di.Array.Id = "DATE_IN" + v.Array<2,1> = "F" + v.Array<2,2> = 1 + v.Array<2,3> = "Date In" + v.Array<2,4> = "M" + v.Array<2,7> = "D/4" + v.Array<2,9> = "L" + v.Array<2,10> = 20 + v.Array<2,11> = "(D)" + v.Array<2,12> = "VARCHAR(255)" + v.Array<2,28> = 1 + v.Array<2,31> = 0 + v.Array<2,34> = 0 + + ti.Array.Id = "TIME_IN" + v.Array<3,1> = "F" + v.Array<3,2> = 2 + v.Array<3,3> = "Time In" + v.Array<3,4> = "M" + v.Array<3,7> = "MT" + v.Array<3,9> = "L" + v.Array<3,10> = 20 + v.Array<3,11> = "(MT)" + v.Array<3,12> = "VARCHAR(255)" + v.Array<3,28> = 1 + v.Array<3,31> = 0 + v.Array<3,34> = 0 + + un.Array.Id = "USER_NAME" + v.Array<4,1> = "F" + v.Array<4,2> = 3 + v.Array<4,3> = "User Name" + v.Array<4,4> = "M" + v.Array<4,9> = "L" + v.Array<4,10> = 20 + v.Array<4,12> = "VARCHAR(255)" + v.Array<4,28> = 1 + v.Array<4,31> = 0 + v.Array<4,34> = 0 + + sn.Array.Id = "STATION" + v.Array<5,1> = "F" + v.Array<5,2> = 4 + v.Array<5,3> = "Station Name" + v.Array<5,4> = "M" + v.Array<5,9> = "L" + v.Array<5,10> = 20 + v.Array<5,12> = "VARCHAR(255)" + v.Array<5,28> = 1 + v.Array<5,31> = 0 + v.Array<5,34> = 0 + + ma.Array.Id = "MAC_ADDRESS" + v.Array<6,1> = "F" + v.Array<6,2> = 5 + v.Array<6,3> = "Mac Address" + v.Array<6,4> = "M" + v.Array<6,9> = "L" + v.Array<6,10> = 20 + v.Array<6,12> = "VARCHAR(255)" + v.Array<6,28> = 1 + v.Array<6,31> = 0 + v.Array<6,34> = 0 + + pn.Array.Id = "PROGRAM_NAME" + v.Array<7,1> = "F" + v.Array<7,2> = 6 + v.Array<7,3> = "Program Name" + v.Array<7,4> = "M" + v.Array<7,9> = "L" + v.Array<7,10> = 20 + v.Array<7,12> = "VARCHAR(255)" + v.Array<7,28> = 1 + v.Array<7,31> = 0 + v.Array<7,34> = 0 + + ln.Array.Id = "MARKER" + v.Array<8,1> = "F" + v.Array<8,2> = 7 + v.Array<8,3> = "Marker" + v.Array<8,4> = "M" + v.Array<8,9> = "R" + v.Array<8,10> = 20 + v.Array<8,12> = "VARCHAR(255)" + v.Array<8,28> = 1 + v.Array<8,31> = 0 + v.Array<8,34> = 0 + + at.Array.Id = "ACTIVITY" + v.Array<9,1> = "F" + v.Array<9,2> = 8 + v.Array<9,3> = "Activity" + v.Array<9,4> = "M" + v.Array<9,9> = "L" + v.Array<9,10> = 20 + v.Array<9,12> = "VARCHAR(255)" + v.Array<9,28> = 1 + v.Array<9,31> = 0 + v.Array<9,34> = 0 + + v.Array.Id = "" + v.Array.Id<1> = id.Array.Id + v.Array.Id<2> = di.Array.Id + v.Array.Id<3> = ti.Array.Id + v.Array.Id<4> = un.Array.Id + v.Array.Id<5> = sn.Array.Id + v.Array.Id<6> = ma.Array.Id + v.Array.Id<7> = pn.Array.Id + v.Array.Id<8> = ln.Array.Id + v.Array.Id<9> = at.Array.Id + status = "" + Title = "" + type = "D" + + DictTable = "DICT.":AuditTable + Open DictTable to vTable Then + For X = 1 to 9 + dict.Array = v.Array + Convert @VM TO @FM IN dict.Array + Write Dict.Array to vTable, v.Array.Id Then + RTP5(AuditTable, v.Array.Id, Title , Status, Type) + End Else + ErrorMsg = "WRITE" + RecId = v.Array.Id + Gosub MsgAlert + End + Next X + End Else + ErrorMsg = "OPEN" + TableName = DictTable + Gosub MsgAlert + End + +return + + +MsgAlert: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + Error = "" + Mess = "" + Mess = "BO" + Mess = "!" + Mess = "Audit Manager" + + Begin Case + Case ErrorMsg = "WARNING" + Mess = "BNY" + Error = "Changing the status to Remove will|delete the audit trail for the ":TableName:" table.||Are you sure you want to proceed?" + Case ErrorMsg = "UPDATE" + Error = "Table ":TableName:" is not an available option." + Case ErrorMsg = "UPDATE2" + Error = "Table ":TableName:" is a duplicate entry" + Case ErrorMsg = "OPEN" + Error = "Unable to OPEN the ": TableName: " table." + Case ErrorMsg = "READ" + Error = "Unable to Read ":RecId:" Record." + Case ErrorMsg = "WRITE" + Error = "Unable to Write ":RecId:" Record." + Case ErrorMsg = "AUDIT" + Error = "An error occurred adding the MFS to the ": TableName: " table.":@TM:@TM:"Error Code: ": Code<1,1,1> + Case ErrorMsg = "DEFINE" + Error = "An error occurred adding the MFS to the ": TableName: " table.":@TM:@TM:"Error Code: ": Code<1,1,1> + End Case + + Mess = Error + retVal = Msg("", Mess) +return + +Get_MFS_Name: + NumApps = Count(@APPID, @FM) + (@APPID NE "") + For i = 1 to NumApps + SysObjKey = "$AUDIT_MANAGER_MFS":"*":@APPID + ObjExists = Xlate("SYSOBJ", SysObjKey, 0, "X") + Until ObjExists + Next i + + MFSName = "AUDIT_MANAGER_MFS*":@APPID +return + diff --git a/FRAMEWORKS/STPROC/ERROR_SERVICES.txt b/FRAMEWORKS/STPROC/ERROR_SERVICES.txt new file mode 100644 index 0000000..3dea632 --- /dev/null +++ b/FRAMEWORKS/STPROC/ERROR_SERVICES.txt @@ -0,0 +1,380 @@ +Function Error_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Error_Services + + Description : Handler program for all error services. + + Notes : Application errors should be logged using the Error Services module. There are a few methodological + assumptions built into way errors are managed which are important to understand in order to properly + work with Error Services: + + - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to + the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger + this will appear backwards since the originating procedure always appears at the bottom of the + list and the current routine appears at the top of the list. We are using this orientation because + it is common to refer to the process of calling other procedures as 'drilling down'. + + - The reason for defining the orientation of the call stack is because Error_Services allows for + multiple error conditions to be appended to an original error. In most cases this will happen when + a procedure at the bottom of the stack generates an error condition and then returns to its + calling procedure. This higher level procedure can optionally add more information relevant to + itself. This continues as the call stack 'bubbles' its way back to the top to where the + originating procedure is waiting. + + - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus) + preserve their error state until explicitly cleared. This can hinder the normal execution of code + since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists. + Our philosophy is that error conditions should automatically be cleared before a new procedure + is executed to avoid this problem. However, the nature of Basic+ does not make this easy to + automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our + philosophy then it should include a call into the 'Clear' service request at the top of the + program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.) + + - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any + error conditions that were set before. + + - The 'Set' service request is the equivelent to the various forms of setting an error within Basic+ + (e.g., Set_Status, Set_FSError, Set_EventStatus). This will clear out any pre-existing error(s) + first (see 'Clear' service request description below). In most cases the 'Add' service request + (see below) should be used since error conditions are intended to be automatically cleared by + service modules or properly managed stored procedures. + + - The 'Add' service request is similar to the 'Set' service request but it will not clear out any + pre-existing errors. Using 'Add', the error conditions can be stacked allowing the higher level + calling procedures the ability to contribute to the existing error or add additional errors. + + - The 'Clear' service request will reset all of the error condition flags. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + History : (Date, Initials, Notes) + 12/28/12 dmb Original programmer. + 12/31/12 dmb Add hooks for various service requests. Add comments in the Notes section to explain the + theory of operation of Error Services. + 01/01/13 dmb Add functionality to the Set, Add, GetMessage, and GetMessages service requests. + 01/02/13 dmb Remove reference to SERVICES_SETUP and put the Assigned command lines directly into this + code to avoid infinite loop problem. + 01/05/13 dmb Added HasError service request. + 03/13/13 dmb [SRPFW-9] Added NoError service request. + 10/01/13 dmb [SRPFW-18] Replace APP_INSERTS with LOGICAL and declare Error_Services. + 10/06/13 dmb [SRPFW-17] Retrofit to use the default FrameWorks system font. + 03/20/17 fjt [SRPFW-160] Conversion to EB+; addition of justification parameter to display. + 10/09/17 dmb Add SendRuntimeAlert service to act as a debugger intercept process. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$Insert MSG_EQUATES +$insert RTI_DEBUG_COMMON +$insert SRPMail_Inserts + +Equ Segoe_UI$ to 'Segoe UI' : @SVM : -12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + +// Make sure any request parameters which have not been assigned are nulled. +// Normally these would be referenced in the SERVICES_SETUP insert but there is a call to ERROR_SERVICES in that +// insert which causes an infinite loop to occur. +If Assigned(Service) else Service = '' +If Assigned(Error) else Error = '' +If Assigned(Param1) else Param1 = '' +If Assigned(Param2) else Param2 = '' +If Assigned(Param3) else Param3 = '' +If Assigned(Param4) else Param4 = '' +If Assigned(Param5) else Param5 = '' +If Assigned(Param6) else Param6 = '' +If Assigned(Param7) else Param7 = '' +If Assigned(Param8) else Param8 = '' +If Assigned(Param9) else Param9 = '' +If Assigned(Param10) else Param10 = '' +If Assigned(Response) else Response = '' + +AutoDisplayErrors = False$ ; // Set this to True$ when debugging so all errors will automatically display. + +Common /ErrorServices/ ErrorMessages@, ErrorSources@, ErrorCodes@, RetStacks@, Unused5@, Unused6@, Unused7@, Unused8@ + +Declare function RetStack, Error_Services, SRPSendMail +Declare subroutine Error_Services + +GoToService else + Error_Services('Set', Service : ' is not a valid service request within the Error services module.') +end + +Return Response else '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Set +// +// Param1 - Error message. Messages should be fairly descriptive. +// +// Sets an error to the stack. This will automatically clear any existing error conditions first so this error will +// be the only one on the stack. +//---------------------------------------------------------------------------------------------------------------------- +Service Set(ErrorMessage) + + Error_Services('Clear') + Error_Services('Add', ErrorMessage) + + If AutoDisplayErrors then Error_Services('DisplayError') + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// Add +// +// Param1 - Error message. Messages should be fairly descriptive. +// +// Adds an error to the stack. This will not clear existing error conditions first. It is intended to allow higher level +// routines to add more information to an existing error condition or simply to maintain an ongoing error log for some +// troubleshooting or debugging purposes. +//---------------------------------------------------------------------------------------------------------------------- +Service Add(ErrorMessage) + + CurStack = RetStack() + AtSelf = CurStack[1, @FM] ; // AtSelf should be the name of this routine (e.g., ERROR_SERVICES) + Loop + CurRoutine = CurStack[1, @FM] ; // Get the next routine from the program call stack. + Until CurRoutine _NEC AtSelf + CurStack = Delete(CurStack, 1, 0, 0) ; // Remove any self-references from the program call stack. + Repeat + Convert @FM to @VM in CurStack ; // Convert the delimiter so it can be added to the global common. + + If Len(ErrorMessages@) then + ErrorMessages@ := @FM : ErrorMessage + RetStacks@ := @FM : CurStack + end else + ErrorMessages@ = ErrorMessage + RetStacks@ = CurStack + end + + If AutoDisplayErrors then Error_Services('DisplayError') + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// Clear +// +// Clears all error conditions and related information. +//---------------------------------------------------------------------------------------------------------------------- +Service Clear() + + ErrorMessages@ = '' + ErrorSources@ = '' + ErrorCodes@ = '' + RetStacks@ = '' + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetMessage +// +// Returns the most current error message. +//---------------------------------------------------------------------------------------------------------------------- +Service GetMessage() + + Response = ErrorMessages@[-1, 'B' : @FM] + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetMessages +// +// Returns the stack of error messages. This will be @FM delimited. +//---------------------------------------------------------------------------------------------------------------------- +Service GetMessages() + + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = ErrorMessages@ + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// HasError +// +// Returns True if there is an error condition, False if there is no error condition. Caller will still need to use +// the GetMessage or GetMessages service to determine what the error is. The HasError service allows the caller to +// embed the Error_Services service call inside of a conditional statement like this: +// +// If Error_Services('HasError') then +// * An error has occured. Proceed accordingly. +// ErrorMessage = Error_Services('GetMessage') +// end else +// * No error has occured. +// end +//---------------------------------------------------------------------------------------------------------------------- +Service HasError() + + If Len(ErrorMessages@) then + Response = True$ + end else + Response = False$ + end + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// NoError +// +// Returns True if there are no error conditions, False if there is an error condition. This is the opposite of the +// HasError service and exists for improved readability. +//---------------------------------------------------------------------------------------------------------------------- +Service NoError() + + If Len(ErrorMessages@) then + Response = False$ + end else + Response = True$ + end + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// DisplayError +// +// Displays the current error message to the end user. +//---------------------------------------------------------------------------------------------------------------------- +Service DisplayError(Justification) + + ErrorMessage = Error_Services('GetMessage') + If Len(ErrorMessage) then + MsgStruct = '' + MsgStruct = ErrorMessage + MsgStruct = 'BO' + MsgStruct = 'W' + MsgStruct = '!' + MsgStruct = -1 + MsgStruct = -1 + MsgStruct = Justification + MsgStruct = 'Error Services' + MsgStruct = Segoe_UI$ + Msg(@Window, MsgStruct) + end + +End Service + + +Service GetSource() + + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = '' + +End Service + + +Service GetSources() + + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = '' + +End Service + + +Service GetCode() + + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = '' + +End Service + + +Service GetCodes() + + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = '' + +End Service + + +Service GetStackTrace() + // Business logic goes here. Data that needs to be returned should be assigned to the Response parameter. + Response = '' +End Service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////? + +//---------------------------------------------------------------------------------------------------------------------- +// SendRuntimeAlert +// +// Sends out an email alert when this service is called as a debugger intercept. +//---------------------------------------------------------------------------------------------------------------------- +SendRuntimeAlert: + + Done = False$ + Error = False$ + Program = Curr_Program@ + MsgSent = '' + + If Program EQ '' then Program = 'Error Services' + + ConfigFile = '' + ConfigFile<1> = SendUsing_Port$ + ConfigFile<2> = '' + ConfigFile<3> = '' ; // Server port + ConfigFile<4> = '' ; // Mail server + ConfigFile<5> = True$ ; // Authenticate + ConfigFile<6> = '' ; // Username + ConfigFile<7> = '' ; // Password + ConfigFile<8> = False$ ; // Use SSL + + Text = '' + Text<-1> = 'App: ' : @APPID<1> + Text<-1> = 'Window: ' : @WINDOW + Text<-1> = 'User: ' : @USERNAME + Text<-1> = 'Station: ' : @STATION + Text<-1> = ' ' + Text<-1> = 'SP Status: ' : SPStatus@ + Text<-1> = 'SP Stat Code: ' : SPStatCode@ + Text<-1> = 'Program: ' : Program + Text<-1> = 'Call Depth: ' : CallDepth@ + Text<-1> = 'Line No: ' : LineNo@ + Text<-1> = ' ' + Text<-1> = 'Stack: ' + Text<-1> = CallStack@ + Convert \00\ TO ',' in Text + Swap @VM with ':@VM:' IN Text + Swap @FM with Char(13) : Char(10) IN Text + Swap @TM with Char(13) : Char(10) IN Text + + SentFrom = '' + SentTo = '' + Message = '' + Message<1> = '' : Program ; // Subject + Message<2> = SentFrom ; // From (email address) + Message<3> = SentTo ; // Send to (email address) + Message<5> = '' ; // Blind Carbon Copy (email address) + Message<6> = '' ; // Reply To (email address) + Message<7> = 'TEXT' ; // Content Type (TEXT or HTML) + Message<8> = Text ; // Content / Body + Message<9> = '' ; // Attachment(s) (path to file name(s)) + + MsgSent = SRPSendMail(Message, ConfigFile) + +return diff --git a/FRAMEWORKS/STPROC/HTTPCLIENT_SERVICES.txt b/FRAMEWORKS/STPROC/HTTPCLIENT_SERVICES.txt new file mode 100644 index 0000000..277be38 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTPCLIENT_SERVICES.txt @@ -0,0 +1,856 @@ +Function HTTPClient_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTPClient_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 03/28/16 dmb [SRPFW-120] Original programmer. + 07/01/17 dmb [SRPFW-184] Refactor using Enhanced BASIC+ syntax. + 05/19/18 dmb [SRPFW-235] Check for content in the HeaderList variable before calling the For Each loop. + 11/15/18 dmb [SRPFW-238] Add ClientCertPath argument to the SendHTTPRequest service to support + client-side certificates. + 02/28/19 dmb Change UseXMLHTTP argument to UseClientXMLHTTP in the SendHTTPRequest service to make it + easier to interpret. + 02/09/20 dmb [SRPFW-309] Fix a bug in the SendHTTPRequest service so that request headers are properly + parsed. All colons were erroneously being converted to @VM instead of the first colon (which + separated the header name from the header value). + 02/09/20 dmb [SRPFW-309] Update the SetResponseHeaderField service to better support Set-Cookie headers. + Allow multiple cookie names to be stored but only store the value of the last cookie name + if it is duplicated. + 02/09/20 dmb [SRPFW-309] Update the GetResponseHeaderField by adding a Delimiter argument so the caller + can specify an alternative delimiter for the values being returned. + 02/09/20 dmb [SRPFW-309] Add GetCookies service to make it easier to view all cookies returned in the + response. + 02/09/20 dmb [SRPFW-309] Add GetCookie service to make it easier to see the entire cookie string of a + specified cookie. + 02/10/20 dmb [SRPFW-309] Update the GetCookie service to include an IgnoreAttributes argument. If this + is True$, then only the cookie name and value will be returned. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert SERVICE_SETUP + +Equ CRLF$ to \0D0A\ +// The readyState property will have this value when the request has returned from the server. +// http://msdn.microsoft.com/en-us/library/ms753800(v=vs.85).aspx +Equ HTTP_COMPLETED$ to 4 + +Common /HTTPClientServices/ RequestHeaderFields@, RequestHeaderValues@, ResponseHeaderFields@, ResponseHeaderValues@, ResponseStatusCode@, ResponseStatusPhrase@, ResponseBody@, TimeoutDuration@ + +Declare function SRP_COM, HTTPClient_Services, GetTickCount, OLECreateInstance, OLEGetProperty, OLECallMethod, OLEStatus +Declare subroutine SRP_COM, HTTPClient_Services, OLEPutProperty + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ +Options RESPONSEHEADERNAMES = 'Access-Control-Allow-Headers', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Origin', 'Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-Location', 'Content-Disposition', 'Content-Type', 'Date', 'Expires', 'Last-Modified', 'Link', 'Location', 'Retry-After', 'Server', 'Set-Cookie', 'Transfer-Encoding', 'Vary', 'WWW-Authenticate', + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SendHTTPRequest +// +// Method - The HTTP method to submit to the server. - [Required] +// URL - The URL receiving the HTTP request. - [Required] +// HeaderList - An @FM/@VM list of request header names and values. - [Optional] +// Body - The request body to be sent to the server. - [Optional] +// ProxyUser - Username needed to authenticate against a proxy server. - [Optional] +// ProxyPassword - Password needed to authenticate against a proxy server. - [Optional] +// UseAsynchronous - Flag to determine if the HTTP request should be processed asynchronously. Default is True. +// - [Optional] +// UseClientXMLHTTP - Flag to determine if client XMLHTTP or server XMLHTTP should be used. Default is server XMLHTTP. +// - [Optional] +// ClientCertPath - Path to a client-side certificate. This is usually in Location\Certificate Store\Subject format. +// - [Optional] +// +// Calls the indicated HTTP web service routine. +//---------------------------------------------------------------------------------------------------------------------- +Service SendHTTPRequestOLE(Method, URL, HeaderList, Body, ProxyUser, ProxyPassword, UseAsynchronous, UseClientXMLHTTP, ClientCertPath) + + // Defaults. + If UseAsynchronous NE False$ then UseAsynchronous = True$ + If UseClientXMLHTTP NE True$ then UseClientXMLHTTP = False$ + + If (Method NE '') AND (URL NE '') then + // Make sure all prior response settings are cleared before performing the next HTTP request. + HTTPClient_Services('ClearResponseSettings') + + // Attempt to get a handle for the best XMLHTTP object. + objXMLHTTP = '' + If UseClientXMLHTTP then + ServerPrefix = '' + end else + ServerPrefix = 'Server' + end + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP.6.0' + objXMLHTTP = OLECreateInstance(XMLHTTPProgID) + Status = OLEStatus() + If Status then + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP.3.0' + objXMLHTTP = OLECreateInstance(XMLHTTPProgID) + Status = OLEStatus() + If Status then + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP' + objXMLHTTP = OLECreateInstance(XMLHTTPProgID) + Status = OLEStatus() + If Status then + Error = 'Unable to create a handle to the XMLHTTP object in the ' : Service : ' service.' + Error := ' OLE Error: ' : Status + Error_Services('Add', Error) + end + end + end + + If Error_Services('NoError') then + // Invoke the XMLHTTP object's open method to initialize a request. + rv = OLECallMethod(objXMLHTTP, 'open', Method, URL, UseAsynchronous, ProxyUser, ProxyPassword) + Status = OLEStatus() + If Status then + Error = 'Error calling the open method for the XMLHTTP object in the ' : Service : ' service.' + Error := ' OLE Error: ' : Status + Error_Services('Add', Error) + end + end + +* If Error_Services('NoError') then +* // Set the request header names and values. This will add or update any header fields passed in through this +* // service with those have may have been previously set using the SetRequestHeaderFields or +* // SetRequestHeaderField already. +* If Len(HeaderList) then HTTPClient_Services('SetRequestHeaderFields', HeaderList) +* // Now get all of the request header fields. +* HeaderList = HTTPClient_Services('GetRequestHeaderFields') +* If Error_Services('NoError') then +* If HeaderList NE '' then +* For Each HeaderPair in HeaderList using @FM +* HeaderName = HeaderPair<0, 1> +* HeaderValue = HeaderPair<0, 2> +* SRP_COM(objXMLHTTP, 'CALL', 'setRequestHeader', HeaderName, HeaderValue) +* If SRP_COM('', 'HASERROR') then +* Error = 'Error setting the setRequestHeader property for the ' : HeaderName : ' field in the XMLHTTP object in the ' : Service : ' service.' +* Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') +* Error_Services('Add', Error) +* end +* Next HeaderPair +* end +* end +* end + +* If ClientCertPath NE '' then +* If Error_Services('NoError') then +* // Invoke the XMLHTTP object's setOption method to invoke a certificate. +* rv = SRP_COM(objXMLHTTP, 'CALL', 'setOption', 3, ClientCertPath) +* If SRP_COM('', 'HASERROR') then +* Error = 'Error calling the setOption method for the XMLHTTP object in the ' : Service : ' service.' +* Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') +* Error_Services('Add', Error) +* end +* end +* end + + If Error_Services('NoError') then + // Invoke the XMLHTTP object's send method to submit the request to the server. + rv = OLECallMethod(objXMLHTTP, 'send', Body) + Status = OLEStatus() + If Status then + Error = 'Error calling the send method for the XMLHTTP object in the ' : Service : ' service.' + Error := ' OLE Error: ' : Status + Error_Services('Add', Error) + end + end + + If Error_Services('NoError') then + If UseAsynchronous then + StartTime = GetTickCount() + TimeoutDuration = HTTPClient_Services('GetTimeoutDuration') + TimedOut = False$ + Loop + ReadyState = OLEGetProperty(objXMLHTTP, 'readyState') + CurrentTime = GetTickCount() + ElapsedTime = Int((CurrentTime - StartTime) / 1000) + TimedOut = ElapsedTime GE TimeoutDuration + While (ReadyState NE HTTP_COMPLETED$) AND Not(TimedOut) + Repeat + end + + // Check the XMLHTTP object's responseBody property to get the server's response. + Response = OLEGetProperty(objXMLHTTP, 'responseBody') + Response1 = OLEGetProperty(objXMLHTTP, 'responseText') + Response2 = objXMLHTTP->responseBody + Response3 = objXMLHTTP->responseText + + Status = OLEStatus() + If Status then + Error = 'Error getting the responseBody property for the XMLHTTP object in the ' : Service : ' service.' + Error := ' OLE Error: ' : Status + Error_Services('Add', Error) + Response = '' + end else + HTTPClient_Services('SetResponseBody', Response) + end + end + + If Error_Services('NoError') then + // If the request was successful, get the response status code, phrase, and response headers and set them + // using HTTPClient_Services so the caller can retrieve is desired. + Code = OLEGetProperty(objXMLHTTP, 'status') + Phrase = Trim(OLEGetProperty(objXMLHTTP, 'statusText')) + HTTPClient_Services('SetResponseStatusCode', Code) + HTTPClient_Services('SetResponseStatusPhrase', Phrase) + + ResponseHeaders = OLECallMethod(objXMLHTTP, 'getAllResponseHeaders') + Swap CRLF$ with @FM in ResponseHeaders + For Each ResponseHeader in ResponseHeaders using @FM + Name = ResponseHeader[1, 'F:'] + Value = Trim(ResponseHeader[Col2() + 1, 9999]) + If (Name NE '') AND (Value NE '') then + HTTPClient_Services('SetResponseHeaderField', Name, Value) + end + Next ResponseHeader + end + + // Make sure all prior request settings are cleared so future HTTP request won't be affected. + Error = Error_Services('GetMessage') ; // Get any pre-existing errors so they can be preserved. + HTTPClient_Services('ClearRequestSettings') ; // This will automatically clear the error stack. + Error_Services('Set', Error) ; // Restore any errors so the caller can check for them. + end else + Error_Services('Add', 'Method or URL argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SendHTTPRequest +// +// Method - The HTTP method to submit to the server. - [Required] +// URL - The URL receiving the HTTP request. - [Required] +// HeaderList - An @FM/@VM list of request header names and values. - [Optional] +// Body - The request body to be sent to the server. - [Optional] +// ProxyUser - Username needed to authenticate against a proxy server. - [Optional] +// ProxyPassword - Password needed to authenticate against a proxy server. - [Optional] +// UseAsynchronous - Flag to determine if the HTTP request should be processed asynchronously. Default is True. +// - [Optional] +// UseClientXMLHTTP - Flag to determine if client XMLHTTP or server XMLHTTP should be used. Default is server XMLHTTP. +// - [Optional] +// ClientCertPath - Path to a client-side certificate. This is usually in Location\Certificate Store\Subject format. +// - [Optional] +// +// Calls the indicated HTTP web service routine. +//---------------------------------------------------------------------------------------------------------------------- +Service SendHTTPRequest(Method, URL, HeaderList, Body, ProxyUser, ProxyPassword, UseAsynchronous, UseClientXMLHTTP, ClientCertPath) + + // Defaults. + If UseAsynchronous NE False$ then UseAsynchronous = True$ + If UseClientXMLHTTP NE True$ then UseClientXMLHTTP = False$ + + If (Method NE '') AND (URL NE '') then + // Make sure all prior response settings are cleared before performing the next HTTP request. + HTTPClient_Services('ClearResponseSettings') + + // Attempt to get a handle for the best XMLHTTP object. + objXMLHTTP = '' + If UseClientXMLHTTP then + ServerPrefix = '' + end else + ServerPrefix = 'Server' + end + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP.6.0' + If SRP_COM(objXMLHTTP, 'CREATE', XMLHTTPProgID) else + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP.3.0' + If SRP_COM(objXMLHTTP, 'CREATE', XMLHTTPProgID) else + XMLHTTPProgID = 'Msxml2.' : ServerPrefix : 'XMLHTTP' + If SRP_COM(objXMLHTTP, 'CREATE', XMLHTTPProgID) else + Error = 'Unable to create a handle to the XMLHTTP object in the ' : Service : ' service.' + If SRP_COM('', 'HASERROR') then + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + end + Error_Services('Add', Error) + end + end + end + + If Error_Services('NoError') then + // Invoke the XMLHTTP object's open method to initialize a request. + SRP_COM(objXMLHTTP, 'CALL', 'open', Method, URL, UseAsynchronous, ProxyUser, ProxyPassword) + If SRP_COM('', 'HASERROR') then + Error = 'Error calling the open method for the XMLHTTP object in the ' : Service : ' service.' + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + Error_Services('Add', Error) + end + end + + If Error_Services('NoError') then + // Set the request header names and values. This will add or update any header fields passed in through this + // service with those have may have been previously set using the SetRequestHeaderFields or + // SetRequestHeaderField already. + If Len(HeaderList) then HTTPClient_Services('SetRequestHeaderFields', HeaderList) + // Now get all of the request header fields. + HeaderList = HTTPClient_Services('GetRequestHeaderFields') + If Error_Services('NoError') then + If HeaderList NE '' then + For Each HeaderPair in HeaderList using @FM + HeaderName = HeaderPair<0, 1> + HeaderValue = HeaderPair<0, 2> + SRP_COM(objXMLHTTP, 'CALL', 'setRequestHeader', HeaderName, HeaderValue) + If SRP_COM('', 'HASERROR') then + Error = 'Error setting the setRequestHeader property for the ' : HeaderName : ' field in the XMLHTTP object in the ' : Service : ' service.' + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + Error_Services('Add', Error) + end + Next HeaderPair + end + end + end + + If ClientCertPath NE '' then + If Error_Services('NoError') then + // Invoke the XMLHTTP object's setOption method to invoke a certificate. + rv = SRP_COM(objXMLHTTP, 'CALL', 'setOption', 3, ClientCertPath) + If SRP_COM('', 'HASERROR') then + Error = 'Error calling the setOption method for the XMLHTTP object in the ' : Service : ' service.' + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + Error_Services('Add', Error) + end + end + end + + If Error_Services('NoError') then + // Invoke the XMLHTTP object's send method to submit the request to the server. + rv = SRP_COM(objXMLHTTP, 'CALL', 'send', Body) + If SRP_COM('', 'HASERROR') then + Error = 'Error calling the send method for the XMLHTTP object in the ' : Service : ' service.' + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + Error_Services('Add', Error) + end + end + + If Error_Services('NoError') then + If UseAsynchronous then + StartTime = GetTickCount() + TimeoutDuration = HTTPClient_Services('GetTimeoutDuration') + TimedOut = False$ + Loop + ReadyState = SRP_COM(objXMLHTTP, 'GET', 'readyState') + CurrentTime = GetTickCount() + ElapsedTime = Int((CurrentTime - StartTime) / 1000) + TimedOut = ElapsedTime GE TimeoutDuration + While (ReadyState NE HTTP_COMPLETED$) AND Not(TimedOut) + Repeat + end + + // Check the XMLHTTP object's responseBody property to get the server's response. +* Response = SRP_COM(objXMLHTTP, 'GET', 'responseBody') + Response = SRP_COM(objXMLHTTP, 'GET', 'responseText') + + If SRP_COM('', 'HASERROR') then + Error = 'Error getting the responseBody property for the XMLHTTP object in the ' : Service : ' service.' + Error := ' SRP_COM Error: ' : SRP_COM('', 'ERROR') + Error_Services('Add', Error) + Response = '' + end else + HTTPClient_Services('SetResponseBody', Response) + end + end + + If Error_Services('NoError') then + // If the request was successful, get the response status code, phrase, and response headers and set them + // using HTTPClient_Services so the caller can retrieve is desired. + Code = SRP_COM(objXMLHTTP, 'GET', 'status') + Phrase = Trim(SRP_COM(objXMLHTTP, 'GET', 'statusText')) + HTTPClient_Services('SetResponseStatusCode', Code) + HTTPClient_Services('SetResponseStatusPhrase', Phrase) + + ResponseHeaders = SRP_COM(objXMLHTTP, 'CALL', 'getAllResponseHeaders') + Swap CRLF$ with @FM in ResponseHeaders + For Each ResponseHeader in ResponseHeaders using @FM + Name = ResponseHeader[1, 'F:'] + Value = Trim(ResponseHeader[Col2() + 1, 9999]) + If (Name NE '') AND (Value NE '') then + HTTPClient_Services('SetResponseHeaderField', Name, Value) + end + Next ResponseHeader + end + + // Release the handle to the XMLHTTP object in case it was created. + SRP_COM(objXMLHTTP, 'RELEASE') + + // Make sure all prior request settings are cleared so future HTTP request won't be affected. + Error = Error_Services('GetMessage') ; // Get any pre-existing errors so they can be preserved. + HTTPClient_Services('ClearRequestSettings') ; // This will automatically clear the error stack. + Error_Services('Set', Error) ; // Restore any errors so the caller can check for them. + end else + Error_Services('Add', 'Method or URL argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRequestHeaderFields +// +// HeaderList - An @FM/@VM list of request header fields and their values. - [Required] +// +// Sets the Request Header Fields as indicated by the HeaderList argument. The HeaderList should not be formatted as a +// list rather than an associated multivalue array. This is easier for the developer to manage in the code that calls +// this service. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRequestHeaderFields(HeaderList) + + If HeaderList NE '' then + For Each HeaderPair in HeaderList using @FM + HeaderName = HeaderPair<0, 1> + HeaderValue = HeaderPair<0, 2> + HTTPClient_Services('SetRequestHeaderField', HeaderName, HeaderValue) + Next HeaderPair + end else + Error_Services('Add', 'HeaderList argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRequestHeaderField +// +// Name - Header Field Name to set. - [Required] +// Value - Value for the header field. This will be Trimmed to enforce proper formatting. - [Required] +// +// Sets the indicated Request Header Field with the indicated value. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRequestHeaderField(Name, Value) + + If (Name NE '') AND (Value NE '') then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = RequestHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos else + fPos = Count(RequestHeaderFields@, @FM) + (RequestHeaderFields@ NE '') + 1 + end + RequestHeaderFields@ = Name + RequestHeaderValues@ = Trim(Value) + end else + Error_Services('Add', 'The Name or Value argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRequestHeaderFields +// +// Returns all of the Request Header Field names and values. This returns an @FM/@VM list of names and values. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRequestHeaderFields() + + HeaderFieldBlock = '' + + If RequestHeaderFields@ NE '' then + NumFields = Count(RequestHeaderFields@, @FM) + (RequestHeaderFields@ NE '') + For FieldCnt = 1 to NumFields + HeaderFieldBlock := RequestHeaderFields@ : @VM : RequestHeaderValues@ : @FM + Next FieldCnt + HeaderFieldBlock[-1, 1] = '' + end + + Response = HeaderFieldBlock + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRequestHeaderField +// +// Name - Header Field Name to get. - [Required] +// +// Returns the value previously set for the indicated Request Header Field. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRequestHeaderField(Name) + + Value = '' + + If Name NE '' then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = RequestHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos then + Value = RequestHeaderValues@ + end else + Error_Services('Add', Name : ' is not a header field in the request.') + end + end else + Error_Services('Add', 'The Name argument is missing in the ' : Service : ' service.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseHeaderField +// +// Name - Header Field Name to set. - [Required] +// Value - Value for the header field. This will be Trimmed to enforce proper formatting. - [Required] +// +// Sets the indicated Response Header Field with the indicated value. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseHeaderField(Name, Value) + + If (Name NE '') AND (Value NE '') then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = ResponseHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos else + fPos = Count(ResponseHeaderFields@, @FM) + (ResponseHeaderFields@ NE '') + 1 + end + ResponseHeaderFields@ = Name + PreviousValue = ResponseHeaderValues@ + If PreviousValue EQ '' then + ResponseHeaderValues@ = Trim(Value) + end else + If Name EQ 'Set-Cookie' then + // Unlike other response headers, Set-Cookie can have multiple entries. However, if more than one + // cookie of a particular name exists then only store the last entry. + SetCookieFound = False$ + CookieName = Value[1, 'F='][1, 'F '][1, 'F;'] + For Each HeaderField in ResponseHeaderFields@ using @FM setting fPos + If HeaderField EQ 'Set-Cookie' then + SetCookieFound = True$ + end + Until SetCookieFound EQ True$ + Next HeaderField + If SetCookieFound EQ True$ then + // Set-Cookie was found. Check to see if the cookie name has already been added. + CookieNameFound = False$ + CookieValues = ResponseHeaderValues@ + For Each CookieValue in CookieValues using @VM setting vPos + MatchCookieName = CookieValue[1, 'F='][1, 'F '][1, 'F;'] + If CookieName EQ MatchCookieName then + CookieNameFound = True$ + end + Until CookieNameFound EQ True$ + Next CookieValue + If CookieNameFound EQ True$ then + // Cookie name already exists. Replace the old value with the new one. + ResponseHeaderValues@ = Trim(Value) + end else + // This is a new cookie name. Append the Set-Cookie value to the list. + ResponseHeaderValues@ = Trim(Value) + end + end else + // No cookies have been set yet. + ResponseHeaderValues@ = Trim(Value) + end + end else + ResponseHeaderValues@ = PreviousValue : ' ;' : Trim(Value) + end + end + end else + Error_Services('Add', 'The Name or Value argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseHeaderFields +// +// Returns all of the Response Header Field names and values. This returns an @FM/@VM list of names and values. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseHeaderFields() + + HeaderFieldBlock = '' + + If ResponseHeaderFields@ NE '' then + NumFields = Count(ResponseHeaderFields@, @FM) + (ResponseHeaderFields@ NE '') + For FieldCnt = 1 to NumFields + HeaderFieldBlock := ResponseHeaderFields@ : @VM : ResponseHeaderValues@ : @FM + Next FieldCnt + HeaderFieldBlock[-1, 1] = '' + end else + Error_Services('Add', 'There are no response header fields get.') + end + + Response = HeaderFieldBlock + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseHeaderField +// +// Name - Header Field Name to get. - [Required] +// Delimiter - Delimiter to use for multiple values. Default is '; ' for all header fields except for Set-Cookie. +// Set-Cookie defaults to @VM. - [Optional] +// +// Returns the value previously set for the indicated Response Header Field. The Name argument is case-insensitive but +// if the indicated Response Header Field has not been set then an error condition will be set. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseHeaderField(Name=RESPONSEHEADERNAMES, Delimiter) + + Value = '' + + If Name NE '' then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = ResponseHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos then + Value = ResponseHeaderValues@ + If Delimiter NE '' then + If Name EQ 'Set-Cookie' then + Convert @VM to Delimiter in Value + end else + Swap '; ' with Delimiter in Value + end + end + end else + Error_Services('Add', Name : ' is not a header field in the response.') + end + end else + Error_Services('Add', 'The Name argument is missing in the ' : Service : ' service.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetCookies +// +// Delimiter - Delimiter to use for multiple cookies. Default is @FM - [Optional] +// +// Returns all cookie strings from the response headers. +//---------------------------------------------------------------------------------------------------------------------- +Service GetCookies(Delimiter) + + If Delimiter EQ '' then Delimiter = @FM + + Cookies = HTTPClient_Services('GetResponseHeaderField', 'Set-Cookie', Delimiter) + + Response = Cookies + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetCookie +// +// Name - Name of the cookie to get. - [Required] +// IgnoreAttributes - Boolean flag to indicate if the cookie's attributes should be removed when returning the cookie. +// Default value is False$. - [Optional] +// +// Returns the value for the indicated cookie name. +//---------------------------------------------------------------------------------------------------------------------- +Service GetCookie(Name, IgnoreAttributes=BOOLEAN) + + If IgnoreAttributes NE True$ then IgnoreAttributes = False$ + + Cookie = '' + + If Name NE '' then + CookieNameFound = False$ + Cookies = HTTPClient_Services('GetCookies') + For Each CookieString in Cookies using @FM + MatchCookieName = CookieString[1, 'F='][1, 'F '][1, 'F;'] + If Name EQ MatchCookieName then + CookieNameFound = True$ + end + Until CookieNameFound EQ True$ + Next CookieValue + If CookieNameFound EQ True$ then + If IgnoreAttributes EQ True$ then + CookieString = Trim(CookieString[1, ';']) + end + Transfer CookieString to Cookie + end + end else + Error_Services('Add', 'The Name argument is missing in the ' : Service : ' service.') + end + + Response = Cookie + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseStatusCode +// +// Code - HTTP status code to set. - [Required] +// +// Sets the response status code generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseStatusCode(Code) + + If Code NE '' then + ResponseStatusCode@ = Code + end else + Error_Services('Add', 'The Code argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseStatusCode +// +// Gets the response status code generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseStatusCode() + + Response = ResponseStatusCode@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseStatusPhrase +// +// Phrase - HTTP status phrase to set. - [Required] +// +// Sets the response status phrase generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseStatusPhrase(Phrase) + + If Phrase NE '' then + ResponseStatusPhrase@ = Phrase + end else + Error_Services('Add', 'The Phrase argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseStatusPhrase +// +// Gets the response status phrase generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseStatusPhrase() + + Response = ResponseStatusPhrase@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseBody +// +// Body - The response body which would have been generated by an XMLHTTP call. +// +// Sets the response body generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseBody(Body) + + ResponseBody@ = Body + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseBody +// +// Gets the response body generated by the most recent HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseBody() + + Response = ResponseBody@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetTimeoutDuration +// +// TimeoutDuration - The length of time (in seconds) before an HTTP request will abort. +// +// Sets the timeout duration that will be used before an HTTP request will abort. This is only applicable if the +// request is asynchronous. If the timeout duration is empty, a default setting of 30 minutes (1800 seconds) will be +// set. +//---------------------------------------------------------------------------------------------------------------------- +Service SetTimeoutDuration(TimeoutDuration) + + If TimeoutDuration EQ '' then TimeoutDuration = 1800 + + TimeoutDuration@ = TimeoutDuration + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTimeoutDuration +// +// Returns the timeout duration that will be used before an HTTP request will abort. This is only applicable if the +// request is asynchronous. If the timeout duration is empty, a default setting of 30 minutes (1800) seconds) will be +// returned. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTimeoutDuration() + + If TimeoutDuration@ EQ '' then TimeoutDuration@ = 1800 + + Response = TimeoutDuration@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ClearResponseSettings +// +// Clears all of the global common variables used for responses. +//---------------------------------------------------------------------------------------------------------------------- +Service ClearResponseSettings() + + ResponseHeaderFields@ = '' + ResponseHeaderValues@ = '' + ResponseStatusCode@ = '' + ResponseStatusPhrase@ = '' + ResponseBody@ = '' + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ClearRequestSettings +// +// Clears all of the global common variables used for requests. +//---------------------------------------------------------------------------------------------------------------------- +Service ClearRequestSettings() + + RequestHeaderFields@ = '' + RequestHeaderValues@ = '' + TimeoutDuration@ = 1800 + +end service diff --git a/FRAMEWORKS/STPROC/HTTP_ABORTED_SERVICE.txt b/FRAMEWORKS/STPROC/HTTP_ABORTED_SERVICE.txt new file mode 100644 index 0000000..71196cd --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_ABORTED_SERVICE.txt @@ -0,0 +1,38 @@ +Subroutine HTTP_Aborted_Service(ProcErr) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Aborted_Service + + Description : Handler program for the HTTP Aborted service module. + + Notes : Service handler for HTTP Requests that get aborted either due to Runtime Errors or Status Errors. + If the Debugger Intercept has been enabled, this handler will only receive Status Error aborts. + + Parameters : + ProcErr [in] -- The procedural error data being passed in from the OEngineServer. Unless otherwise + changed, the only reason this should be called is if there was a runtime error in one + of the stored procedures that was called by the initial request. + + Metadata : + + History : (Date, Initials, Notes) + 02/27/17 dmb Original programmer. - [SRPFW-125] + 03/04/17 dmb Replace direct logging with the CreateLogFile service. - [SRPFW-154] + 12/03/18 dmb Update to use the SetResponseError service. - [SRPFW-257] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_INSERTS + +// Generate a log file. Pass in the contents of the ProcErr argument as is. +HTTP_Services('CreateLogFile', 'Aborted', ProcErr) + +HTTP_Services('SetResponseError', '', '', 500, ProcErr, FullEndpointURL) + +Return diff --git a/FRAMEWORKS/STPROC/HTTP_AUTHENTICATION_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_AUTHENTICATION_SERVICES.txt new file mode 100644 index 0000000..88d57d9 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_AUTHENTICATION_SERVICES.txt @@ -0,0 +1,553 @@ +Function HTTP_Authentication_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Authentication_Services + + Description : Handler program for all HTTP authentication. + + Notes : Authentication techniques will vary depending upon the application so the code in the + AuthenticateRequest service will need to be customized as necessary. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + History : (Date, Initials, Notes) + 02/25/15 dmb [SRPFW-91] Original programmer. + 06/10/15 dmb [SRPFW-91] Add checks to make sure Username and Password are populated before attempting to + authenticate against the USERS table. This prevents easy authentication if the USERS table + isn't being managed well. + 02/25/16 dmb [SRPFW-108] Add support for the GetEnableAuthenticateFlag service. If disabled, then automatically + authenticate the user. + 02/25/16 dmb [SRPFW-108] Add support for the GetRealmValue service. Use this instead of hard-coding the + realm. + 12/01/16 dmb Update the AuthenticateRequest service to verify authentication requirements of the current + URL using the URLRequiresAuthentication service. + 07/01/17 dmb [SRPFW-184] Refactor using Enhanced BASIC+ syntax. + 10/22/18 dmb [SRPFW-253] Add support for checking for whitelisted IPs in the AuthenticateRequest service. + 10/31/18 dmb [SRPFW-254] Add GetWebAccountPassword, SetWebAccountPassword, and ValidateWebAccountPassword + services. + 10/31/18 dmb [SRPFW-254] Update the AuthenticateRequest service to use the ValidateWebAccountPassword + service rather than relying upon a hardcoded USERS table. + 11/01/18 dmb [SRPFW-256] Update NewPasswordTimeToLive$ equate to use the GetNewPasswordTimeToLive service + rather than the hardcoded value. + 11/01/18 dmb [SRPFW-256] Update OldPasswordTimeToLive$ equate to use the GetOldPasswordTimeToLive service + rather than the hardcoded value. + 11/09/18 dmb [SRPFW-256] Update ValidateWebAccountPassword service to implement the containment action if + too many failed password attempts have been attempted. + 11/20/18 dmb [SRPFW-256] Add GetWebAccountEnabledStatus service. Update the AuthenticateRequest service + to use it before attempting to validate the password. + 11/21/18 dmb [SRPFW-257] Add ResetWebAccountPassword service. + 11/21/18 dmb [SRPFW-257] Update SetWebAccountPassword service to support a flag that ignores expiration + date. + 11/23/18 dmb [SRPFW-257] Add SetAuthenticatedAccountID and GetAuthenticatedAccountID services. + 12/12/18 dmb [SRPFW-257] Add SetAuthenticatedPassword and GetAuthenticatedPassword services. + 06/24/19 dmb [SRPFW-276] Update the ValidateWebAccountPassword service to reset the invalid password + attempt counter for an account if a valid password is passed in. + 12/09/19 dmb [SRPFW-296] Update all calls to Memory_Services to use a specific cache name. + 06/30/20 dmb [SRPFW-313] Update the AuthenticateRequest service to return a 403 status code rather than + a 511 status code if the IP making the request is not permitted. + 07/27/20 dmb [SRPFW-313] Replace references to the IPIsPermitted service with the IsIPPermitted service. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert SERVICE_SETUP +$insert HTTP_INSERTS + +Equ SecondsPerHour$ to 60 * 60 ; // 60 minutes * 60 seconds = 3600 +Equ SecondsPerDay$ to 24 * SecondsPerHour$ ; // 24 hours * 60 minutes * 60 seconds = 86400 +Equ NewPasswordTimeToLive$ to HTTP_Services('GetNewPasswordTimeToLive') * SecondsPerHour$ ; // Convert hours to seconds +Equ OldPasswordTimeToLive$ to HTTP_Services('GetOldPasswordTimeToLive') * SecondsPerHour$ ; // Convert hours to seconds +Equ CacheName$ to 'SRPHTTPFramework' + +Declare function Database_Services, RTI_CreateGUID +Declare subroutine Database_Services + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the HTTP Authentication services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// AuthenticateRequest +// +// Returns a boolean value indicating the success of the authentication attempt. Default method is built around +// HTTP Basic Authentication. +//---------------------------------------------------------------------------------------------------------------------- +Service AuthenticateRequest() + + // All response headers that need to be set, regardless of authentication, should be handled here. + // 1. Access-Control-Allow-Origin must always be returned for CORS purposes. + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Origin', '*') + + EnableAuthentication = HTTP_Services('GetEnableAuthenticationFlag') + FullEndPointURL = HTTP_Services('GetFullEndPointURL') + URLRequiresAuthentication = HTTP_Services('URLRequiresAuthentication', FullEndPointURL) + + // Set the default status code and phrase if authentication fails. + StatusCode = 401 + StatusPhrase = '' + + If EnableAuthentication AND URLRequiresAuthentication then + HTTPMethod = HTTP_Services('GetHTTPRequestMethod') + HTTPRemoteAddr = HTTP_Services('GetHTTPRemoteAddr') + + // Verify that the client IP is permitted. If there are no whitelisted IPs, then all IPs are permitted. + IsIPPermitted = HTTP_Services('IsIPPermitted', HTTPRemoteAddr) + If IsIPPermitted EQ True$ then + If HTTPMethod _EQC 'OPTIONS' then + // OPTIONS methods are never authenticated. Allow the user to be provisionally authenticated since the method + // will remains as OPTIONS throughout the entire API. + UserAuthenticated = True$ + end else + // Assume the user is not authenticated until otherwise proven. + UserAuthenticated = False$ + + // The follow code provides a skeleton for support HTTP Basic authorization. This is a REST friendly + // authentication protocol and is documented in the core HTTP specification. Because REST does not preserve the + // state, all requests are authenticated regardless of previous authentication successes. HTTP Basic should + // only be used if https:// is being used. Otherwise, the credentials are being passed through as plain text. + + + // HTTP Basic uses the Authorization request header. However, the Authorization request header field does not + // always work with web server products when being passed to a third-party service. So, if the standard header + // returns nothing then check the custom X-Authorization request header. + AuthorizationB64 = HTTP_Services('GetRequestHeaderField', 'Authorization') + If AuthorizationB64 EQ '' then AuthorizationB64 = HTTP_Services('GetRequestHeaderField', 'X-Authorization') + + If AuthorizationB64 NE '' then + // All HTTP Basic credentials should be Base64 encoded (in addition to encrypted via https://). Decode + // the credentials. + Authorization = SRP_Decode(AuthorizationB64[7, 999], 'BASE64') + + // HTTP Basic credentials are always colon (:) delimited. Typically this will come through as + // Username:Password, but there could be other formats if the application requires it. For instance, for + // applications supporting multiple customers wherein each customer has their own group of users, the + // format could look like this CustomerID/Username:Password. This provides, in a sense, a three-part + // identifier. The following parsing logic would need to be adjusted as needed. + Username = Authorization[1, ':'] + Password = Authorization[Col2() + 1, 999] + EnabledStatus = HTTP_Authentication_Services('GetWebAccountEnabledStatus', Username) + If EnabledStatus EQ True$ then + // Only authenticate if a username and password is provided. This prevents authenticating in the event + // the USERS row is missing a password or the USERS table has a blank row. + If (Username NE '') AND (Password NE '') then + // Below is where you would place your logic to validate the username, password, and any other credentials + // that were passed in. This code uses the default HTTP Framework WEB_ACCOUNTS table. + + UserAuthenticated = HTTP_Authentication_Services('ValidateWebAccountPassword', Username, Password, False$) + + // A successful login should set the WWW-Authenticate response header field with the appropriate value. The + // credentials are stored in memory so they can be retrieved by other services as needed. + If UserAuthenticated then + UserAuthenticated = True$ + HTTP_Authentication_Services('SetAuthenticatedAccountID', Username) + HTTP_Authentication_Services('SetAuthenticatedPassword', Password) + // The realm attribute is a part of the HTTP authentication specification and is used to help identify all + // resources that belong to the same authentication. Typically this will be the same value for all requests + // within the same application. The branded name or OpenInsight name of the application would be a good + // example to use here. + Realm = HTTP_Services('GetRealmValue') + HTTP_Services('SetResponseHeaderField', 'WWW-Authenticate', 'xBasic realm="' : Realm : '"') + end + end + end else + // IP address making the request is not permitted. Do not authenticate the user. + StatusCode = 403 + StatusPhrase = 'Account ' : Username : ' is disabled.' + UserAuthenticated = False$ + end + end + end + end else + // IP address making the request is not permitted. Do not authenticate the user. + StatusCode = 403 + StatusPhrase = HTTPRemoteAddr : ' is not a permitted IP address.' + UserAuthenticated = False$ + end + end else + // Force the user to be authenticated since authentication is not enabled. + UserAuthenticated = True$ + end + + // Non-authenticated requests should have a 401 status code returned. + If Not(UserAuthenticated) then + HTTP_Services('SetResponseError', '', '', StatusCode, StatusPhrase, FullEndpointURL) + end + + Response = UserAuthenticated + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// CleanUp +// +// Runs any clean up processes as needed to prepare the engine for the next request. +//---------------------------------------------------------------------------------------------------------------------- +Service CleanUp() + + // This service is called from HTTP_MCP before sending the response back to the caller. Any application specific + // logic that stores data in memory or attaches customer specific database tables should be properly closed out + // to avoid subsequent requests from having innappropriate access. + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetWebAccountEnabledStatus +// +// Gets the enabled status for the indicated web account. +//---------------------------------------------------------------------------------------------------------------------- +Service GetWebAccountEnabledStatus(AccountID) + + EnabledStatus = '' + + If AccountID NE '' then + WebAccountRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = WebAccountRow + EnabledStatus = {ACCOUNT_ENABLED} + If EnabledStatus NE True$ then EnabledStatus = False$ ; // Always default to disabled unless explicitly enabled. + end + end else + Error_Services('Add', 'AccountID argument was missing in the ' : Service : ' service.') + end + + Response = EnabledStatus + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetWebAccountPassword +// +// Gets the current password for the indicated web account. If the CreateIfNew flag is set to True$, a new password will +// be generated if no password currently exists. This new password will be added to the web account. +//---------------------------------------------------------------------------------------------------------------------- +Service GetWebAccountPassword(AccountID, CreateIfNew) + + Password = '' + + If CreateIfNew NE True$ then CreateIfNew = False$ + + If AccountID NE '' then + WebAccountRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = WebAccountRow + Begin Case + Case ({CURRENT_PASSWORD} EQ '') AND (CreateIfNew EQ True$) + Password = HTTP_Authentication_Services('ResetWebAccountPassword', AccountID, CurrentPassword) + + Case ({CURRENT_PASSWORD} EQ '') AND (CreateIfNew EQ False$) + Error_Services('Add', 'No password exists for Account ID ' : AccountID) + + Case Otherwise$ + Password = {CURRENT_PASSWORD} + + End Case + end + end else + Error_Services('Add', 'AccountID argument was missing in the ' : Service : ' service.') + end + + Response = Password + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ResetWebAccountPassword +// +// Resets the current password (or creates a new one) for the indicated web account. This new password will be added to +// the web account. +//---------------------------------------------------------------------------------------------------------------------- +Service ResetWebAccountPassword(AccountID, CurrentPassword) + + Password = '' + + If AccountID NE '' then + WebAccountRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = WebAccountRow + // Password is based on a random GUID and then encoded as Base64. + Password = RTI_CreateGUID('B') + HTTP_Authentication_Services('SetWebAccountPassword', AccountID, CurrentPassword, Password, True$) + If Error_Services('HasError') then Password = '' + end + end else + Error_Services('Add', 'AccountID argument was missing in the ' : Service : ' service.') + end + + Response = Password + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ValidateWebAccountPassword +// +// Validates the password for the indicated web account. If the CurrentOnly argument is set to True$, then only the +// current password associated with the web account will be validated. Otherwise, the old password will also be valided +// using the expiration date and time associated. +//---------------------------------------------------------------------------------------------------------------------- +Service ValidateWebAccountPassword(AccountID, Password, CurrentOnly) + + Valid = False$ ; // Assume False$ for now. + ErrorMessage = '' + + If CurrentOnly NE True$ then CurrentOnly = False$ + + If (AccountID NE '') AND (Password NE '') then + WebAccountRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = WebAccountRow + ThisSeconds = Date() * SecondsPerDay$ + Time() + Begin Case + Case Password EQ {CURRENT_PASSWORD} + ExpireSeconds = {CURRENT_PASSWORD_EXPIRE_DATE} * SecondsPerDay$ + {CURRENT_PASSWORD_EXPIRE_TIME} + If ThisSeconds LE ExpireSeconds then + Valid = True$ + end else + ErrorMessage = 'Password is expired. A new one needs to be requested.' + end + + Case (Password EQ {OLD_PASSWORD}) AND (CurrentOnly EQ False$) + ExpireSeconds = {OLD_PASSWORD_EXPIRE_DATE} * SecondsPerDay$ + {OLD_PASSWORD_EXPIRE_TIME} + If ThisSeconds LE ExpireSeconds then + Valid = True$ + end else + ErrorMessage = 'Password is expired. A new one needs to be requested.' + end + + Case Otherwise$ + ErrorMessage = 'Password is invalid.' + + End Case + + If ErrorMessage EQ '' then + // Reset the number of invalid password attempts for the account. + {INVALID_PASSWORD_ATTEMPTS} = 0 + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', @ID, @RECORD, True$, False$, True$) + end else + // Update the total invalid password attempts for this server. + Attempts = HTTP_Services('GetTotalInvalidPasswordAttempts') + Attempts += 1 + HTTP_Services('SetTotalInvalidPasswordAttempts', Attempts) + // Update the total invalid password attempts for this account. + InvalidPasswordAttempts = {INVALID_PASSWORD_ATTEMPTS} + 1 + {INVALID_PASSWORD_ATTEMPTS} = InvalidPasswordAttempts + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', @ID, @RECORD, True$, False$, True$) + InvalidPasswordLimit = HTTP_Services('GetInvalidPasswordLimit') + If InvalidPasswordAttempts GE InvalidPasswordLimit then + ContainmentAction = HTTP_Services('GetContainmentAction') + Begin Case + Case ContainmentAction _EQC 'Disable Server' + HTTP_Services('SetServerEnabled', False$) + Case ContainmentAction _EQC 'Quarantine Account' + {ACCOUNT_ENABLED} = False$ + WebAccountRow = @RECORD + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', AccountID, WebAccountRow, True$, False$, True$) + End Case + ActionDetails = '' + ActionDetails<1> = Fmt('Containment Action:', 'L#35') : ContainmentAction + ActionDetails<2> = Fmt('Invalid Password Limit:', 'L#35') : InvalidPasswordLimit + ActionDetails<3> = Fmt('Total Invalid Password Attempts:', 'L#35') : Attempts + ActionDetails<4> = Fmt('Account ID:', 'L#35') : AccountID + ActionDetails<5> = Fmt('Total Account Invalid Attempts:', 'L#35') : InvalidPasswordAttempts + HTTP_Authentication_Services('ContainmentActionNotification', ActionDetails) + end + Error_Services('Add', ErrorMessage) + end + end + end else + Error_Services('Add', 'AccountID or Password argument was missing in the ' : Service : ' service.') + end + + Response = Valid + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetWebAccountPassword +// +// Sets a new password for the indicated web account. If no current password already exists, then the new password will +// be added to the web account automatically. Otherwise, the current password will be verified before allowing a new +// password to be set. +//---------------------------------------------------------------------------------------------------------------------- +Service SetWebAccountPassword(AccountID, CurrentPassword, NewPassword, OverrideExpireDate) + + If OverrideExpireDate NE True$ then OverrideExpireDate = False$ + + If (AccountID NE '') AND (NewPassword NE '') then + WebAccountRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = WebAccountRow + If {CURRENT_PASSWORD} EQ '' then + // This is a new password for this web account. Accept the new password. + CreateDate = Date() + CreateTime = Time() + CreateSeconds = CreateDate * SecondsPerDay$ + CreateTime + ExpireSeconds = CreateSeconds + NewPasswordTimeToLive$ + ExpireDate = Int(ExpireSeconds / SecondsPerDay$) + ExpireTime = Mod(ExpireSeconds, SecondsPerDay$) + {CURRENT_PASSWORD} = NewPassword + {CURRENT_PASSWORD_CREATE_DATE} = CreateDate + {CURRENT_PASSWORD_CREATE_TIME} = CreateTime + {CURRENT_PASSWORD_EXPIRE_DATE} = ExpireDate + {CURRENT_PASSWORD_EXPIRE_TIME} = ExpireTime + WebAccountRow = @RECORD + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', AccountID, WebAccountRow, True$, False$, True$) + end else + // A current password already exists. + Valid = HTTP_Authentication_Services('ValidateWebAccountPassword', AccountID, CurrentPassword, True$) OR (OverrideExpireDate EQ True$) + If Valid EQ True$ then + Begin Case + Case CurrentPassword EQ NewPassword + // New password must be different than the current password. + Error_Services('Add', 'New password must be different than the current password.') + + Case Otherwise$ + // Current password is valid and new password is different. + + // Make the current password the old passowrd. Reset the expiration date and time as + // needed. + CurrentPassword = {CURRENT_PASSWORD} + CurrentPasswordCreateDate = {CURRENT_PASSWORD_CREATE_DATE} + CurrentPasswordCreateTime = {CURRENT_PASSWORD_CREATE_TIME} + {OLD_PASSWORD} = CurrentPassword + {OLD_PASSWORD_CREATE_DATE} = CurrentPasswordCreateDate + {OLD_PASSWORD_CREATE_TIME} = CurrentPasswordCreateTime + ThisSeconds = Date() * SecondsPerDay$ + Time() + ExpireSeconds = ThisSeconds + OldPasswordTimeToLive$ + ExpireDate = Int(ExpireSeconds / SecondsPerDay$) + ExpireTime = Mod(ExpireSeconds, SecondsPerDay$) + {OLD_PASSWORD_EXPIRE_DATE} = ExpireDate + {OLD_PASSWORD_EXPIRE_TIME} = ExpireTime + + // Set the new password information. + CreateDate = Date() + CreateTime = Time() + CreateSeconds = CreateDate * SecondsPerDay$ + CreateTime + ExpireSeconds = CreateSeconds + NewPasswordTimeToLive$ + ExpireDate = Int(ExpireSeconds / SecondsPerDay$) + ExpireTime = Mod(ExpireSeconds, SecondsPerDay$) + {CURRENT_PASSWORD} = NewPassword + {CURRENT_PASSWORD_CREATE_DATE} = CreateDate + {CURRENT_PASSWORD_CREATE_TIME} = CreateTime + {CURRENT_PASSWORD_EXPIRE_DATE} = ExpireDate + {CURRENT_PASSWORD_EXPIRE_TIME} = ExpireTime + WebAccountRow = @RECORD + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', AccountID, WebAccountRow, True$, False$, True$) + End Case + end + end + end + end else + Error_Services('Add', 'AccountID or NewPassword argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAuthenticatedAccountID +// +// Sets the account ID that was successfully authenticated for this request. +//---------------------------------------------------------------------------------------------------------------------- +Service SetAuthenticatedAccountID(AccountID) + + If AccountID NE '' then + Memory_Services('SetValue', ServiceModule : '*AuthenticatedAccountID', AccountID, CacheName$) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAuthenticatedAccountID +// +// Gets the successfully authenticated account ID for this request. +//---------------------------------------------------------------------------------------------------------------------- +Service GetAuthenticatedAccountID() + + AccountID = Memory_Services('GetValue', ServiceModule : '*AuthenticatedAccountID', '', '', CacheName$) + + Response = AccountID + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAuthenticatedPassword +// +// Sets the password that was successfully authenticated for this request. +//---------------------------------------------------------------------------------------------------------------------- +Service SetAuthenticatedPassword(Password) + + If Password NE '' then + Memory_Services('SetValue', ServiceModule : '*AuthenticatedPassword', Password, CacheName$) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAuthenticatedPassword +// +// Gets the successfully authenticated password for this request. +//---------------------------------------------------------------------------------------------------------------------- +Service GetAuthenticatedPassword() + + Password = Memory_Services('GetValue', ServiceModule : '*AuthenticatedPassword', '', '', CacheName$) + + Response = Password + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ContainmentActionNotification +// +// Handles notification protocols when a containment breach has occured. This handler is mostly a placeholder for +// developers to add their own custom protocol action. +//---------------------------------------------------------------------------------------------------------------------- +Service ContainmentActionNotification(ActionDetails) + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + diff --git a/FRAMEWORKS/STPROC/HTTP_CONTACTS_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_CONTACTS_SERVICES.txt new file mode 100644 index 0000000..cd0e806 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_CONTACTS_SERVICES.txt @@ -0,0 +1,535 @@ +Function HTTP_Contacts_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Contacts_Services + + Description : Handler program for the HTTP Contacts service module. + + Notes : In the comments below, the term "resource" will be used. In most cases this is synonymous with a + database row, but the web (and especially REST) abstracts all information being returned simply as a + "resource". This provides developers more flexibility in their web API designs. For instance, a + resource can be a combination of various different database rows and other data (like images, + documents, etc.) + + In this sample service, the "contact" resource will closely map to a sample CONTACTS database table. + This is meant to provide the OpenInsight web API developer an easy way to create a web-based CRUD + API that can also be extended as needed. Locking is performed on the resource at the database row + level using the Lock statement, but this is only done just prior to the Write statement since HTTP + is a stateless protocol. While some attempts to wait for the lock to be available could be added, + this is normally discouraged since this could cause the HTTP request to take too long to finish. + + All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 04/17/15 dmb Original programmer. - [SRPFW-96] + 03/09/16 dmb Refactor to use the updated RunHTTPService service. - [SRPFW-112] + 07/01/17 dmb Refactor using Enhanced BASIC+ syntax. - [SRPFW-184] + 07/07/17 dmb Add support for PUT and PATCH so this routine can serve as a more complete CRUD example. + - [SRPFW-187] + 07/08/17 dmb Remove checks for query parameters from the main router and make this a function of the + GET method/URL handler. - [SRPFW-187] + 07/19/18 dmb Fix minor typo in the NextSegment variable in the GetItem method. - [SRPFW-248] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS + +// In the comments related to URL examples, words surrounded by "{" and "}" represent the names of values that +// will appear in the actual URL. Words surrounded by "<" and ">" represent variables that contain values relevant to +// the actual URL. See the Notes above for a list of the most important variables. +// +// For instance, /contacts/{KeyID} could look like https://api.mysite.com/v1/contacts/1000, assuming +// resolves to "https://api.mysite.com/v1" and {KeyID} resolves to "1000". +// +// The type of request being made needs to be determined based on the URL content. There are only a few possibilities +// that this API will support: +// +// All Resources = /contacts +// Specific Resource = /contacts/{KeyID} +// Specific Resource Property = /contacts/{KeyID}/{property} +// +// Also, any URL can end with query parameters like this: +// +// Resource Query = /contacts?{property}={value} +// +// The request will go to the same handler as if the query parameters were missing but that handler itself will +// determine if the query parameters will be used or ignored. + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = 'picture' + +// Handle the HTTP request as needed. +Begin Case + Case RemainingURL _EQC '' + // This means the URL ends with /contacts, which means this is the end point. The HTTP methods roughly function + // as follows: + // + // POST - Creates a new resource. Assumes the server will generate the Key ID, which will be returned in the + // HTTP response. + // GET - The client is requesting a collection of all contacts. + AllowedMethods = 'POST,GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub Post, Get, Options + end else + ValidMethod = False$ + end + + Case Count(RemainingURL, '/') EQ 0 + // This means the URL ends with /contacts/{KeyID}. {KeyID} is also known as the resource ID. When a resource is + // closely mapped to a database row (as is the case with this Contacts API), this is where the basic CRUD + // functionality will be added. The HTTP methods roughly function as follows: + // + // PUT - Creates* a resource using the Key ID contained in the URL. This is equivalent to the Write + // statement in BASIC+. + // GET - Reads the resource referenced by the Key ID contained in the URL. This is equivalent to the Read + // statement in BASIC+. + // PUT - Updates* the resource referenced by the Key ID contained in the URL. This is the exact same + // feature defined above. This should make sense since the Write statement in BASIC+ is used to + // create and update database rows. Note, the PUT method assumes the entire resource is within the + // request body, not just the changes. See the PATCH method below. + // DELETE - Deletes the source referenced by the Key ID contained in the URL. This is equivalent to the Delete + // statement in BASIC+. + // + // * Many people use the POST method for creating (and updating) a resource. However, per the HTTP + // specification, POST is to be used when creating a new resource that does not yet have a resource ID + // (i.e., Key ID). The server determines the Key ID and this is returned to the client for future use. + // + // PATCH - Updates specific properties (e.g., data columns) of the resource referenced by the Key ID + // contained in the URL. This is similar in concept to the WriteV statement in BASIC+, although + // multiple changes in the resource can be updated with one PATCH method. + AllowedMethods = 'PUT,GET,DELETE,PATCH,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub PutItem, GetItem, DeleteItem, PatchItem, OptionsItem + end else + ValidMethod = False$ + end + + Case Count(RemainingURL, '/') GE 1 + // This means the URL ends with /contacts/{KeyID}/{property}. A property can be any specific data that is + // associated with the resource. It could be a column value, an image, a PDF document, etc. In this case, the + // only property supported by this web API is the contact's "picture". The developer can put add code in this + // service to update the picture or the developer can create another HTTP service to handle this. Since a + // "picture" service might be useful as a property for other types of resources, a call to a dedicated "picture" + // HTTP service will be made "as is" so it can handle the request. Calling another HTTP service is similar to + // the way one MFS calls another MFS by modifying the FS list. In this case, the NextSegment and RemainingURL + // variables will need to be modified. + Property = FullEndPointURL[-1, 'B/'] + Locate Property in AllowedServices using ',' setting ServicePos then + NextSegment = Property ; // This allows the RunHTTPService to call HTTP_PICTURE_SERVICES. + RemainingURL = '' ; // This variable won't be used in the HTTP_PICTURE_SERVICES code, but to keep the + ; // variables well formed, this should be cleared. + HTTP_Services('RunHTTPService', NextSegment, RemainingURL) + end else + ValidService = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Post +// +// Attempts to create a new resource. Creating a new which is a database row follows these guidelines: +// +// - Any unexpected system errors will return a 500 status code (Internal Server Error). +// - If no errors occur then a 201 (Created) status code is returned. The Content-Location response header will be +// set to the value of the URL that will allow the client to GET the newly created resource. +// - If there is an error locking the resource then a 423 status code (Locked) is returned. +//---------------------------------------------------------------------------------------------------------------------- +Post: + + HTTP_Resource_Services('PostDatabaseItem', 'CONTACTS', SelfURL) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Get +// +// Returns a collection of resources. +// +// The easiest way to return a list of resources that are mapped to a database table is to use the GetDatabaseItems +// service. This is being done in the code below. This URL also supports the passing in of query parameters, which in +// this case will be used to return those items that match the property/value query. +// +// A property can be any specific data that is associated with the resource. It could be a column value, an image, a PDF +// document, etc. In this case, only properties that match the name of database columns in the CONTACTS table will be +// supported by this web API. Note, developers can limit the properties (aka columns) to those that are indexed in order +// to avoid having a request take too long. +//---------------------------------------------------------------------------------------------------------------------- +Get: + + HAL = '' ; // Initialize the response. + + If HTTP_Services('GetHTTPGetString') NE '' then + // This means the URL ends with /contacts?{property}={value}. The client is searching for one or more contacts + // that match the query parameters. This is equivalent to doing a filtered RLIST search. + + // Get the query string passed into the URL. + GetString = HTTP_Services('GetHTTPGetString') + // Get the name of the property being queried. + Property = GetString[1, 'F='] + // Get the value being searched for. + Value = HTTP_Services('GetQueryField', Property) + // Get the database columns for the table. + ColumnNames = HTTP_Resource_Services('GetColumnNames', 'CONTACTS') + ColumnName = Property + Convert @Lower_Case to @Upper_Case in ColumnName + // Verify the property matches a valid column in the table. + Locate ColumnName in ColumnNames using @FM setting fPos then + // Use the GetDatabaseItems service to perform the search and prepare the HAL+JSON response. If a more complex + // or optimized solution is needed, then replace the following with custom code. + Filter = 'SELECT CONTACTS WITH ' : ColumnName : ' CONTAINING ' : Quote(Value) + // The GetDatabaseItems service will return all database column values unless otherwise specified. Since a query + // search might generated several results, it is sometimes best to pass in just those columns that are important + // for the query result. + ColumnNames = 'first_name' : @FM : 'last_name' : @FM : 'email' + Locate ColumnName in ColumnNames using @FM setting fPos else + // Make sure the property being searched is included in the columns being returned. + ColumnNames := @FM : Property + end + HAL = HTTP_Resource_Services('GetDatabaseItems', Filter, 'CONTACTS', SelfURL, ColumnNames) + end else + // This is not a valid property, which means the URL does not resolve. Set a 404 error. Add a description if + // desired. + HTTP_Services('SetResponseStatus', 404) + end + + end else + // This means the URL ends with /contacts. The client is requesting all resources available at this URL. + // This is equivalent to performing an unfiltered SELECT statement. The ColumnNames argument for the + // GetDatabaseItems service specifies which values should be represented in the JSON response. + + Filter = '' + ColumnNames = 'first_name' : @FM : 'last_name' : @FM : 'email' + HAL = HTTP_Resource_Services('GetDatabaseItems', Filter, 'CONTACTS', SelfURL, ColumnNames) + + end + + Response = HAL + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Options +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +Options: + + GoSub SetCommonOptionResponseHeaders + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// PutItem +// +// Attempts to update the resource. If the resource does not already exist then a new one will be created. Updating a +// resource which is a database row follows these guidelines: +// +// - Any unexpected system errors will return a 500 status code (Internal Server Error). +// - If no errors occur then a 200 (OK) status code is returned if the resource previously existed. Otherwise, +// a 201 (Created) status code is returned and the Content-Location response header will be set to the value of the +// URL that will allow the client to GET a newly created resource. +// - If there is an error locking the resource then a 423 status code (Locked) is returned. +//---------------------------------------------------------------------------------------------------------------------- +PutItem: + + KeyID = NextSegment + + HTTP_Resource_Services('PutDatabaseItem', 'CONTACTS', SelfURL : '/' : KeyID, KeyID) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// GetItem +// +// Returns the specific resource. +// +// The easiest way to return a resource that is mapped to a database row is to use the GetDatabaseItem service. This +// is being done in the code below. However, to demonstrate how then basic functionality can be extended, there is +// additional code below that will show how to add the Contact resource's image URL to the JSON response. +//---------------------------------------------------------------------------------------------------------------------- +GetItem: + + KeyID = NextSegment + + // Calling this service alone would be sufficient to return a HAL+JSON representation of the specified contact. + HAL = HTTP_Resource_Services('GetDatabaseItem', 'CONTACTS', SelfURL : '/' : KeyID, KeyID) + + // Since the Contact resource can also have an image, the following code will generate a valid URL for this image + // in case the client wants to retrieve it. The URL will then be added to the HAL+JSON response so this comes + // back as a single representation of the resource. + If HAL NE '' then + // Make the JSON content an object so the SRP_JSON API can work with it. + ParseResponse = SRP_JSON(HALRootObj, 'PARSE', HAL) + If ParseResponse EQ '' then + // The CONTACTS table has a PICTURE data column. This stores the physical path to the image, but this is + // not useful to the HTTP client. Create a URL that will allow the client to retrieve the image. + PictureValue = SRP_JSON(HALRootObj, 'GETVALUE', 'picture', '') + If PictureValue NE '' then + If SRP_JSON(PictureObj, 'NEW', 'OBJECT') then + // Create the URL and add it to the JSON object. + ImageURL = SelfURL : '/' : KeyID : '/picture' + SRP_JSON(PictureObj, 'SETVALUE', 'href', ImageURL) + SRP_JSON(PictureObj, 'SETVALUE', 'name', 'picture-' : KeyID) + SRP_JSON(HALRootObj, 'SET', 'picture', PictureObj) + HAL = SRP_JSON(HALRootObj, 'STRINGIFY', 'STYLED') + // Set the HTTP response body with the final HAL+JSON results. + HTTP_Services('SetResponseBody', HAL, False$, 'application/hal+json') + SRP_JSON(PictureObj, 'RELEASE') + end + end + SRP_JSON(HALRootObj, 'RELEASE') + end + end + + Response = HAL + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// DeleteItem +// +// Attempts to delete the resource. Deleting a resource which is a database row follows these guidelines: +// +// - Any unexpected system errors will return a 500 status code (Internal Server Error). +// - If no errors occur then a 204 (No Content) status code is returned. +// - If the resource was already deleted then a 204 (No Content) status code is returned. +// - If there is an error locking the resource then a 423 status code (Locked) is returned. +//---------------------------------------------------------------------------------------------------------------------- +DeleteItem: + + KeyID = NextSegment + + HTTP_Resource_Services('DeleteDatabaseItem', 'CONTACTS', KeyID) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// PatchItem +// +// Attempts to update the resource. Updating a resource which is a database row follows these guidelines: +// +// - Any unexpected system errors will return a 500 status code (Internal Server Error). +// - If no errors occur then a 200 (OK) status code is returned. +// - If the resource is new then a 404 (Not Found) status code is returned. PATCH only works with existing resources. +// - Only those properties (columns) which are passed in will get updated. +// - If there is an error locking the resource then a 423 status code (Locked) is returned. +//---------------------------------------------------------------------------------------------------------------------- +PatchItem: + + KeyID = NextSegment + + HTTP_Resource_Services('PatchDatabaseItem', 'CONTACTS', SelfURL : '/' : KeyID, KeyID) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// OptionsItem +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +OptionsItem: + + GoSub SetCommonOptionResponseHeaders + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// PutItemProperty +// +// Attempts to update the property of a specific resource. +// +// A property can be any specific data that is associated with the resource. It could be a column value, an image, a PDF +// document, etc. In this case, the only property supported by this web API is the contact's "picture". The developer +// can put add code here to update the picture or the developer can create another HTTP service to handle this. Since a +// "picture" service might be useful as a property for other types of resources, a call to a dedicated "picture" HTTP +// service will be made. +// +// Calling another HTTP service is similar to the way one MFS calls another MFS by modifying the FS list. In this case, +// the NextSegment and RemainingURL variables will need to be modified. At this point in the stack the following +// API variables look like this: +// +// HTTPMethod : PUT +// SelfURL : /contacts +// NextSegment : {KeyID} +// FullEndPointURL : /contacts/{KeyID}/{property} +// +// The code will need to determine if a supported property has been passed in. If so, then the next HTTP service will +// need to be called with the appropriate modifications to the variables. +//---------------------------------------------------------------------------------------------------------------------- +PutItemProperty: + + // Get the name of the property by looking at the last segment in the FullEndPointURL variable. An assumption is + // being made that there are no other segments in the URL that follow the property name. + Property = FullEndPointURL[-1, 'B/'] + Locate Property in AllowedServices using ',' setting ServicePos then + // A supported property has been passed in the URL. Modify the NextSegment and RemainingURL variables so the + // next HTTP service can be called correctly. + NextSegment = Property ; // This allows the RunHTTPService to call HTTP_PICTURE_SERVICES. + RemainingURL = '' ; // This variable won't be used in the HTTP_PICTURE_SERVICES code, but to keep the + ; // variables well formed, this should be cleared. + HTTP_Services('RunHTTPService', NextSegment, RemainingURL) + end else + // The URL contains an unsupported property. Return a 404 error. + HTTP_Services('SetResponseStatus', 404, Property : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// GetItemProperty +// +// Returns the property of a specific resource. +// +// A property can be any specific data that is associated with the resource. It could be a column value, an image, a PDF +// document, etc. In this case, the only property supported by this web API is the contact's "picture". The developer +// can put add code here to return the picture or the developer can create another HTTP service to handle this. Since a +// "picture" service might be useful as a property for other types of resources, a call to a dedicated "picture" HTTP +// service will be made. +// +// Calling another HTTP service is similar to the way one MFS calls another MFS by modifying the FS list. In this case, +// the NextSegment and RemainingURL variables will need to be modified. At this point in the stack the following +// API variables look like this: +// +// HTTPMethod : GET +// SelfURL : /contacts +// NextSegment : {KeyID} +// FullEndPointURL : /contacts/{KeyID}/{property} +// +// The code will need to determine if a supported property has been passed in. If so, then the next HTTP service will +// need to be called with the appropriate modifications to the variables. +//---------------------------------------------------------------------------------------------------------------------- +GetItemProperty: + + // Get the name of the property by looking at the last segment in the FullEndPointURL variable. An assumption is + // being made that there are no other segments in the URL that follow the property name. + Property = FullEndPointURL[-1, 'B/'] + If Property _EQC 'picture' then + // A supported property has been passed in the URL. Modify the NextSegment and RemainingURL variables so the + // next HTTP service can be called correctly. + NextSegment = Property ; // This allows the RunHTTPService to call HTTP_PICTURE_SERVICES. + RemainingURL = '' ; // This variable won't be used in the HTTP_PICTURE_SERVICES code, but to keep the + ; // variables well formed, this should be cleared. + HTTP_Services('RunHTTPService', NextSegment, RemainingURL) + end else + // The URL contains an unsupported property. Return a 404 error. + HTTP_Services('SetResponseStatus', 404, Property : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// OptionsItemProperty +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +OptionsItemProperty: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_DEBUGGER_SERVICE.txt b/FRAMEWORKS/STPROC/HTTP_DEBUGGER_SERVICE.txt new file mode 100644 index 0000000..19c0d64 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_DEBUGGER_SERVICE.txt @@ -0,0 +1,31 @@ +Subroutine HTTP_Debugger_Service(Void) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Debugger_Service + + Description : Handler program for the HTTP Debugger service module. + + Notes : Service handler for HTTP Requests that abort due to a Runtime Error and the Debugger Intercept + has been enabled. + + Parameters : + + Metadata : + + History : (Date, Initials, Notes) + 03/07/17 dmb Original programmer. - [SRPFW-155] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_INSERTS +$insert RTI_DEBUG_COMMON + +HTTP_Services('CreateLogFile', 'Debugger', SPStatus@ : @RM : SPStatCode@ : @RM : Curr_Program@ : @RM : CallDepth@ : @RM : LineNo@ : @RM : CallStack@) + +Return diff --git a/FRAMEWORKS/STPROC/HTTP_ENTRY_POINT_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_ENTRY_POINT_SERVICES.txt new file mode 100644 index 0000000..04674f2 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_ENTRY_POINT_SERVICES.txt @@ -0,0 +1,199 @@ +Function HTTP_Entry_Point_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Entry_Point_Services + + Description : Handler program for the HTTP Entry Point service module. + + Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 02/04/15 dmb Original programmer. - [SRPFW-92] + 04/17/15 dmb Replace the SetHALLinks service with SetHALCollection service for the Get method. - + [SRPFW-92] + 03/09/16 dmb Refactor to use the updated RunHTTPService service. - [SRPFW-112] + 07/01/17 dmb Refactor using Enhanced BASIC+ syntax. - [SRPFW-184] + 07/10/17 dmb Add version to the list of allowed services. - [SRPFW-188] + 09/13/18 dmb Add scan as an allowed service. Remove contacts and version. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = 'scan' + +// Since all authenticated API requests will start with the Entry Point, any authentication-dependent global response +// headers should be set here. +GoSub SetGlobalResponseHeaders + +// Handle the HTTP request as needed. +Begin Case + Case RemainingURL _EQC '' + // This means the URL matches the , which means this is the entry point. The client is requesting a + // collection of services available. + AllowedMethods = 'GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub Get, Options + end else + ValidMethod = False$ + end + + Case Count(RemainingURL, '/') GE 0 + // This means the URL ends with /{service}, where is the name of the service. The client is + // requesting a specific web service. If this is an allowed service, just call the service "as is" and let it + // handle the request. Calling another HTTP service is similar to the way one MFS calls another MFS by modifying + // the FS list. In this case, the NextSegment and RemainingURL variables will need to be modified. + Locate NextSegment in AllowedServices using ',' setting ServicePos then + RemainingURL = Field(RemainingURL, '/', 2, 99) + HTTP_Services('RunHTTPService', NextSegment, RemainingURL) + end else + ValidService = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Get +// +// Returns the available services. +//---------------------------------------------------------------------------------------------------------------------- +Get: + + HREFNames = '' + HREFURIs = '' + For Each Service in AllowedServices using ',' + HREFNames := service : @FM + HREFURIs := SelfURL : '/' : Service : @FM + Next Service + HREFNames[-1, 1] = '' + HREFURIs[-1, 1] = '' + + HTTP_JSON_Services('SetHALCollection', SelfURL, HREFURIs, HREFNames) + + If Error_Services('NoError') then + Services = HTTP_JSON_Services('GetHAL') + HTTP_Services('SetResponseBody', Services, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseStatus', 500, '') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Options +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +Options: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetGlobalResponseHeaders +// +// Since all authenticated API requests will start with the Entry Point, any authentication-dependent global response +// headers should be set here. +//---------------------------------------------------------------------------------------------------------------------- +SetGlobalResponseHeaders: +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return + diff --git a/FRAMEWORKS/STPROC/HTTP_JSON_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_JSON_SERVICES.txt new file mode 100644 index 0000000..3d4a499 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_JSON_SERVICES.txt @@ -0,0 +1,909 @@ +Function HTTP_JSON_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_JSON_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 02/06/15 dmb Original programmer. - [SRPFW-87] + 04/17/15 dmb Added SetHALItem, SetHALCollection, and SetHALCollectionEmbedded services and removed + SetHALLinks, SetHALEmbedded, and GetHALRootObj services. These new services do a better + job of simplifying the creation of specific item and item collection HAL+JSON responses. + The GetHAL service remains but it has been modified to support the new services. + - [SRPFW-87] + 04/17/15 dmb Converted /HTTPJSONServices/ labelled common into /HAL/ and /Schema/ labelled commons so + that the FreeCommon statement can be used. - [SRPFW-87] + 04/19/15 dmb Update SetHALItem to support multivalue columns. - [SRPFW-87] + 05/15/15 dmb Update SetHALCollectionEmbedded to allow responses with no embedded data. - [SRPFW-87] + 06/09/15 dmb Restore SetHALLinks service as this does provide a valid response in some cases. + - [SRPFW-87] + 06/09/15 dmb Add ItemArrayLabel argument to the GetHAL service so the calling service (usually + HTTP_Resources_Services) can specify the label text to use for the primary HAL array. + If not specified then "item" will be used as the default. - [SRPFW-87] + 07/01/17 dmb Refactor using Enhanced BASIC+ syntax. - [SRPFW-184] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert SERVICE_SETUP +$insert HTTP_INSERTS + +Declare function SRP_Sort_Array + +Common /HAL/ HALType@, HALRootObj@, HALRootLinksObj@, HALEmbeddedObj@, HALItemArray@, HALLinksObj@ +Common /Schema/ SchemaRootObj@, SchemaPropertiesObj@, SchemaRequiredArray@ + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the HTTP Authentication services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetHALItem +// +// ItemURL - The URL to the item itself. - [Required] +// ColumnNames - An @FM delimited array of column names (i.e., dictionaries) that will label the column values. +// - [Required] +// ColumnValues - An @FM delimited array of column values (i.e., data) that represents the item resource. These are +// associated with the ColumnNames argument. - [Required] +// DataTypes - An @FM delimited array of JSON data types for each column value. If empty then SRP_JSON will decide +// using its default type matching rules. - [Optional] +// MVGroupNames - An @FM delimited array of MV group names. These are associated with the ColumnNames argument. +// - [Optional] +// +// Creates a HAL+JSON object for a specific item. Requires the GetHAL service to return the serialized object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHALItem(ItemURL, ColumnNames, ColumnValues, DataTypes, MVGroupNames) + + HALType@ = Service + + If (ItemURL NE '') AND (ColumnNames NE '') AND (ColumnValues NE '') then + If MVGroupNames NE '' then + // MV group names have been passed in. Sort the arguments by the MV group names so these can be properly + // combined into the same JSON object. + Arguments = SRP_Sort_Array(ColumnNames : @RM : ColumnValues : @RM : DataTypes : @RM : MVGroupNames, 'AL4', False$, @RM, @FM) + ColumnNames = Arguments[1, @RM] + ColumnValues = Arguments[Col2() + 1, @RM] + DataTypes = Arguments[Col2() + 1, @RM] + MVGroupNames = Arguments[Col2() + 1, @RM] + end + + PrevMVGroupName = '' + + If HALRootObj@ NE '' else + // Create the root object. + If SRP_JSON(HALRootObj@, 'NEW', 'OBJECT') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL root object in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + // Create the "_links" object. It will be SET to the root object in the GetHAL service. + If SRP_JSON(HALRootLinksObj@, 'NEW', 'OBJECT') then + + // Create the "self" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hSelfObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "self" object. + SRP_JSON(hSelfObj, 'SETVALUE', 'href', ItemURL) + // SET the "self" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', 'self', hSelfObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hSelfObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + + // Create the "collection" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hCollectionObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "collection" object. + CollectionURL = ItemURL + ItemID = CollectionURL[-1, 'B/'] + CollectionURL[-1, Neg(Len(ItemID) + 1)] = '' + SRP_JSON(hCollectionObj, 'SETVALUE', 'href', CollectionURL) + // SET the "collection" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', 'collection', hCollectionObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hCollectionObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + + // Add the column name/value pairs. These are SETVALUEd to the root object. + ColumnNames = ColumnNames[1, @RM] ; // Make sure there are no "extra" items being added. + ColumnValues = ColumnValues[1, @RM] ; // Make sure there are no "extra" items being added. + DataTypes = DataTypes[1, @RM] ; // Make sure there are no "extra" items being added. + MVGroupNames = MVGroupNames[1, @RM] ; // Make sure there are no "extra" items being added. + NumColumns = DCount(ColumnNames, @FM) + For ColumnCnt = 1 to NumColumns + Name = ColumnNames + Value = ColumnValues + Type = DataTypes + MVGroupName = MVGroupNames + + If Len(MVGroupName) then + // This column is a part of a MV group. Check to see if this is a new MV group or one that was + // already being used. + If MVGroupName NE PrevMVGroupName then + // A new MV group is being worked on. + If PrevMVGroupName NE '' then + // Create the JSON object for the new MV group. + If SRP_JSON(hMVArray, 'New', 'ARRAY') then + For MVValueCnt = 1 to MVTotalValues + If SRP_JSON(hMVObject, 'New', 'Object') then + For MVColumnCnt = 1 to MVTotalColumns + SRP_JSON(hMVObject, 'SetValue', MVLabels, MVArray) + Next MVColumnCnt + end + SRP_JSON(hMVArray, 'Add', hMVObject) + SRP_JSON(hMVObject, 'Release') + Next MVValueCnt + If SRP_JSON(HALRootObj@, 'Set', PrevMVGroupName, hMVArray) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hMVArray, 'Release') + end + end + MVLabels = '' + MVArray = '' + MVTotalColumns = 0 + MVTotalValues = 0 + end + MVLabels := Name : @FM + MVArray := Value : @FM + MVTotalColumns += 1 + NumValues = DCount(Value, @VM) + If NumValues GT MVTotalValues then MVTotalValues = NumValues +* If SRP_JSON(hColumnArray, 'NEW', 'ARRAY') then +* NumValues = Count(Value, @VM) + (Value NE '') +* For ValueCnt = 1 to NumValues +* SRP_JSON(hColumnArray, 'ADDVALUE', Value<0, ValueCnt>) +* Next ValueCnt +* If SRP_JSON(hMVGroupObj@, 'SET', Name, hColumnArray) else HTTP_Services('SetResponseError', '', '', 500) +* SRP_JSON(hColumnArray, 'RELEASE') +* end + end else + If Index(Value, @VM, 1) then + If SRP_JSON(hColumnArray, 'NEW', 'ARRAY') then + NumValues = Count(Value, @VM) + (Value NE '') + For ValueCnt = 1 to NumValues + SRP_JSON(hColumnArray, 'ADDVALUE', Value<0, ValueCnt>) + Next ValueCnt + If SRP_JSON(HALRootObj@, 'SET', Name, hColumnArray) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hColumnArray, 'RELEASE') + end + end else + If SRP_JSON(HALRootObj@, 'SETVALUE', Name, Value, Type) else HTTP_Services('SetResponseError', '', '', 500) + end + end + Transfer MVGroupName to PrevMVGroupName + Next ColumnCnt + + If PrevMVGroupName NE '' then + // Create the JSON object for the new MV group. + If SRP_JSON(hMVArray, 'New', 'ARRAY') then + For MVValueCnt = 1 to MVTotalValues + If SRP_JSON(hMVObject, 'New', 'Object') then + For MVColumnCnt = 1 to MVTotalColumns + SRP_JSON(hMVObject, 'SetValue', MVLabels, MVArray) + Next MVColumnCnt + end + SRP_JSON(hMVArray, 'Add', hMVObject) + SRP_JSON(hMVObject, 'Release') + Next MVValueCnt + If SRP_JSON(HALRootObj@, 'Set', PrevMVGroupName, hMVArray) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hMVArray, 'Release') + end + end + SRP_JSON(hMVGroupObj@, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + end else + // At least one required argument is missing. + HTTP_Services('SetResponseError', '', '', 500) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetHALCollection +// +// CollectionURL - The URL to the collection. - [Required] +// ItemsURLs - An @FM delimited array of URLs to each item. - [Required] +// ItemsTitles - An @FM delimited array of item titles. These are associated with the ItemsURLs argument - +// [Required] +// +// Creates a HAL+JSON object for a collection. Requires the GetHAL service to return the serialized object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHALCollection(CollectionURL, ItemsURLs, ItemsTitles) + + HALType@ = Service + + If (CollectionURL NE '') AND (ItemsURLs NE '') AND (ItemsTitles NE '') then + + If HALRootObj@ NE '' else + // Create the root object. + If SRP_JSON(HALRootObj@, 'NEW', 'OBJECT') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL root object in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + If Len(HALRootLinksObj@) else + // Create the "_links" object. It will be SET to the root object in the GetHAL service. + If SRP_JSON(HALRootLinksObj@, 'NEW', 'OBJECT') then + + // Create the "self" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hSelfObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "self" object. + SRP_JSON(hSelfObj, 'SETVALUE', 'href', CollectionURL) + // SET the "self" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', 'self', hSelfObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hSelfObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + + If Len(HALItemArray@) else + // Create the "item" array. This will hold the embedded items. It will be SET to the "_links" object + // in the GetHAL when service. It is left available now so multiple calls into the SetHALCollection + // service can be made in the event items needs to be added at different opportunities. + If SRP_JSON(HALItemArray@, 'NEW', 'ARRAY') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL item array in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + // ADD items to the "item" array. + NumItems = Count(ItemsURLs, @FM) + (ItemsURLs NE '') + For ItemCnt = 1 to NumItems + If SRP_JSON(hItemObj, 'NEW', 'OBJECT') then + ItemURL = Field(ItemsURLs, @FM, ItemCnt, 1) + ItemTitle = Field(ItemsTitles, @FM, ItemCnt, 1) + + // Create the "href" name/value for the "item" object. + SRP_JSON(hItemObj, 'SETVALUE', 'href', ItemURL) + + // Create the "title" name/value for the "item" object. + SRP_JSON(hItemObj, 'SETVALUE', 'title', ItemTitle) + + // Add this item object to the "item" array. + SRP_JSON(HALItemArray@, 'ADD', hItemObj) + + // Release the Item object handle. + SRP_JSON(hItemObj, 'RELEASE') + end + Next ItemCnt + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + end else + // At least one required argument is missing. + HTTP_Services('SetResponseError', '', '', 500) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetHALCollectionEmbedded +// +// CollectionURL - The URL to the collection. - [Required] +// ItemsURLs - An @RM delimited array of URLs to each item. - [Required] +// ColumnNames - An @RM/@FM delimited array of column names (i.e., dictionaries) that will label the column values. +// These are associated with the ItemsURLs argument. - [Required] +// ColumnValues - An @RM/@FM delimited array of column values (i.e., data) that represents the item resource. These +// are associated with the ItemsURLs argument. - [Required] +// DataTypes - An @RM/@FM delimited array of JSON data types for each column value. If empty then SRP_JSON will +// decide using its default type matching rules. - [Optional] +// MVGroupNames - An @RM/@FM delimited array of MV group names. These are associated with the ItemsURLs argument. +// - [Optional] +// +// Creates a HAL+JSON object for a collection of embedded items. Requires the GetHAL service to return the serialized +// object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHALCollectionEmbedded(CollectionURL, ItemsURLs, ColumnNames, ColumnValues, DataTypes, MVGroupNames) + + HALType@ = Service + + If CollectionURL NE '' then + If HALRootObj@ NE '' else + // Create the root object. + If SRP_JSON(HALRootObj@, 'NEW', 'OBJECT') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL root object in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + If HALRootLinksObj@ NE '' else + // Create the "_links" object. It will be SET to the root object in the GetHAL service. + If SRP_JSON(HALRootLinksObj@, 'NEW', 'OBJECT') then + + // Create the "self" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hSelfObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "self" object. + SRP_JSON(hSelfObj, 'SETVALUE', 'href', CollectionURL) + // SET the "self" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', 'self', hSelfObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hSelfObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + + If HALEmbeddedObj@ NE '' else + // Create the "_embedded" object. This will contain the array of items. It will be SET to the root + // object in the GetHAL service. It is left available now so multiple calls into the + // SetHALCollectionEmbedded service can be made in the event items needs to be added at different + // opportunities. + If SRP_JSON(HALEmbeddedObj@, 'NEW', 'OBJECT') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL embedded object in the ' : Service : ' service.') + end + end + + If HALItemArray@ NE '' else + // Create the "item" array. This will hold the embedded items. It will be SET to the "_embedded" object + // in the GetHAL when service. It is left available now so multiple calls into the + // SetHALCollectionEmbedded service can be made in the event items needs to be added at different + // opportunities. + If SRP_JSON(HALItemArray@, 'NEW', 'ARRAY') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL item array in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + // SET items to the "item" array. + + NumItems = Count(ItemsURLs, @RM) + (ItemsURLs NE '') + For ItemCnt = 1 to NumItems + If SRP_JSON(hItemObj, 'NEW', 'OBJECT') then + ItemURL = Field(ItemsURLs, @RM, ItemCnt, 1) + ItemColumnNames = Field(ColumnNames, @RM, ItemCnt, 1) + ItemColumnValues = Field(ColumnValues, @RM, ItemCnt, 1) + ItemDataTypes = Field(DataTypes, @RM, ItemCnt, 1) + ItemMVGroupNames = Field(MVGroupNames, @RM, ItemCnt, 1) + + If Len(ItemMVGroupNames) then + // MV group names have been passed in. Sort the arguments by the MV group names so these can be properly + // combined into the same JSON object. + Arguments = SRP_Sort_Array(ItemColumnNames : @RM : ItemColumnValues : @RM : ItemDataTypes : @RM : ItemMVGroupNames, 'AL4', False$, @RM, @FM) + ItemColumnNames = Arguments[1, @RM] + ItemColumnValues = Arguments[Col2() + 1, @RM] + ItemDataTypes = Arguments[Col2() + 1, @RM] + ItemMVGroupNames = Arguments[Col2() + 1, @RM] + end + + PrevMVGroupName = '' + + If SRP_JSON(hLinksObj, 'NEW', 'OBJECT') then + // Create the "self" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hSelfObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "self" object. + SRP_JSON(hSelfObj, 'SETVALUE', 'href', ItemURL) + // SET the "self" object to the "_links" object and name it. + If SRP_JSON(hLinksObj, 'SET', 'self', hSelfObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hSelfObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + + // SET the "_links" object to the root object and name it. + If SRP_JSON(hItemObj, 'SET', '_links', hLinksObj) else HTTP_Services('SetResponseError', '', '', 500) + + // Release the "links" object handle. + SRP_JSON(hLinksObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + + NumColumns = Count(ItemColumnNames, @FM) + (ItemColumnNames NE '') + For ColumnCnt = 1 to NumColumns + Name = ItemColumnNames + Value = ItemColumnValues + Type = ItemDataTypes + MVGroupName = ItemMVGroupNames + + If Len(MVGroupName) then + // This column is a part of a MV group. Check to see if this is a new MV group or one that was + // already being used. + If MVGroupName NE PrevMVGroupName then + // A new MV group is being worked on. + If Len(PrevMVGroupName) then + // There was a previous MV group started, then SET this to the MV group object. + If SRP_JSON(hItemObj, 'SET', PrevMVGroupName, hMVGroupObj@) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hMVGroupObj@, 'RELEASE') + end + // Create the JSON object for the new MV group. + If SRP_JSON(hMVGroupObj@, 'NEW', 'OBJECT') else HTTP_Services('SetResponseError', '', '', 500) + end + If SRP_JSON(hColumnArray, 'NEW', 'ARRAY') then + NumValues = Count(Value, @VM) + (Value NE '') + For ValueCnt = 1 to NumValues + SRP_JSON(hColumnArray, 'ADDVALUE', Value<0, ValueCnt>) + Next ValueCnt + If SRP_JSON(hMVGroupObj@, 'SET', Name, hColumnArray) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hColumnArray, 'RELEASE') + end + end else + If Index(Value, @VM, 1) then + If SRP_JSON(hColumnArray, 'NEW', 'ARRAY') then + NumValues = Count(Value, @VM) + (Value NE '') + For ValueCnt = 1 to NumValues + SRP_JSON(hColumnArray, 'ADDVALUE', Value<0, ValueCnt>) + Next ValueCnt + If SRP_JSON(hItemObj, 'SET', Name, hColumnArray) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hColumnArray, 'RELEASE') + end + end else + If SRP_JSON(hItemObj, 'SETVALUE', Name, Value, Type) else HTTP_Services('SetResponseError', '', '', 500) + end + end + Transfer MVGroupName to PrevMVGroupName + Next ColumnCnt + + If Len(PrevMVGroupName) then + // There was a previous MV group started, then SET this to the MV group object. + If SRP_JSON(hItemObj, 'SET', PrevMVGroupName, hMVGroupObj@) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hMVGroupObj@, 'RELEASE') + end + + // Add this item object to the "item" array. + SRP_JSON(HALItemArray@, 'ADD', hItemObj) + + // Release the Item object handle. + SRP_JSON(hItemObj, 'RELEASE') + end + Next ItemCnt + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + // At least one required argument is missing. + HTTP_Services('SetResponseError', '', '', 500) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetHALLinks +// +// SelfURI - The URI to the self object. - [Required] +// HREFNames - An @FM delimited array of HREF names to add to the "links" object. - [Optional] +// HREFURIs - An @FM delimited array of HREF URIs to add to the "links" objects. These are associated with the +// HREFNames argument. - [Optional] +// ChildNames - An @FM delimited array of names for objects to add to the "links" object. - [Optional] +// hChildren - An @FM delimited array of objects handles to add to the "links" object. These are associated with +// the ChildNames argument. +// Names - An @FM delimited array of names to add to the "links" object. - [Optional] +// Values - An @FM delimited array of values to add to the "links" object. These are associated with the Names +// argument. -[Optional] +// +// Creates a HAL style "links" object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHALLinks(SelfURI, HREFNames, HREFURIs, ChildNames, hChildren, Names, Values) + + HALType@ = Service + + If SelfURI NE '' then + + If HALRootObj@ NE '' else + // Create the root object. + If SRP_JSON(HALRootObj@, 'NEW', 'OBJECT') else + HTTP_Services('SetResponseError', '', '', 500) + Error_Services('Add', 'Error creating the HAL root object in the ' : Service : ' service.') + end + end + + If Error_Services('NoError') then + + If HALRootLinksObj@ NE '' else + // Create the "_links" object. It will be SET to the root object in the GetHAL service. + If SRP_JSON(HALRootLinksObj@, 'NEW', 'OBJECT') then + + // Create the "self" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hSelfObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "self" object. + SRP_JSON(hSelfObj, 'SETVALUE', 'href', SelfURI) + // SET the "self" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', 'self', hSelfObj) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hSelfObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + + // Create any "href" objects that are requested. These will be SET to the "_links" object when finished. + If HREFNames NE '' then + NumHREFs = Count(HREFNames, @FM) + (HREFNames NE '') + For HREFCnt = 1 to NumHREFs + HREFName = HREFNames + HREFURI = HREFURIs + // Create the "href" object. It will be SET to the "_links" object when finished. + If SRP_JSON(hHREFObj, 'NEW', 'OBJECT') then + // Create the "href" name/value for the "href" object. + SRP_JSON(hHREFObj, 'SETVALUE', 'href', HREFURI) + // SET the "href" object to the "_links" object and name it. + If SRP_JSON(HALRootLinksObj@, 'SET', HREFName, hHREFObj) then else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hHREFObj, 'RELEASE') + end else + HTTP_Services('SetResponseError', '', '', 500) + end + Next HREFCnt + end + + // Add any chile name/object pairs that have been passed into this service. This are SET to the "links" + // object. + If ChildNames NE '' then + NumChildren = Count(ChildNames, @FM) + (ChildNames NE '') + For ChildCnt = 1 to NumChildren + ChildName = ChildNames + hChild = hChildren + If SRP_JSON(HALRootLinksObj@, 'SET', ChildName, hChild) else HTTP_Services('SetResponseError', '', '', 500) + While Error_Services('NoError') + Next ChildCnt + end + + // Add any name/value pairs that have been passed into this service. These are SETVALUEd to the "links" + // object. + If Names NE '' then + NumNames = Count(Names, @FM) + (Names NE '') + For NameCnt = 1 to NumNames + Name = Names + Value = Values + If SRP_JSON(HALRootLinksObj@, 'SETVALUE', Name, Value) else HTTP_Services('SetResponseError', '', '', 500) + While Error_Services('NoError') + Next NameCnt + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end else + HTTP_Services('SetResponseError', '', '', 500) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetHALEmbedded +// +// Returns the handle to a root JSON object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHALEmbedded() + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetHALRootObj +// +// Returns the handle to a root JSON object. If it does not already exist it will be created. +//---------------------------------------------------------------------------------------------------------------------- +Service GetHALRootObj() + + If HALRootObj@ NE '' else + // Create the root object. + If SRP_JSON(HALRootObj@, 'NEW', 'OBJECT') else HTTP_Services('SetResponseError', '', '', 500) + end + + Response = HALRootObj@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetHAL +// +// Returns the serialized JSON object for the current HAL response. If no HAL object has been defined then this will +// return an empty string and a 500 status code will be set. All HAL objects and arrays will be released in this +// service. +//---------------------------------------------------------------------------------------------------------------------- +Service GetHAL(ItemArrayLabel) + + HAL = '' + + If (HALType@ NE '') AND (HALRootObj@ NE '') AND (HALRootLinksObj@ NE '') then + // Check the HAL Type (i.e., Collection or CollectionEmbedded) and perform any final association of + // objects and arrays. Release any objects and arrays. + Begin Case + Case HALType@ _EQC 'SetHALCollectionEmbedded' + If Len(HALEmbeddedObj@) AND Len(HALItemArray@) then + If Len(ItemArrayLabel) else ItemArrayLabel = 'item' + If SRP_JSON(HALEmbeddedObj@, 'SET', ItemArrayLabel, HALItemArray@) else HTTP_Services('SetResponseError', '', '', 500) + If SRP_JSON(HALRootObj@, 'SET', '_embedded', HALEmbeddedObj@) else HTTP_Services('SetResponseError', '', '', 500) + end + SRP_JSON(HALEmbeddedObj@, 'RELEASE') + SRP_JSON(HALItemArray@, 'RELEASE') + + Case HALType@ _EQC 'SetHALCollection' + If Len(HALItemArray@) then + If Len(ItemArrayLabel) else ItemArrayLabel = 'item' + If SRP_JSON(HALRootLinksObj@, 'SET', ItemArrayLabel, HALItemArray@) else HTTP_Services('SetResponseError', '', '', 500) + end + SRP_JSON(HALItemArray@, 'RELEASE') + End Case + + // Set the "_links" object to the root. This occurs for all HAL types. + If SRP_JSON(HALRootObj@, 'SET', '_links', HALRootLinksObj@) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(HALRootLinksObj@, 'RELEASE') + + // Serialize the HAL object. Use STYLED for human readability or FAST for optimum performance and smaller payload. +* HAL = SRP_JSON(HALRootObj@, 'STRINGIFY', 'STYLED') + HAL = SRP_JSON(HALRootObj@, 'STRINGIFY', 'FAST') + SRP_JSON(HALRootObj@, 'RELEASE') + end + + // Clear all HAL common variables. + FreeCommon 'HAL' + + Response = HAL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSchemaRootObj +// +// Returns the handle to a root Schema object. If it does not already exist it will be created with the standard +// "$schema" value already added. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSchemaRootObj() + + If SchemaRootObj@ NE '' else + // Create the root object. + If SRP_JSON(SchemaRootObj@, 'NEW', 'OBJECT') then + If SRP_JSON(SchemaRootObj@, 'SETVALUE', '$schema', 'http://json-schema.org/draft-04/schema#') else HTTP_Services('SetResponseError', '', '', 500) + end else + HTTP_Services('SetResponseError', '', '', 500) + end + end + + Response = SchemaRootObj@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetSchemaMeta +// +// Title - The title for the schema. - [Optional] +// Description - A description for the schema. - [Optional] +// Type - The JSON type for the schema. The default value is "object". - [Optional] +// +// Sets the meta data associated to the schema object. +//---------------------------------------------------------------------------------------------------------------------- +Service SetSchemaMeta(Title, Description, Type) + + // Check for the root object. If none exists then create one and use it. + If Len(SchemaRootObj@) else SchemaRootObj@ = HTTP_JSON_Services('GetSchemaRootObj') + + If Error_Services('NoError') then + If Type NE '' else Type = 'object' + + If Title NE '' then + If SRP_JSON(SchemaRootObj@, 'SETVALUE', 'title', Title) else HTTP_Services('SetResponseError', '', '', 500) + end + + If Description NE '' then + If SRP_JSON(SchemaRootObj@, 'SETVALUE', 'description', Description, 'STRING') else HTTP_Services('SetResponseError', '', '', 500) + end + + If Type NE '' then + If SRP_JSON(SchemaRootObj@, 'SETVALUE', 'type', Type, 'STRING') else HTTP_Services('SetResponseError', '', '', 500) + end + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetSchemaProperty +// +// Name - The name of the member of this property. - [Required] +// Title - The title for this property. - [Optional] +// Type - The data type for this property. - [Optional] +// Format - The display format for this property. - [Optional] +// EnumList - A list of options that are to be used for this property. - [Optional] +// Required - Flag to indicate if this property is required. Default is false. - [Optional] +// +// Sets a property to the schema. There can be more than one property so this service will add another property to the +// list if it already exists. +//---------------------------------------------------------------------------------------------------------------------- +Service SetSchemaProperty(Name, Title, Type, Format, EnumList, Required) + + // Check for properties object handle. If none, create an object and use it. + If SchemaPropertiesObj@ NE '' else + SRP_JSON(SchemaPropertiesObj@, 'NEW', 'OBJECT') + end + + If SchemaPropertiesObj@ NE '' then + If Name NE '' then + If SRP_JSON(hNameObj, 'NEW', 'OBJECT') then + // Add the Title member to the Name object. + If Title NE '' then + If SRP_JSON(hNameObj, 'SETVALUE', 'title', Title) else HTTP_Services('SetResponseError', '', '', 500) + end + // Add the Type member to the Name object. + If Type NE '' then + If SRP_JSON(hNameObj, 'SETVALUE', 'type', Type) else HTTP_Services('SetResponseError', '', '', 500) + end + // Add the Format member to the Name object. + If Format NE '' then + If SRP_JSON(hNameObj, 'SETVALUE', 'format', Format) else HTTP_Services('SetResponseError', '', '', 500) + end + // Add the EnumList array to the Name object. + If EnumList NE '' then + If SRP_JSON(hEnumAry, 'NEW', 'ARRAY') then + NumItems = Count(EnumList, @FM) + (EnumList NE '') + For ItemCnt = 1 to NumItems + If SRP_JSON(hEnumAry, 'ADDVALUE', EnumList) else HTTP_Services('SetResponseError', '', '', 500) + Next ItemCnt + If SRP_JSON(hNameObj, 'SET', 'enum', hEnumAry) else HTTP_Services('SetResponseError', '', '', 500) + SRP_JSON(hEnumAry, 'RELEASE') + end else + // Unable to create the Enum array. + HTTP_Services('SetResponseError', '', '', 500) + end + end + SRP_JSON(SchemaPropertiesObj@, 'SET', Name, hNameObj) + SRP_JSON(hNameObj, 'RELEASE') + If Required then + // Add members to the Required object. + If Len(SchemaRequiredArray@) else + SRP_JSON(SchemaRequiredArray@, 'NEW', 'ARRAY') + end + If Len(SchemaRequiredArray@) then + SRP_JSON(SchemaRequiredArray@, 'ADDVALUE', Name, 'STRING') + end + end + end else + // Unable to create the Name object. + HTTP_Services('SetResponseError', '', '', 500) + end + end else + // Name argument is missing. + HTTP_Services('SetResponseError', '', '', 500) + end + end else + // Unable to create the Schema Properties object. + HTTP_Services('SetResponseError', '', '', 500) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSchema +// +// Returns the serialized JSON object for the current schema. If no schema object has been defined then this will return +// an empty string and a 500 status code will be set. All schema objects and arrays will be released in this service. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSchema() + + Schema = '' + + If SchemaRootObj@ NE '' then + SRP_JSON(SchemaRootObj@, 'SET', 'properties', SchemaPropertiesObj@) + SRP_JSON(SchemaRootObj@, 'SET', 'required', SchemaRequiredArray@) + Schema = SRP_JSON(SchemaRootObj@, 'STRINGIFY', 'FAST') + SRP_JSON(SchemaRequiredArray@, 'RELEASE') ; SchemaRequiredArray@ = '' + SRP_JSON(SchemaPropertiesObj@, 'RELEASE') ; SchemaPropertiesObj@ = '' + SRP_JSON(SchemaRootObj@, 'RELEASE') ; SchemaRootObj@ = '' + end else + HTTP_Services('SetResponseError', '', '', 500) + end + + Response = Schema + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetURLFromID +// +// ID that needs to be converted to a URL format. - [Required] +// +// Returns a URL segment for the ID passed into the service. This creates a "slug" style URL so that it will be search +// friendly, human readable, and an RESTful. +//---------------------------------------------------------------------------------------------------------------------- +Service GetURLFromID(ID) + + URL = ID + + // Convert all non-friendly URL characters into dashes. + Convert @Upper_Case to @Lower_Case in URL + Convert '!@#$%^&*()+=|<>?,./\"' : "'" to '' in URL + Convert '_' to '' in URL + URL = Trim(URL) + Convert ' ' to '-' in URL + + Response = URL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetIDFromURL +// +// URL that needs to be converted to an ID. Note, this is not a complete URL path. This should ordinarily be the end +// point of a URL. - [Required] +// A delimited array of IDs that can be used to validate the converted ID. Any MV delimiter can be used. If there is no +// match found then the ID will match the URL. - [Optional] +// +// Returns the ID based on the URL passed into the service. This service attempts to reverse engineer the URL. +//---------------------------------------------------------------------------------------------------------------------- +Service GetIDFromURL(URL, Array, Table) + + ID = URL + + FoundID = False$ + + If Array NE '' then + Convert @STM to @FM in Array + Convert @TM to @FM in Array + Convert @SVM to @FM in Array + Convert @VM to @FM in Array + Convert @RM to @FM in Array + NumElements = Count(Array, @FM) + (Array NE '') + For ElementCnt = 1 to NumElements + MatchID = HTTP_JSON_Services('GetURLFromID', Array) + If ID _EQC MatchID then + ID = Array + FoundID = True$ + end + Until FoundID + Next ElementCnt + end + + If Not(FoundID) then Error_Services('Add', 'Unable to match the ID based on the provided URL') + + Response = ID + +end service diff --git a/FRAMEWORKS/STPROC/HTTP_MCP.txt b/FRAMEWORKS/STPROC/HTTP_MCP.txt new file mode 100644 index 0000000..2f4ea0e --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_MCP.txt @@ -0,0 +1,195 @@ +Function HTTP_MCP(Request, ProcErr) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_MCP (HTTP Master Controller Program) + + Description : HTTP Controller program for the application. + + Notes : In an MVC framework this is the 'Controller' routine that accepts HTTP requests nad routes them to + the core Master Controller Program (MCP). HTTP_MCP is written as a replacement to the + RUN_OECGI_REQUEST listner. It is intended to be a cleaner listener designed to allow REST style + API calls and better control over request and response handling. Since it is a listner, it should + be only modified when core functionality needs to be added or modified. Application specific + changes should be kept within one or more of the called services. + + Parameters : + Request [in] -- The request array which includes the HTTP request and OECGI provided information. + ProcErr [in] -- Contains error messages in the event of a prior crash (such as a runtime error). The + specified listener is automatically called in these situations with the ProcErr argument + populated. Therefore, a check for data in this argument needs to occur immediately so that + the error can be properly managed and returned to the caller in a suitable format. For + RUN_OECGI_REQUEST applications, INET_ABORTED would normally be called to handle this. + Response [out] -- HTTP response to send back to the OECGI. + + History : (Date, Initials, Notes) + 02/06/15 dmb [SRPFW-90] Original programmer. Copied from INET_MCP but refactored for REST API requests. + 04/14/15 dmb [SRPFW-90] Add missing '\' in the path for debug files to be written to. + 02/23/16 dmb [SRPFW-103] Move the request/response capture path defintion into the + SYSENV\SRP_HTTP_FRAMEWORK_SETUP record. + 02/25/16 dmb [SRPFW-108] Replace Xlate with GetCapturePath service. + 03/09/16 dmb [SRPFW-111] Call GetEntryPointService before calling RunHTTPService. + 03/09/16 dmb [SRPFW-112] Remove HTTP_SERVICE_SETUP insert. + 03/09/16 dmb [SRPFW-112] Call GetHTTPPathInfo before calling RunHTTPService. + 05/17/16 dmb [SRPFW-125] Add support for ProcErr. Create a generic error response. + 10/01/16 dmb [SRPFW-128] Add code to track API execution time using SRP_Stopwatch. Display the time in + the Response log that is written into the debug folder. + 02/18/17 dmb [SRPFW-151] Report the decoded Authorization data in the Response log. + 02/27/17 dmb [SRPFW-125] Add support for the GetProcErrService service. If missing, the default ProcErr + process logic will continue to work. + 03/03/17 dmb [SRPFW-154] Replace direct logging with the CreateLogFile service. + 03/08/17 dmb [SRPFW-155] Add support for setting the debugger mode and intercept. + 07/01/17 dmb [SRPFW-184] Refactor using Enhanced BASIC+ syntax. + 11/01/18 dmb [SRPFW-256] Add support for the GetServerEnabled service. Set status to 503 is server is not + enabled. + 11/18/18 dmb [SRPFW-257] Add support for the GetAPICallProcedure service. Use the RunWebAPI or + RunHTTPService service as appropriate. + 12/12/18 dmb [SRPFW-257] If Get_Status returns an error, produce a GetStatus log and then use the + SetResponseError service so the client gets a detailed response. + 12/16/19 dmb [SRPFW-296] Update code that calls the CreateLogFile service for Get_Status conditions so + that the status detail is better formatted. Also, clear the error condition to prevent + the OECGI from making a ProcErr call. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert HTTP_INSERTS +$insert INET_EQUATES +$insert INET_HEADERS +$insert Msg_Equates + +Equ CRLF$ to \0D0A\ + +Declare subroutine SRP_Stopwatch, Set_Status, RTI_Set_Debugger +Declare function SRP_Stopwatch, RTI_OS_Directory + +If Assigned(Request) else Request = '' +If Assigned(ProcErr) else ProcErr = '' +If ProcErr NE '' then + // Runtime errors produce two copies of the error description in the ProcErr argument. Just divide in half to get + // one copy. + If ProcErr[1, Len(ProcErr) / 2] EQ ProcErr[Len(ProcErr) / 2 + 1, Len(ProcErr) / 2] then + ProcErr = ProcErr[1, Len(ProcErr) / 2] + end +end + +// Start timing the overall API. +SRP_Stopwatch('Reset') +SRP_Stopwatch('Start', 'WebAPI') + +// Set the mode for the debugger and identify the debugger intercept service if applicable. +DebuggerSetting = HTTP_Services('GetDebuggerSetting') +If DebuggerSetting EQ 2 then + DebuggerService = HTTP_Services('GetDebuggerService') +end else + DebuggerService = '' +end +RTI_Set_Debugger(DebuggerSetting, DebuggerService) + +// Use HTTP_Services to store the HTTP request as provided by the OECGI and also to retreive the relevant request +// information that will be used below. +HTTP_Services('SetSessionID') +HTTP_Services('SetOECGIRequest', Request) +HTTP_Services('SetOECGIProcErr', ProcErr) +HTTP_Services('SetRequestHeaderFields') +HTTP_Services('SetQueryFields') + +// Create the HTTP Request log file. +HTTP_Services('CreateLogFile', 'Request') + +If ProcErr NE '' then + // An unexpected error occurred with the most recent request. The nature of the error (usually a runtime error) will + // be contained in the ProcErr argument. Generate a response so the caller will receive a well formatted reply. + AbortedService = HTTP_Services('GetAbortedService') + + If AbortedService NE '' then + // There is a procedural error service designated to handle this condition. Allow it to process the error and + // generate the response. + Call @AbortedService(ProcErr) + end else + // There is no procedural error service so process this using default logic. + Swap \00\ with \0D0A\ in ProcErr + Swap @FM with \0D0A\ in ProcErr + Swap @VM with \0D0A\ in ProcErr + Swap @SVM with \0D0A\ in ProcErr + + // The ProcErr always contains two copies of the error description so just divide in half to get one copy. + If ProcErr[1, Len(ProcErr) / 2] EQ ProcErr[Len(ProcErr) / 2 + 1, Len(ProcErr) / 2] then + ProcErr = ProcErr[1, Len(ProcErr) / 2] + end + + HTTP_Services('SetResponseError', '', '', 500, ProcErr, FullEndpointURL) + end +end else + ServerEnabled = HTTP_Services('GetServerEnabled') + // Check to see if the server is still enabled. + If ServerEnabled then + // Authenticate the request using HTTP Authentication Services. If the user is not validated then the appropriate + // response status and headers will be set. If no authentication is required then the AuthenticateRequest service + // should set the UserAuthenticated response to True as a default. + // + // This service is also where global response headers are set, regardless of whether the user is authenticated. + // + // Note: Even if authentication is disabled via the SRP_HTTP_FRAMEWORK_SETUP configuration record, the + // AuthenticateRequest should still be called. It will inspect the flag and set the response accordingly. + UserAuthenticated = HTTP_Authentication_Services('AuthenticateRequest') + + If UserAuthenticated then + // Call the API based on the type of calling procedure specified in the setup. + APICallProcedure = HTTP_Services('GetAPICallProcedure') + If APICallProcedure EQ 'Web API' then + HTTP_Services('RunWebAPI') + end else + EntryPointService = HTTP_Services('GetEntryPointService') + RemainingURL = HTTP_Services('GetHTTPPathInfo') + HTTP_Services('RunHTTPService', EntryPointService, RemainingURL) + end + end + end else + HTTP_Services('SetResponseError', '', '', 503, 'Server is temporarily disabled.') + end +end + +// Get the full response to send back to the requesting client. +Response = HTTP_Services('GetResponse') + +// Stop timing the overall API. +SRP_Stopwatch('Stop', 'WebAPI') +TimeToExecute = SRP_Stopwatch('GetBenchmark', 'WebAPI') + +// Check the status before logging and returning the HTTP Response. If there is a status error then the Response +// variable should be cleared and no log generated. The OEngineServer will resubmit a request with the error detail +// the the ProcErr service will handle and log this. +If Get_Status() EQ 0 then + HTTP_Services('CreateLogFile', 'Response', Response) +end else + StatusCode = '' + Status = Get_Status(StatusCode) + HTTP_Services('SetResponseError', '', '', 500, 'Get_Status Error', FullEndpointURL, 'Status' : @FM : 'StatusCode', Status : @FM : StatusCode<1, 1> : ' - ' : StatusCode<1, 2>) + Response = HTTP_Services('GetResponse') + HTTP_Services('CreateLogFile', 'GetStatus', Response) + Set_Status(0) +end + +// Engage the debugger if requested. +If HTTP_Services('GetRequestHeaderField', 'Debug') then Debug + +// Clear all saved values that were set in this session to avoid subsequent requests to a running engine from getting +// invalid data. +HTTP_Services('ClearSettings') + +// Clean up processes, as needed, that were set in this session to avoid subsequent requests to a running engine from +// getting invalid data. +HTTP_Authentication_Services('CleanUp') + +// Clear any possible internal OpenInsight errors so everything will process normally. Note, traditional INET does not +// clear this flag automatically. This is how INET_ABORTED gets called if there is an SSP error. The SRP HTTP Framework +// clears this flag by default because the developer can still trap Get_Status() in the relevant web service code and +// create a custom HTTP response. Thus, the ProcErr service will only be called if there is a runtime error condition. +* Set_Status(0) + +Return Response diff --git a/FRAMEWORKS/STPROC/HTTP_PICTURE_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_PICTURE_SERVICES.txt new file mode 100644 index 0000000..0bfb76a --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_PICTURE_SERVICES.txt @@ -0,0 +1,252 @@ +Function HTTP_Picture_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Picture_Services + + Description : Handler program for the HTTP Picture service module. + + Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 03/27/16 dmb Original programmer. - [SRPFW-96] + 07/06/17 dmb Refactor using Enhanced BASIC+ syntax. - [SRPFW-184] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS +$insert CONTACTS_EQUATES + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = '' + +PictureFolder = '\WebAppData\ContactPictures\' + +// Handle the HTTP request as needed. +Begin Case + Case RemainingURL _EQC '' + // This means the URL ends with /contacts/{KeyID}/picture, which means this is the end point. + AllowedMethods = 'PUT,GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub Put, Get, Options + end else + ValidMethod = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Put +// +// Attempts to update the picture resource at this URL end point. +//---------------------------------------------------------------------------------------------------------------------- +Put: + + NumSegments = DCount(SelfURL, '/') + KeyID = Field(SelfURL, '/', NumSegments - 1, 1) + TableName = 'CONTACTS' + + Open TableName to hTable then + Lock hTable, KeyID then + ResponseStatus = 200 ; // Updating an existing resource. + Read DataRow from hTable, KeyID else + DataRow = '' + ResponseStatus = 201 ; // Creating a new resource. + end + + // A URI scheme of the Base64 encoded image will be in the Data variable. + HTTPPostString = HTTP_Services('GetHTTPPostString') + HTTPPostString = HTTP_Services('DecodePercentString', HTTPPostString) + Scheme = HTTPPostString[1, 'F:'] + If Scheme _EQC 'data' then + MediaType = HTTPPostString[Col2() + 1, 'F;'] ; // Should be "image/png" or "image/jpg" + Encoding = HTTPPostString[Col2() + 1, 'F,'] ; // Should be "base64" + EncodedData = HTTPPostString[Col2() + 1, Len(HTTPPostString)] ; // Should be the actual Base64 encoded content. + DecodedData = SRP_Decode(EncodedData, 'BASE64') + FileType = MediaType[-1, 'B/'] + FileName = KeyID : '.' : FileType + FilePath = Drive() : PictureFolder : FileName + Status() = 0 + OSWrite DecodedData to FilePath + StatusCode = Status() + If StatusCode then + Begin Case + Case StatusCode EQ 1 ; Error = 'Bad OS filename. Code: ' : StatusCode + Case StatusCode EQ 2 ; Error = 'Access denied by operating system. Code: ' : StatusCode + Case StatusCode EQ 3 ; Error = 'Disk or directory full. Code: ' : StatusCode + Case StatusCode EQ 4 ; Error = 'File does not exist. Code: ' : StatusCode + Case StatusCode EQ 5 ; Error = 'Unknown error. Code: ' : StatusCode + Case StatusCode EQ 6 ; Error = 'Attempt to write to read-only file. Code: ' : StatusCode + Case Otherwise$ ; Error = 'Unknown error. Code: ' : StatusCode + End Case + HTTP_Services('SetResponseStatus', '501', Error) + end else + DataRow = PictureFolder : FileName + Write DataRow to hTable, KeyID then + HTTP_Services('SetResponseStatus', ResponseStatus) + HTTP_Services('SetResponseHeaderField', 'Content-Location', SelfURL) + end else + HTTP_Services('SetResponseStatus', 500, 'Error writing ' : KeyID : ' to the ' : TableName : ' table.') + end + end + end else + HTTP_Services('SetResponseStatus', '415') + end + Unlock hTable, KeyID else Null + end else + HTTP_Services('SetResponseStatus', 423, KeyID : ' is currently locked.') + end + end else + HTTP_Services('SetResponseStatus', 500, 'Error opening the ' : TableName : ' table.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Get +// +// Attempts to return the picture resource from this URL end point. +//---------------------------------------------------------------------------------------------------------------------- +Get: + + // Get the picture's physical file path from the CONTACT database row. + NumSegments = DCount(SelfURL, '/') + KeyID = Field(SelfURL, '/', NumSegments - 1, 1) + PicturePath = Drive() : HTTP_Resource_Services('GetColumnValues', 'CONTACTS', 'picture', KeyID) + + If PicturePath NE '' then + // Verify the picture actually exists. + If Dir(PicturePath) NE '' then + // Get the image extension. + ImageExt = PicturePath[-1, 'B.'] + If ImageExt _EQC 'jpg' then ImageExt = 'jpeg' + // Get the best content type that matches the client's and server's ability. + ContentType = HTTP_Services('GetBestContentNegotiation', 'Accept', 'text/plain' : @FM : 'image/' : ImageExt) + If ContentType NE '' then + OSRead PictureBinary from PicturePath then + Begin Case + Case ContentType _EQC 'text/plain' + PictureBody = SRP_Encode(PictureBinary, 'BASE64') + PictureBody = 'data:' : 'image/' : ImageExt : ';base64,' : PictureBody + HTTP_Services('SetResponseHeaderField', 'Content-Encoding', 'base64') + HTTP_Services('SetResponseBody', PictureBody, False$, 'text/plain') + + Case ContentType[1, 6] _EQC 'image/' + HTTP_Services('SetResponseBody', PictureBinary, True$, ContentType) + + End Case + end + end + end else + HTTP_Services('SetResponseStatus', '404', 'Picture for contact ' : KeyID : ' does not exist.') + end + end else + HTTP_Services('SetResponseStatus', '404', 'Picture for contact ' : KeyID : ' does not exist.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Options +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +Options: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_RESOURCE_MANAGER_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_RESOURCE_MANAGER_SERVICES.txt new file mode 100644 index 0000000..c61b6a2 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_RESOURCE_MANAGER_SERVICES.txt @@ -0,0 +1,582 @@ +Function HTTP_Resource_Manager_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Resource_Manager_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 07/12/19 dmb [SRPFW-277] Original programmer. + 07/13/19 dmb [SRPFW-277] Added various services so that the NDW_HTTP_FRAMEWORKS_SERVICES commuter as well + as additional tools can get or set various resource meta data. + 07/15/19 dmb [SRPFW-277] Added the GetEndpointResourceKeyID service. + 07/16/19 dmb [SRPFW-277] Added the GetResourceSignature service. + 07/16/19 dmb [SRPFW-277] Update GetResourceProperty service to support the RESOURCE property. + 07/16/19 dmb [SRPFW-277] Replaced harcoded cache duration with the CacheTTL$ equate. + 07/16/19 dmb [SRPFW-277] Rename the IsResource service to IsValidEndpoint. + 07/17/19 dmb [SRPFW-277] Update the SetResource service to refresh the GetResource cache better. + 07/24/19 dmb [SRPFW-278] Fix bug in the GetEndpointResourceKeyID service so that matching the URLEndpoint + works better. + 09/25/19 dmb [SRPFW-278] Fix bug in the GetResource service that prevented endpoints with a resource ID + from being matched correctly to the currently stored resources endpoints. + 12/09/19 dmb [SRPFW-296] Update all calls to Memory_Services to use a specific cache name. + 01/23/20 dmb [SRPFW-296] Update the SetResourceProperty and GetResourceSignature services to support the + HEAD method. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert HTTP_INSERTS +$insert SERVICE_SETUP +$insert INET_EQUATES +$insert INET_HEADERS +$insert HTTP_FRAMEWORK_SETUP_EQUATES + +Equ CRLF$ to \0D0A\ +Equ CacheTTL$ to 300 ; // Allow cached data to only be fresh for 5 seconds. +Equ CacheName$ to 'SRPHTTPFramework' +Equ ValidMethods$ to 'GET,POST,PUT,PATCH,DELETE,HEAD' + +Declare function HTTP_Resource_Manager_Services, HTTP_Resource_Services, Database_Services, Memory_Services, SRP_Array +Declare subroutine HTTP_Resource_Manager_Services, HTTP_Resource_Services, Database_Services, Memory_Services + +GoToService else + HTTP_Services('SetResponseError', '', '', 404, Service : ' is not a valid service request within the HTTP Resource Manager services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ +Options CLASSES = 'APIROOT', 'RESOURCE', 'RESOURCE_ID', 'PROPERTY' +Options PROPERTIES = 'CLASS', 'DESCRIPTION', 'EXCLUDE_LOGGING', 'METHODS', 'NAME', 'RESOURCE', 'TITLE', 'QUERY_PARAMS' +Options CHILDREN = 'ALL', 'RESOURCE', 'RESOURCE_ID', 'PROPERTY' +Options METHODS = 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResourceProperty +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// PropertyName - Name of the property whose value is being queried. - [Required] +// +// Returns the value of the indicated resource property for the indicated URL endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResourceProperty(URLEndpoint, PropertyName=PROPERTIES) + + PropertyValue = '' + + If PropertyName NE '' then + Resource = HTTP_Resource_Manager_Services('GetResource', URLEndpoint) + If Error_Services('NoError') then + PropertyNames = Resource<1> + Locate PropertyName in PropertyNames using @VM setting PropertyPos then + PropertyValue = Resource<2, PropertyPos> + end + Begin Case + Case PropertyName EQ 'EXCLUDE_LOGGING' + // This property defaults to false unless true. + If PropertyValue NE True$ then PropertyValue = False$ + Case PropertyName EQ 'RESOURCE' AND PropertyValue = '' + // Unless the system has forced this property to store a value, it should be derived from the + // resource signature. + Signature = HTTP_Resource_Manager_Services('GetResourceSignature', URLEndpoint) + PropertyValue = Signature[1, '.'] + End Case + end + end else + Error_Services('Add', 'PropertyName argument was missing in the ' : Service : ' service.') + end + + Response = PropertyValue + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResourceProperty +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// PropertyName - Name of the property whose value is being set. - [Required] +// PropertyValue - Value of the property being updated. Depending upon the property, this might clear the value or +// set a default value. - [Optional] +// +// Sets (or updates) the value of the indicated resource property for the indicated URL endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResourceProperty(URLEndpoint, PropertyName=PROPERTIES, PropertyValue) + + If PropertyName NE '' then + Resource = HTTP_Resource_Manager_Services('GetResource', URLEndpoint) + If Error_Services('NoError') then + PropertyNames = Resource<1> + Begin Case + Case PropertyName EQ 'METHODS' + // Make sure only valid HTTP methods are set. + Transfer PropertyValue to Methods + For Each Method in Methods using ',' setting cPos + Locate Method in ValidMethods$ using ',' setting MethodPos then + PropertyValue := Method : ',' + end + Next Method + PropertyValue[-1, 1] = '' + Case PropertyName EQ 'EXCLUDE_LOGGING' + // This property defaults to false unless true. + If PropertyValue NE True$ then PropertyValue = False$ + Case PropertyName EQ 'CLASS' + // Make sure only a valid resource class is set. + Locate PropertyValue in 'RESOURCE,RESOURCE_ID,PROPERTY' using ',' setting ClassPos else + PropertyValue = 'RESOURCE' + end + End Case + Locate PropertyName in PropertyNames using @VM setting PropertyPos else + Resource<1, PropertyPos> = PropertyName + end + Resource<2, PropertyPos> = PropertyValue + HTTP_Resource_Manager_Services('SetResource', URLEndpoint, Resource) + end + end else + Error_Services('Add', 'PropertyName argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResourceChildren +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// ChildType - Type of child resource being queried. If empty or ALL then all children are returned. - [Optional] +// +// Returns an @FM delimited list of URL endpoints matching the indicated child type that are children to the indicated +// URL endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResourceChildren(URLEndpoint, ChildType=CHILDREN) + + Children = '' + + ResourceList = HTTP_Resource_Manager_Services('GetResourceList') + If Error_Services('NoError') then + // Loop through the resource list to find resource children. + If ResourceList NE '' then + Locate ChildType in 'ALL,RESOURCE,RESOURCE_ID,PROPERTY' using ',' setting ChildPos else + ChildType = 'ALL' + end + ThisEndpointKeyID = HTTP_Resource_Manager_Services('GetEndpointResourceKeyID', URLEndpoint) + ThisLevel = DCount(ThisEndpoint, '/') + For Each ResourceItem in ResourceList using @FM + Endpoint = ResourceItem<0, 2> + EndpointLevel = DCount(Endpoint, '/') + If EndpointLevel EQ 2 then + EndpointParent = 'APIROOT' + end else + EndpointParent = Field(Endpoint, '/', 1, EndpointLevel - 1) + end + If EndpointParent _EQC ThisEndpointKeyID then + EndpointType = ResourceItem<0, 5> + If (EndpointType EQ ChildType) OR (ChildType EQ 'ALL') then + Children := Endpoint : @FM + end + end + Next ResourceItem + end + end + Children[-1, 1] = '' + + Response = Children + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResourceSignature +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// Method - HTTP method for the signature. This must be a valid method but it can also be empty. If empty, +// the signature returned will simply omit the method. - [Optional] +// +// Returns the API calling signature for the indicated URL endpoint. This is used by the RunWebAPI service (a member of +// HTTP_Services) when calling the Web API module. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResourceSignature(URLEndpoint, Method=METHODS) + + Signature = '' + + URLEndpointKeyID = HTTP_Resource_Manager_Services('GetEndpointResourceKeyID', URLEndpoint) + + // Validate the HTTP method. + Locate Method in ValidMethods$ using ',' setting MethodPos else + Method = '' + end + + If URLEndpointKeyID EQ 'APIROOT' then + Signature = 'APIROOT.' + end else + ThisLevel = DCount(URLEndpointKeyID, '/') + For LevelCnt = 2 to ThisLevel + Class = HTTP_Resource_Manager_Services('GetResourceProperty', Field(URLEndpointKeyID, '/', 1, LevelCnt), 'CLASS') + Begin Case + Case Class EQ 'RESOURCE' + // A resource starts a new signature. + Signature = Field(URLEndpointKeyID, '/', LevelCnt, 1) : '.' + Case Class EQ 'RESOURCE_ID' + Signature := 'ID.' + Case Otherwise$ + Signature := Field(URLEndpointKeyID, '/', LevelCnt, 1) : '.' + End Case + Next LevelCnt + end + + If Method NE '' then + Signature := Method + end else + Signature[-1, 1] = '' + end + + Response = Signature + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEndpointResourceKeyID +// +// URLEndpoint - URL endpoint to be validated. If empty, the APIROOT resource will be returned. - [Optional] +// AllowNew - Boolean flag indicating if a URL endpoint can be returned if new. Default is false. - [Optional] +// +// Returns the resource Key ID for the indicated URL endpoint. If AllowNew is true, a URL endpoint will be returned that +// best matches the available endpoints but it will not be cached. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEndpointResourceKeyID(URLEndpoint, AllowNew) + + ServiceKeyID := '*' : URLEndpoint + ResourceKeyID = Memory_Services('GetValue', ServiceKeyID, True$, CacheTTL$, CacheName$) + ResourceKeyIDFound = True$ ; // Assume true for now. + + If AllowNew NE True$ then AllowNew = False$ + IsNew = False$ ; // Assume false for now. + + If ResourceKeyID EQ '' then + If (URLEndpoint EQ '') OR (URLEndpoint _EQC 'APIROOT') then + ResourceKeyID = 'APIROOT' + end else + // Make sure the URL endpoint is well formed. The intent is for the incoming URL endpoint to be forgiving but + // internally it needs to match with the exact format of the endpoints used to uniquely identify each resource. + Swap 'https' with '' in URLEndpoint + Swap 'http' with '' in URLEndpoint + HomeURL = HTTP_Services('GetHomeURL') + Swap 'https' with '' in HomeURL + Swap 'http' with '' in HomeURL + APIURL = HTTP_Services('GetAPIRootURL', False$) + If URLEndpoint[-1, 1] EQ '/' then URLEndpoint[-1, 1] = '' + // Remove references to the Home or API URLs since these are not used when creating the resource endpoint + // identifiers. + Swap HomeURL with '' in URLEndpoint + Swap APIURL with '' in URLEndpoint + If URLEndpoint EQ '' then + // An empty URL endpoint implies APIROOT. + ResourceKeyID = 'APIROOT' + end else + // The URL endpoint needs to be walked one segment at a time to confirm that it matches the pattern of + // an existing resource endpoint. Since the true URL endpoint might contains a resource ID, there needs + // to be a check to see if the value of a given segment matches a defined resource or resource property + // first. If not, then confirm there is a resource ID defined for this segment. + ResourceList = HTTP_Resource_Manager_Services('GetResourceList') + ResourceArray = SRP_Array('Rotate', ResourceList, @FM , @VM) + ResourceEndpoints = ResourceArray<2> + ResourceNames = ResourceArray<3> + ResourceClasses = ResourceArray<5> + // Since the stored resource endpoints contain user defined resource IDs, each of these need to be + // converted to a generic '{ResourceID}' so simple comparison logic can work. + For Each Class in ResourceClasses using @VM setting ClassPos + If Class EQ 'RESOURCE_ID' then + OrigResourceEndpoint = ResourceEndpoints<0, ClassPos> + ResourceEndpoint = OrigResourceEndpoint + ResourceName = ResourceNames<0, ClassPos> + Swap ResourceName with '{ResourceID}' in ResourceEndpoint + Swap OrigResourceEndpoint with ResourceEndpoint in ResourceEndpoints + end + Next Class + Convert @Upper_Case to @Lower_Case in ResourceEndpoints + Convert @Upper_Case to @Lower_Case in URLEndpoint + // Remove any preceding "/" characters so the For Each will work + // better. + If URLEndpoint[1, 1] EQ '/' then URLEndpoint = URLEndpoint[2, 9999] + MatchResourceKeyID = '' + // Walk the URL endpoint provided and check for matches. Build the resource Key ID along the way. If a + // given segment is unable to be matched to a defined resource endpoint, end the loop and clear the + // resource Key ID. + FinalSegment = False$ + For Each Segment in URLEndpoint using '/' setting SegmentPos + MatchResourceKeyID := '/' : Segment + Locate MatchResourceKeyID in ResourceEndpoints using @VM setting URLPos then + If Segment[1, 1] EQ '{' then + ResourceKeyID := '/{resourceid}' + end else + ResourceKeyID := '/' : Segment + end + end else + MatchResourceKeyID = Field(MatchResourceKeyID, '/', 1, SegmentPos) : '/{resourceid}' + Locate MatchResourceKeyID in ResourceEndpoints using @VM setting URLPos then + ResourceKeyID := '/{resourceid}' + end else + If AllowNew EQ True$ then + ResourceKeyID := '/' : Segment + IsNew = True$ + end else + FinalSegment = True$ + end + end + end + While (ResourceKeyIDFound EQ True$) AND (FinalSegment EQ False$) + Next Segment + end + end + + If ResourceKeyIDFound EQ True$ then + If IsNew NE True$ then + Memory_Services('SetValue', ServiceKeyID, ResourceKeyID, CacheName$) + end + end else + ResourceKeyID = '' + end + end + + Response = ResourceKeyID + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResource +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// +// Returns an array of resource property names and values for the indicated URL endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResource(URLEndpoint) + + URLEndpointKeyID = HTTP_Resource_Manager_Services('GetEndpointResourceKeyID', URLEndpoint) + ServiceKeyID := '*' : URLEndpointKeyID + Resource = Memory_Services('GetValue', ServiceKeyID, True$, CacheTTL$, CacheName$) + + If Resource EQ '' then + ResourceList = HTTP_Resource_Manager_Services('GetResourceList') + If Error_Services('NoError') then + // The URL endpoint needs to be walked one segment at a time to confirm that it matches the pattern of + // an existing resource endpoint. Since the true URL endpoint might contains a resource ID, there needs + // to be a check to see if the value of a given segment matches a defined resource or resource property + // first. If not, then confirm there is a resource ID defined for this segment. + ResourceArray = SRP_Array('Rotate', ResourceList, @FM , @VM) + ResourceEndpoints = ResourceArray<2> + ResourceNames = ResourceArray<3> + ResourceClasses = ResourceArray<5> + // Since the stored resource endpoints contain user defined resource IDs, each of these need to be + // converted to a generic '{ResourceID}' so simple comparison logic can work. + For Each Class in ResourceClasses using @VM setting ClassPos + If Class EQ 'RESOURCE_ID' then + OrigResourceEndpoint = ResourceEndpoints<0, ClassPos> + ResourceEndpoint = OrigResourceEndpoint + ResourceName = ResourceNames<0, ClassPos> + Swap ResourceName with '{ResourceID}' in ResourceEndpoint + Swap OrigResourceEndpoint with ResourceEndpoint in ResourceEndpoints + end + Next Class + Convert @Upper_Case to @Lower_Case in ResourceEndpoints + MatchURLEndpointKeyID = URLEndpointKeyID + Convert @Upper_Case to @Lower_Case in MatchURLEndpointKeyID + + Locate MatchURLEndpointKeyID in ResourceEndpoints using @VM setting ResourcePos then + ResourceArray = ResourceList + Convert @VM to @FM in ResourceArray + NameProperty = ResourceArray<3> + ClassProperty = ResourceArray<5> + OtherProperties = ResourceArray<19> + Convert @SVM to @FM in OtherProperties + Convert @TM to @VM in OtherProperties + ResourceList = 'NAME' : @VM : NameProperty : @FM : 'CLASS' : @VM : ClassProperty : @FM : OtherProperties + Resource = SRP_Array('Rotate', ResourceList, @FM, @VM) + Memory_Services('SetValue', ServiceKeyID, Resource, CacheName$) + end + end + end + + Response = Resource + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResource +// +// URLEndpoint - URL endpoint for the resource. If empty, the APIROOT resource will be returned. - [Optional] +// PropertyArray - An @FM/@VM delimited array of resource property names and values for the resource. - [Required] +// +// Updates the array of resource property names and values for the indicated URL endpoint. Note, this replaces the +// existing property names and values. Other services should be used to update an existing array and then call this +// service when the array is updated. The PropertyArray must have at least one property name and value. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResource(URLEndpoint, PropertyArray) + + If PropertyArray NE '' then + URLEndpointKeyID = HTTP_Resource_Manager_Services('GetEndpointResourceKeyID', URLEndpoint, True$) + ResourceList = HTTP_Resource_Manager_Services('GetResourceList') + If Error_Services('NoError') then + ResourceArray = SRP_Array('Rotate', ResourceList, @FM , @VM) + MatchURLEndpointKeyID = URLEndpointKeyID + Convert @Upper_Case to @Lower_Case in MatchURLEndpointKeyID + ResourceEndpoints = ResourceArray<2> + Convert @Upper_Case to @Lower_Case in ResourceEndpoints + Locate MatchURLEndpointKeyID in ResourceEndpoints By 'AL' using @VM setting ResourcePos then + // This is an existing resource so update it. + Resource = ResourceList + Convert @VM to @FM in Resource + end else + // This is a new resource. + ResourceList = Insert(ResourceList, ResourcePos, 0, 0, '') + GoSub GetResourceTemplate + end + // Update the resource array with the property array data. + PropertyNames = PropertyArray<1> + PropertyValues = PropertyArray<2> + Locate 'NAME' in PropertyNames using @VM setting PropertyPos then + Name = PropertyValues<0, PropertyPos> + PropertyNames = Delete(PropertyNames, 0, PropertyPos, 0) + PropertyValues = Delete(PropertyValues, 0, PropertyPos, 0) + end else + // If no Name is provided, use the final segment of the URL endpoint. + Name = URLEndpointKeyID[-1, 'B/'] + PropertyArray = Insert(PropertyArray, 1, 1, 0, 'NAME') + PropertyArray = Insert(PropertyArray, 2, 1, 0, Name) + end + Locate 'CLASS' in PropertyNames using @VM setting PropertyPos then + Class = PropertyValues<0, PropertyPos> + Locate Class in 'RESOURCE,RESOURCE_ID,PROPERTY' using ',' setting ClassPos else + Class = 'RESOURCE' + PropertyArray<2, PropertyPos> = Class + end + PropertyNames = Delete(PropertyNames, 0, PropertyPos, 0) + PropertyValues = Delete(PropertyValues, 0, PropertyPos, 0) + end else + // All resources are required to have a class. If none is specified then set it to 'RESOURCE'. + Class = 'RESOURCE' + PropertyArray = Insert(PropertyArray, 1, 1, 0, 'CLASS') + PropertyArray = Insert(PropertyArray, 2, 1, 0, Class) + end + Memory_Services('SetValue', ServiceModule : '*GetResource*' : URLEndpointKeyID, PropertyArray, CacheName$) + Resource<03> = Name + Resource<05> = Class + OtherProperties = PropertyNames : @FM : PropertyValues + OtherPropertiesList = SRP_Array('Rotate', OtherProperties, @FM, @VM) + Convert @VM to @TM in OtherPropertiesList + Convert @FM to @SVM in OtherPropertiesList + Resource<19> = OtherPropertiesList + Convert @FM to @VM in Resource + ResourceList = Resource + ResourcesKeyID = HTTP_Services('GetLocalAppKeyID', ResourcesKeyID$) + Database_Services('WriteDataRow', SetupTable$, ResourcesKeyID, ResourceList, True$, False$, True$) + end + end else + Error_Services('Add', 'PropertyArray was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsValidEndpoint +// +// URLEndpoint - URL endpoint for the resource. If empty, a False value will be returned. - [Required] +// +// Returns a Boolean flag indicating if the indicated URL endpoint exists. +//---------------------------------------------------------------------------------------------------------------------- +Service IsValidEndpoint(URLEndpoint) + + IsValidEndpoint = False$ ; // Assume False for now. + + If URLEndpoint NE '' then + URLEndpointKeyID = HTTP_Resource_Manager_Services('GetEndpointResourceKeyID', URLEndpoint) + If URLEndpointKeyID NE '' then IsValidEndpoint = True$ + end else + Error_Services('Add', 'URLEndpoint argument was missing in the ' : Service : ' service.') + end + + Response = IsValidEndpoint + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResourceList +// +// Returns the resource list for the current application. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResourceList() + + ResourceList = '' + + ResourcesKeyID = HTTP_Services('GetLocalAppKeyID', ResourcesKeyID$) + If Error_Services('NoError') then + ResourceList = Database_Services('ReadDataRow', SetupTable$, ResourcesKeyID, True$, CacheTTL$, False$) + end + + Response = ResourceList + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// GetResourceTemplate +// +// Returns a template for a new resource. Most of this information is needed for the NDW_HTTP_FRAMEWORK_SETUP form's +// Tree control. +//---------------------------------------------------------------------------------------------------------------------- +GetResourceTemplate: + + Resource = '' + Resource<01> = DCount(URLEndpointKeyID, '/') + Resource<02> = URLEndpointKeyID + Resource<03> = URLEndpointKeyID[-1, 'B/'] + Resource<04> = 'Text' : @SVM + Resource<05> = '' + Resource<06> = '' + Resource<07> = 'RGB{68, 68, 68}' : @SVM : 'White' + Resource<08> = 'Segoe UI' : @SVM : '-12' : @SVM : '400' : @SVM : '0' : @SVM : '0' : @SVM : '0' : @SVM : '1' : @SVM : '0' : @SVM : '0' : @SVM : '0' : @SVM : '0' : @SVM : '0' + Resource<09> = 'Left' : @SVM : 'Center' + Resource<10> = 'N' + Resource<11> = 'None' + Resource<12> = 1 + Resource<13> = 24 + Resource<14> = 0 + Resource<15> = 1 + Resource<16> = 'None' + Resource<17> = 'Left' + Resource<18> = 13 : @SVM : 13 + +return diff --git a/FRAMEWORKS/STPROC/HTTP_RESOURCE_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_RESOURCE_SERVICES.txt new file mode 100644 index 0000000..bfe86bb --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_RESOURCE_SERVICES.txt @@ -0,0 +1,1790 @@ +Function HTTP_Resource_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Resource_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 04/19/15 dmb [SRPFW-95] Original programmer. + 04/21/15 dmb [SRPFW-95] Fix bug in Prepare_Column_Values gosub that ignored calculated columns. Thanks to + Barry Stevens for finding this. + 04/21/15 dmb [SRPFW-95] Add PostDatabaseItem service. + 04/21/15 dmb [SRPFW-95] Fix bug in Prepare_Column_Names gosub that ignored calculated columns. + 04/21/15 dmb [SRPFW-95]Modify the GetDatabaseItems service to support multiple types of options in the + Filter (formerly Query) argument. + 05/04/15 dmb [SRPFW-95] Convert Prepare_Column_Names gosub into the GetColumnNames service. Retrofit all + calls to the gosub to use the new service. + 05/04/15 dmb [SRPFW-95] Convert Prepare_Column_Values gosub into the GetColumnValues service. Retrofit + all calls to the gosub to use the new service. + 05/04/15 dmb [SRPFW-95] Move the logic to exclude non-master columns and full Key ID columns into the + GetColumnNames service. The GetColumnValues service will no longer be doing any column name + filter. It will just work with the list provided. It will, however, still make sure the + column name exists before attempting to get a value for it. + 05/04/15 dmb [SRPFW-95] Modify the GetColumnValues service to return full Key IDs if the column name + requires it. Add logic to decrement delimiters if @RM or @FM characters are found in the + value. + 05/04/15 dmb [SRPFW-95] Modify the PostDatabaseItem service to handle SRP_JSON PARSE errors better and + return a 400 response status code. + 05/15/15 dmb [SRPFW-95] Modify the GetDatabaseItems service to return an empty HAL+JSON embedded response + if there are no matches. Remove the 404 status since the URL itself is valid although the + database returns no matches. + 06/09/15 dmb [SRPFW-95] Add ItemArrayLabel option for GetDatabaseItem and GetDatabaseItems services. This + allows the calling service to customize the name of the primary HAL item array. + 02/27/16 dmb [SRPFW-112] Update various services to use Memory_Services for caching. + 03/23/16 dmb [SRPFW-114] Comment out the logic that attempted to remove full Key ID values from the + response in the GetColumnValues services. Mark Boorman pointed out a bug in this logic, but + the reason for doing this was unnecessary. + 03/24/16 dmb [SRPFW-115] Add GetMVGroupNames service. + 03/25/16 dmb [SRPFW-119] Update all SRP_JSON GETVALUE services used in the PostDatabaseItem service to + use the Default argument to return an empty string if the objects value is null. + 04/11/16 dmb [SRPFW-121] Update GetDatabaseItems service to use %RECORDS% if the Filter argument is + empty. This will provide a sorted list of Key IDs automatically. + 04/11/16 dmb [SRPFW-121] Update PostDatabaseItems service to use %RECORDS% if %SK% does not exist. This + will make it easier to calculate the next available Key ID. + 07/26/16 dmb [SRPFW-126] Refactor the GetColumnNames service and resolve a bug that Barry Steven's + discovered where non-master data type columns would be returned. + 10/13/16 dmb [SRPFW-129] Update the PostDatabaseItem service to set the response status to 201 when the + ItemID is being passed in but it does not yet exist in the database. + 07/01/17 dmb [SRPFW-184] Refactor using Enhanced BASIC+ syntax. + 07/05/17 dmb Add PutDatabaseItem and PatchDatabaseItem services. Refactor so all DatabaseItem create and + update services share relevant common code. + 07/05/17 dmb Update several variables and comments to better match database terminology rather than + HTTP terminology. + 07/19/18 dmb Update the PostDatabaseItem, PutDatabaseItem, and PatchDatabaseItem services to support a + new argument, AllowedColumnNames, which will be used to filter out column names which are + submitted in the payload but should not be updated on the server. + 11/29/18 dmb [SRPFW-259] Fix GetColumnNames to properly remove XREF columns. + 11/29/18 dmb [SRPFW-259] Add GetObjects service. + 11/29/18 dmb [SRPFW-259] Add GetSerializedResource service. + 11/29/18 dmb [SRPFW-259] Add ParseResource service. + 11/29/18 dmb [SRPFW-259] Add AddLinkRelationships service. + 11/29/18 dmb [SRPFW-259] Add AddProperties service. + 11/30/18 dmb [SRPFW-259] Add AddEmbeddedResources service. + 11/30/18 dmb [SRPFW-259] Add AddNestedProperties service. + 12/01/18 dmb [SRPFW-259] Update GetDatabaseItem to use the new resource services. + 12/01/18 dmb [SRPFW-259] Update GetDatabaseItems to use the new resource services. + 11/30/18 dmb [SRPFW-259] Add AddFormAction service. + 12/02/18 dmb [SRPFW-259] Update GetColumnValues service so when a Key ID is missing it will set + Error_Services and set the response status to 404. + 12/04/18 dmb [SRPFW-259] Add support for multiple nested objects in the AddNestedProperties service. + 12/06/18 dmb [SRPFW-257] Add LoremIpsum service. + 12/12/18 dmb [SRPFW-259] Update GetObjects so that specific Key ID parts can be identified to be used in + the self relationship URL and also add feature so the default '*' delimiter can be swapped + out for another character. + 01/03/19 dmb [SRPFW-259] Fix bug AddNestedProperties when using Array formatting. + 02/14/19 dmb [SRPFW-259] Add IsArray argument for the AddProperties service so data can be automatically + formatted as an array regardless if @VMs are found. This is meant to maintain formatting + integrity of the property regardless of 0, 1, or multiple values. + 03/04/19 dmb [SRPFW-259] Add GetObject service. Refactored GetObjects service to use GetObject service. + 03/04/19 dmb [SRPFW-259] Add AddProperty service. Update AddProperties service to call AddProperty for + each property. + 03/04/19 dmb [SRPFW-259] Add AddSubProperty and AddSubProperties service. + 03/04/19 dmb [SRPFW-259] Add AddSubResource and AddSubResources service. + 03/05/19 dmb [SRPFW-259] Add AddSubResourceObject and AddSubResourceObjects service. + 03/05/19 dmb [SRPFW-259] Remove AddNestedProperties service. Refit other services to use AddSubResources. + 03/05/19 dmb [SRPFW-259] Add AddLinkRelationship service. Update AddLinkRelationships service to call + AddLinkRelationship for each relationship. + 03/05/19 dmb [SRPFW-259] Update all resource related services to use new services and remove direct calls + to SRP_JSON except for the lowest level services. + 03/05/19 dmb [SRPFW-259] Add AllowKeyProperty argument to the GetObject, GetObjects, and GetColumnNames + services to override the default behavior of removing full Key ID columns from being + represented in the object. This is useful for sub-resources. + 03/05/19 dmb [SRPFW-259] Fix bug in GetObject service where associated property names were not being + removed if the column names were removed by the GetColumnNames service. + 03/06/19 dmb [SRPFW-259] Update the GetDatabaseItem and GetDatabaseItems service so the SelfURL argument + is now optional. + 04/10/19 dmb [SRPFW-271] Replace the Content-Location response header with Location in UpdateDatabaseRow. + This is the correct header for 201 responses. + (cf. https://tools.ietf.org/html/rfc2616#section-10.2.2) + 05/28/19 dmb [SRPFW-274] Update the AddEmbeddedResources service to support a new Singular argument. This + provides support for an embedded resource that is unique and should be represented as + sub-properties rather than sub-resources. + 05/28/19 dmb [SRPFW-274] Update the AddSubProperty service to correctly handle the SubPropertyValue + argument if it contains an object handle. + 05/28/19 dmb [SRPFW-274] Rename the GetLinkRelationship service to GetLinkRelation. Rename the + GetLinkRelationships service to GetLinkRelations. + 05/31/19 dmb [SRPFW-276] Update the GetColumnValues service so Error_Services is called after the + SetResponseError call. This prevents Error_Services from being cleared prematurely. + 05/31/19 dmb [SRPFW-276] Update the GetColumnNames service so Error_Services is called after the + SetResponseError call. This prevents Error_Services from being cleared prematurely. + 05/31/19 dmb [SRPFW-276] Update the GetMVGroupNames service so Error_Services is called after the + SetResponseError call. This prevents Error_Services from being cleared prematurely. + 12/09/19 dmb [SRPFW-296] Update all calls to Memory_Services to use a specific cache name. + 12/16/19 dmb [SRPFW-296] Update the AddEmbeddedResources so it can be called more than once for the same + embedded resource name. New resources will be added rather than replace what is already + present. + 01/22/20 dmb [SRPFW-296] Update the AddLinkRelation and AddLinkRelations services to support IsTemplate + (IsTemplates) Boolean argument. This is to add support for URI Templates: + https://tools.ietf.org/html/rfc6570 + https://tools.ietf.org/html/draft-kelly-json-hal-08#section-5.2 + 01/26/20 dmb [SRPFW-296] Add GetURLTemplate service. + 01/26/20 dmb [SRPFW-296] Update the AddLinkRelation service to call the GetURLTemplate service to create + a URL Template out of an indicated expanded URL. + 09/18/20 dmb [SRPFW-318] Update the AddSubProperty, AddSubResourceObject, and AddSubResource services + to escape the property name to avoid problems with properties containing dots. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert HTTP_INSERTS +$insert SERVICE_SETUP +$insert INET_EQUATES +$insert INET_HEADERS +$insert DICT_EQUATES + +Equ CRLF$ to \0D0A\ +Equ CacheName$ to 'SRPHTTPFramework' + +Declare function HTTP_Resource_Services, HTTP_Resource_Manager_Services, Database_Services, Memory_Services +Declare function SRP_Array +Declare subroutine HTTP_Resource_Services, RList, Make.List, Activate_Save_Select, Memory_Services + +GoToService else + HTTP_Services('SetResponseError', '', '', 404, Service : ' is not a valid service request within the HTTP Resource services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ +Options LAYOUT = 'Array', 'List' +Options METHODS = 'GET', 'POST', 'PUT', 'PATCH', 'DELETE' +Options STYLES = 'Fast', 'Styled', 'DropNulls' +Options ALLDATATYPES = 'String', 'Number', 'Boolean', 'StringList', 'NumberList', 'BooleanList', 'ObjectHandle' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// GetObject +// +// TableName - Name of the database table where the resource (database row) is stored. - [Optional] +// KeyID - Key ID of a database row that should be used to build the resource. - [Optional] +// ColumnNames - A delimited list of column names to build into the resource. Default will be all legitimate +// columns which are returned by the GetColumnNames service. - [Optional] +// PropertyNames - A delimited list of property names to use for each column. Default will be the column name. +// - [Optional] +// DataTypes - A delimited list of JSON data types (e.g., string, number, Boolean, etc.). Default will be +// string. - [Optional] +// MVGroupNames - A delimited list of MV group names that are to be matched with the delimited list of nested +// group names. - [Optional] +// NestedGroupNames - A delimited list of nested group names to use for each MV group name. This is only used if +// a list of MV group names is also provided. - [Optional] +// BaseSelfRelURL - The base URL to use for creating a self link relationship. If empty then no self link +// relationship will be created. Otherwise, the Key ID will be appended as a segment to this +// URL and added using the AddLinkRelations service. - [Optional] +// KeyParts - A delimited list of Key ID parts that should be used to created the self link relationship. +// Default is all Key ID parts will be used. - [Optional] +// KeyDelimiter - The character to use as the delimiter for multi-part Key IDs when used in the self link +// relationship. Default is '*', although this is not a URL friendly character. - [Optional] +// AllowKeyProperty - A Boolean flag indicating that the resource object be allowed to represent the Key ID of the +// database row to exists. This ultimately informs the GetColumnNames service to avoid stripping +// out the Key ID column. - [Optional] +// +// Creates one or more new resource objects. The database table, Key ID, and list of column mames are provided, these +// will be used to create properties within the resource object. +//---------------------------------------------------------------------------------------------------------------------- +Service GetObject(TableName, KeyID, ColumnNames, PropertyNames, DataTypes, MVGroupNames, NestedGroupNames, BaseSelfRelURL, KeyParts, KeyDelimiter, AllowKeyProperty) + + ObjectHandle = '' + + If (TableName NE '') AND (KeyID NE '') then + FieldArray = Database_Services('ReadDataRow', 'DICT.' : TableName, '%FIELDS%', False$, 60) + Convert @Lower_Case to @Upper_Case in ColumnNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in ColumnNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in PropertyNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in DataTypes + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in MVGroupNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in NestedGroupNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in KeyParts + If KeyDelimiter EQ '' then KeyDelimiter = '*' + MVColumnGroupNames = '' + CompareColumnNames = ColumnNames ; // Save the original column names for comparison after they've been vetted. + ColumnNames = HTTP_Resource_Services('GetColumnNames', TableName, ColumnNames, AllowKeyProperty) + // Check each original column name against the vetted list. If it is missing, remove the associated property name + // as well. + NumColumnNames = DCount(CompareColumnNames, @FM) + For ColumnPos = NumColumnNames to 1 Step -1 + ColumnName = CompareColumnNames + Locate ColumnName in ColumnNames using @FM setting fPos else + PropertyNames = Delete(PropertyNames, ColumnPos, 0, 0) + end + Next ColumnPos + hTable = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + If SRP_JSON(ObjectHandle, 'New', 'Object') then + ColumnValues = HTTP_Resource_Services('GetColumnValues', TableName, ColumnNames, KeyID) + If Error_Services('NoError') then + Convert @VM : @SVM : @TM : @STM to @SVM : @TM : @STM : Char(249) in ColumnValues + Convert @Lower_Case to @Upper_Case in ColumnNames + For Each ColumnName in ColumnNames using @FM setting fPos + PropertyName = PropertyNames + If PropertyName EQ '' then PropertyNames = Oconv(ColumnName, 'MCL') + DataType = DataTypes + If DataType EQ '' then DataTypes = 'String' + Locate ColumnName in FieldArray using @VM setting vPos then + MVGroupName = FieldArray + If MVGroupName NE '' then + Locate MVGroupName in MVGroupNames using @FM setting Pos then + NestedGroupName = NestedGroupNames + If NestedGroupName EQ '' then NestedGroupName = Oconv(MVGroupName, 'MCL') + MVColumnGroupNames = NestedGroupName + end else + MVColumnGroupNames = Oconv(MVGroupName, 'MCL') + end + end + end + Next ColumnName + ColumnArray = ColumnNames : @RM : PropertyNames : @RM : DataTypes : @RM : MVColumnGroupNames : @RM : ColumnValues + ColumnArray = SRP_Array('Rotate', ColumnArray, @RM, @FM) + Convert @FM to @VM in ColumnArray + Convert @RM to @FM in ColumnArray + ColumnArray = SRP_Array('SortRows', ColumnArray, 'AL4', 'LIST') + NestedValueArray = '' + NestedPropertyNames = '' + PrevMVColumnGroupName = '' + For Each ColumnInfo in ColumnArray using @FM setting fPos + ColumnName = ColumnInfo[1, @VM] + PropertyName = ColumnInfo[Col2() + 1, @VM] + DataType = ColumnInfo[Col2() + 1, @VM] + MVColumnGroupName = ColumnInfo[Col2() + 1, @VM] + Value = ColumnInfo[Col2() + 1, @VM] + Convert @SVM : @TM : @STM : Char(249) to @VM : @SVM : @TM : @STM in Value + If MVColumnGroupName NE '' then + If (MVColumnGroupName NE PrevMVColumnGroupName) AND (PrevMVColumnGroupName NE '') then + NestedPropertyNames[-1, 1] = '' + NestedValueArray[-1, 1] = '' + NestedValueArray = SRP_Array('Rotate', NestedValueArray, @FM, @VM) + Convert @FM to @RM in NestedValueArray + Convert @VM to @FM in NestedValueArray + HTTP_Resource_Services('AddSubResources', ObjectHandle, PrevMVColumnGroupName, NestedPropertyNames, NestedValueArray) + NestedPropertyNames = '' + NestedValueArray = '' + end + NestedPropertyNames := PropertyName : @FM + NestedValueArray := Value : @FM + PrevMVColumnGroupName = MVColumnGroupName + end else + HTTP_Resource_Services('AddProperty', ObjectHandle, PropertyName, Value, DataType) + end + Next ColumnInfo + If PrevMVColumnGroupName NE '' then + NestedPropertyNames[-1, 1] = '' + NestedValueArray[-1, 1] = '' + NestedValueArray = SRP_Array('Rotate', NestedValueArray, @FM, @VM) + Convert @FM to @RM in NestedValueArray + Convert @VM to @FM in NestedValueArray + HTTP_Resource_Services('AddSubResources', ObjectHandle, PrevMVColumnGroupName, NestedPropertyNames, NestedValueArray) + end + If BaseSelfRelURL NE '' then + If KeyParts NE '' then + NewKeyID = '' + For Each KeyPart in KeyParts using @FM + NewKeyID := Field(KeyID, '*', KeyPart, 1) : KeyDelimiter + Next KeyPart + NewKeyID[-1, 1] = '' + Transfer NewKeyID to KeyID + end else + Convert '*' to KeyDelimiter in KeyID + end + SelfRelURL = BaseSelfRelURL : '/' : KeyID + HTTP_Resource_Services('AddLinkRelations', ObjectHandle, 'self', SelfRelURL) + end + end + end else + Error_Services('Add', 'Error creating resource object in the ' : Service : ' service.') + end + end + end else + If SRP_JSON(ObjectHandle, 'New', 'Object') else + Error_Services('Add', 'Error creating resource object in the ' : Service : ' service.') + end + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetObjects +// +// TableName - Name of the database table where the resource (database row) is stored. - [Optional] +// Filter - Information that informs the service of how the database should be filtered. There are four +// options: 1. Empty string, which is the default, meaning all database rows should be selected, +// 2. A "SELECT" query that will be used in an RList() statement, 3. The name of a saved list of +// Key IDs, or 4. An @FM delimited list of Key IDs. - [Optional] +// ColumnNames - A delimited list of column names to build into the resource. Default will be all legitimate +// columns which are returned by the GetColumnNames service. - [Optional] +// PropertyNames - A delimited list of property names to use for each column. Default will be the column name. +// - [Optional] +// DataTypes - A delimited list of JSON data types (e.g., string, number, Boolean, etc.). Default will be +// string. - [Optional] +// MVGroupNames - A delimited list of MV group names that are to be matched with the delimited list of nested +// group names. - [Optional] +// NestedGroupNames - A delimited list of nested group names to use for each MV group name. This is only used if +// a list of MV group names is also provided. - [Optional] +// BaseSelfRelURL - The base URL to use for creating a self link relationship. If empty then no self link +// relationship will be created. Otherwise, the Key ID will be appended as a segment to this +// URL and added using the AddLinkRelations service. - [Optional] +// KeyParts - A delimited list of Key ID parts that should be used to created the self link relationship. +// Default is all Key ID parts will be used. - [Optional] +// KeyDelimiter - The character to use as the delimiter for multi-park Key IDs when used in the self link +// relationship. Default is '*', although this is not a URL friendly character. - [Optional] +// AllowKeyProperty - A Boolean flag indicating that the resource object be allowed to represent the Key ID of the +// database row to exists. This ultimately informs the GetColumnNames service to avoid stripping +// out the Key ID column. - [Optional] +// +// Creates one or more new resource objects. The database table, Key ID, and list of column mames are provided, these +// will be used to create properties within the resource object. +//---------------------------------------------------------------------------------------------------------------------- +Service GetObjects(TableName, Filter, ColumnNames, PropertyNames, DataTypes, MVGroupNames, NestedGroupNames, BaseSelfRelURL, KeyParts, KeyDelimiter, AllowKeyProperty) + + ObjectHandles = '' + + If TableName NE '' then + hTable = Database_Services('GetTableHandle', TableName) + If Error_Services('NoError') then + Begin Case + Case Filter EQ '' + Filter = Xlate(TableName, '%RECORDS%', '', 'X') + If Len(Filter) then + rv = Set_Status(0) + Make.List(0, Filter, '', '') + end else + Filter = 'SELECT ' : TableName : ' BY @ID' + rv = Set_Status(0) + RList(Filter, 5, '', '', '') + end + + Case Filter[1, 7] EQ 'SELECT ' + rv = Set_Status(0) + RList(Filter, 5, '', '', '') + + Case Count(Filter, @FM) + rv = Set_Status(0) + Make.List(0, Filter, '', '') + + Case Otherwise$ + // First, test to see if this is a valid saved list. If not, assume it is a single Key ID. + If Num(Filter) then + SaveList = Quote(Filter) + end else + SaveList = Filter + end + Activate_Save_Select(SaveList) + If Get_Status() then + rv = Set_Status(0) + Make.List(0, Filter, '', '') + end + End Case + EOF = False$ + Loop + Readnext KeyID else EOF = True$ + Until EOF EQ True$ + ObjectHandle = HTTP_Resource_Services('GetObject', TableName, KeyID, ColumnNames, PropertyNames, DataTypes, MVGroupNames, NestedGroupNames, BaseSelfRelURL, KeyParts, KeyDelimiter, AllowKeyProperty) + If Error_Services('NoError') then + ObjectHandles := ObjectHandle : @FM + end else + Error_Services('Add', 'Error creating resource object in the ' : Service : ' service.') + end + While Error_Services('NoError') + Repeat + ObjectHandles[-1, 1] = '' + end + end else + ObjectHandles = HTTP_Resource_Services('GetObject') + end + + Response = ObjectHandles + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ParseResource +// +// SerializedResource - Name of the database table where the resource (database row) is stored. - [Optional] +// +// Creates a new resource object. If a database table, Key ID, and list of column mames are provided, these will be used +// to create properties within the resource object. +//---------------------------------------------------------------------------------------------------------------------- +Service ParseResource(SerializedResource) + + ObjectHandle = '' + + If SerializedResource NE '' then + If SRP_JSON(ObjectHandle, 'Parse', SerializedResource) EQ '' else + Error_Services('Add', 'Error parsing the serialized resource in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'SerializedResource argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddProperty +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added. - [Required] +// PropertyValue - The property value being added. Default will be an empty string. - [Optional] +// DataType - The data type for the property value. These can be the standard JSON data types (e.g., 'String', +// 'Number', or 'Boolean'). If the PropertyValue contains @VM delimiters, these will be formatted as +// a JSON Array. There are a few special data types as well: +// - 'StringList' - Same as 'String', but will force the values to be stored in a JSON Array even +// if there are no @VM delimiters in the value. +// - 'NumberList' - Same as 'Number', but will force the values to be stored in a JSON Array even +// if there are no @VM delimiters in the value. +// - 'BooleanList' - Same as 'Boolean', but will force the values to be stored in a JSON Array even +// if there are no @VM delimiters in the value. +// - 'ObjectHandle' - A JSON object handle. This is expected to be a sub-property or a sub-resource +// object. This object handle will be released automatically. +// If DataType is empty, the default will be 'String'. - [Optional] +// +// Adds a property to the indicated resource object along with any value provided. +//---------------------------------------------------------------------------------------------------------------------- +Service AddProperty(ObjectHandle, PropertyName, PropertyValue, DataType=ALLDATATYPES) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') then + If DataType EQ '' then DataType = 'String' + If DataType _EQC 'ObjectHandle' then + If Num(PropertyValue) then + Transfer PropertyValue to objProperty + SRP_JSON(ObjectHandle, 'Set', PropertyName, objProperty) + SRP_JSON(objProperty, 'Release') + end else + Error_Services('Add', 'The PropertyValue argument from the ' : Service : ' service does not contain a valid object handle.') + end + end else + IsList = (Count(PropertyValue, @VM) GE 1) OR (DataType[-4, 4] _EQC 'List') + If IsList EQ True$ then + If SRP_JSON(arrayItem, 'New', 'Array') then + For Each ItemValue in PropertyValue using @VM + SRP_JSON(arrayItem, 'AddValue', ItemValue, DataType) + Next ItemValue + SRP_JSON(ObjectHandle, 'Set', PropertyName, arrayItem) + SRP_JSON(arrayItem, 'Release') + end + end else + SRP_JSON(ObjectHandle, 'SetValue', PropertyName, PropertyValue, DataType) + end + end + end else + Error_Services('Add', 'ObjectHandle or PropertyName argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddProperties +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyNames - An @FM delimited list of one or more property names. - [Required] +// PropertyValues - An @FM delimited list of property values being added. Default will be an empty string. +// - [Optional] +// DataTypes - An @FM delimited list of data types for the property values. See the DataType description for the +// AddProperty service. - [Optional] +// +// Adds one or more properties in the indicated resource object. This is a wrapper for the AddProperty service to make +// it easier to add multple properties to a resource object in one call. +//---------------------------------------------------------------------------------------------------------------------- +Service AddProperties(ObjectHandle, PropertyNames, PropertyValues, DataTypes) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyNames NE '') then + For Each PropertyName in PropertyNames using @FM setting fPos + PropertyValue = PropertyValues + DataType = DataTypes + HTTP_Resource_Services('AddProperty', ObjectHandle, PropertyName, PropertyValue, DataType) + Next PropertyName + end else + Error_Services('Add', 'ObjectHandle or PropertyNames argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubProperty +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubPropertyName - The sub-property name being added. - [Required] +// SubPropertyValue - The sub-property value being added. Default will be an empty string. - [Optional] +// DataType - The data type for the sub-property value. See the DataType description for the AddProperty +// service. - [Optional] +// +// Adds a sub-property to the indicated property of the indicated resource object along with any value provided. This is +// a one-service alternative to creating a temporary resource object and property (via GetObject with AddProperty) and +// then adding this object to the primary resource as a property (via AddProperty using 'ObjectHandle' data type). +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubProperty(ObjectHandle, PropertyName, SubPropertyName, SubPropertyValue, DataType=ALLDATATYPES) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') then + If DataType EQ '' then DataType = 'String' + Swap '.' with '..' in PropertyName ; // Escape the property name temporarily so the Get service will avoid treating it as a path. + PropertyObjectHandle = SRP_JSON(ObjectHandle, 'Get', PropertyName) + Swap '..' with '.' in PropertyName ; // Unescape the property name so it can be added to the JSON as intended. + If PropertyObjectHandle EQ 0 then PropertyObjectHandle = '' ; // A 0 means the property doesn't exist in the primary resource. Make this empty so it will get created. + PropertyObjectHandle = HTTP_Resource_Services('AddProperty', PropertyObjectHandle, SubPropertyName, SubPropertyValue, DataType) + If Error_Services('NoError') then + HTTP_Resource_Services('AddProperty', ObjectHandle, PropertyName, PropertyObjectHandle, 'ObjectHandle') + end + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubPropertyName argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubProperties +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubPropertyNames - An @FM delimited list of one or more sub-property names. - [Required] +// SubPropertyValues - An @FM delimited list of sub-property values being added. Default will be an empty string. +// - [Optional] +// DataTypes - An @FM delimited list of data types for the sub-property values. See the DataType description for +// the AddProperty service. - [Optional] +// +// Adds one or more sub-properties to the indicated property of the indicated resource object. This is a wrapper for the +// AddSubProperty service to make it easier to add multple sub-properties to a property in one call. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubProperties(ObjectHandle, PropertyName, SubPropertyNames, SubPropertyValues, DataTypes) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (SubPropertyNames NE '') then + For Each SubPropertyName in SubPropertyNames using @FM setting fPos + SubPropertyValue = SubPropertyValues + DataType = DataTypes + HTTP_Resource_Services('AddSubProperty', ObjectHandle, PropertyName, SubPropertyName, SubPropertyValue, DataType) + Next PropertyName + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubPropertyNames argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubResourceObject +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubResourceObjectHandle - The object handle to a sub-resource being added. - [Required] +// +// Adds a sub-resource object handle to the indicated property of the indicated resource object. Any pre-existing +// sub-resources will be preserved and new ones will be appended. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubResourceObject(ObjectHandle, PropertyName, SubResourceObjectHandle) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') AND (SubResourceObjectHandle NE '') then + Swap '.' with '..' in PropertyName ; // Escape the property name temporarily so the Get service will avoid treating it as a path. + PropertyArrayHandle = SRP_JSON(ObjectHandle, 'Get', PropertyName) + Swap '..' with '.' in PropertyName ; // Unescape the property name so it can be added to the JSON as intended. + If PropertyArrayHandle EQ 0 then SRP_JSON(PropertyArrayHandle, 'New', 'Array') + If PropertyArrayHandle GT 0 then + SRP_JSON(PropertyArrayHandle, 'Add', SubResourceObjectHandle) + SRP_JSON(SubResourceObjectHandle, 'Release') + SRP_JSON(ObjectHandle, 'Set', PropertyName, PropertyArrayHandle) + SRP_JSON(PropertyArrayHandle, 'Release') + end else + Error_Services('Add', 'Error creating property array handle in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubResourceObjectHandle argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubResourceObjects +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubResourceObjectHandles - An @FM delimited list of sub-resource object handles being added. - [Required] +// +// Adds one or more sub-resource object handles to the indicated property of the indicated resource object. This is a +// wrapper for the AddSubResourceObject service to make it easier to add multple sub-resource object handles to a +// property in one call. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubResourceObjects(ObjectHandle, PropertyName, SubResourceObjectHandles) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') AND (SubResourceObjectHandles NE '') then + For Each SubResourceObjectHandle in SubResourceObjectHandles using @FM + HTTP_Resource_Services('AddSubResourceObject', ObjectHandle, PropertyName, SubResourceObjectHandle) + Next SubResourceObjectHandle + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubResourceObjectHandles argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubResource +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the GetObject +// service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubResourcePropertyNames - An @FM delimited list of one or more sub-resource property names being added. +// - [Required] +// SubResourcePropertyValues - An @FM delimited list of one or more sub-resource property values being added. Default +// will be an empty string. - [Optional] +// DataTypes - An @FM delimited list of data types for the sub-resource property values. See the +// DataType description for the AddProperty service. - [Optional] +// +// Adds a sub-resource to the indicated property of the indicated resource object. A sub-resource object handle is +// created using the sub-resource property names and values and then added. Any pre-existing sub-resources will be +// preserved and new ones will be appended. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubResource(ObjectHandle, PropertyName, SubResourcePropertyNames, SubResourcePropertyValues, DataTypes) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') AND (SubResourcePropertyNames NE '') then + Swap '.' with '..' in PropertyName ; // Escape the property name temporarily so the Get service will avoid treating it as a path. + PropertyArrayHandle = SRP_JSON(ObjectHandle, 'Get', PropertyName) + Swap '..' with '.' in PropertyName ; // Unescape the property name so it can be added to the JSON as intended. + If PropertyArrayHandle EQ 0 then SRP_JSON(PropertyArrayHandle, 'New', 'Array') + If PropertyArrayHandle GT 0 then + SubResourceObjectHandle = HTTP_Resource_Services('GetObject') + If SubResourceObjectHandle GT 0 then + For Each SubResourcePropertyName in SubResourcePropertyNames using @FM setting fPos + SubResourcePropertyValue = SubResourcePropertyValues + DataType = DataTypes + HTTP_Resource_Services('AddProperty', SubResourceObjectHandle, SubResourcePropertyName, SubResourcePropertyValue, DataType) + Next PropertyName + HTTP_Resource_Services('AddSubResourceObject', ObjectHandle, PropertyName, SubResourceObjectHandle) + end else + Error_Services('Add', 'Error creating sub-resource object handle in the ' : Service : ' service.') + end + SRP_JSON(PropertyArrayHandle, 'Release') + end else + Error_Services('Add', 'Error creating property array handle in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubResourcePropertyNames argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSubResources +// +// ObjectHandle - Object handle to the resource. If empty, a new one will be created using the +// GetObject service. - [Optional] +// PropertyName - The property name being added or updated. - [Required] +// SubResourcePropertyNames - An @FM delimited list of one or more sub-resource property names being added. +// - [Required] +// SubResourcePropertyValuesArray - An @RM/@FM delimited array of one or more sub-resource property values being +// added. Each @FM list will be treated as a sub-resource. Default will be an empty +// string. - [Optional] +// DataTypes - An @FM delimited list of data types for the sub-resource property values. See the +// DataType description for the AddProperty service. - [Optional] +// +// Adds one or more sub-resources to the indicated property of the indicated resource object. This is a wrapper for the +// AddSubResource service to make it easier to add multple sub-resources to a property in one call. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSubResources(ObjectHandle, PropertyName, SubResourcePropertyNames, SubResourcePropertyValuesArray, DataTypes) + + If ObjectHandle EQ '' then ObjectHandle = HTTP_Resource_Services('GetObject') + + If (ObjectHandle NE '') AND (PropertyName NE '') AND (SubResourcePropertyNames NE '') then + For Each SubResourcePropertyValues in SubResourcePropertyValuesArray using @RM + HTTP_Resource_Services('AddSubResource', ObjectHandle, PropertyName, SubResourcePropertyNames, SubResourcePropertyValues, DataTypes) + Next SubResourcePropertyValues + end else + Error_Services('Add', 'ObjectHandle, PropertyName, or SubResourcePropertyNames argument was missing from the ' : Service : ' service.') + end + + Response = ObjectHandle + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddLinkRelation +// +// ObjectHandle - Object handle to the resource. - [Required] +// Relation - The relation being added. - [Required] +// URL - The URL associated to the indicated relation. - [Required] +// Title - The friendly title for the indicated relation. - [Optional] +// IsTemplate - Boolean flag to indicated if the link is URI Templated. - [Optional] +// IgnoreResourceID - Boolean flag to determine if a resource ID segment should be left untemplated. - [Optional] +// IgnoreProperty - Boolean flag to determine if a property segment should be left untemplated. - [Optional] +// IgnoreQueryParam - Boolean flag to determine if existing query params should be left untemplated. - [Optional] +// +// Adds a _links relation to the indicated resource object. This is part of the HAL specification. +//---------------------------------------------------------------------------------------------------------------------- +Service AddLinkRelation(ObjectHandle, Relation, URL, Title, IsTemplate=BOOLEAN, IgnoreResourceID=BOOLEAN, IgnoreProperty=BOOLEAN, IgnoreQueryParam=BOOLEAN) + + If (ObjectHandle NE '') AND (Relation NE '') AND (URL NE '') then + objRel = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + If IsTemplate EQ True$ then + URL = HTTP_Resource_Services('GetURLTemplate', URL, IgnoreResourceID, IgnoreProperty, IgnoreQueryParam) + If Index(URL, '{', 1) then + // The GetURLTemplate service was able to convert the URL to a URL Template. + HTTP_Resource_Services('AddProperty', objRel, 'templated', True$, 'Boolean') + end + end + HTTP_Resource_Services('AddProperty', objRel, 'href', URL) + If Title NE '' then + HTTP_Resource_Services('AddProperty', objRel, 'title', Title) + end + HTTP_Resource_Services('AddSubProperty', ObjectHandle, '_links', Relation, objRel, 'ObjectHandle') + end + end else + Error_Services('Add', 'ObjectHandle, Relation, or URL argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddLinkRelations +// +// ObjectHandle - Object handle to the resource. - [Required] +// Relations - A delimited list of relations being added. - [Required] +// URLs - A delimited list of URLs for each indicated relation. - [Required] +// Titles - A delimited list of display friendly titles for each indicated relation. - [Optional] +// IsTemplates - A delimited list of Boolean flags to indicated if the link is URI Templated. - [Optional] +// IgnoreResourceIDs - Boolean flag to determine if a resource ID segment should be left untemplated. - [Optional] +// IgnoreProperties - Boolean flag to determine if a property segment should be left untemplated. - [Optional] +// IgnoreQueryParams - Boolean flag to determine if existing query params should be left untemplated. - [Optional] +// +// Adds one or more _links relations in the indicated resource object. This is part of the HAL specification. +//---------------------------------------------------------------------------------------------------------------------- +Service AddLinkRelations(ObjectHandle, Relations, URLs, Titles, IsTemplates, IgnoreResourceIDs=BOOLEAN, IgnoreProperties=BOOLEAN, IgnoreQueryParams=BOOLEAN) + + If (ObjectHandle NE '') AND (Relations NE '') AND (URLs NE '') then + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in Relations + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in URLs + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in Titles + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in IsTemplates + For Each Relation in Relations using @FM setting fPos + URL = URLs + Title = Titles + IsTemplate = IsTemplates + IgnoreResourceID = IgnoreResourceIDs + IgnoreProperty = IgnoreProperties + IgnoreQueryParam = IgnoreQueryParams + HTTP_Resource_Services('AddLinkRelation', ObjectHandle, Relation, URL, Title, IsTemplate, IgnoreResourceID, IgnoreProperty, IgnoreQueryParam) + Next Name + end else + Error_Services('Add', 'ObjectHandle, Relations, or URLs argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddEmbeddedResources +// +// ObjectHandle - Object handle to the resource. - [Required] +// EmbeddedResourceName - Name of the embedded resource. - [Required] +// EmbeddedResourceObjectHandles - An @FM delimited list of resource object handles being added. Each embedded +// resource object handle will be released automatically. - [Required] +// Singular - A Boolean flag indicating that the embedded resource object should be represented +// as singular (i.e., unique) rather than as multiple. A singular embedded resource +// object will be displayed using sub-properties but multiple embedded resources +// (even if there is just one) will be displayed using sub-resources. The default +// value is False. - [Optional] +// +// Adds one or more embedded resources in the indicated resource object. Embedded resources are stand-alone resources +// on their own (and usually have their own endpoint), but are included, at least partially, in another resource due to +// the close relationship between them. This is often done to eliminate multiple requests to pull in all significant +// resource data. This is part of the HAL specification. +//---------------------------------------------------------------------------------------------------------------------- +Service AddEmbeddedResources(ObjectHandle, EmbeddedResourceName, EmbeddedResourceObjectHandles, Singular) + + If (ObjectHandle NE '') AND (EmbeddedResourceName NE '') AND (EmbeddedResourceObjectHandles NE '') then + If Singular NE True$ then Singular = False$ + If Singular EQ True$ then + objEmbedded = HTTP_Resource_Services('AddSubProperty', '', EmbeddedResourceName, '', EmbeddedResourceObjectHandles, 'ObjectHandle') + end else + objEmbedded = SRP_JSON(ObjectHandle, 'Get', '_embedded') + If objEmbedded EQ 0 then objEmbedded = '' + objEmbedded = HTTP_Resource_Services('AddSubResourceObjects', objEmbedded, EmbeddedResourceName, EmbeddedResourceObjectHandles) + end + If Error_Services('NoError') then + HTTP_Resource_Services('AddProperty', ObjectHandle, '_embedded', objEmbedded, 'ObjectHandle') + end + end else + Error_Services('Add', 'ObjectHandle, EmbeddedResourceName, or EmbeddedResourceObjectHandles argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddFormAction +// +// ObjectHandle - Object handle to the resource. - [Required] +// Name - Name associated with this form action. - [Required] +// Method - HTTP method used by this form action. - [Required] +// URL - URL used as the target by this form action. - [Required] +// Title - Display friendly title for this form action. Default is the Name argument. - [Optional] +// Fields - A delimited list of fields that need to be submitted with this action. Fields can be interpreted +// in any way the API chooses, but typically they map to a property of the current resource. +// - [Optional] +// FieldProperties - A structured @FM/@VM delimited array of property values associated with the fields. - [Optional] +// For each field, the value structure follows this pattern: +// = Default value. The value that should be passed in unless otherwise overridden by the +// client. +// = Required flag. A Boolean flag indicating if this property requires a value to be +// passed in. +// = Visible flag. A Boolean flag indicating if this property should be visible to the +// client. A non-visible field simply means that the default value will automatically +// be passed in. +// +// Adds one _forms action in the indicated resource object. Due to the complexity and depth of a single action, this +// service will only add one action at a time. Additional actions can be added by calling this service multiple times. +//---------------------------------------------------------------------------------------------------------------------- +Service AddFormAction(ObjectHandle, Name, Method=METHODS, URL, Title, Fields, FieldProperties) + + If (ObjectHandle NE '') AND (Name NE '') AND (Method NE '') AND (URL NE '') then + If Title EQ '' then Title = Name + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in Fields + objAction = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + HTTP_Resource_Services('AddProperty', objAction, 'method', Method) + HTTP_Resource_Services('AddProperty', objAction, 'action', URL) + HTTP_Resource_Services('AddProperty', objAction, 'title', Title) + objFields = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + If Fields NE '' then + For Each Field in Fields using @FM setting fPos + HTTP_Resource_Services('AddSubProperty', objFields, Field, 'default', FieldProperties, 'String') + HTTP_Resource_Services('AddSubProperty', objFields, Field, 'required', FieldProperties, 'Boolean') + HTTP_Resource_Services('AddSubProperty', objFields, Field, 'visible', FieldProperties, 'Boolean') + Next Field + HTTP_Resource_Services('AddProperty', objAction, 'fields', objFields, 'ObjectHandle') + end + end + HTTP_Resource_Services('AddSubProperty', ObjectHandle, '_forms', Name, objAction, 'ObjectHandle') + end + end else + Error_Services('Add', 'ObjectHandle, Name, Method, or URL argument was missing from the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSerializedResource +// +// ObjectHandle - Object handle to the resource needing to be serialized. - [Required] +// Style - Formatting style for the final output (Fast, DropNulls, or Styled). Default = Fast. - [Optional] +// +// Serializes the indicated resource object and then releases the object. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSerializedResource(ObjectHandle, Style=STYLES) + + SerializedResource = '' + + If ObjectHandle NE '' then + If Style EQ '' then Style = 'Fast' + SerializedResource = SRP_JSON(ObjectHandle, 'Stringify', Style) + SRP_JSON(ObjectHandle, 'Release') + end else + Error_Services('Add', 'ObjectHandle argument was missing from the ' : Service : ' service.') + end + + Response = SerializedResource + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// LoremIpsum +// +// Creates a dummy HTTP response using lorem ipsum content. This is a placeholder service used when new endpoint +// handlers are automatically created. It is expected to be replaced by the actual API logic. +//---------------------------------------------------------------------------------------------------------------------- +Service LoremIpsum() + + ObjectHandle = HTTP_Resource_Services('GetObjects') + LoremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' + LoremIpsum := 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure ' + LoremIpsum := 'dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non ' + LoremIpsum := 'proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' + HTTP_Resource_Services('AddProperty', ObjectHandle, 'content', LoremIpsum, 'String') + FullEndPointURL = HTTP_Services('GetFullEndPointURL') + APIURL = HTTP_Services('GetAPIRootURL', True$) + HTTP_Resource_Services('AddLinkRelations', ObjectHandle, 'self' : @FM : 'apiEntryPoint', FullEndpointURL : @FM : APIURL) + jsonResource = HTTP_Resource_Services('GetSerializedResource', ObjectHandle, 'Fast') + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + HTTP_Services('SetResponseStatus', 200) + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetURLTemplate +// +// URL - The URL that needs to be transformed into a URL template. - [Required] +// IgnoreResourceID - Boolean flag to determine if a resource ID segment should be left untemplated. - [Optional] +// IgnoreProperty - Boolean flag to determine if a property segment should be left untemplated. - [Optional] +// IgnoreQueryParam - Boolean flag to determine if existing query params should be left untemplated. - [Optional] +// +// Returns the indicated URL as a URL Template. +//---------------------------------------------------------------------------------------------------------------------- +Service GetURLTemplate(URL, IgnoreResourceID=BOOLEAN, IgnoreProperty=BOOLEAN, IgnoreQueryParam=BOOLEAN) + + URLTemplate = '' + + If IgnoreResourceID NE True$ then IgnoreResourceID = False$ + If IgnoreProperty NE True$ then IgnoreProperty = False$ + If IgnoreQueryParam NE True$ then IgnoreQueryParam = False$ + + If URL NE '' then + If Index(URL, '{', 1) then + // The URL already appears to be formatted as a template. Return the URL that was passed in. + URLTemplate = URL + end else + // The URL is not formatted as a template. Match it to a resource and create a templated URL. + If URL[1, 1] EQ '/' then + // URL is formatted as a relative URL. Start the URL Template as empty. + URLTemplate = '' + URL[1, 1] = '' + end else + // Assume the URL is absolute. Start the URL Template with the base URL. + URLTemplate = Field(URL, '/', 1, 3) + URL = Field(URL, '/', 4, 999) + end + If Index(URL, '?', 1) then + // URL contains query params. Remove these for now and add them back only if IgnoreQueryParams is set + // to True$. This way the original query params will be included in the URL Template. + OrigQueryParams = Field(URL, '?', 2, 1) + URL[-1, Neg(Len(OrigQueryParams) + 1)] = '' + end else + OrigQueryParams = '' + end + For Each Segment in URL using '/' + URLTemplate := '/' : Segment + ResourceClass = HTTP_Resource_Manager_Services('GetResourceProperty', URLTemplate, 'CLASS') + Begin Case + Case ResourceClass _EQC 'RESOURCE_ID' + If IgnoreResourceID NE True$ then + // This segment is a Resource ID. Get the NAME property for this URL and use this for the + // segment instead. + ResourceID = HTTP_Resource_Manager_Services('GetResourceProperty', URLTemplate, 'NAME') + URLTemplate[-1, Neg(Len(Segment))] = ResourceID + end + Case ResourceClass _EQC 'PROPERTY' + If IgnoreProperty NE True$ then + // This segment is a Property. Use {propertyName} for the segment instead. + URLTemplate[-1, Neg(Len(Segment))] = '{propertyName}' + end + End Case + Next Segment + If IgnoreQueryParam NE True$ then + // Now the the URLTemplate is complete. Check to see if there are query params supported by this endpoint. + QueryParams = HTTP_Resource_Manager_Services('GetResourceProperty', URLTemplate, 'QUERY_PARAMS') + If QueryParams NE '' then + QueryParams = '{?' : QueryParams : '}' + URLTemplate := QueryParams + end + end else + If OrigQueryParams NE '' then + URLTemplate := '?' : OrigQueryParams + end + end + end + end else + Error_Services('Add', 'URL argument was missing from the ' : Service : ' service.') + end + + Response = URLTemplate + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetDatabaseItem +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// SelfURL - The URL that identifies the item resource. - [Optional] +// KeyID - Key ID for the database row. - [Required] +// ColumnNames - An @FM delimited list of column names to build into the resource. If empty then all documented +// column names from the %FIELDS% dictionary record will be used. - [Optional] +// ItemArrayLabel - Label text to use when naming the primary HAL item array. If empty then "item" will be +// used. - [Optional] +// +// Gets the resource item from a database table. The format will be HAL+JSON. +//---------------------------------------------------------------------------------------------------------------------- +Service GetDatabaseItem(TableName, SelfURL, KeyID, ColumnNames, ItemArrayLabel) + + BaseSelfURL = Field(SelfURL, '/', 1, Count(SelfURL, '/')) + ObjectHandle = HTTP_Resource_Services('GetObjects', TableName, KeyID, ColumnNames, ItemArrayLabel) + If SelfURL NE '' then + HTTP_Resource_Services('AddLinkRelations', ObjectHandle, 'self' : @FM : 'collection', SelfURL : @FM : BaseSelfURL) + end + HAL = HTTP_Resource_Services('GetSerializedResource', ObjectHandle) + HTTP_Services('SetResponseBody', HAL, False$, 'application/hal+json') + + // Use the Response variable for internal monitoring, tracking, and debugging. This does not affect the HTTP + // response. + Response = HAL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetDatabaseItems +// +// Filter - Information that informs the service of how the database should be filtered. There are four +// options: 1. Empty, if all database rows should be selected, 2. A "SELECT" query that will be used +// in an RList() statement, 3. The name of a saved list of Key IDs, or 4. An @FM delimited list of +// Key IDs. - [Optional] +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// SelfURL - The URL that identifies the collection resource. - [Optional] +// ColumnNames - An @FM delimited list of column names to build into the resource. If empty then all documented +// column names from the %FIELDS% dictionary record will be used. - [Optional] +// ItemArrayLabel - Label text to use when naming the primary HAL item array. If empty then "item" will be +// used. - (Optional) +// +// Gets the resource items from a database table. The format will be HAL+JSON. +//---------------------------------------------------------------------------------------------------------------------- +Service GetDatabaseItems(Filter, TableName, SelfURL, ColumnNames, ItemArrayLabel) + + HAL = '' + + ObjectHandle = HTTP_Resource_Services('GetObjects') + If Error_Services('NoError') then + objItems = HTTP_Resource_Services('GetObjects', TableName, Filter, ColumnNames, ItemArrayLabel, '', '', '', SelfURL) + HTTP_Resource_Services('AddEmbeddedResources', ObjectHandle, 'item', objItems) + If SelfURL NE '' then + // Add _links sub-properties for HAL implementation. + HTTP_Resource_Services('AddLinkRelations', ObjectHandle, 'self', SelfURL) + end + If Error_Services('NoError') then + // Serialize the object into a JSON string. + HAL = HTTP_Resource_Services('GetSerializedResource', ObjectHandle) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', HAL, False$, 'application/hal+json') + end + end + + Response = HAL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// DeleteDatabaseItem +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// KeyID - Key ID for the database row. - [Required] +// +// Deletes the resource item from a database table. +//---------------------------------------------------------------------------------------------------------------------- +Service DeleteDatabaseItem(TableName, KeyID) + + If (TableName NE '') AND (KeyID NE '') then + Open TableName to hTable then + Lock hTable, KeyID then + Read DataRow from hTable, KeyID then + Delete hTable, KeyID then + HTTP_Services('SetResponseStatus', 204) + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error deleting ' : KeyID : ' from the ' : TableName : ' table.') + end + end else + HTTP_Services('SetResponseStatus', 204) + end + Unlock hTable, KeyID else Null + end else + HTTP_Services('SetResponseError', '', '', 423, KeyID : ' is currently locked.') + end + end else + // Unable to open the database table. Set a 500 status code. + HTTP_Services('SetResponseError', '', '', 500, 'Unable to open the ' : TableName : ' table.') + end + end else + // Required arguments are missing so just set a 404 status code. + HTTP_Services('SetResponseError', '', '', 404, 'Required arguments are missing.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// PutDatabaseItem +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// SelfURL - The URL that identifies the resource. - [Required] +// KeyID - Key ID for the database row. - [Required] +// AllowedColumnNames - An @FM delimited list of column names that are permitted in this service. - [Optional] +// +// Creates a new or updates a specific resource item in the database table. To conform to the requirements of the PUT +// method, the entire resource will be replaced with the content being passed in, even if only a few properties (e.g., +// database columns) are being updated. Thus, it is assumed that both changed and unchanged properties will be passed +// into the request body. +//---------------------------------------------------------------------------------------------------------------------- +Service PutDatabaseItem(TableName, SelfURL, KeyID, AllowedColumnNames) + + If (TableName NE '') AND (SelfURL NE '') AND (KeyID NE '') then + Open TableName to hTable then + HaveKeyID = False$ ; // Assume false for now. + + Lock hTable, KeyID then + ItemURL = SelfURL + Read OrigDataRow from hTable, KeyID then + StatusCode = 200 ; // Updating an existing resource. + end else + StatusCode = 201 ; // Creating a new resource. + end + DataRow = '' ; // Clearing data row of all content. PUT assumes the entire resource is being updated. + HaveKeyID = True$ + end + + If HaveKeyID then + GoSub UpdateDatabaseRow + end else + HTTP_Services('SetResponseError', '', '', 423, KeyID : ' is currently locked.') + end + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error opening the ' : TableName : ' table.') + end + end else + // Required arguments are missing so just set a 404 status code. + HTTP_Services('SetResponseError', '', '', 404, 'Required arguments are missing.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// PostDatabaseItem +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// SelfURL - The URL that identifies the resource. - [Required] +// AllowedColumnNames - An @FM delimited list of column names that are permitted in this service. - [Optional] +// +// Creates a new resource item in the database table. To conform to the requirements of the POST method, the Key ID +// will be created automatically by the server and the entire resource will be created with the content being passed in. +//---------------------------------------------------------------------------------------------------------------------- +Service PostDatabaseItem(TableName, SelfURL, AllowedColumnNames) + + If (TableName NE '') AND (SelfURL NE '') then + Open TableName to hTable then + HaveKeyID = False$ ; // Assume false for now. + + // Logic to create a new KeyID is placed here. The following code attempts to retrieve the KeyID from a + // %SK% counter. If this fails, it will attempt to retrieve it from %RECORD%. Finally, if this fails then + // KeyID will be set to a value of 1 and the code will increment this value until a new Key ID can be found. + KeyID = Xlate('DICT.' : TableName, '%SK%', 1, 'X') + If KeyID EQ '' then + KeyIDs = Xlate(TableName, '%RECORDS%', '', 'X') + KeyID = KeyIDs[-1, 'B' : @FM] + KeyID += 1 + end + If KeyID EQ '' then KeyID = 1 + Loop + Lock hTable, KeyID then + Read DataRow from hTable, KeyID then + Unlock hTable, KeyID else Null + end else + OrigDataRow = '' + DataRow = '' + ItemURL = SelfURL : '/' : KeyID + StatusCode = 201 ; // Creating a new resource. + HaveKeyID = True$ + end + end + Until HaveKeyID + KeyID += 1 + Repeat + + If HaveKeyID then + GoSub UpdateDatabaseRow + end else + HTTP_Services('SetResponseError', '', '', 400, 'Error attempting to POST the resource to the ' : TableName : ' table.') + end + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error opening the ' : TableName : ' table.') + end + end else + // Required arguments are missing so just set a 404 status code. + HTTP_Services('SetResponseError', '', '', 404, 'Required arguments are missing.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// PatchDatabaseItem +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// SelfURL - The URL that identifies the resource. - [Required] +// KeyID - Key ID for the database row. - [Required] +// AllowedColumnNames - An @FM delimited list of column names that are permitted in this service. - [Optional] +// +// Updates a specific resource item in the database table. To conform to the requirements of the PATCH method, only +// specific properties (e.g., database columns) of the resource will be updated. All properties not identified will +// be left alone. +//---------------------------------------------------------------------------------------------------------------------- +Service PatchDatabaseItem(TableName, SelfURL, KeyID, AllowedColumnNames) + + If (TableName NE '') AND (SelfURL NE '') AND (KeyID NE '') then + Open TableName to hTable then + HaveKeyID = False$ ; // Assume false for now. + + Lock hTable, KeyID then + ItemURL = SelfURL + Read OrigDataRow from hTable, KeyID then + DataRow = OrigDataRow + StatusCode = 200 ; // Updating an existing resource. + HaveKeyID = True$ + end else + StatusCode = 404 ; // Creating a new resource, which is unsupported for the PATCH method. + end + end + + If HaveKeyID then + GoSub UpdateDatabaseRow + end else + HTTP_Services('SetResponseError', '', '', 423, KeyID : ' is currently locked.') + end + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error opening the ' : TableName : ' table.') + end + end else + // Required arguments are missing so just set a 404 status code. + HTTP_Services('SetResponseError', '', '', 404, 'Required arguments are missing.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetColumnNames +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// ColumnNames - An @FM delimited list of column names to build into the resource. If empty then all documented +// column names from the %FIELDS% dictionary record will be used. - [Optional] +// AllowKeyProperty - A Boolean flag indicating that the resource object be allowed to represent the Key ID of the +// database row to exists. This ultimately informs the GetColumnNames service to avoid stripping +// out the Key ID column. - [Optional] +// +// Gets the column names from the dictionary of the table provided that will be used to create the resource. If the +// ColumnNames argument is used then this service will validate the list as valid columns. In either case, the following +// rules will be applied: +// +// - Regardless of the case used in the ColumnNames argument it will be upper cased to match against the dictionary +// names correctly. +// - All column names bound to a Key ID of part 0 (i.e., the entire key) will be removed (unless AllowKeyProperty is +// set to True). +// - All non-master column names will be removed to avoid duplicates. +// - SRP FrameWorks audit column names (MODIFIED_BY, MODIFIED_DATE, and MODIFIED_TIME) will be removed. +//---------------------------------------------------------------------------------------------------------------------- +Service GetColumnNames(TableName, ColumnNames, AllowKeyProperty) + + If AllowKeyProperty NE True$ then AllowKeyProperty = False$ + + // Make any column names passed in safe to work with. + Convert @Lower_Case to @Upper_Case in ColumnNames + Convert ',' to @FM in ColumnNames + CompareColumnNames = ColumnNames + + // Create a service Key ID suitable for caching the results. + ServiceKeyID := '*' : TableName + If ColumnNames NE '' then + ServiceKeyID := '*' : SRP_Hash(ColumnNames, 'SHA-1', 'BASE32') + end + // Check to see if column names have been cached this session. + ColumnNames = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If ColumnNames EQ '' then + If TableName NE '' then + Open TableName to hTable then + Open 'DICT.' : TableName to @DICT then + Read Fields from @DICT, '%FIELDS%' else Fields = '' + // Sort the fields array by descending Field Type. This puts Calculated (Type = 'S') columns before + // Data (Type = 'F') columns. All Calculated columns qualify, so the list can stop when the + // calculated columns are reached. + Fields = SRP_Array('SortRows', Fields, 'DL' : FIELDS_TYPE$) + FieldsList = SRP_Array('Rotate', Fields) + + // Restore the list of required column names, if any. + Transfer CompareColumnNames to ColumnNames + + // Loop through the fields starting at the bottom and remove all fields that do not qualify. These + // conditions disqualify a field: + // - Full Key IDs - This allows Key Part columns to properly represent the data and abstract the + // resource better. + // - Non-master data type columns - This prevents duplication of data. + // - Empty Column Names - This prevents special dictionary columns, like 'G' type from being + // included. + // - Cross-reference columns - These are calculated columns meant for indexing only. + FieldPtr = DCount(FieldsList, @FM) + Loop + Until FieldPtr EQ 0 + Master = Fields ; // Calculated columns have no Master flag. + Type = Fields + Conv = Fields + MV = Fields + Pos = Fields + ColumnName = Fields + KeyPart = Fields + GroupName = Fields + Indexed = Fields + If (Master AND (Not(Pos EQ 0 AND KeyPart EQ 0) OR (AllowKeyProperty EQ True$))) OR ((Type _EQC 'S') AND (ColumnName[-5, 5] _NEC '_XREF')) then + // The column must be a Master column (but not a full Key ID). + If ColumnName EQ '' then + // If the column does not have a name in the FIELDS_NAME$ value (for whatever reason) then + // remove it from the array so it will be be included in the final results. + Fields = Delete(Fields, FIELDS_FIELD_NO$, FieldPtr, 0) + Fields = Delete(Fields, FIELDS_PART$, FieldPtr, 0) + FieldsList = Delete(FieldsList, FieldPtr, 0, 0) + end + end else + // The column does not meet the criteria. Remove the reference from the Fields array. Check + // to see if this field was included in the ColumnNames argument and remove from that as + // well. + Fields = Delete(Fields, FIELDS_FIELD_NO$, FieldPtr, 0) + Fields = Delete(Fields, FIELDS_PART$, FieldPtr, 0) + FieldsList = Delete(FieldsList, FieldPtr, 0, 0) + Locate ColumnName in ColumnNames using @FM setting fPos then ColumnNames = Delete(ColumnNames, fPos, 0, 0) + end + // Decrement the Field Position counter so the next item above in the array can be reviewed. + FieldPtr -= 1 + Repeat + Fields = SRP_Array('Rotate', FieldsList) + FieldNames = Fields + Convert @VM to @FM in FieldNames + If Len(ColumnNames) then + // Check the supplied list of column names to make sure they are valid. + CompareColumnNames = ColumnNames + For Each ColumnName in CompareColumnNames using @FM + Locate ColumnName in FieldNames using @FM setting fPos else + Locate ColumnName in ColumnNames using @FM setting fPos then + ColumnNames = Delete(ColumnNames, fPos, 0, 0) + end + end + Next ColumnName + end else + ColumnNames = Fields + Convert @VM to @FM in ColumnNames + end + // Exclude the audit column names in case they exist. + Locate 'MODIFIED_BY' in ColumnNames using @FM setting fPos then ColumnNames = Delete(ColumnNames, fPos, 0, 0) + Locate 'MODIFIED_DATE' in ColumnNames using @FM setting fPos then ColumnNames = Delete(ColumnNames, fPos, 0, 0) + Locate 'MODIFIED_TIME' in ColumnNames using @FM setting fPos then ColumnNames = Delete(ColumnNames, fPos, 0, 0) + If Len(ServiceKeyID) then + Memory_Services('SetValue', ServiceKeyID, ColumnNames, CacheName$) + end + end else + // Unable to open the dictionary table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' dictionary table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Unable to open the database table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Required arguments are missing so just set a 404 status code. + ErrorMessage = 'Required arguments are missing.' + HTTP_Services('SetResponseError', '', '', 404, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end + + Response = ColumnNames + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetColumnValues +// +// TableName - Name of the database table where the resource (database row) is stored. - [Required] +// ColumnNames - An @FM delimited list of column names to build into the resource. - [Required] +// KeyID - Key ID for the database row. - [Required] +// +// Gets the column values from the database row from the provided table and ID that will be used to create the resource. +// This is returned as an @FM delimited list of values. +//---------------------------------------------------------------------------------------------------------------------- +Service GetColumnValues(TableName, ColumnNames, KeyID) + + ServiceKeyID := '*' : SRP_Hash(TableName : ColumnNames : KeyID, 'SHA-1', 'BASE32') + ColumnValues = Memory_Services('GetValue', ServiceKeyID, True$, 10, CacheName$) + + If ColumnValues EQ '' then + If (TableName NE '') AND (ColumnNames NE '') AND (KeyID NE '') then + Open TableName to hTable then + Open 'DICT.' : TableName to @DICT then + Read Fields from @DICT, '%FIELDS%' else Fields = '' + @ID = KeyID + Read @RECORD from hTable, @ID then + Convert @Lower_Case to @Upper_Case in ColumnNames + NumColumns = Count(ColumnNames, @FM) + (ColumnNames NE '') + + If ColumnNames NE '' then + For Each ColumnName in ColumnNames using @FM setting ColumnCnt + ColumnName = ColumnNames + ColumnValue = '' + Locate ColumnName in Fields using @VM setting vPos then + Master = Fields + Type = Fields + Conv = Fields + MV = Fields + Pos = Fields + KeyPart = Fields + GroupName = Fields + + // Now get the value based on factors like data vs. calculated and whole key vs. key part + Begin Case + Case Type EQ 'F' + // Data column. + If Len(KeyPart) then + // This is a Key ID column. If KeyPart is 0 then this represents the entire + // Key ID, which is not normally returned since the Item ID is already known + // and will appear in the URL. If this is a multipart Key ID then KeyPart + // will be an integer. This value should be returned since it likely is a + // significant part of the resource. + If KeyPart EQ 0 then + ColumnValue = @ID + end else + ColumnValue = Field(@ID, '*', KeyPart, 1) + end + end else + ColumnValue = @RECORD + end + + Case Type EQ 'S' + // Calculated (symbolic) column. If @RM or @FM delimiters are discovered then all + // delimiters will be decremented as needed so the response payload will not become + // out of sync. + ColumnValue = Calculate(ColumnName) + If Index(ColumnValue, @RM, 1) then + Convert @STM to Char(248) in ColumnValue + Convert @TM to Char(249) in ColumnValue + Convert @SVM to @STM in ColumnValue + Convert @VM to @TM in ColumnValue + Convert @FM to @SVM in ColumnValue + Convert @RM to @VM in ColumnValue + end else + If Index(ColumnValue, @FM, 1) then + Convert @STM to Char(249) in ColumnValue + Convert @TM to @STM in ColumnValue + Convert @SVM to @TM in ColumnValue + Convert @VM to @SVM in ColumnValue + Convert @FM to @VM in ColumnValue + end + end + + End Case + + // If there is a conversion pattern then apply it. + If Len(Conv) then ColumnValue = Oconv(ColumnValue, Conv) + +* If KeyPart EQ 0 then +* ColumnNames = Delete(ColumnNames, ColumnCnt, 0, 0) +* end else + ColumnValues := ColumnValue : @FM +* end + end + Next ColumnName + end + + ColumnValues[-1, 1] = '' + Memory_Services('SetValue', ServiceKeyID, ColumnValues, CacheName$) + end else + ErrorMessage = KeyID : ' is not a valid row in the ' : TableName : ' table.' + HTTP_Services('SetResponseError', '', '', 404, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Unable to open the dictionary table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' dictionary table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Unable to open the database table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Required arguments are missing so just set a 404 status code. + ErrorMessage = 'Required arguments are missing.' + HTTP_Services('SetResponseError', '', '', 404, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end + + Response = ColumnValues + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetMVGroupNames +// +// TableName - Name of the database table. - [Required] +// ColumnNames - An @FM delimited list of column names. - [Required] +// +// Gets the MV group names for the dictionary columns passed in. Note: the ColumnNames argument should be the same list +// that was returned from the GetColumnNames service. This will return an @FM delimited list of MV group +// names. Thus, for non-multivalue fields, the values will be empty. The MV group names will be returned in lower case. +//---------------------------------------------------------------------------------------------------------------------- +Service GetMVGroupNames(TableName, ColumnNames) + + ServiceKeyID := '*' : SRP_Hash(TableName : ColumnNames, 'SHA-1', 'BASE32') + MVGroupNames = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If MVGroupNames EQ '' then + If (TableName NE '') AND (ColumnNames NE '') then + Open TableName to hTable then + Open 'DICT.' : TableName to @DICT then + Read Fields from @DICT, '%FIELDS%' else Fields = '' + MVGroupNames = '' + AllColumnNames = Fields + AllGroupNames = Fields + // Convert to upper case for now so that matches against the dictionary column names can be made. + Convert @Lower_Case to @Upper_Case in ColumnNames + // Loop through the fields and append the matching MV group names to the list. + NumColumns = DCount(ColumnNames, @FM) + For ColumnCnt = 1 to NumColumns + ColumnName = ColumnNames + Locate ColumnName in AllColumnNames using @VM setting vPos then MVGroupNames := AllGroupNames<0, vPos> : @FM + Next ColumnCnt + MVGroupNames[-1, 1] = '' + Convert @Upper_Case to @Lower_Case in MVGroupNames + Memory_Services('SetValue', ServiceKeyID, MVGroupNames, CacheName$) + end else + // Unable to open the dictionary table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' dictionary table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Unable to open the database table. Set a 500 status code. + ErrorMessage = 'Unable to open the ' : TableName : ' table.' + HTTP_Services('SetResponseError', '', '', 500, ErrorMessage) + Error_Services('Add', ErrorMessage) + end + end else + // Required arguments are missing so just set a 404 status code. + ErrorMessage = 'Required arguments are missing.' + HTTP_Services('SetResponseError', '', '', 404, 'Required arguments are missing.') + Error_Services('Add', ErrorMessage) + end + end + + Response = MVGroupNames + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// UpdateDatabaseRow +// +// Updates the database row with the data contained in the Request Body. This will write the updated row data to the +// table and it will update the HTTP response status and headers as needed. This gosub is used by the PostDatabaseItem, +// PutDatabaseItem, and PatchDatabaseItem services. +//---------------------------------------------------------------------------------------------------------------------- +UpdateDatabaseRow: + + // The new resource will have been put into the POST string. + Body = HTTP_Services('GetHTTPPostString') + // The POST string will have been encoded so use percent (URL) decoding. + Body = HTTP_Services('DecodePercentString', Body) + Convert @Lower_Case to @Upper_Case in AllowedColumnNames + + If Body EQ '' then + ParseResponse = SRP_JSON(hBody, 'NEW', 'OBJECT') + end else + ParseResponse = SRP_JSON(hBody, 'PARSE', Body) + end + If (ParseResponse EQ '') OR (ParseResponse EQ 1) then + // Go through the column names in the JSON object and map the column values to the respective + // field positions in the database row. + Fields = Xlate('DICT.' : TableName, '%FIELDS%', '', 'X') + NumColumns = SRP_JSON(hBody, 'GETCOUNT') + ColumnNames = SRP_JSON(hBody, 'GETMEMBERS') + If ColumnNames NE '' then + For Each ColumnName in ColumnNames using @FM setting ColumnCnt + ColumnName = ColumnNames + hColumn = SRP_JSON(hBody, 'GET', ColumnName) + JSONType = SRP_JSON(hColumn, 'TYPE') + If ColumnName[1, 1] NE '_' then + // Ignore special properties which are for HATEOAS purpose. + Begin Case + Case JSONType _EQC 'Array' + // Count the number of members in the array then loop through to build the @VM value list. + ColumnValues = '' + NumItems = SRP_JSON(hColumn, 'GETCOUNT') + For ItemCnt = 1 to NumItems + hItem = SRP_JSON(hColumn, 'GET', ItemCnt) + ItemNames = SRP_JSON(hItem, 'GETMEMBERS') + If ItemNames NE '' then + For Each ColumnName in ItemNames using @FM setting ItemPtr + ColumnValues = ColumnValues : SRP_JSON(hItem, 'GETVALUE', ColumnName, '') : @VM + Next ItemName + end + SRP_JSON(hItem, 'Release') + Next NumItems + If ItemNames NE '' then + For Each ColumnName in ItemNames using @FM setting ItemPtr + ColumnValue = ColumnValues + ColumnValue[-1, 1] = '' + GoSub UpdateColumnData + Next ColumnName + end + + Case JSONType _EQC 'Object' + // This is likely an MV group with one or more embedded arrays which need to be processed + // individually. + NumMVColumns = SRP_JSON(hColumn, 'GETCOUNT') + MVColumnNames = SRP_JSON(hColumn, 'GETMEMBERS') + If MVColumnNames NE '' then + For Each ColumnName in MVColumnNames using @FM setting MVColumnCnt + ColumnName = MVColumnNames + hMVColumn = SRP_JSON(hColumn, 'GET', ColumnName) + ColumnValue = '' + NumValues = SRP_JSON(hMVColumn, 'GETCOUNT') + For ValueCnt = 1 to NumValues + ColumnValue := SRP_JSON(hMVColumn, 'GETVALUE', ColumnName : '[' : ValueCnt : ']', '') : @VM + Next ValueCnt + ColumnValue[-1, 1] = '' + SRP_JSON(hMVColumn, 'RELEASE') + GoSub UpdateColumnData + Next ColumnName + end + + Case Otherwise$ + // This is just a regular column. Get the value. + ColumnValue = SRP_JSON(hBody, 'GETVALUE', ColumnName, '') + GoSub UpdateColumnData + + End Case + end + + SRP_JSON(hColumn, 'RELEASE') + Next ColumnName + end + + Write DataRow to hTable, KeyID then + // The database row has been successfully updated. Set the response status as originally identified by the + // calling service. Set the Content-Location response header with the new or updated items URL so the + // client can retrieve the resource if needed. + HTTP_Services('SetResponseStatus', StatusCode) + HTTP_Services('SetResponseHeaderField', 'Location', ItemURL) + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error writing ' : KeyID : ' to the ' : TableName : ' table.') + end + end else + HTTP_Services('SetResponseError', '', '', 400, ParseResponse) + end + Unlock hTable, KeyID else Null + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// UpdateColumnData +// +// Updates the specified database column with the indicated value. This only updates the dynamic array and does not +// write the data to the table. +//---------------------------------------------------------------------------------------------------------------------- +UpdateColumnData: + + Convert @Lower_Case to @Upper_Case in ColumnName + + AllowContinue = True$ ; // Assume this can continue for now. + If AllowedColumnNames NE '' then + Locate ColumnName in AllowedColumnNames using @FM setting AllowedFound else + // This column is not approved for updating. + AllowContinue = False$ + end + end + + Locate ColumnName in Fields using @VM setting vPos then + Pos = Fields + Type = Fields + If Type EQ 'F' then + If AllowContinue EQ True$ then + Conv = Fields + If Len(Conv) then ColumnValue = IConv(ColumnValue, Conv) + DataRow = ColumnValue + end else + // This column is not allowed to be updated so make sure it retains the value stored in the database. + DataRow = OrigDataRow + end + end + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_SERVICES.txt new file mode 100644 index 0000000..a1092bb --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_SERVICES.txt @@ -0,0 +1,3123 @@ +Function HTTP_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + History : (Date, Initials, Notes) + 02/16/15 dmb [SRPFW-82] Original programmer. + 04/07/15 dmb [SRPFW-82] Add CRLF$ equate. + 07/20/15 dmb [SRPFW-82] Optimize SetRequestHeaderFields by removing the call to GetHTTPAdditionalValues + out of the loop. + 11/01/15 dmb [SRPFW-86] Fix reference to '<' to '>' in DecodePercentString service when swapping '>' + (Thanks Anton). + 02/23/16 dmb [SRPFW-106] Add GetVersion service. + 02/25/16 dmb [SRPFW-108] Add GetHomeURL, GetAPIRoolURL, GetCapturePath, GetEnableAuthenticationFlag, and + GetRealmValue services. + 03/09/16 dmb [SRPFW-110] Update the GetResponseStatus service to use the + SYSENV\SRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES to use the default phrase if one is not + provided. + 03/09/16 dmb [SRPFW-110] Update the GetResponse service to use the GetResponseStatus service to populate + the response body if there is no body already generated by a service. + 03/09/16 dmb [SRPFW-111] Add GetEntryPointService service. + 03/09/16 dmb [SRPFW-112] Add GetFullEndpointURL service. + 03/09/16 dmb [SRPFW-112] Update argument signatures for the RunHTTPService to be simpler and more + intuitive. + 03/16/16 dmb [SRPFW-113] Update the GetFullEndpointURL service so end points that are also the same as + the API URL do not display a "/" at the end. + 03/17/16 dmb [SRPFW-113] Update the SetResponseHeaderField service so Access-Control-Allow-Headers is + added to the list of header fields that use ", " rather than ";" to delimit multiple values. + 03/24/16 dmb [SRPFW-116] Add GetFlushCacheFlag service. + 03/24/16 dmb [SRPFW-117] Update the ClearSettings service to call the GetFlushCacheFlag service and use + this flag to determine if a Flush and GarbageCollect statement should be called. + 03/27/16 dmb [SRPFW-123] Add GetBestContentNegotiation service. + 09/30/16 dmb [SRPFW-127] Fix DecodePercentString to convert %09, %0A, and %0D properly. + 11/08/16 dmb Retrofit the entire service to use Enhanced BASIC+. + 11/08/16 dmb Update the SetQueryField service to only require the Name argument to be populated. + 02/21/17 dmb [SRPFW-152] Add SetHTTP value services to correspond with the existing GetHTTP value + services. + 02/27/17 dmb [SRPFW-125] Add the GetAbortedService service. + 03/03/17 dmb [SRPFW-154] Add the SetSessionID, GetSessionID, SetOECGIProcErr, GetOECGIProcErr, and + CreateLogFile services. + 03/03/17 dmb [SRPFW-154] Add SessionID@ and ProcErr@ to the named common and to the list of variables + cleared in the ClearSettings service. + 03/04/17 dmb [SRPFW-154] Add the GetEnableLoggingFlag service. + 03/04/17 dmb [SRPFW-154] Update CreateLogFile service to use the GetEnableLoggingFlag service. + 03/04/17 dmb [SRPFW-154] Update the SetRequestHeaderFields service to rely upon the + GetHTTPRegistrySettings service rather than the SRP_Registry function to identify the + AdditionalValues that were passed in through the OECGI Request array. This eliminates + dependency upon the name of the OECGI executable. + 03/07/17 dmb [SRPFW-155] Add the GetDebuggerSetting and GetDebuggerService services. + 07/01/17 dmb [SRPFW-184] Additional refactoring. + 07/07/17 dmb [SRPFW-154] Add the GetLogErrorsOnlyFlag service. Update the CreateLogFile to support this + service. + 09/22/17 dmb [SRPFW-193] Update the GetEntryPointService service to support fully qualified web service + routine names. + 10/22/18 dmb [SRPFW-253] Add the GetWhitelistedIPs and IPIsPermitted services. + 10/31/18 dmb [SRPFW-255] Replace Xlate with ReadDataRow for all services referencing SetupTable$ + 10/31/18 dmb [SRPFW-255] Update GetHomeURL service to automatically prepend HTTP or HTTPS based on the + request if this is not already specified in the user defined Home URL setting. + 11/01/18 dmb [SRPFW-255] Update GetNonAuthenticatedURLs service to automatically prepend the API URL if + this is not already specified in the user defined setting. + 11/01/18 dmb [SRPFW-255] Add the GetEnableHTTPBasicAuthenticationFlag service. + 11/01/18 dmb [SRPFW-255] Add the GetNewPasswordTimeToLive service. + 11/01/18 dmb [SRPFW-255] Add the GetOldPasswordTimeToLive service. + 11/01/18 dmb [SRPFW-256] Add the GetInvalidPasswordLimit service. + 11/01/18 dmb [SRPFW-256] Add the GetContainmentAction service. + 11/01/18 dmb [SRPFW-256] Add the GetServerEnabled service. + 11/01/18 dmb [SRPFW-256] Add the SetServerEnabled service. + 11/09/18 dmb [SRPFW-256] Add the GetTotalInvalidPasswordAttempts service. + 11/09/18 dmb [SRPFW-256] Add the SetTotalInvalidPasswordAttempts service. + 11/18/18 dmb [SRPFW-257] Add the RunWebAPI service. + 11/18/18 dmb [SRPFW-257] Add the GetAPICallProcedure service. + 11/19/18 dmb [SRPFW-257] Add the GetWebAPI service. + 11/18/18 dmb [SRPFW-257] Update the RunWebAPI service to use the GetWebAPI service. + 11/19/18 dmb [SRPFW-257] Add the UpdateWebAPIs service. + 11/20/18 dmb [SRPFW-257] Add support to store SYSENV records keyed to the local application. + 11/22/18 dmb [SRPFW-253] Update the IPIsPermitted service to support wildcard and IP range values. + 12/02/18 dmb [SRPFW-257] Convert GetLocalAppKeyID gosub lable to a service so Web APIs can call it. + 12/02/18 dmb [SRPFW-257] Add the SetResponseError service. + 12/06/18 dmb [SRPFW-257] Add a call to the LoremIpsum service when building a new API using the + UpdateWebAPIs service. + 12/10/18 dmb [SRPFW-257] Update RunWebAPI service to support sub-resources. + 12/11/18 dmb [SRPFW-257] Remove training '/' character if one exists in the GetFullEndpointURL service. + 12/12/18 dmb [SRPFW-257] Add GetStatus log type. + 12/24/18 dmb [SRPFW-257] Refactor RunWebAPI so resource IDs are identified better. + 02/03/19 dmb [SRPFW-257] Update GetFullEndpointURL service to append query params. + 04/18/19 dmb [SRPFW-271] UpdateDecodePercentString service to support conversion of left quotation mark + (i.e., %E2%80%9C). + 04/22/19 dmb [SRPFW-271] Add call to Utility_DotNet in the CreateLogFile service so that Response logs + can provide UTC formatted date/time stamps for the request. + 05/24/19 dmb Update all GetHTTPValue services to support a DecodePercentString flag that will be used to + automatically call the DecodePercentString service before returning the HTTP value. + 05/31/19 dmb [SRPFW-276] Update the SetResponseError service to use "detail" instead of "Detail". + 06/24/19 dmb [SRPFW-276] Remove larges blocks of code from the RunWebAPI service and convert these into + new services: GetEndpoint, IsValidEndpoint, SetSupportedEndpoints, and GetEndpointPattern. + 06/24/19 dmb [SRPFW-276] Update the CreateLogFile service to confirm if the endpoint resource should be + excluded from being logged. + 06/24/19 dmb [SRPFW-276] Update the GetHomeURL service to use the GetHTTPServerName service first and + then rely upon the HTTP_FRAMEWORK_SETUP_HOME_URL$ value. + 07/16/19 dmb [SRPFW-277] Deprecate local IsValidEndpoint service. Update RunWebAPI service to use the + IsValidEndpoint service from the HTTP_Resource_Manager_Services module. + 07/16/19 dmb [SRPFW-277] Update the CreateLogFile service to use the new GetResourceProperty service to + determine if logging is excluded for the current endpoint. + 07/16/19 dmb [SRPFW-277] Deprecate the GetEndpointPattern service since it is no longer a dependency with + any other services. + 07/16/19 dmb [SRPFW-277] Deprecate the SetSupportedEndpoints service since it is no longer a dependency + with any other services. + 07/17/19 dmb [SRPFW-277] Update the UpdateWebAPIs service to use the GetResourceProperty service to get + the supported HTTP methods and also to use the GetResourceSignature service to build the + list of API signatures. + 07/18/19 dmb [SRPFW-277] Update the CreateLogFile service to parse the Get_Status error better. + 08/10/19 dmb [SRPFW-278] Update the CreateLogFile service to create/append a log index in addition to a + detail log file. This will be used by the HTTP Logs utility to quickly populate several + logs. + 09/22/19 dmb [SRPFW-278] Fix VNAV in UpdateWebAPIs service. The APIProcedureName variable was unassigned + in some conditions. + 09/23/19 dmb [SRPFW-278] Update the CreateLogFile service to support the new Remote Address / Execute + Time column. Fix minor bug that appended a '/' when the endpoint was the same as the API + Root. + 09/24/19 dmb [SRPFW-278] Update the UpdateWebAPIs service to support the creation of a local copy of a + Web API that exists in an inherited application. + 09/24/19 dmb [SRPFW-278] Update the URLRequiresAuthentication service to support exact matching endpoints + and wildcard endpoints. + 09/25/19 dmb [SRPFW-278] Update the GetResponse and SetResponseBody services to auto-detect PNG, JPG, and + GIF data formats. + 12/09/19 dmb [SRPFW-296] Update all calls to Memory_Services to use a specific cache name. + 12/16/19 dmb [SRPFW-296] Update the CreateLogFile service to fix a VNAV bug when GetStatus logs are + created. Clean up the log row and the log body. + 01/18/20 dmb [SRPFW-296] Update the CreateLogFile service by replacing Utility_DotNet('TIMEZONE') with + the SRP_DateTime service (SRP Utilities 2.1) to avoid localization problems and potential + 502 Bad Gateway errors. + 01/23/20 dmb [SRPFW-296] Update the RunWebAPI service to support the HEAD method if the GET method is + also supported. + 01/23/20 dmb [SRPFW-296] Update the UpdateWebAPIs service to add a HEAD API if there is a GET API. + 02/08/20 dmb [SRPFW-309] Update the SetResponseHeaderField service so the Append flag creates multiple + Set-Cookie headers rather than folding them. + 02/09/20 dmb [SRPFW-309] Add SetCookie service to make it easier to build a Set-Cookie response header. + 02/12/20 dmb [SRPFW-311] Update the SetResponseError service to correct a typo. It was calling the + SetErrorResponse service. + 03/04/20 dmb [SRPFW-311] Update the GetResponseHeaderFields service to check the HTTPScriptName value + and use LF$ instead of CRLF$ as the delimiter when OECGI is not the .EXE version. + 04/22/20 dmb [SRPFW-313] Update the SetCookie service to use Max-Age instead of MaxAge. + 04/22/20 dmb [SRPFW-313] Update the SetCookie service to assume any internal datetime value being passed + in is in local time. Use the ToUTC service to convert to UTC/GMT time. + 05/22/20 dmb [SRPFW-313] Update the SetCookie service to always append an equal sign (=) to the cookie's + name, even if the value is empty. Otherwise, the correct cookie won't get referenced if the + intent is to clear the value. + 05/22/20 dmb [SRPFW-313] Update the GetNonAuthenticatedURLs service to use the new + HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_PATHS$ equate. + 06/15/20 dmb [SRPFW-313] Rename GetNonAuthenticatedURLs service to GetNonAuthenticatedPaths and update + the URLRequiresAuthentication service to call the new service name. + 06/15/20 dmb [SRPFW-313] Update the URLRequiresAuthentication service to support query param validations. + 06/30/20 dmb [SRPFW-313] Add the IsIPWhitelisted, GetBannedIPs, and IsIPBanned services. + 06/30/20 dmb [SRPFW-313] Update the IPIsPermitted service to call the IsIPWhitelisted and IsIPBanned + services to determine result. + 07/08/20 dmb [SRPFW-313] Add the AddBannedIP and RemoveBannedIP services. + 07/11/20 dmb [SRPFW-313] Fix bug in the AddBannedIP service to contactenate the IP using @VM rather than + @FM. + 07/22/20 dmb Update the AddBannedIP service to check first to see if the IP is whitelisted. If so, then + don't add the IP to the banned list. + 07/23/20 dmb [SRPFW-313] Fix bug in the IsIPWhitelisted and IsIPBanned services that would consider an IP + to be in the list if the IP characters are exactly the same as in the list but the list IPs + have additional characters. + 07/26/20 dmb [SRPFW-313] Add the GetWhitelistedIPsType service. + 07/26/20 dmb [SRPFW-313] Update the IPIsPermitted service to support the new Whitelisted IP type value. + 07/26/20 dmb [SRPFW-313] Add the IsIPPermitted service as a synonym to the IPIsPermitted service. This + name conforms to the IsIPWhitelisted and IsIPBanned service names. + 10/28/21 dmb Update the SetRequestHeaderFields service to first check to see if the field begins with + "HTTP_" before stripping it out. This allows for support of OECGI 4.0.2.0. + 10/28/21 dmb Update the DecodePercentString service to use SRP_Decode(String, 'URL') instead of + successive Swap statements. This fixes a problem where subsequent swaps are unaware of + legitmate % characters and attempts to swap them again. + 12/22/21 dmb Update the CreateLogFile and SetOECGIRequest services to use the official + ADDITIONAL_VALUES_STRING$ equate. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert HTTP_INSERTS +$insert HTTP_FRAMEWORK_SETUP_EQUATES +$insert INET_EQUATES +$insert INET_HEADERS +$insert REPOSERRORS + +Equ CRLF$ to \0D0A\ +Equ LF$ to \0A\ +Equ CacheName$ to 'SRPHTTPFramework' +Equ OnlyAllowWhitelistedIPs$ to 1 +Equ AlwaysAllowWhitelistedIPs$ to 2 + +Common /HTTPServices/ WebAPIList@, HTTPServiceList@, Request@, ProcErr@, RequestHeaderFields@, RequestHeaderValues@, ResponseHeaderFields@, ResponseHeaderValues@, ResponseStatusCode@, ResponseStatusPhrase@, ResponseBody@, ResponseBodyIsBinary@, SelfURL@, QueryFields@, QueryValues@, SessionID@, LogCounter@ + +Declare function Memory_Services, Error_Services, Database_Services, Get_Property, RetStack, SRP_Array, Repository +Declare function RTI_OS_Directory, SRP_Stopwatch, SRP_Registry, SRP_Sort_Array, SRP_Rotate_Array, GetCurrentProcessId +Declare function HTTP_Resource_Services, HTTP_Resource_Manager_Services, Logging_Services, SRP_Path, SRP_DateTime +Declare function SRP_Num +Declare subroutine Memory_Services, Error_Services, SRP_Stopwatch, Database_Services, Send_Message, Repository +Declare subroutine HTTP_Resource_Services, HTTP_Resource_Manager_Services, Logging_Services + +// Clear any error conditions. +Error_Services('Clear') + +GoToService else + HTTP_Services('SetResponseError', '', '', 404, Service : ' is not a valid service request within the HTTP services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ +Options RESPONSEHEADERNAMES = 'Access-Control-Allow-Headers', 'Access-Control-Allow-Methods', 'Access-Control-Allow-Origin', 'Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-Location', 'Content-Disposition', 'Content-Type', 'Date', 'Expires', 'Last-Modified', 'Link', 'Location', 'Retry-After', 'Server', 'Set-Cookie', 'Transfer-Encoding', 'Vary', 'WWW-Authenticate', +Options CONTENTNEGOTIATIONFIELDS = 'Accept', 'Accept-Charset', 'Accept-Encoding', 'Accept-Language' +Options LOGTYPES = 'Request', 'Response', 'Aborted', 'Debugger' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// RunWebAPI +// +// Method - The HTTP method for the URL endpoint being requested. - [Optional] +// Endpoint - The URL endpoint (not including the Home or API Root) being requested. - [Optional] +// +// Calls the web API procedure for the resource associated to the URL endpoint being requested. Note, when this service +// is called normally the arguments are empty. They only exist for testing a web API without having to run from an +// actual HTTP request. +//---------------------------------------------------------------------------------------------------------------------- +Service RunWebAPI(Method, Endpoint) + + // The Method and Endpoint arguments will normally be empty, but they might be populated for testing purposes. If + // empty, just get their values from the appropriate services. + If Endpoint EQ '' then Endpoint = HTTP_Services('GetEndpoint') + If Method EQ '' then Method = HTTP_Services('GetHTTPRequestMethod') + + ValidMethod = True$ ; // Assume the method is valid for now. + ValidQuery = True$ ; // Assume the method is valid for now. + ValidEndpoint = HTTP_Resource_Manager_Services('IsValidEndpoint', Endpoint) + If ValidEndpoint then + FullEndpointURL = HTTP_Services('GetFullEndpointURL') ; // Used for any SetErrorResponse services if needed. + Resource = HTTP_Resource_Manager_Services('GetResourceProperty', Endpoint, 'RESOURCE') + GetString = HTTP_Services('GetHTTPGetString') + If GetString NE '' then + // Endpoint contains at least one query param. Note, if the supported query param is a "*", this means + // any query param is valid. + ResourceQueryParams = HTTP_Resource_Manager_Services('GetResourceProperty', Endpoint, 'QUERY_PARAMS') + If ResourceQueryParams NE '*' then + Convert @Upper_Case to @Lower_Case in ResourceQueryParams + Convert '&' to @FM in GetString + Convert '=' to @VM in GetString + GetString = SRP_Array('Rotate', GetString) + QueryParams = GetString<1> + Convert @Upper_Case to @Lower_Case in QueryParams + For Each QueryParam in QueryParams using @VM + Locate QueryParam in ResourceQueryParams using ',' setting cPos else ValidQuery = False$ + While ValidQuery EQ True$ + Next QueryParam + end + end + // If the query params are valid, check to see if the HTTP method is valid. + If ValidQuery EQ True$ then + ResourceMethods = HTTP_Resource_Manager_Services('GetResourceProperty', Endpoint, 'METHODS') + Locate 'GET' in ResourceMethods using ',' setting cPos then + // Whenever the GET method is supported then the HEAD method should also be supported. + ResourceMethods := ',HEAD' + end + ResourceMethods := ',OPTIONS' ; // Always support the OPTIONS method + If ResourceMethods[1, 1] EQ ',' then ResourceMethods = ResourceMethods[2, 999] + Locate Method in ResourceMethods using ',' setting cPos else + ValidMethod = False$ + end + end + end + + // Resolve the endpoint with the appropriate HTTP response. + Begin Case + Case (ValidEndpoint EQ True$) AND (ValidMethod EQ True$) AND (ValidQuery EQ True$) + // Valid endpoint and method. Call the API if it exists or create a default response if it doesn't. + // Note: It is critical that the web API routine be named in this format: _API + If Method EQ 'OPTIONS' then + // All OPTIONS methods are handled the same way. + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + If ResourceMethods NE '' then + For Each ResourceMethod in ResourceMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', ResourceMethod, True$) + Next ResourceMethod + end + end else + WebAPI = HTTP_Services('GetWebAPI', Resource) + If WebAPI NE '' then + // Call the Web API as indicated. + APISignature = HTTP_Resource_Manager_Services('GetResourceSignature', Endpoint, Method) + Call @WebAPI(APISignature) + end else + // This resource doesn't have an API routine created yet. Returns a default response. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but the web API module has not yet been created.') + end + end + + Case ValidMethod EQ False$ + // Endpoint is valid, but the method is not. + HTTP_Services('SetResponseError', '', '', 405, '', FullEndpointURL) + If ResourceMethods NE '' then + For Each ResourceMethod in ResourceMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', ResourceMethod, True$) + Next ResourceMethod + end + + Case ValidQuery EQ False$ + // Endpoint is valid, but one of the query params is not. + HTTP_Services('SetResponseError', '', '', 404, QueryParam : ' is not valid for this web API endpoint.', FullEndpointURL) + + Case Otherwise$ + // Must be an invalid endpoint. + HTTP_Services('SetResponseError', '', '', 404, 'This is not a valid web API endpoint.', FullEndpointURL) + End Case + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RunHTTPService +// +// HTTPService - The HTTP (or web) service to call. - [Required] +// RemainingURL - This is the remaining portion of the URL that has not yet been processed by previous services. +// +// Calls the indicated HTTP web service routine. +//---------------------------------------------------------------------------------------------------------------------- +Service RunHTTPService(HTTPService, RemainingURL) + + If Len(HTTPService) then + Convert @Lower_Case to @Upper_Case in HTTPService + + // Note: It is critical that web service routine be named in this format: HTTP__SERVICES + IsHTTPService = False$ ; // Assume the web service does not exist for now. + NumApps = Count(@APPID, @FM) + (@APPID NE '') + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SysObjKey = '$HTTP_' : HTTPService : '_SERVICES' + end else + SysObjKey = '$HTTP_' : HTTPService : '_SERVICES' : '*' : @APPID + end + IsHTTPService = (Index(HTTPServiceList@, SysObjKey, 1) GT 0) + Until IsHTTPService + Next AppCnt + + If Not(IsHTTPService) then + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SysObjKey = '$HTTP_' : HTTPService : '_SERVICES' + end else + SysObjKey = '$HTTP_' : HTTPService : '_SERVICES' : '*' : @APPID + end + IsHTTPService = (Xlate('SYSOBJ', SysObjKey, 0, 'X') GT '') + Until IsHTTPService + Next AppCnt + If (IsHTTPService) then + If Len(HTTPServiceList@) then HTTPServiceList@ := @FM + HTTPServiceList@ := SysObjKey + end + end + + If Not(IsHTTPService) then + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SysObjKey = '$' : HTTPService + end else + SysObjKey = '$' : HTTPService : '*' : @APPID + end + IsHTTPService = (Index(HTTPServiceList@, SysObjKey, 1) GT 0) + Until IsHTTPService + Next AppCnt + end + + If Not(IsHTTPService) then + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SysObjKey = '$' : HTTPService + end else + SysObjKey = '$' : HTTPService : '*' : @APPID + end + IsHTTPService = (Xlate('SYSOBJ', SysObjKey, 0, 'X') GT '') + Until IsHTTPService + Next AppCnt + If (IsHTTPService) then + If Len(HTTPServiceList@) then HTTPServiceList@ := @FM + HTTPServiceList@ := SysObjKey + end + end + + If IsHTTPService then + // Call the HTTP service as indicated. + HTTPRoutine = 'HTTP_' : HTTPService : '_SERVICES' + Call @HTTPRoutine(RemainingURL) + end else + HTTP_Services('SetResponseError', '', '', 404, HTTPService : ' is not a valid web service.') + end + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetSelfURL +// +// SelfURL - The self URL relevant to the current service. - [Required] +// +// Sets the self URL for the current service. The self URL is the URL that identifies itself. It is typically returned +// in responses to serve as a self-referencing ID apart from other URLs that might be returned which direct the caller +// to other services. +//---------------------------------------------------------------------------------------------------------------------- +Service SetSelfURL(SelfURL) + + If Len(SelfURL) then + SelfURL@ = SelfURL + end else + HTTP_Services('SetResponseError', '', '', 400, 'SelfURL argument was missing a value in the ' : Service : '.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSelfURL +// +// Returns the self URL for the current service. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSelfURL() + + Response = SelfURL@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetSessionID +// +// Creates and sets a unique Session ID for the current HTTP Request/Response. This is used to stamp various logs. +//---------------------------------------------------------------------------------------------------------------------- +Service SetSessionID() + + ProcessID = GetCurrentProcessId() + SessionID@ = Oconv(Date(), 'DJS-') : '_' : Oconv(Time(), 'MTS-') : '_' : ProcessID + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSessionID +// +// Returns the unique Session ID for the current HTTP Request/Response. This is used to stamp various logs. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSessionID() + + If SessionID@ EQ '' then + // For some reason, the SetSessionID service has not been called. This could occur if a process that is not + // called within the normal SRP HTTP Framework stack (e.g., an INET process) calls this service. Go ahead + // and call the service now so the GetSessionID can be used. + HTTP_Services('SetSessionID') + end + Response = SessionID@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// CreateLogFile +// +// LogType - The type of log to be written. This can be user-defined. - [Required] +// Data - Information used to create the log body. Some log types ignore this. - [Optional] +// +// Creates a log file in the designated capture path. +//---------------------------------------------------------------------------------------------------------------------- +Service CreateLogFile(LogType=LOGTYPES, Data) + + EnableLogging = HTTP_Services('GetEnableLoggingFlag') + LogErrorsOnly = HTTP_Services('GetLogErrorsOnlyFlag') + Endpoint = HTTP_Services('GetEndpoint') + ExcludeLogging = Http_Resource_Manager_Services('GetResourceProperty', Endpoint, 'EXCLUDE_LOGGING') + + If (LogType NE '') AND (EnableLogging EQ True$) AND (ExcludeLogging NE True$) then + CapturePath = HTTP_Services('GetCapturePath') + If RTI_OS_Directory('EXISTS', CapturePath) EQ True$ then + // Prepare the log body based on the log type. + LogBody = '' + LogRow = '' + Begin Case + Case (LogType _EQC 'Request') AND (LogErrorsOnly EQ False$) + Request = HTTP_Services('GetOECGIRequest') + ProcErr = HTTP_Services('GetOECGIProcErr') + // If ProcErr is populated, treat this as an error scenario. Otherwise, treat this is a normal HTTP + // Request. + If ProcErr NE '' then + LogBody = 'ProcErr Argument' : CRLF$ + LogBody := Str('-', 80) : CRLF$ + LogBody := ProcErr + end else +* Swap @FM with CRLF$ in LogBody + LogBody = 'Request Argument' : CRLF$ + LogBody := Str('-', 80) : CRLF$ + LogBody := Fmt('<01> HTTPQueryString', 'L#30') : ': ' : Request : CRLF$ + PathInfo = Request + LogBody := Fmt('<02> HTTPPathInfo', 'L#30') : ': ' : PathInfo : CRLF$ + LogBody := Fmt('<03> HTTPContentType', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<04> HTTPContentLength', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<05> HTTPGatewayInterface', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<06> HTTPHTTPS', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<07> HTTPAccept', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<08> HTTPCookie', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<09> HTTPFrom', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<10> HTTPReferer', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<11> HTTPUserAgent', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<12> HTTPTranslated', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<13> HTTPRemoteAddr', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<14> HTTPRemoteHost', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<15> HTTPRemoteIdent', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<16> HTTPRemoteUser', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<17> HTTPRequestMethod', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<18> HTTPScriptName', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<19> HTTPServerName', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<20> HTTPServerPort', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<21> HTTPServerProtocol', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<22> HTTPServerSoftware', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<23> HTTPServerURL', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<24> HTTPNoURLDecode', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<25> HTTPResponseIsBinary', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<26> HTTPRegistrySettings', 'L#30') : '+ ' : CRLF$ + RegistrySettings = Request + NumRegistrySettings = DCount(RegistrySettings, '&') + AdditionalNames = '' ; // Initialize the AdditionalValues registry setting. Update as required. + For RegistryCnt = 1 to NumRegistrySettings + RegistrySetting = Field(RegistrySettings, '&', RegistryCnt, 1) + Name = RegistrySetting[1, '='] + Value = RegistrySetting[Col2() + 1, 999] + If Name _EQC 'AdditionalValues' then + Value = HTTP_Services('DecodePercentString', Value) + AdditionalNames = Value + end + LogBody := Space(5) : Fmt(Name, 'L#25') : ': ' : Value : CRLF$ + Next RegistryCnt + LogBody := Fmt('<27> HTTPOECGIVersion', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<28> HTTPGetString', 'L#30') : ': ' : Request : CRLF$ + LogBody := Fmt('<29> HTTPPostString', 'L#30') : ': ' : HTTP_Services('DecodePercentString', Request) : CRLF$ + LogBody := Fmt('<30> HTTPAdditionalValues', 'L#30') : '+ ' : CRLF$ + NumAdditionalNames = DCount(AdditionalNames, ',') + AdditionalValues = Request + For NameCnt = 1 to NumAdditionalNames + Name = Field(AdditionalNames, ',', NameCnt, 1) + Name = Name[6, 99] ; // Remove the "HTTP_" prefix the Registry requires. + Convert '_' to ' ' in Name + Name = NameCap(Name) ; // Apply casing to make it prettier to read. + Convert ' ' to '-' in Name + LogBody := Space(5) : Fmt(Name, 'L#25') : ': ' : AdditionalValues<0, NameCnt> : CRLF$ + Next NameCnt + LogBody[-2, 2] = '' ; // Remove the last CR/LF. + If PathInfo NE '' then + If PathInfo[1, 1] NE '/' then PathInfo = '/' : PathInfo + end + LogRow = Request : @FM : Request : @FM : HTTP_Services('GetAPIRootURL', False$) : PathInfo : @FM : Request + end + + Case LogType _EQC 'Response' + // The HTTP Response is assumed to be in the Data argument. + If Not(LogErrorsOnly) OR (LogErrorsOnly AND ((ResponseStatusCode@[1, 1] EQ 4) OR (ResponseStatusCode@[1, 1] EQ 5))) then + TimeToExecute = SRP_Stopwatch('GetBenchmark', 'WebAPI') + HTTPFrameworkVer = HTTP_Services('GetVersion') + Swap CRLF$ with ' - ' in HTTPFrameworkVer + LogBody := 'HTTP Framework : ' : 'v' : HTTPFrameworkVer : CRLF$ + LogBody := 'Time to Execute : ' : TimeToExecute : CRLF$ + LogBody := 'Request Date/Time: ' : SRP_DateTime('Format', SRP_DateTime('Now', True$), "DDD, DD MMM YYYY hh:mm:ss 'GMT'") : CRLF$ + LogBody := 'Request Method : ' : HTTP_Services('GetHTTPRequestMethod') : CRLF$ + LogBody := 'Request URL : ' : HTTP_Services('GetFullEndpointURL')[1, 'F?'] : CRLF$ + AuthorizationB64 = HTTP_Services('GetRequestHeaderField', 'Authorization') + If Len(AuthorizationB64) else AuthorizationB64 = HTTP_Services('GetRequestHeaderField', 'X-Authorization') + If Len(AuthorizationB64) then + Authorization = AuthorizationB64[1, ' '] : ' ' : SRP_Decode(AuthorizationB64[Col2() + 1, 999], 'BASE64') + LogBody := 'Authorization : ' : Authorization : CRLF$ + end else + LogBody := 'Authorization : None' : CRLF$ + end + QueryParams = Http_Services('GetHTTPGetString') + If QueryParams NE '' then + LogBody := 'Query Params : ' : QueryParams : CRLF$ + end + Status = Get_Status(StatusCode) + If Status GT 0 then + LogBody := 'Get_Status() : ' : Status : ' - ' : StatusCode : CRLF$ + end + LogBody := Str('-', 80) : CRLF$ + LogBody := Data + ResponseStatus = HTTP_Services('GetResponseStatus') + StatusCode = ResponseStatus[1, ' '] + StatusPhrase = Trim(ResponseStatus[Col2() + 1, 999]) + LogRow = '' : @FM : StatusCode : @FM : StatusPhrase : @FM : TimeToExecute + end + + Case LogType _EQC 'Aborted' + // Data should contain the contents of the ProcErr argument that came in through the controller. + LogBody = 'ProcErr Argument' : CRLF$ + LogBody := Str('-', 80) : CRLF$ + LogBody := Data + ErrorCode = Data[1, ':'] + ErrorDesc = Trim(Data[Col2() + 1, 999]) + LogRow = '' : @FM : ErrorCode : @FM : ErrorDesc : @FM + + Case LogType _EQC 'Debugger' + SPStatus = Data[1, @RM] + SPStatCode = Data[Col2() + 1, @RM] + Curr_Program = Data[Col2() + 1, @RM] + CallDepth = Data[Col2() + 1, @RM] + LineNo = Data[Col2() + 1, @RM] + CallStack = Data[Col2() + 1, @RM] + If SRP_JSON(hDebuggerObj, 'NEW', 'OBJECT') then + SRP_JSON(hDebuggerObj, 'SETVALUE', 'SPStatus', SPStatus) + + OSRead RevError from 'REVERROR.DAT' then + StartPos = Index(RevError, SPStatCode<2>, 1) + SPStatDesc = RevError[StartPos, \0D\] + Swap '%1%' with SPStatCode<3> in SPStatDesc + Swap '%2%' with SPStatCode<4> in SPStatDesc + end else + SPStatDesc = SPStatCode + Swap @FM with ', ' in SPStatDesc + end + SRP_JSON(hDebuggerObj, 'SETVALUE', 'SPStatCode', SPStatDesc) + SRP_JSON(hDebuggerObj, 'SETVALUE', 'Curr_Program', Curr_Program) + SRP_JSON(hDebuggerObj, 'SETVALUE', 'CallDepth', CallDepth) + SRP_JSON(hDebuggerObj, 'SETVALUE', 'LineNo', LineNo) + If SRP_JSON(hCallStackArray, 'NEW', 'ARRAY') then + ProcCount = DCount(CallStack, @FM) + For ProcNum = 1 to ProcCount + If SRP_JSON(hProcObj, 'NEW', 'OBJECT') then + SRP_JSON(hProcObj, 'SETVALUE', 'ProcName', CallStack, 'STRING') + SRP_JSON(hProcObj, 'SETVALUE', 'LineNo', CallStack, 'NUMBER') + SRP_JSON(hCallStackArray, 'ADD', hProcObj) + SRP_JSON(hProcObj, 'RELEASE') + end + Next ProcNum + SRP_JSON(hDebuggerObj, 'SET', 'CallStack', hCallStackArray) + SRP_JSON(hCallStackArray, 'RELEASE') + end + LogBody = SRP_JSON(hDebuggerObj, 'STRINGIFY', 'STYLED') + SRP_JSON(hDebuggerObj, 'RELEASE') + end + ErrorCode = SPStatCode[1, ':'] + ErrorDesc = Trim(SPStatCode[Col2() + 1, 999]) + LogRow = '' : @FM : ErrorCode : @FM : ErrorDesc : @FM + + Case LogType _EQC 'GetStatus' + LogRow = '' : @FM : Data : @FM + Status = Get_Status(StatusCode) + If Status GT 0 then + LogBody := 'Get_Status() : ' : StatusCode<1, 1> : ' - ' : StatusCode<1, 2> : CRLF$ + end + LogBody := Str('-', 80) : CRLF$ + LogBody := Data + LogRow = '' : @FM : StatusCode<1, 1> : @FM : Trim(StatusCode<1, 2>) : @FM + + Case Otherwise$ + LogBody := Data + End Case + + If LogBody NE '' then + // Create the log file name and write the log and append the log index. + SessionID = HTTP_Services('GetSessionID') + If LogCounter@ EQ '' then LogCounter@ = 0 + LogCounter@ += 1 + LogFileName = SessionID : '_' : Fmt(LogCounter@, 'R(0)#6') : '_' : LogType : '.log' + OSWrite LogBody to CapturePath : '\' : LogFileName + If LogRow NE '' then + LogDate = Iconv(LogFileName[1, '_'], 'DJS') + LogTime = Iconv(LogFileName[Col2() + 1, '_'], 'MT') + ProcessID = LogFileName[Col2() + 1, '_'] + Sequence = LogFileName[Col2() + 1, '_'] + objLog = Logging_Services('NewLog', CapturePath, SessionID[1, '_'] : '_Index.log', \0D0A\, \09\, '', '', False$, False$) + LogRow = LogDate : @FM : LogTime : @FM : ProcessID : @FM : Sequence : @FM : LogType : @FM : LogRow : @FM : 'View...' : @FM : CapturePath : '\' : LogFileName + Logging_Services('AppendLog', objLog, LogRow, @RM, @FM, True$) + end + end + end + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetOECGIRequest +// +// Request - The @FM delimited array containing the HTTP request that OECGI passes in. - [Required] +// +// Sets the HTTP request that the OECGI creates to memory so it can be retrieved by later routines. This avoids the need +// to pass this around into various routines. +//---------------------------------------------------------------------------------------------------------------------- +Service SetOECGIRequest(Request) + + If Len(Request) then + PathInfo = Request + ScriptName = Request + // Some web servers, like Microsoft IIS, include the Script Name URL in the Path Info. The SRP HTTP Framework works + // under the assumption that Script Name and Path Info combined are the full path. So, in or to correct this, a + // check is made to see if Script Name is included in Path Info and, if so, have it removed. + LenScriptName = Len(ScriptName) + If PathInfo[1, LenScriptName] _EQC ScriptName then + PathInfo = PathInfo[LenScriptName + 1, 999] + end + If PathInfo[1, 1] EQ '/' then PathInfo[1, 1] = '' + Request = PathInfo + + Memory_Services('SetValue', 'HTTPQueryString', Request, CacheName$) + Memory_Services('SetValue', 'HTTPPathInfo', Request, CacheName$) + Memory_Services('SetValue', 'HTTPContentType', Request, CacheName$) + Memory_Services('SetValue', 'HTTPContentLength', Request, CacheName$) + Memory_Services('SetValue', 'HTTPGatewayInterface', Request, CacheName$) + Memory_Services('SetValue', 'HTTPHTTPS', Request, CacheName$) + Memory_Services('SetValue', 'HTTPAccept', Request, CacheName$) + Memory_Services('SetValue', 'HTTPCookie', Request, CacheName$) + Memory_Services('SetValue', 'HTTPFrom', Request, CacheName$) + Memory_Services('SetValue', 'HTTPReferer', Request, CacheName$) + Memory_Services('SetValue', 'HTTPUserAgent', Request, CacheName$) + Memory_Services('SetValue', 'HTTPTranslated', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRemoteAddr', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRemoteHost', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRemoteIdent', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRemoteUser', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRequestMethod', Request, CacheName$) + Memory_Services('SetValue', 'HTTPScriptName', Request, CacheName$) + Memory_Services('SetValue', 'HTTPServerName', Request, CacheName$) + Memory_Services('SetValue', 'HTTPServerPort', Request, CacheName$) + Memory_Services('SetValue', 'HTTPServerProtocol', Request, CacheName$) + Memory_Services('SetValue', 'HTTPServerSoftware', Request, CacheName$) + Memory_Services('SetValue', 'HTTPServerURL', Request, CacheName$) + Memory_Services('SetValue', 'HTTPNoURLDecode', Request, CacheName$) + Memory_Services('SetValue', 'HTTPResponseIsBinary', Request, CacheName$) + Memory_Services('SetValue', 'HTTPRegistrySettings', Request, CacheName$) + Memory_Services('SetValue', 'HTTPOECGIVersion', Request, CacheName$) + Memory_Services('SetValue', 'HTTPGetString', Request, CacheName$) + Memory_Services('SetValue', 'HTTPPostString', Request, CacheName$) + Memory_Services('SetValue', 'HTTPAdditionalValues', Request, CacheName$) + + Request@ = Request + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetOECGIRequest +// +// Returns the original HTTP request that the OECGI creates. +//---------------------------------------------------------------------------------------------------------------------- +Service GetOECGIRequest() + + Response = Request@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetOECGIProcErr +// +// ProcErr - The text of the procedural error. - [Required] +// +// Sets the HTTP ProcErr that the OECGI creates to memory so it can be retrieved by later routines. This avoids the need +// to pass this around into various routines. +//---------------------------------------------------------------------------------------------------------------------- +Service SetOECGIProcErr(ProcErr) + + If ProcErr NE '' then + ProcErr@ = ProcErr + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetOECGIProcErr +// +// Returns the original HTTP ProcErr that the OECGI creates. +//---------------------------------------------------------------------------------------------------------------------- +Service GetOECGIProcErr() + + Response = ProcErr@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetHTTPValue +// +// Sets a specific HTTP request value. This is normally set within the SetOECGIRequest service and done directly using +// Memory_Services for efficiency, but some APIs might need to override an HTTP request value. +//---------------------------------------------------------------------------------------------------------------------- +Service SetHTTPQueryString(HTTPValue) +Service SetHTTPPathInfo(HTTPValue) +Service SetHTTPContentType(HTTPValue) +Service SetHTTPContentLength(HTTPValue) +Service SetHTTPGatewayInterface(HTTPValue) +Service SetHTTPHTTPS(HTTPValue) +Service SetHTTPAccept(HTTPValue) +Service SetHTTPCookie(HTTPValue) +Service SetHTTPFrom(HTTPValue) +Service SetHTTPReferer(HTTPValue) +Service SetHTTPUserAgent(HTTPValue) +Service SetHTTPTranslated(HTTPValue) +Service SetHTTPRemoteAddr(HTTPValue) +Service SetHTTPRemoteHost(HTTPValue) +Service SetHTTPRemoteIdent(HTTPValue) +Service SetHTTPRemoteUser(HTTPValue) +Service SetHTTPRequestMethod(HTTPValue) +Service SetHTTPScriptName(HTTPValue) +Service SetHTTPServerName(HTTPValue) +Service SetHTTPServerPort(HTTPValue) +Service SetHTTPServerProtocol(HTTPValue) +Service SetHTTPServerSoftware(HTTPValue) +Service SetHTTPServerURL(HTTPValue) +Service SetHTTPNoURLDecode(HTTPValue) +Service SetHTTPResponseIsBinary(HTTPValue) +Service SetHTTPRegistrySettings(HTTPValue) +Service SetHTTPOECGIVersion(HTTPValue) +Service SetHTTPGetString(HTTPValue) +Service SetHTTPPostString(HTTPValue) +Service SetHTTPAdditionalValues(HTTPValue) + + HTTPKey = Service[4, 99] + Memory_Services('SetValue', HTTPKey, HTTPValue, CacheName$) + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetHTTPValue +// +// Returns a specific HTTP request value. This is normally set within the SetOECGIRequest service. This service is not +// called directly as other services normally are. It is a generic service that various 'GetHTTPxxxx' services will +// call. This is why the meta data doesn't include GetHTTPValue but one or more specific GetHTTPxxxx options. +//---------------------------------------------------------------------------------------------------------------------- +Service GetHTTPQueryString(DecodePercentString) +Service GetHTTPPathInfo(DecodePercentString) +Service GetHTTPContentType(DecodePercentString) +Service GetHTTPContentLength(DecodePercentString) +Service GetHTTPGatewayInterface(DecodePercentString) +Service GetHTTPHTTPS(DecodePercentString) +Service GetHTTPAccept(DecodePercentString) +Service GetHTTPCookie(DecodePercentString) +Service GetHTTPFrom(DecodePercentString) +Service GetHTTPReferer(DecodePercentString) +Service GetHTTPUserAgent(DecodePercentString) +Service GetHTTPTranslated(DecodePercentString) +Service GetHTTPRemoteAddr(DecodePercentString) +Service GetHTTPRemoteHost(DecodePercentString) +Service GetHTTPRemoteIdent(DecodePercentString) +Service GetHTTPRemoteUser(DecodePercentString) +Service GetHTTPRequestMethod(DecodePercentString) +Service GetHTTPScriptName(DecodePercentString) +Service GetHTTPServerName(DecodePercentString) +Service GetHTTPServerPort(DecodePercentString) +Service GetHTTPServerProtocol(DecodePercentString) +Service GetHTTPServerSoftware(DecodePercentString) +Service GetHTTPServerURL(DecodePercentString) +Service GetHTTPNoURLDecode(DecodePercentString) +Service GetHTTPResponseIsBinary(DecodePercentString) +Service GetHTTPRegistrySettings(DecodePercentString) +Service GetHTTPOECGIVersion(DecodePercentString) +Service GetHTTPGetString(DecodePercentString) +Service GetHTTPPostString(DecodePercentString) +Service GetHTTPAdditionalValues(DecodePercentString) + + HTTPKey = Service[4, 99] + HTTPValue = Memory_Services('GetValue', HTTPKey, '', '', CacheName$) + + If DecodePercentString EQ True$ then + HTTPValue = HTTP_Services('DecodePercentString', HTTPValue) + end + + Response = HTTPValue + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRequestHeaderFields +// +// Sets all of the Request Header Fields based on the content of the HTTP request that the OECGI creates. This assumes +// the SetOECGIRequest service has already been called so that the Request array is in memory. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRequestHeaderFields() + + // These are the standard header fields that Revelation has pre-defined to be included in the OECGI request array. + HTTP_Services('SetRequestHeaderField', 'Accept', HTTP_Services('GetHTTPAccept')) + HTTP_Services('SetRequestHeaderField', 'Content-Length', HTTP_Services('GetHTTPContentLength')) + HTTP_Services('SetRequestHeaderField', 'Content-Type', HTTP_Services('GetHTTPContentType')) + HTTP_Services('SetRequestHeaderField', 'Cookie', HTTP_Services('GetHTTPCookie')) + HTTP_Services('SetRequestHeaderField', 'From', HTTP_Services('GetHTTPFrom')) + HTTP_Services('SetRequestHeaderField', 'Referer', HTTP_Services('GetHTTPReferer')) + HTTP_Services('SetRequestHeaderField', 'User-Agent', HTTP_Services('GetHTTPUserAgent')) + + // Other header fields can be retrieved but they have to be defined in the OECGI registry key under + // "AdditionalValues". This is a comma delimited string of names but these names have to be converted in order + // to be valid header names. + RegistrySettings = HTTP_Services('GetHTTPRegistrySettings') + NumRegistrySettings = DCount(RegistrySettings, '&') + AdditionalNames = '' ; // Initialize the AdditionalValues registry setting. Update as required. + For RegistryCnt = 1 to NumRegistrySettings + RegistrySetting = Field(RegistrySettings, '&', RegistryCnt, 1) + Name = RegistrySetting[1, '='] + If Name _EQC 'AdditionalValues' then + AdditionalNames = RegistrySetting[Col2() + 1, 999] + AdditionalNames = HTTP_Services('DecodePercentString', AdditionalNames) + end + Until Name _EQC 'AdditionalValues' + Next RegistryCnt + NumAdditionalNames = Count(AdditionalNames, ',') + (AdditionalNames NE '') + AdditionalValues = HTTP_Services('GetHTTPAdditionalValues') + For NameCnt = 1 to NumAdditionalNames + If Len(AdditionalValues<0, NameCnt>) then + Name = Field(AdditionalNames, ',', NameCnt, 1) + If Name[1, 5] EQ 'HTTP_' then Name = Name[6, 99] ; // Remove the "HTTP_" prefix the Registry requires. + Convert '_' to ' ' in Name + Name = NameCap(Name) ; // Apply casing to make it prettier to read. + Convert ' ' to '-' in Name + HTTP_Services('SetRequestHeaderField', Name, AdditionalValues<0, NameCnt>) + end + Next NameCnt + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRequestHeaderField +// +// Name - Header Field Name to set. - [Required] +// Value - Value for the header field. This will be Trimmed to enforce proper formatting. - [Required] +// +// Sets the indicated Request Header Field with the indicated value. This can then be retrieved with a +// GetRequestHeaderField service call so that server processing can operate accordingly. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRequestHeaderField(Name, Value) + + If Len(Name) AND Len(Value) then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = RequestHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos else + fPos = Count(RequestHeaderFields@, @FM) + (RequestHeaderFields@ NE '') + 1 + end + RequestHeaderFields@ = Name + RequestHeaderValues@ = Trim(Value) + end else + Error_Services('Add', 'The Name or Value argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRequestHeaderFields +// +// Returns all of the Request Header Field names and values. These are formatted as Name : Value with +// an extra appended after the last field/value pair. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRequestHeaderFields() + + HeaderFieldBlock = '' + + If Len(RequestHeaderFields@) then + NumFields = Count(RequestHeaderFields@, @FM) + (RequestHeaderFields@ NE '') + For FieldCnt = 1 to NumFields + HeaderFieldBlock := RequestHeaderFields@ : ': ' : RequestHeaderValues@ : CRLF$ + Next FieldCnt + HeaderFieldBlock := CRLF$ + end else + Error_Services('Add', 'There are no response header fields set') + end + + Response = HeaderFieldBlock + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRequestHeaderField +// +// Name - Header Field Name to get. - [Required] +// +// Returns the value previously set for the indicated Request Header Field. The Name argument is case-insensitive but +// if the indicated Request Header Field has not been set then an error condition will be set. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRequestHeaderField(Name) + + Value = '' + + If Name NE '' then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = RequestHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos then + Value = RequestHeaderValues@ + end else + Error_Services('Add', Name : ' is not a header field in the request.') + end + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Name argument is missing in the ' : Service : ' service.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetQueryFields +// +// Sets all of the Query Fields based on the content of the HTTP request that the OECGI creates. This assumes the +// SetOECGIRequest service has already been called so that the Request array is in memory. +//---------------------------------------------------------------------------------------------------------------------- +Service SetQueryFields() + + QueryString = HTTP_Services('GetHTTPGetString') + If Len(QueryString) then + Swap '&' with @FM in QueryString + Swap '=' with @VM in QueryString + NumFields = Count(QueryString, @FM) + 1 + For FieldCnt = 1 to NumFields + Field = QueryString + Value = QueryString + HTTP_Services('SetQueryField', Field, Value) + Next FieldCnt + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetQueryField +// +// Field - Query field to set. - [Required] +// Value - Value for the Query field. This will be Trimmed to enforce proper formatting. - [Optional] +// +// Sets the indicated Query field with the indicated value. This can then be retrieved with a GetQueryField service call +// so that server processing can operate accordingly. +//---------------------------------------------------------------------------------------------------------------------- +Service SetQueryField(Field, Value) + + If Field NE '' then + Locate Field in QueryFields@ using @FM setting fPos else + fPos = Count(QueryFields@, @FM) + (QueryFields@ NE '') + 1 + end + Value = HTTP_Services('DecodePercentString', Value) + QueryFields@ = Field + QueryValues@ = Trim(Value) + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Field or Value argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetQueryField +// +// Field - Query Field to get. - [Required] +// +// Returns the value previously set for the indicated Query Field. If then indicated Query Field has not been set then +// then an error condition will be set. +//---------------------------------------------------------------------------------------------------------------------- +Service GetQueryField(Field) + + Value = '' + + If Len(Field) then + Locate Field in QueryFields@ using @FM setting fPos then + Value = QueryValues@ + end else + Error_Services('Add', Field : ' is not a query field in the request.') + end + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Field argument is missing in the ' : Service : ' service.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseHeaderField +// +// Name - Header Field Name to set. - [Required] +// Value - Value for the header field. This will be Trimmed to enforce proper formatting. - [Required] +// Append - Flag that determines if values can be appended to a list. By default this is false and all values will +// replace existing values. - [Optional] +// +// Sets the indicated Response Header Field with the indicated value. This can then be retrieved with a +// GetRequestHeaderField service call so that server processing can operate accordingly. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseHeaderField(Name=RESPONSEHEADERNAMES, Value, Append=BOOLEAN) + + If (Append NE True$) AND (Append NE False$) then Append = False$ + If Len(Append) else Append = False$ + + If Name NE '' AND Value NE '' then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = ResponseHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + If (Name NE 'Set-Cookie') OR ((Name EQ 'Set-Cookie') AND (Append EQ False$)) then + Locate SearchName in SearchFields using @FM setting fPos else + fPos = Count(ResponseHeaderFields@, @FM) + (ResponseHeaderFields@ NE '') + 1 + end + end else + fPos = DCount(ResponseHeaderFields@, @FM) + 1 + end + HeaderValues = ResponseHeaderValues@ + If Append then + // Append the value to an existing list (if one exists). Otherwise, just set the value. + If Len(HeaderValues) then + If Index(HeaderValues, Trim(Value), 1) else + // Only append if it does not already appear in the list. + If Name _EQC 'Allow' OR Name _EQC 'Access-Control-Allow-Headers' then + // Some headers are separated by a comma and space. Others use a semi-colon. + HeaderValues := ', ' : Trim(Value) + end else + HeaderValues := ';' : Trim(Value) + end + end + end else + HeaderValues = Trim(Value) + end + end else + // Set the value. This could replace an existing value. + HeaderValues = Trim(Value) + end + ResponseHeaderFields@ = Name + ResponseHeaderValues@ = HeaderValues + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Name or Value argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetCookie +// +// Name - Name of the cookie. - [Required] +// Value - Value for the cookie. If empty, only the Name will be sent. - [Optional] +// Expires - Date the cookie should expire. Should use RFC1123 formatting. For example: +// "Sun, 06 Nov 1994 08:49:37 GMT" +// If a number is passed in, the system will assume this is an an internal date or datetime and attempt +// to convert it to RFC1123 formatting. - [Optional] +// MaxAge - Number of seconds that the cookie should remain alive. - [Optional] +// Domain - Hosts to which the cookie will be sent. For example, "examples.com", "www.examples.com", or +// "examples.org" - [Optional] +// Path - Scope of the cookie. For example, "/api/reports" or "/api/users". - [Optional] +// Secure - Boolean flag to indicate that the "Secure" attribute should be included. - [Optional] +// HttpOnly - Boolean flag to indicate that the "HttpOnly" attribute should be included. - [Optional] +// Extension - Any other content to include in the cookie. May or may not be name/value paired. - [Optional] +// +// Adds a Set-Cookie header to the response using the indicated Name. The cookie's value and optional attributes will +// automatically be included as indicated by each argument. +//---------------------------------------------------------------------------------------------------------------------- +Service SetCookie(Name, Value, Expires, MaxAge, Domain, Path, Secure=BOOLEAN, HttpOnly=BOOLEAN, Extension) + + If Name NE '' then + Value = Name : '=' : Value + If Expires NE '' then + If Num(Expires) then + // Assume time is local time. Convert it to UTC/GMT time. + Expires = SRP_DateTime('ToUTC', Expires) + // Convert the internal date or datetime to RFC1123 formatting. + Expires = SRP_DateTime('Format', Expires, "DDD, DD MMM YYYY hh:mm:ss 'GMT'") + end + Value := '; Expires=' : Expires + end + If SRP_Num(MaxAge) then + Value := '; Max-Age=' : MaxAge + end + If Domain NE '' then + Value := '; Domain=' : Domain + end + If Path NE '' then + Value := '; Path=' : Path + end + If Secure EQ True$ then + Value := '; Secure' + end + If HttpOnly EQ True$ then + Value := '; HttpOnly' + end + If Extension NE '' then + Value := '; ' : Extension + end + // Use the SetResponseHeaderField service with the Append flag set to True$ to create the Set-Cookie header. + HTTP_Services('SetResponseHeaderField', 'Set-Cookie', Value, True$) + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Name argument is missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseHeaderFields +// +// Returns all of the Response Header Field names and values. These are formatted as Name : Value with +// an extra appended after the last field/value pair. This also returns the response status since the CGI +// specification uses the "Status" header field. This will be put into the response before the regular header +// field/values. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseHeaderFields() + + ScriptType = HTTP_Services('GetHTTPScriptName')[-3, 3] + If ScriptType _EQC 'exe' then + HeaderDelim = CRLF$ + end else + HeaderDelim = LF$ + end + + HeaderFieldBlock = 'Status: ' : HTTP_Services('GetResponseStatus') : HeaderDelim + + If Len(ResponseHeaderFields@) then + NumFields = Count(ResponseHeaderFields@, @FM) + (ResponseHeaderFields@ NE '') + For FieldCnt = 1 to NumFields + HeaderFieldBlock := ResponseHeaderFields@ : ': ' : ResponseHeaderValues@ : HeaderDelim + Next FieldCnt + HeaderFieldBlock := HeaderDelim + end else + Error_Services('Add', 'There are no response header fields get.') + end + + Response = HeaderFieldBlock + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseHeaderField +// +// Name - Header Field Name to get. - [Required] +// +// Returns the value previously set for the indicated Response Header Field. The Name argument is case-insensitive but +// if the indicated Response Header Field has not been set then an error condition will be set. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseHeaderField(Name=RESPONSEHEADERNAMES) + + Value = '' + + If Name NE '' then + SearchName = Name + Convert @Lower_Case to @Upper_Case in SearchName + SearchFields = ResponseHeaderFields@ + Convert @Lower_Case to @Upper_Case in SearchFields + Locate SearchName in SearchFields using @FM setting fPos then + Value = ResponseHeaderValues@ + end else + Error_Services('Add', Name : ' is not a header field in the response.') + end + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Name argument is missing in the ' : Service : ' service.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseStatus +// +// Code - HTTP status code to set. - [Required] +// Phrase - Custom phrase to send with the status code. - [Optional] +// +// Sets the HTTP status code to be used in the response. This can be set at any time. If unchanged by other routines +// this will be the status code used. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseStatus(Code, Phrase) + + If Code NE '' AND Num(Code) then + ResponseStatusCode@ = Code + ResponseStatusPhrase@ = Trim(Phrase) + end else + HTTP_Services('SetResponseError', '', '', 400, 'The Code argument is missing or not valid in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseStatus +// +// Gets the current HTTP status code to be used in the response. If this has not yet been set then code 200 (OK) will +// be used as a default. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseStatus() + + If ResponseStatusCode@ NE '' then + Status = ResponseStatusCode@ + end else + Status = '200' + end + + If Len(ResponseStatusPhrase@) then + Status := ' ' : ResponseStatusPhrase@ + end else + HTTPStatusCodes = Xlate('SYSENV', 'SRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES', '', 'X') + Locate Status in HTTPStatusCodes<1> using @VM setting vPos then + StatusPhrase = HTTPStatusCodes<2, vPos> + Status := ' ' : StatusPhrase + end + end + + Response = Status + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseBody +// +// Body - The full body to send back with the HTTP response - [Required] +// IsBinary - Flag to determine if the response body is binary data. If empty then the body content will be examined +// to make an educated guess. - [Optional] +// ContentType - Value to set for the response header Content-Type. - [Optional] +// +// Sets the body content to be returned in the response. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseBody(Body, IsBinary, ContentType) + + // If there is nothing in the body then make sure IsBinary is set to False. + If Len(Body) else IsBinary = False$ + + // If the IsBinary flag is anything other than True or False then clear the argument so the body content can be + // used to make a decision. + If Index('10', IsBinary, 1) else IsBinary = '' + + If Len(ContentType) then HTTP_Services('SetResponseHeaderField', 'Content-Type', ContentType) + + If Len(Body) AND IsBinary EQ '' then + // There is a body content but the IsBinary flag is empty. Decide what IsBinary should be based on the + // body content and the Content-Type response header field. + ContentType = HTTP_Services('GetResponseHeaderField', 'Content-Type') + If Len(ContentType) else + Begin Case + Case Body[1, 1] EQ '{' + ContentType = 'application/hal+json' + Case Body[1, 4] EQ '%PDF' + ContentType = 'application/pdf' + Case Body[1, 10] EQ \FFD8FFE00010\ : 'JFIF' + ContentType = 'image/jpg' + Case Body[1, 4] EQ \89\ : 'PNG' + ContentType = 'image/png' + Case Body[1, 5] EQ 'GIF89' + ContentType = 'image/gif' + Case Otherwise$ + ContentType = 'text/html' + End Case + end + + Begin Case + Case IndexC(ContentType, 'text', 1) ; IsBinary = False$ + Case IndexC(ContentType, 'json', 1) ; IsBinary = False$ + Case IndexC(ContentType, 'xml', 1) ; IsBinary = False$ + Case IndexC(ContentType, 'pdf', 1) ; IsBinary = True$ + Case IndexC(ContentType, 'image', 1) ; IsBinary = True$ + Case IndexC(ContentType, 'audio', 1) ; IsBinary = True$ + Case IndexC(ContentType, 'video', 1) ; IsBinary = True$ + Case IndexC(ContentType, 'application', 1) ; IsBinary = True$ + Case Otherwise$ ; IsBinary = False$ + End Case + end + + ResponseBody@ = Body + ResponseBodyIsBinary@ = IsBinary + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseBody +// +// Gets the current body to be returned in the response. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseBody() + + Response = ResponseBody@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponseBodyIsBinary +// +// Gets the binary flag associated with the current body. This is normally set by the SetResponseBody service at the +// time the body content is also set. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponseBodyIsBinary() + + Response = ResponseBodyIsBinary@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetResponse +// +// Gets the full response, headers and body, to be returned to the HTTP request. This will build the response as needed +// by OECGI, especially regarding binary data handling. +//---------------------------------------------------------------------------------------------------------------------- +Service GetResponse() + + Response = '' + + Body = HTTP_Services('GetResponseBody') + + If Len(Body) EQ 0 then + // There is no content in the response body. This is typically due to an error condition, but it could also be + // an oversight by the developer when creating the API. Either way, a standard error response should be provided + // so the client can consume the response and have some method of interpreting the problem. + Body = HTTP_Services('GetErrorResponse') + end + + BodyIsBinary = HTTP_Services('GetResponseBodyIsBinary') + + ContentType = HTTP_Services('GetResponseHeaderField', 'Content-Type') + If Len(ContentType) else + Begin Case + Case Body[1, 1] EQ '{' + ContentType = 'application/hal+json' + Case Body[1, 4] EQ '%PDF' + ContentType = 'application/pdf' + Case Body[1, 10] EQ \FFD8FFE00010\ : 'JFIF' + ContentType = 'image/jpg' + Case Body[1, 4] EQ \89\ : 'PNG' + ContentType = 'image/png' + Case Body[1, 5] EQ 'GIF89' + ContentType = 'image/gif' + Case Otherwise$ + ContentType = 'text/html' + End Case + HTTP_Services('SetResponseHeaderField', 'Content-Type', ContentType) + end + + HTTP_Services('SetResponseHeaderField', 'Content-Length', GetByteSize(Body)) + + // Get the response status, all response header fields, and the required additional CR/LF. + Response = HTTP_Services('GetResponseHeaderFields') + // Now add the response body. + Response := Body + + If BodyIsBinary then + // OECGI uses a special prefix to the response to help return binary content properly. + Response = HexConv(Response) + Response = 'OECGI21' : Response + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetResponseError +// +// TypeURL - URL to a human-readable document describing the error condition. Default is "about:blank" +// - [Optional] +// Title - A brief title for the error condition. Default is the formal phrase associated with the status. +// - [Optional] +// Status - The HTTP status code generated for this occurrence of the problem. - [Required] +// Detail - A human-readable explanation specific to this occurrence of the problem. - [Optional] +// InstanceURL - URL that resulted in the error condition. - [Optional] +// PropertyNames - An delimited list of property names being added. - [Optional] +// PropertyValues - An delimited list of property values associated with the property names. - [Optional] +// +// Sets a response error. This follows the RFC 7807 specification (https://tools.ietf.org/html/rfc7807), or the "Problem +// Details for HTTP APIs". This service is used instead of the SetResponseStatus and SetResponseBody. +//---------------------------------------------------------------------------------------------------------------------- +Service SetResponseError(TypeURL, Title, Status, Detail, InstanceURL, PropertyNames, PropertyValues) + + If Status NE '' then + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in PropertyNames + Convert @VM : @SVM : @TM : @STM : ',' to @FM : @FM : @FM : @FM : @FM in PropertyValues + If TypeURL EQ '' then TypeURL = 'about:blank' + If Title EQ '' then + HTTPStatusCodes = Xlate('SYSENV', 'SRP_HTTP_FRAMEWORK_HTTP_STATUS_CODES', '', 'X') + Locate Status in HTTPStatusCodes<1> using @VM setting vPos then + Title = HTTPStatusCodes<2, vPos> + end + end + objError = HTTP_Resource_Services('GetObjects') + If TypeURL NE '' then HTTP_Resource_Services('AddProperties', objError, 'type', TypeURL) + If Title NE '' then HTTP_Resource_Services('AddProperties', objError, 'title', Title) + HTTP_Resource_Services('AddProperties', objError, 'status', Status, 'Number') + If Detail NE '' then HTTP_Resource_Services('AddProperties', objError, 'detail', Detail) + If InstanceURL NE '' then HTTP_Resource_Services('AddProperties', objError, 'instance', InstanceURL) + If PropertyNames NE '' then + HTTP_Resource_Services('AddProperties', objError, PropertyNames, PropertyValues) + end + // Serialize the object into a JSON string. + jsonError = HTTP_Resource_Services('GetSerializedResource', objError) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseStatus', Status, Title) + HTTP_Services('SetResponseBody', jsonError, False$, 'application/problem+json') + end else + HTTP_Services('SetResponseError', '', '', '500', 'HTTP status code was missing in the ' : Service : ' service.', InstanceURL, PropertyNames, PropertyValues) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetErrorResponse +// +// Creates and returns an error response. This is intended to be used when there is no response body to return to the +// client. This response will contain the current response status and any error information stored using Error_Services. +//---------------------------------------------------------------------------------------------------------------------- +Service GetErrorResponse() + + ErrorResponse = '' + + ResponseStatus = HTTP_Services('GetResponseStatus') + StatusCode = ResponseStatus[1, 'F '] + StatusPhrase = ResponseStatus[Col2() + 1, 9999] + EndpointURL = HTTP_Services('GetFullEndpointURL')[1, 'F?'] + HTTPMethod = HTTP_Services('GetHTTPRequestMethod') + QueryParams = HTTP_Services('GetHTTPGetString') + Errors = Error_Services('GetMessages') ; // @FM list of errors. + + If SRP_JSON(hResponseObj, 'NEW', 'OBJECT') then + SRP_JSON(hResponseObj, 'SETVALUE', 'status', StatusCode) + SRP_JSON(hResponseObj, 'SETVALUE', 'phrase', StatusPhrase) + SRP_JSON(hResponseObj, 'SETVALUE', 'method', HTTPMethod) + If Len(QueryParams) then + SRP_JSON(hResponseObj, 'SETVALUE', 'query', QueryParams) + end + SRP_JSON(hResponseObj, 'SETVALUE', 'URL', EndpointURL) + If Len(Errors) then + // Only create the JSON array of errors if there are any errors to include. + If SRP_JSON(hErrorArray, 'NEW', 'ARRAY') then + NumErrors = DCount(Errors, @FM) + For ErrorCnt = 1 to NumErrors + Error = Errors + SRP_JSON(hErrorArray, 'ADDVALUE', Error) + Next ErrorCnt + SRP_JSON(hResponseObj, 'SET', 'errors', hErrorArray) + SRP_JSON(hErrorArray, 'RELEASE') + end + end + ErrorResponse = SRP_JSON(hResponseObj, 'STRINGIFY', 'STYLED') + SRP_JSON(hResponseObj, 'RELEASE') + end + + Response = ErrorResponse + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// DecodePercentString +// +// String - The string with percent-encoded characters. - [Required] +// +// Decodes the string so that percent-encoded characters are restored to their regular form. This returns the +// decoded string. +//---------------------------------------------------------------------------------------------------------------------- +Service DecodePercentString(String) + + DecodedString = '' + + If Len(String) then + DecodedString = SRP_Decode(String, 'URL') + Swap '>' with '>' in DecodedString + Swap '<' with '<' in DecodedString + Swap '&' with '&' in DecodedString + Swap '"' with '"' in DecodedString + Swap ''' with "'" in DecodedString + Swap ''' with "'" in DecodedString + Swap '%E2%80%9C' with '"' in DecodedString ; // Left quotation mark. + Swap '%E2%80%9D' with '"' in DecodedString ; // Right quotation mark. + end else + Error_Services('Add', 'The String argument was missing in the ' : Service : ' service.') + end + + Response = DecodedString + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ClearSettings +// +// Clears all of the global common variables used to track header names, values, and the status settings. This will +// typically only be called within HTTP_MCP when the response is finished and sent back to the OECGI. +//---------------------------------------------------------------------------------------------------------------------- +Service ClearSettings() + + // The FreeCommon statement is not used because one of the commons, LogCounter@, needs to keep its value for as long + // as the same engine is being used to process requests from the EngineServer. + Request@ = '' + ProcErr@ = '' + RequestHeaderFields@ = '' + RequestHeaderValues@ = '' + ResponseHeaderFields@ = '' + ResponseHeaderValues@ = '' + ResponseStatusCode@ = '' + ResponseStatusPhrase@ = '' + ResponseBody@ = '' + ResponseBodyIsBinary@ = '' + SelfURL@ = '' + QueryFields@ = '' + QueryValues@ = '' + SessionID@ = '' + + Memory_Services('ReleaseHashTable', CacheName$) + + If HTTP_Services('GetFlushCacheFlag') then + Flush + GarbageCollect + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetHomeURL +// +// Returns the Home URL for the web site. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <1>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetHomeURL() + + ServiceKeyID = Service + HomeURL = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If HomeURL EQ '' then + HomeURL = HTTP_Services('GetHTTPServerName', True$) + If HomeURL EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + HomeURL = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + end + If HomeURL[1, 4] _NEC 'http' then + If HTTP_Services('GetHTTPHTTPS') _EQC 'on' then + HomeURL = 'https://' : HomeURL + end else + HomeURL = 'http://' : HomeURL + end + end + + Memory_Services('SetValue', ServiceKeyID, HomeURL, CacheName$) + end + + Response = HomeURL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAPIRootURL +// +// FullURL - Boolean flag indicating if the full URL or just the end point should be returned. +// Default is True. - [Optional] +// +// Returns the API Root URL for the web site. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <2>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetAPIRootURL(FullURL=BOOLEAN) + + If FullURL NE False$ then FullURL = True$ + + ServiceKeyID = Service : '*' : FullURL + APIRootURL = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If APIRootURL EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + APIEndpoint = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If FullURL then + HomeURL = HTTP_Services('GetHomeURL') + APIRootURL = HomeURL : APIEndpoint + end else + Transfer APIEndpoint to APIRootURL + end + // Make sure the URL does not end with a slash. + If APIRootURL[-1, 1] EQ '/' then APIRootURL[-1, 1] = '' + Convert @Upper_Case to @Lower_Case in APIRootURL ; // Conver to all lower case since it is case-insensitive anyway. + Memory_Services('SetValue', ServiceKeyID, APIRootURL, CacheName$) + end + + Response = APIRootURL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetCapturePath +// +// Returns the capture path for the request and response content. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <3> +//---------------------------------------------------------------------------------------------------------------------- +Service GetCapturePath() + + ServiceKeyID = Service + CapturePath = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If CapturePath EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + CapturePath = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, CapturePath, CacheName$) + end + + Response = CapturePath + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRealmValue +// +// Returns the realm value, which is used by the WWW-Authenticate response header. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <5>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRealmValue() + + ServiceKeyID = Service + RealmValue = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If RealmValue EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + RealmValue = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, RealmValue, CacheName$) + end + + Response = RealmValue + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEntryPointService +// +// Returns the entry point service name. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <6>. Default is entry_point. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEntryPointService() + + ServiceKeyID = Service + EntryPointService = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If EntryPointService EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + EntryPointService = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If EntryPointService EQ '' then EntryPointService = 'ENTRY_POINT' + If EntryPointService[1, 5] _EQC 'HTTP_' AND EntryPointService[-9, 9] _EQC '_SERVICES' then + // Entry point service is stored as the fully qualified stored procedure name. Remove the HTTP_ prefix + // and _SERVICES suffix so this can be called properly by the RunHTTPService service. + EntryPointService[1, 5] = '' + EntryPointService[-9, 9] = '' + end + Memory_Services('SetValue', ServiceKeyID, EntryPointService, CacheName$) + end + + Response = EntryPointService + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetVersion +// +// Returns the version of the SRP HTTP Framework being used. The response will be in the following format: +// +// x.x.x [RCx] +// mm.dd.yyyy hh:mmA/P +// +// A carriage-return/line-feed character will be used to separate the two pieces of information. +//---------------------------------------------------------------------------------------------------------------------- +Service GetVersion() + + Version = Database_Services('ReadDataRow', 'SYSENV', 'SRP_HTTP_FRAMEWORK_VERSION') + + Swap @FM with CRLF$ in Version + + Response = Version + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetFullEndpointURL +// +// Returns the full URL for the end point. This should correspond with the URL requested by the client. +//---------------------------------------------------------------------------------------------------------------------- +Service GetFullEndpointURL() + + ServiceKeyID = Service + FullEndpointURL = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If FullEndpointURL EQ '' then + PathInfo = HTTP_Services('GetHTTPPathInfo') + If PathInfo[-1, 1] EQ '/' then PathInfo[-1, 1] = '' + If Len(PathInfo) then + If PathInfo[1, 1] NE '/' then PathInfo = '/' : PathInfo + end + FullEndpointURL = HTTP_Services('GetAPIRootURL', True$) : PathInfo + QueryParams = HTTP_Services('GetHTTPGetString') + If QueryParams NE '' then + FullEndpointURL := '?' : QueryParams + end + Memory_Services('SetValue', ServiceKeyID, FullEndpointURL, CacheName$) + end + + Response = FullEndpointURL + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetFlushCacheFlag +// +// Returns the flush cache flag setting. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <7>. This flag should be +// used to determine if the SRP HTTP Framework should clear all cache and buffers just before returning back to the +// OECGI. By default, this flag is checked and implemented in the ClearSettings service. +//---------------------------------------------------------------------------------------------------------------------- +Service GetFlushCacheFlag() + + ServiceKeyID = Service + FlushCacheFlag = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If FlushCacheFlag EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + FlushCacheFlag = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, FlushCacheFlag, CacheName$) + end + + Response = FlushCacheFlag + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEnableAuthenticationFlag +// +// Returns the enable authentication flag setting. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <4>. Note: Only +// an explicit setting of False (0) will turn this flag off. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEnableAuthenticationFlag() + + ServiceKeyID = Service + EnableAuthenticationFlag = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If EnableAuthenticationFlag EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + EnableAuthenticationFlag = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If EnableAuthenticationFlag EQ False$ else EnableAuthenticationFlag = True$ + Memory_Services('SetValue', ServiceKeyID, EnableAuthenticationFlag, CacheName$) + end + + Response = EnableAuthenticationFlag + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEnableHTTPBasicAuthenticationFlag +// +// Returns the enable HTTP Basic Authentication flag setting. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <15>. +// Note: Only an explicit setting of False (0) will turn this flag off. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEnableHTTPBasicAuthenticationFlag() + + ServiceKeyID = Service + EnableHTTPBasicAuthenticationFlag = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If EnableHTTPBasicAuthenticationFlag EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + EnableHTTPBasicAuthenticationFlag = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If EnableHTTPBasicAuthenticationFlag EQ False$ else EnableHTTPBasicAuthenticationFlag = True$ + Memory_Services('SetValue', ServiceKeyID, EnableHTTPBasicAuthenticationFlag, CacheName$) + end + + Response = EnableHTTPBasicAuthenticationFlag + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetNewPasswordTimeToLive +// +// Returns the length of time (in hours) that new passwords can be valid before needing to be reset. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <16>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetNewPasswordTimeToLive() + + ServiceKeyID = Service + TimeToLive = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If TimeToLive EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + TimeToLive = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, TimeToLive, CacheName$) + end + + Response = TimeToLive + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetOldPasswordTimeToLive +// +// Returns the length of time (in hours) that old passwords can be valid. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <17>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetOldPasswordTimeToLive() + + ServiceKeyID = Service + TimeToLive = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If TimeToLive EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + TimeToLive = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If TimeToLive EQ '' then TimeToLive = 1 + Memory_Services('SetValue', ServiceKeyID, TimeToLive, CacheName$) + end + + Response = TimeToLive + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetInvalidPasswordLimit +// +// Returns the number of times an invalid password attempt can be made before containment action is taken. It pulls this +// from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <18>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetInvalidPasswordLimit() + + ServiceKeyID = Service + InvalidPasswordLimit = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If InvalidPasswordLimit EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + InvalidPasswordLimit = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, InvalidPasswordLimit, CacheName$) + end + + Response = InvalidPasswordLimit + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetContainmentAction +// +// Returns the containment action to take if the number of invalid password attempts exceeds the limit. It pulls this +// from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <19>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetContainmentAction() + + ServiceKeyID = Service + ContainmentAction = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If ContainmentAction EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + ContainmentAction = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Memory_Services('SetValue', ServiceKeyID, ContainmentAction, CacheName$) + end + + Response = ContainmentAction + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetServerEnabled +// +// Sets the enabled status of the server. +//---------------------------------------------------------------------------------------------------------------------- +Service SetServerEnabled(ServerEnabled=BOOLEAN) + + If ServerEnabled NE False$ then ServerEnabled = True$ + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', 'SRP_HTTP_FRAMEWORK_SERVER_ENABLED') + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, ServerEnabled, True$, False$, False$) + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetServerEnabled +// +// Returns enabled status of the server. +//---------------------------------------------------------------------------------------------------------------------- +Service GetServerEnabled() + + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', 'SRP_HTTP_FRAMEWORK_SERVER_ENABLED') + ServerEnabled = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + If ServerEnabled NE False$ then ServerEnabled = True$ + + Response = ServerEnabled + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetTotalInvalidPasswordAttempts +// +// Sets the total number of invalid password attempts made. +//---------------------------------------------------------------------------------------------------------------------- +Service SetTotalInvalidPasswordAttempts(Attempts) + + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', 'SRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS') + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, Attempts, True$, False$, True$) + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetTotalInvalidPasswordAttempts +// +// Returns the total number of invalid password attempts made. +//---------------------------------------------------------------------------------------------------------------------- +Service GetTotalInvalidPasswordAttempts() + + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', 'SRP_HTTP_FRAMEWORK_TOTAL_INVALID_PASSWORD_ATTEMPTS') + Attempts = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + If (Attempts EQ '') OR Not(Num(Attempts)) then Attempts = 0 + + Response = Attempts + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetNonAuthenticatedPaths +// +// Returns the list of non-authenticated URLs. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <8>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetNonAuthenticatedPaths() + + ServiceKeyID = Service + NonAuthenticatedPaths = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If NonAuthenticatedPaths EQ '' then + APIRootURL = HTTP_Services('GetAPIRootURL', True$) + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + NonAuthenticatedPaths = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Convert @Upper_Case to @Lower_Case in NonAuthenticatedPaths ; // Make the paths are all lower case since these are case-insensitive anyway. + NonAuthenticatedQueryParams = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If NonAuthenticatedPaths NE '' then + Transfer NonAuthenticatedPaths to Paths + Transfer NonAuthenticatedQueryParams to QueryParams + For Each Path in Paths using @VM setting vPos + If Path[1, 4] _NEC 'http' then + // The should not begin with http/s, but test for it just in case. If it is missing, then prepend + // the API Root URL so this service will return a fully formed URL path. + Path = APIRootURL : Path + end + QueryParam = QueryParams<0, vPos> + If QueryParam NE '' then + // There are associated query params for this path. Append each one to an instance of the path. + For Each Param in QueryParam using @TM + NonAuthenticatedPaths := Path : '?' : Param : @FM + Next Param + end else + NonAuthenticatedPaths := Path : @FM + end + Next URL + NonAuthenticatedPaths[-1, 1] = '' + end + Memory_Services('SetValue', ServiceKeyID, NonAuthenticatedPaths, CacheName$) + end + + Response = NonAuthenticatedPaths + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// URLRequiresAuthentication +// +// Returns a Boolean flag whether the indicated URL requires authentication or not. +//---------------------------------------------------------------------------------------------------------------------- +Service URLRequiresAuthentication(URL) + + Endpoint = URL[1, '?'] ; // Get the URL path up to any query params. + Convert @Upper_Case to @Lower_Case in Endpoint ; // Make the URL path all lower case since it is case-insensitive anyway. + QueryParams = URL[Col2() + 1, 999] ; // Get any query params. + // Convert query params into an @FM/@VM array, rotate the array, and extract only the query param names. + Convert '&=' to @FM : @VM in QueryParams + QueryParams = SRP_Array('Rotate', QueryParams) + QueryParams = QueryParams<1> + If Endpoint[-1, 1] EQ '/' then Endpoint[-1, 1] = '' ; // Strip off any ending slashes. + ServiceKeyID = Service : '*' : URL + URLRequiresAuthentication = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If URLRequiresAuthentication EQ '' then + URLRequiresAuthentication = True$ ; // Assume True for now. + NonAuthenticatedPaths = HTTP_Services('GetNonAuthenticatedPaths') + If QueryParams NE '' then + // Since the URL includes query params, each endpoint + query param combination must be found in the + // non-authenticated path list. + AcceptAllParams = True$ ; // Assume that all query params are non-authenticated for now. + For Each Param in QueryParams using @VM + Path = Endpoint : '?' : Param + If Inlist(NonAuthenticatedPaths, Path, @FM) else AcceptAllParams = False$ + Until AcceptAllParams EQ False$ + Next Param + If AcceptAllParams then URLRequiresAuthentication = False$ + end else + // This URL does not include query params. So just verify that the URL matches any path in the list. + For Each ComparePath in NonAuthenticatedPaths using @FM + If ComparePath[-1, 1] EQ '*' then + // This path has a wildcard which means any URL with the same endpoint will not require + // authentication. + ComparePath[-1, 1] = '' ; // Strip off the wildcard. + If ComparePath[-1, 1] EQ '/' then ComparePath[-1, 1] = '' ; // Strip off any ending slashes. + If IndexC(Endpoint, ComparePath, 1) then URLRequiresAuthentication = False$ + end else + // This path must be an exact match to the URL being requested. + If ComparePath[-1, 1] EQ '/' then ComparePath[-1, 1] = '' ; // Strip off any ending slashes. + If ComparePath EQ Endpoint then URLRequiresAuthentication = False$ + end + Until URLRequiresAuthentication EQ False$ + Next Path + end + end + + Response = URLRequiresAuthentication + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetWhitelistedIPs +// +// Returns the list of whitelisted IPs. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <14>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetWhitelistedIPs() + + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + WhitelistedIPs = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + + Response = WhitelistedIPs + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsIPWhitelisted +// +// Returns a Boolean flag whether the indicated IP is whitelisted. +//---------------------------------------------------------------------------------------------------------------------- +Service IsIPWhitelisted(IP) + + IPWhitelisted = False$ ; // Assume False for now. + WhitelistedIPs = HTTP_Services('GetWhitelistedIPs') + + If WhitelistedIPs NE '' then + Convert '.' to @FM in IP ; // Convert IP string to a delimited array so each element of the IP can be inspected. + For Each IPOption in WhitelistedIPs using @VM + // Assume each whitelisted IP can have a pattern (i.e., a "*" for wildcard or a dash-delimited range). Create + // a match IP before comparing the incoming IP. + Convert '.' to @FM in IPOption + For Each IPelement in IPOption using @FM setting fPos + If IPelement EQ '*' then + // Set the IPoption to match the IP segment of the incoming IP so a match can be made. + IPOption = IP + end else + If Count(IPelement, '-') EQ 1 then + // Verify that the incoming segment falls within the range and then set the IPoption to match + // the incoming IP so a match can be made. + StartingRange = IPelement[1, 'F-'] + EndingRange = IPelement[Col2() + 1, 'F-'] + If Num(StartingRange) AND Num(EndingRange) then + If (IP GE StartingRange) AND (IP LE EndingRange) then + IPOption = IP + end + end + end + end + Next IPelement + + If IP _EQC IPOption then IPWhitelisted = True$ + Until IPWhitelisted EQ True$ + Next IPOption + end + + Response = IPWhitelisted + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetWhitelistedIPsType +// +// Returns the whitelisted IPs type. It pulls this from SYSENV\HTTP_FRAMEWORK_SETUP_WHITELISTED_IPS_TYPE <22>. Type +// will either be a 1 (these IPs will only be permitted) or a 2 (these IPs will always be permitted). +//---------------------------------------------------------------------------------------------------------------------- +Service GetWhitelistedIPsType() + + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + WhitelistedIPsType = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If WhitelistedIPsType NE 2 then WhitelistedIPsType = 1 + + Response = WhitelistedIPsType + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetBannedIPs +// +// Returns the list of banned IPs. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <22>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetBannedIPs() + + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + BannedIPs = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + + Response = BannedIPs + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsIPBanned +// +// Returns a Boolean flag whether the indicated IP is whitelisted. +//---------------------------------------------------------------------------------------------------------------------- +Service IsIPBanned(IP) + + IPBanned = False$ ; // Assume False for now. + BannedIPs = HTTP_Services('GetBannedIPs') + + If BannedIPs NE '' then + Convert '.' to @FM in IP ; // Convert IP string to a delimited array so each element of the IP can be inspected. + For Each IPOption in BannedIPs using @VM + // Assume each whitelisted IP can have a pattern (i.e., a "*" for wildcard or a dash-delimited range). Create + // a match IP before comparing the incoming IP. + Convert '.' to @FM in IPOption + For Each IPelement in IPOption using @FM setting fPos + If IPelement EQ '*' then + // Set the IPoption to match the IP segment of the incoming IP so a match can be made. + IPOption = IP + end else + If Count(IPelement, '-') EQ 1 then + // Verify that the incoming segment falls within the range and then set the IPoption to match + // the incoming IP so a match can be made. + StartingRange = IPelement[1, 'F-'] + EndingRange = IPelement[Col2() + 1, 'F-'] + If Num(StartingRange) AND Num(EndingRange) then + If (IP GE StartingRange) AND (IP LE EndingRange) then + IPOption = IP + end + end + end + end + Next IPelement + + If IP _EQC IPOption then IPBanned = True$ + Until IPBanned EQ True$ + Next IPOption + end + + Response = IPBanned + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddBannedIP +// +// Adds the indicated IP to the list of banned IPs. +//---------------------------------------------------------------------------------------------------------------------- +Service AddBannedIP(IP) + + If IP NE '' then + IPWhitelisted = HTTP_Services('IsIPWhitelisted', IP) + If IPWhitelisted NE True$ then + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + SetupInfo = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + BannedIPs = SetupInfo + BannedIPs<0, -1> = IP + SetupInfo = BannedIPs + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, SetupInfo, True$, False$, False$) + end + end else + Error_Services('Add', 'The IP argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RemoveBannedIP +// +// Removes the indicated IP to the list of banned IPs. +//---------------------------------------------------------------------------------------------------------------------- +Service RemoveBannedIP(IP) + + If IP NE '' then + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + SetupInfo = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + BannedIPs = SetupInfo + Locate IP in BannedIPs using @FM setting Pos then + BannedIPs = Delete(BannedIPs, Pos, 0, 0) + SetupInfo = BannedIPs + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, SetupInfo, True$, False$, False$) + end + end else + Error_Services('Add', 'The IP argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IPIsPermitted +// +// Returns a Boolean flag whether the indicated IP is permitted or not. Note, an IP is permitted if the whitelist is +// empty or if it is included in the list of whitelisted IPs. +//---------------------------------------------------------------------------------------------------------------------- +Service IsIPPermitted(IP) +Service IPIsPermitted(IP) + + IsIPPermitted = False$ ; // Assume False for now. + + WhitelistIPsType = HTTP_Services('GetWhitelistedIPsType') + If WhitelistIPsType EQ OnlyAllowWhitelistedIPs$ then + // Type is that only whitelisted IPs can be allowed. However, these IPs can still be banned. + If HTTP_Services('IsIPBanned', IP) EQ False$ then + WhitelistedIPs = HTTP_Services('GetWhitelistedIPs') + + If WhitelistedIPs EQ '' then + IsIPPermitted = True$ + end else + IsIPPermitted = HTTP_Services('IsIPWhitelisted', IP) + end + end + end else + // Type must be that whitelisted IPs will always be allowed. These IPs cannot be banned, even if they appear in + // the ban list. + IPWhitelisted = HTTP_Services('IsIPWhitelisted', IP) + If IPWhitelisted then + IsIPPermitted = True$ + end else + IsIPPermitted = Not(HTTP_Services('IsIPBanned', IP)) + end + end + + Response = IsIPPermitted + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetBestContentNegotiation +// +// RequestHeaderField - The request header field containing the acceptable client options. - [Required] +// ServerOptions - An @FM delimited list of options the server can accommodate. - [Required] +// +// Returns the best content negotiation match based on the options the server is able to support and the options the +// client requested in one of the header request fields that supports content negotiation. This uses standard content +// negotiation rules wherein the server does its best to accommodate the client based on the order of preference. +//---------------------------------------------------------------------------------------------------------------------- +Service GetBestContentNegotiation(RequestHeaderField=CONTENTNEGOTIATIONFIELDS, ServerOptions) + + ServiceKeyID = Service : '*' : SRP_Hash(RequestHeaderField : ServerOptions, 'SHA-1', 'BASE32') + ContentNegotiation = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If Len(RequestHeaderField) AND Len(ServerOptions) then + If Len(ContentNegotiation) EQ 0 then + Convert @Upper_Case to @Lower_Case in ServerOptions + ClientOptions = HTTP_Services('GetRequestHeaderField', RequestHeaderField) + Convert @Upper_Case to @Lower_Case in ClientOptions + Convert ' ' to '' in ClientOptions + Convert ',' to @FM in ClientOptions + Convert ';' to @VM in ClientOptions + NumClientOptions = DCount(ClientOptions, @FM) + NumServerOptions = DCount(ServerOptions, @FM) + // The following loop converts the priority value for each content option into an integer so it can be + // easily sorted. Note: A missing priority means this option is the most preferred. + For OptionCnt = 1 to NumClientOptions + Priority = ClientOptions + If Len(Priority) then + Priority = Priority[-1, 1] + If Not(Num(Priority)) then Priority = 1 + end else + Priority = 10 + end + ClientOptions = Priority + Next NumClientOptions + // Sort based on the priority value (highest to lowest). + ClientOptions = SRP_Sort_Array(ClientOptions, 'DR2', True$) + // Rotate the array so just the content options can be retreived. + ClientOptions = SRP_Rotate_Array(ClientOptions)<1> + Convert @VM to @FM in ClientOptions + // Loop through the client options until the first match is found. If none is found then return an empty + // string and set the response status to 406 (Not Acceptable). + FoundContentNegotiation = False$ + For ClientOptionCnt = 1 to NumClientOptions + Option = ClientOptions + If RequestHeaderField _EQC 'Accept' then + If Option EQ '*/*' then + ServerOptionCnt = 1 + FoundContentNegotiation = True$ + end else + Type = Option[1, '/'] + SubType = Option[Col2() + 1, '/'] + For ServerOptionCnt = 1 to NumServerOptions + ServerOption = ServerOptions + ServerType = ServerOption[1, '/'] + ServerSubType = ServerOption[Col2() + 1, '/'] + If Type _EQC ServerType then + If SubType EQ '*' then + FoundContentNegotiation = True$ + end else + If SubType _EQC ServerSubType then + FoundContentNegotiation = True$ + end + end + end + Until FoundContentNegotiation + Next ServerOptionCnt + end + end else + If Option EQ '*' then + ServerOptionCnt = 1 + FoundContentNegotiation = True$ + end else + Type = Option[1, '/'] + For ServerOptionCnt = 1 to NumServerOptions + ServerType = ServerOptions + If Type _EQC ServerType then + FoundContentNegotiation = True$ + end + Until FoundContentNegotiation + Next ServerOptionCnt + end + end + Until FoundContentNegotiation + Next ClientOptionCnt + + If FoundContentNegotiation EQ True$ then + ContentNegotiation = ServerOptions + Memory_Services('SetValue', ServiceKeyID, ContentNegotiation, CacheName$) + end else + HTTP_Services('SetResponseError', '', '', 406, 'The server cannot provide the client acceptable content.') + end + end + end else + HTTP_Services('SetResponseError', '', '', 400, 'The RequestHeaderField or ServerOptions argument is missing in the ' : Service : ' service.') + end + + Response = ContentNegotiation + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAbortedService +// +// Returns the service handler for aborted HTTP Requests. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <9>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetAbortedService() + + ServiceKeyID = Service + AbortedService = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If AbortedService EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + AbortedService = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Convert @Lower_Case to @Upper_Case IN AbortedService + Memory_Services('SetValue', ServiceKeyID, AbortedService, CacheName$) + end + + Response = AbortedService + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEnableLoggingFlag +// +// Returns the enable logging flag setting. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <10>. Note: Only +// an explicit setting of False (0) will turn this flag off. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEnableLoggingFlag() + + ServiceKeyID = Service + EnableLoggingFlag = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If EnableLoggingFlag EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + EnableLoggingFlag = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If EnableLoggingFlag EQ False$ else EnableLoggingFlag = True$ + Memory_Services('SetValue', ServiceKeyID, EnableLoggingFlag, CacheName$) + end + + Response = EnableLoggingFlag + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLogErrorsOnlyFlag +// +// Returns the log errors only flag setting. It pulls this from SYSENV\SRP_HTTP_FRAMEWORK_SETUP <13>. Note: Only +// an explicit setting of False (0) will turn this flag off. +//---------------------------------------------------------------------------------------------------------------------- +Service GetLogErrorsOnlyFlag() + + ServiceKeyID = Service + LogErrorsOnlyFlag = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If LogErrorsOnlyFlag EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + LogErrorsOnlyFlag = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If LogErrorsOnlyFlag EQ False$ else LogErrorsOnlyFlag = True$ + Memory_Services('SetValue', ServiceKeyID, LogErrorsOnlyFlag, CacheName$) + end + + Response = LogErrorsOnlyFlag + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetDebuggerSetting +// +// Returns the value that will be passed into the RTI_Debugger_Setting subroutine. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <11>. If no value has been set then a 0 (disabled) is returned as the default. +//---------------------------------------------------------------------------------------------------------------------- +Service GetDebuggerSetting() + + ServiceKeyID = Service + DebuggerSetting = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If DebuggerSetting EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + DebuggerSetting = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If DebuggerSetting EQ '' then DebuggerSetting = 0 + Memory_Services('SetValue', ServiceKeyID, DebuggerSetting, CacheName$) + end + + Response = DebuggerSetting + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetDebuggerService +// +// Returns the service handler for aborted HTTP Requests due to runtime errors. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <12>. +//---------------------------------------------------------------------------------------------------------------------- +Service GetDebuggerService() + + ServiceKeyID = Service + DebuggerService = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If DebuggerService EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + DebuggerService = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + Convert @Lower_Case to @Upper_Case IN DebuggerService + Memory_Services('SetValue', ServiceKeyID, DebuggerService, CacheName$) + end + + Response = DebuggerService + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAPICallProcedure +// +// Returns the API calling procedure method which is primarily used by HTTP_MCP. It pulls this from +// SYSENV\SRP_HTTP_FRAMEWORK_SETUP <20>. If no value has been set then "Web API" is returned as the default. +//---------------------------------------------------------------------------------------------------------------------- +Service GetAPICallProcedure() + + ServiceKeyID = Service + APICallProcedure = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If APICallProcedure EQ '' then + SetupRowKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + APICallProcedure = Database_Services('ReadDataRow', SetupTable$, SetupRowKeyID) + If APICallProcedure EQ '' then APICallProcedure = 'Web API' + Memory_Services('SetValue', ServiceKeyID, APICallProcedure, CacheName$) + end + + Response = APICallProcedure + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetWebAPI +// +// Returns the name of the indicated resource's API procedure if it exists. If it does not exist then an empty string +// will be returned. +//---------------------------------------------------------------------------------------------------------------------- +Service GetWebAPI(Resource, ReturnRepositoryKeyID) + + If ReturnRepositoryKeyID NE True$ then ReturnRepositoryKeyID = False$ + + ServiceModule = RetStack()<1> + ServiceKeyID = ServiceModule : '*' : Service : '*' : Resource : '*' : ReturnRepositoryKeyID + WebAPI = Memory_Services('GetValue', ServiceKeyID, True$, 10, CacheName$) + + If WebAPI EQ '' then + Convert @Lower_Case to @Upper_Case in Resource + NumApps = Count(@APPID, @FM) + (@APPID NE '') + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SysObjKey = '$' : Resource : '_API' + end else + SysObjKey = '$' : Resource : '_API' : '*' : @APPID + end + ObjExists = (Xlate('SYSOBJ', SysObjKey, 0, 'X') GT '') + Until ObjExists + Next AppCnt + + If ObjExists then + WebAPI = Resource : '_API' + If ReturnRepositoryKeyID EQ True$ then + WebAPI = AppID : '*STPROC**' : WebAPI + end + end + Memory_Services('SetValue', ServiceKeyID, WebAPI, CacheName$) + end + + Response = WebAPI + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// UpdateWebAPIs +// +// Creates or updates exist web API procedures as needed based on the indicated resource list. If at least one new API +// has been updated, this service will return a True$. Otherwise a False$ will be returned. Note: this will not +// remove existing API procedures or individual APIs even if the resource is no longer referenced. The MakeLocal +// argument can indicate if inherited APIs should be made local in order to be updated and compiled successfully. +//---------------------------------------------------------------------------------------------------------------------- +Service UpdateWebAPIs(ResourceList, MakeLocal=BOOLEAN) + + // Assume no inherited APIs will be made local + If MakeLocal NE True$ then MakeLocal = False$ + APIsUpdated = False$ + + If ResourceList EQ '' then ResourceList = HTTP_Resource_Manager_Services('GetResourceList') + + If ResourceList NE '' then + For Each ResourceItem in ResourceList using @FM setting fPos + EndpointPattern = ResourceItem<0, 2> + EndpointName = ResourceItem<0, 3> + Convert @Upper_Case to @Lower_Case in EndpointPattern + Convert @Upper_Case to @Lower_Case in EndpointName + // Strip off the preceding "/", if any, to make the endpoint pattern uniform. + If EndpointPattern[1, 1] EQ '/' then EndpointPattern = EndpointPattern[2, 999] + // Temporarily convert "/" to @FM to make it easier to reference the segments. + Convert '/' to @FM in EndpointPattern + NumSegments = DCount(EndpointPattern, @FM) + EndpointType = ResourceItem<0, 5> + // Set the current resource (if appropriate) and swap out the unique resource ID with + // a generic "{ResourceID}" placeholder where appropriate. + Begin Case + Case (EndpointType EQ 'APIROOT') OR (EndpointType EQ 'RESOURCE') + If EndpointType EQ 'APIROOT' then + CurrentResource = 'APIROOT' + end else + CurrentResource = EndpointName + end + If NumSegments GT 1 then + If EndpointPattern[1, 1] EQ '{' then + EndpointPattern = '{ResourceID}' + end + end + Case EndpointType EQ 'RESOURCE_ID' + CurrentResource = EndpointPattern + EndpointPattern = '{ResourceID}' + Case EndpointType EQ 'PROPERTY' + If EndpointPattern[1, 1] EQ '{' then + CurrentResource = EndpointPattern + EndpointPattern = '{ResourceID}' + end else + CurrentResource = EndpointPattern + end + End Case + + // Restore the "/" in the endpoint. This is now the Key ID to the endpoint that will be stored in + // memory. + Convert @FM to '/' in EndpointPattern + + // Identify the API signatures needed for this endpoint. + APISignatures = '' + Methods = HTTP_Resource_Manager_Services('GetResourceProperty', EndpointPattern, 'METHODS') + If Methods NE '' then + For Each Method in Methods using ',' setting MethodPos + APISignatures := HTTP_Resource_Manager_Services('GetResourceSignature', EndpointPattern, Method) : ',' + Next Method + end + APISignatures[-1, 1] = '' + + CurrentResource = Oconv(CurrentResource, 'MCT') + APIProcedureName = Oconv(CurrentResource, 'MCU') : '_API' + + // Check to see if the API procedure for the current resource exists. If not, then attempt to create one. + WebAPI = HTTP_Services('GetWebAPI', CurrentResource, True$) + If WebAPI EQ '' then + APISignatureKeyID = HTTP_Services('GetLocalAppKeyID', APISignatureKeyID$) + APISignature = Database_Services('ReadDataRow', SetupTable$, APISignatureKeyID) + APICommentBlockKeyID = HTTP_Services('GetLocalAppKeyID', APICommentBlockKeyID$) + APICommentBlock = Database_Services('ReadDataRow', SetupTable$, APICommentBlockKeyID) + APIBodyBlockKeyID = HTTP_Services('GetLocalAppKeyID', APIBodyBlockKeyID$) + APIBody = Database_Services('ReadDataRow', SetupTable$, APIBodyBlockKeyID) + APIProcedure = APISignature : @FM : APICommentBlock : @FM : APIBody + Swap '' with CurrentResource in APIProcedure + Swap 'MM/DD/YY' with Oconv(Date(), 'D2/') in APIProcedure + GoSub CreateNewAPI + end + + // Confirm that the API procedure exists along with associated API signatures. Then check to see if any new + // API signatures need to be added to the API procedure. + If (WebAPI NE '') AND (APISignatures NE '') then + // Web API procedure exists. Make sure all API signatures exist. + WebAPIAppID = WebAPI[1, '*'] + TypeID = WebAPI[Col2() + 1, '*'] + ClassID = WebAPI[Col2() + 1, '*'] + EntityID = WebAPI[Col2() + 1, '*'] + ThisAppID = @AppId<1> + rv = Set_Status(0) + APIProcedure = Repository('ACCESS', WebAPI) + If Get_Status(StatusCode) then + Error_Services('Add', 'Error accessing the ' : APIProcedureName : ' procedure. Get_Status: ' : StatusCode) + WebAPI = '' + end else + Swap \0D0A\ with @FM in APIProcedure + CompareAPIProcedure = APIProcedure + // Strip away excess @FM (lines) from the source code. + Loop + Until APIProcedure[-1, 1] NE @FM + APIProcedure[-1, 1] = '' + Repeat + For Each APISignature in APISignatures using ',' + Method = APISignature[-1, 'B.'] + If IndexC(APIProcedure, 'API ' : APISignature, 1) else + // API signature doesn't exist so append it to the bottom. + APIProcedure := @FM : @FM : @FM : 'API ' : APISignature : @FM : @FM : " HTTP_Resource_Services('LoremIpsum')" : @FM : @FM : 'end api' + end + If Method EQ 'GET' then + // Make sure the HEAD API is also present. + Locate 'API ' : APISignature in APIProcedure using @FM setting fPos then + APISignature[-3, 3] = 'HEAD' + If IndexC(APIProcedure, 'API ' : APISignature, 1) else + // The HEAD API signature doesn't exist so insert it before the GET API. + APIProcedure = Insert(APIProcedure, fPos, 0, 0, 'API ' : APISignature) + end + end + end + Next APISignature + If APIProcedure NE CompareAPIProcedure then + // A change has been made so attempt to update and compile. + If (WebAPIAppID NE ThisAppID) AND (MakeLocal EQ True$) then + // The existing WebAPI belongs to an inherited application. The flag to make this local has been set so create a copy of the Web API. + GoSub CreateNewAPI + end else + GoSub UpdateCurrentAPI + end + end + end + end + Until Error_Services('HasError') EQ True$ + Next ResourceItem + end else + Error_Services('Add', 'The ResourceList argument is missing in the ' : Service : ' service.') + end + + Response = APIsUpdated + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLocalAppKeyID +// +// Returns the local application KeyID for the indicated row. If one does not exist, the FRAMEWORKS row will be copied. +//---------------------------------------------------------------------------------------------------------------------- +Service GetLocalAppKeyID(BaseAppKeyID) + + LocalAppKeyID = '' + + RowFound = False$ + LocalAppKeyID = BaseAppKeyID : '*' : @APPID<1> + NumApps = Count(@APPID, @FM) + (@APPID NE '') + For AppCnt = 1 to NumApps + AppID = @APPID + If AppID _EQC 'SYSPROG' then + SetupKeyID = BaseAppKeyID + end else + SetupKeyID = BaseAppKeyID : '*' : AppID + end + SetupRow = Database_Services('ReadDataRow', SetupTable$, SetupKeyID) + If SetupRow NE '' then + RowFound = True$ + If SetupKeyID NE LocalAppKeyID then + Database_Services('WriteDataRow', SetupTable$, LocalAppKeyID, SetupRow) + end + end + Until RowFound + Next AppCnt + + Response = LocalAppKeyID + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEndpoint +// +// Returns the endpoint for the current request. If this is the entry point then "APIROOT" will be returned so the +// caller knows explicitly what type of endpoint this is. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEndpoint() + + Endpoint = HTTP_Services('GetHTTPPathInfo') + // If the endpoint is still empty, this emplies the API entry point. Assign the value "APIROOT" so that it can be + // used to map to the appropriate web API procedure. + If Endpoint EQ '' then Endpoint = 'APIROOT' + + Response = Endpoint + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsValidEndpoint - Deprecated +// +// Returns a Boolean flag indicating if the indicated endpoint is valid based on the defined resources. If the Endpoint +// argument is empty, the GetEndpoint services will be used to identify the endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service IsValidEndpoint(Endpoint) + + ValidEndpoint = True$ ; // Assume the endpoint is valid for now. + If Endpoint EQ '' then Endpoint = HTTP_Services('GetEndpoint') + + // Create a list of supported web APIs based on the defined endpoints in the setup record. + HTTP_Services('SetSupportedEndpoints') + // Get the endpoint pattern for the current endpoint. + EndpointPattern = HTTP_Services('GetEndpointPattern', Endpoint) + + If Error_Services('NoError') then + // The endpoint has been modified into a well-formed pattern. If it did not fail any obvious validation checks, + // see if there is an actual resource associated with this endpoint and respond accordingly. + Resource = Memory_Services('GetValue', 'API*' : EndpointPattern : '*RESOURCE', '', '', CacheName$) + If Resource EQ '' then + ValidEndpoint = False$ + end + end + + Response = ValidEndpoint + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetSupportedEndpoints - Deprecated +// +// Creates a memory-resident lookup of all the supported endpoints, properties, methods, query params, and logging flag. +//---------------------------------------------------------------------------------------------------------------------- +Service SetSupportedEndpoints() + + ServiceKeyID = Service + AlreadySet = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If Not(AlreadySet) then + // Create a list of supported web APIs based on the defined endpoints in the setup record. + ResourcesKeyID = HTTP_Services('GetLocalAppKeyID', ResourcesKeyID$) + ResourceList = Database_Services('ReadDataRow', SetupTable$, ResourcesKeyID) + // Loop through the resource list to find a matching pattern. Otherwise, this is an invalid endpoint. + If ResourceList NE '' then + For Each ResourceItem in ResourceList using @FM setting fPos + EndpointPattern = ResourceItem<0, 2> + EndpointName = ResourceItem<0, 3> + Convert @Upper_Case to @Lower_Case in EndpointPattern + Convert @Upper_Case to @Lower_Case in EndpointName + // Strip off the preceding "/", if any, to make the endpoint pattern uniform. + If EndpointPattern[1, 1] EQ '/' then EndpointPattern = EndpointPattern[2, 999] + // Temporarily convert "/" to @FM to make it easier to reference the segments. + Convert '/' to @FM in EndpointPattern + NumSegments = DCount(EndpointPattern, @FM) + EndpointType = ResourceItem<0, 5> + + // Swap out the unique resource ID with a generic "{ResourceID}" placeholder where appropriate. + NewEndpointPattern = '' + For Each Segment in EndpointPattern using @FM + If Segment[1, 1] EQ '{' then Segment = '{ResourceID}' + NewEndpointPattern := Segment : @FM + Next Segment + NewEndpointPattern[-1, 1] = '' + Transfer NewEndpointPattern to EndpointPattern + + // For each resource item, identify the current resource, properties, sub-resources, methods, and valid + // query params. + Begin Case + Case (EndpointType EQ 'APIROOT') OR (EndpointType EQ 'RESOURCE') + If EndpointType EQ 'APIROOT' then + CurrentResource = EndpointType + end else + CurrentResource = EndpointName + end + Memory_Services('SetValue', 'API*' : CurrentResource : '*HAS_RESOURCE_ID', False$, CacheName$) ; // Assume no for now. + Memory_Services('SetValue', 'API*' : CurrentResource : '*PROPERTIES', '', CacheName$) ; // Assume none for now. + Memory_Services('SetValue', 'API*' : CurrentResource : '*SUB_RESOURCES', '', CacheName$) ; // Assume none for now. + If NumSegments GT 1 then + If EndpointPattern[1, 1] NE '{' then + // The previous segment is not a resource ID, so update the sub-resource list. + ParentResource = EndpointPattern + SubResources = Memory_Services('GetValue', 'API*' : ParentResource : '*SUB_RESOURCES', '', '', CacheName$) + SubResources := EndpointName : @FM + Memory_Services('SetValue', 'API*' : ParentResource : '*SUB_RESOURCES', SubResources, CacheName$) + end + end + Case EndpointType EQ 'RESOURCE_ID' + CurrentResource = EndpointPattern + Memory_Services('SetValue', 'API*' : CurrentResource : '*HAS_RESOURCE_ID', True$, CacheName$) + Memory_Services('SetValue', 'API*' : CurrentResource : '*{ResourceID}*PROPERTIES', '', CacheName$) ; // Assume none for now. + Case EndpointType EQ 'PROPERTY' + If EndpointPattern[1, 1] EQ '{' then + CurrentResource = EndpointPattern + Properties = Memory_Services('GetValue', 'API*' : CurrentResource : '*{ResourceID}*PROPERTIES', '', '', CacheName$) + Properties := EndpointName : @FM + Memory_Services('SetValue', 'API*' : CurrentResource : '*{ResourceID}*PROPERTIES', Properties, CacheName$) + end else + CurrentResource = EndpointPattern + Properties = Memory_Services('GetValue', 'API*' : CurrentResource : '*PROPERTIES', '', '', CacheName$) + Properties := EndpointName : @FM + Memory_Services('SetValue', 'API*' : CurrentResource : '*PROPERTIES', Properties, CacheName$) + end + End Case + // Restore the "/" in the endpoint. This is now the Key ID to the endpoint that will be stored in + // memory. + Convert @FM to '/' in EndpointPattern + Memory_Services('SetValue', 'API*' : EndpointPattern : '*RESOURCE', CurrentResource, CacheName$) + // Identify the HTTP methods and Query Params that this endpoint supports. + EndpointElements = ResourceItem<0, 19> + If EndpointElements NE '' then + For Each EndpointElement in EndpointElements using @SVM setting svmPos + ElementName = EndpointElement[1, @TM] + ElementValue = EndpointElement[Col2() + 1, @TM] + Begin Case + Case ElementName _EQC 'METHODS' + Memory_Services('SetValue', 'API*' : EndpointPattern : '*METHODS', ElementValue, CacheName$) + Case ElementName _EQC 'QUERY_PARAMS' + Memory_Services('SetValue', 'API*' : EndpointPattern : '*QUERY_PARAMS', ElementValue, CacheName$) + Case ElementName _EQC 'EXCLUDE_LOGGING' + Memory_Services('SetValue', 'API*' : EndpointPattern : '*EXCLUDE_LOGGING', ElementValue, CacheName$) + End Case + Next EndpointElement + end + Next ResourceItem + end + Memory_Services('SetValue', ServiceKeyID, True$, CacheName$) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetEndpointPattern - Deprecated +// +// Returns the generic endpoint format for the indicated actual request endpoint. This replaces specific resource IDs +// with the "{ResourceID}" place holder. If the Endpoint argument is empty, the GetEndpoint services will be used to +// identify the endpoint. +//---------------------------------------------------------------------------------------------------------------------- +Service GetEndpointPattern(Endpoint) + + If Endpoint EQ '' then Endpoint = HTTP_Services('GetEndpoint') + + ServiceKeyID = Service : '*' : Endpoint + EndpointPattern = Memory_Services('GetValue', ServiceKeyID, '', '', CacheName$) + + If EndpointPattern EQ '' then + // Create a list of supported web APIs based on the defined endpoints in the setup record. This might already + // be done, but the SetSupportedEndpoints tracks this so it won't waste time doing it again. + HTTP_Services('SetSupportedEndpoints') + // Attempt to map the actual endpoint with a endpoint pattern to validate the API as well as supported HTTP methods. + ValidEndpoint = True$ ; // Assume true for now. + APISignature = '' ; // This will be the actual API passed into the resource API routine if valid. + For Each Segment in Endpoint using '/' setting SegmentNo + Convert @Upper_Case to @Lower_Case in Segment + Begin Case + Case SegmentNo EQ 1 + // The first segment is always a resource. + CurrentResource = Segment + EndpointPattern := Segment : '/' + APISignature = Segment : '.' + LastEndpointType = 'RESOURCE' + Case LastEndpointType EQ 'RESOURCE' + Properties = Memory_Services('GetValue', 'API*' : CurrentResource : '*PROPERTIES', '', '', CacheName$) + SubResources = Memory_Services('GetValue', 'API*' : CurrentResource : '*SUB_RESOURCES', '', '', CacheName$) + Locate Segment in Properties using @FM setting fPos then + EndpointPattern := Segment : '/' + APISignature := Segment : '.' + LastEndpointType = 'PROPERTY' + end else + Locate Segment in SubResources using @FM setting fPos then + CurrentResource = Segment + EndpointPattern := Segment : '/' + APISignature = Segment : '.' + LastEndpointType = 'RESOURCE' + end else + If Memory_Services('GetValue', 'API*' : CurrentResource : '*HAS_RESOURCE_ID', '', '', CacheName$) EQ True$ then + EndpointPattern := '{ResourceID}/' + APISignature := 'ID.' + LastEndpointType = 'RESOURCE_ID' + end else + ValidEndpoint = False$ + end + end + end + Case LastEndpointType EQ 'RESOURCE_ID' + EndpointPattern := Segment : '/' + Properties = Memory_Services('GetValue', 'API*' : CurrentResource : '*{ResourceID}*PROPERTIES', '', '', CacheName$) + Locate Segment in Properties using @FM setting fPos then + LastEndpointType = 'PROPERTY' + APISignature := Segment : '.' + end else + CurrentResource = Segment + APISignature = Segment : '.' + LastEndpointType = 'RESOURCE' + end + Case LastEndpointType EQ 'PROPERTY' + // There shouldn't be any more segments, so consider this an invalid endpoint. + ValidEndpoint = False$ + End Case + While ValidEndpoint EQ True$ + Next Segment + EndpointPattern[-1, 1] = '' + Memory_Services('SetValue', ServiceKeyID, EndpointPattern, CacheName$) + end + + Response = EndpointPattern + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// +// Create a new Web API in the local application. +// +//---------------------------------------------------------------------------------------------------------------------- +CreateNewAPI: + + WebAPI = @AppId<1> : '*STPROC**' : APIProcedureName + rv = Set_Status(0) + Repository('NEW', WebAPI, '', 1, 1, '', '', '', '', '', APIProcedureName, APIProcedure) + If Get_Status(StatusCode) then + Error_Services('Add', 'Error creating the ' : APIProcedureName : ' procedure. Get_Status: ' : StatusCode) + WebAPI = '' + end else + APIsUpdated = True$ + Repository('COMPILE', WebAPI, 1, '', 1) + If Get_Status(StatusCode) then + Error_Services('Add', 'Error compiling the ' : APIProcedureName : ' procedure. Get_Status: ' : StatusCode) + WebAPI = '' + end + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Update a current Web API in the local application. +// +//---------------------------------------------------------------------------------------------------------------------- +UpdateCurrentAPI: + + rv = Set_Status(0) + Repository('UPDATE', WebAPI, APIProcedure) + If Get_Status(StatusCode) then + If (StatusCode<1, 1> EQ REP_APP_INHERIT_MOD_ERR$) AND (MakeLocal EQ True$) then + APIsUpdated = True$ + end else + Error_Services('Add', 'Error updating the ' : APIProcedureName : ' procedure. Get_Status: ' : StatusCode<1, 1> : ' - ' : StatusCode<1, 2>) + WebAPI = '' + end + end else + APIsUpdated = True$ + Repository('COMPILE', WebAPI, 1, '', 1) + If Get_Status(StatusCode) then + Error_Services('Add', 'Error compiling the ' : APIProcedureName : ' procedure. Get_Status: ' : StatusCode) + WebAPI = '' + end + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_USERS_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_USERS_SERVICES.txt new file mode 100644 index 0000000..199cd6e --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_USERS_SERVICES.txt @@ -0,0 +1,256 @@ +Function HTTP_Users_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Users_Services + + Description : Handler program for the HTTP Users service module. + + Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 04/17/15 dmb Original programmer. - [SRPFW-94] + 05/22/15 dmb Retrofit using the new template from HTTP_Contacts_Services and relying upon the + HTTP_Resources_Services module. - [SRPFW-94] + 03/09/16 dmb Refactor to use the updated RunHTTPService service. - [SRPFW-112] + 07/01/17 dmb Refactor using Enhanced BASIC+ syntax. - [SRPFW-184] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = '' + +// Some methods are restricted to authorized users only. Get their security level for cross-checking later. +Username = Memory_Services('GetValue', 'Username') +Security = Xlate('USERS', Username, 'ACCESS_LEVEL', 'X') + +// Handle the HTTP request as needed. +Begin Case + Case RemainingURL _EQC '' + // This means the URL ends with /users, which means this is the end point. The client is requesting a + // collection of all users. + AllowedMethods = 'POST,GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub Post, Get, Options + end else + ValidMethod = False$ + end + + Case Count(RemainingURL, '/') EQ 0 + // This means the URL ends with /users/{KeyID}. The client is requesting a specific user item. + AllowedMethods = 'PUT,GET,DELETE,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub PutItem, GetItem, DeleteItem, OptionsItem + end else + ValidMethod = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Post +// +// Attempts to create a new user. +//---------------------------------------------------------------------------------------------------------------------- +Post: + + HTTP_Resource_Services('PostDatabaseItem', 'USERS', SelfURL) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Get +// +// Returns a collection of users. This URL also supports the passing in of query parameters, which in this case will +// will only support "name" as the query param field. +//---------------------------------------------------------------------------------------------------------------------- +Get: + + HAL = '' ; // Initialize the response. + + If HTTP_Services('GetHTTPGetString') NE '' then + // This means the URL ends with /users?name={value}. + + NameSearch = HTTP_Services('GetQueryField', 'name') + Filter = 'SELECT USERS BY USERNAME WITH USERNAME CONTAINING ' : Quote(NameSearch) + ColumnNames = 'first_name' : @FM : 'last_name' + HAL = HTTP_Resource_Services('GetDatabaseItems', Filter, 'USERS', SelfURL, ColumnNames) + + end else + // This means the URL ends with /users. The client is requesting all users available at this URL. + + Filter = '' + ColumnNames = 'first_name' : @FM : 'last_name' + HAL = HTTP_Resource_Services('GetDatabaseItems', Filter, 'USERS', SelfURL, ColumnNames) + + end + + Response = HAL + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Options +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +Options: + + GoSub SetCommonOptionResponseHeaders + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// PutItem +// +// Attempts to update a user. If the user does not already exist then a new one will be created. +//---------------------------------------------------------------------------------------------------------------------- +PutItem: + + KeyID = NextSegment + + HTTP_Resource_Services('PutDatabaseItem', 'USERS', SelfURL : '/' : KeyID, KeyID) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// GetItem +// +// Returns the specific user. +//---------------------------------------------------------------------------------------------------------------------- +GetItem: + + KeyID = NextSegment + + ColumnNames = 'first_name' : @FM : 'last_name' + HAL = HTTP_Resource_Services('GetDatabaseItem', 'USERS', SelfURL : '/' : KeyID, KeyID, ColumnNames) + + Response = HAL + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// DeleteItem +// +// Attempts to delete the user. +//---------------------------------------------------------------------------------------------------------------------- +DeleteItem: + + KeyID = NextSegment + + HTTP_Resource_Services('DeleteDatabaseItem', 'USERS', KeyID) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// OptionsItem +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +OptionsItem: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_VERSION_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_VERSION_SERVICES.txt new file mode 100644 index 0000000..a58c7d4 --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_VERSION_SERVICES.txt @@ -0,0 +1,162 @@ +Function HTTP_Version_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Version_Services + + Description : Handler program for the HTTP Version service module. + + Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 07/10/17 dmb Original programmer. - [SRPFW-188] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = '' + +// Handle the HTTP request as needed. +Begin Case + Case RemainingURL _EQC '' + // This means the URL ends with /version. + AllowedMethods = 'GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub Get, Options + end else + ValidMethod = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------------------------------------------------- +// Get +// +// Returns the version resource. +//---------------------------------------------------------------------------------------------------------------------- +Get: + + Version = HTTP_Services('GetVersion') + If Error_Services('NoError') then + Swap CRLF$ with @FM in Version + If SRP_JSON(hVersionObj, 'NEW', 'OBJECT') then + SRP_JSON(hVersionObj, 'SETVALUE', 'Version', Version<1>) + SRP_JSON(hVersionObj, 'SETVALUE', 'Date', Field(Version<2>, ' ', 1, 1)) + SRP_JSON(hVersionObj, 'SETVALUE', 'Time', Field(Version<2>, ' ', 2, 1)) + VersionBody = SRP_JSON(hVersionObj, 'STRINGIFY', 'STYLED') + SRP_JSON(hVersionObj, 'RELEASE') + HTTP_Services('SetResponseStatus', 200) + HTTP_Services('SetResponseBody', VersionBody, False, 'application/json') + end + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// Options +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +Options: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return diff --git a/FRAMEWORKS/STPROC/HTTP_WEBACCOUNTS_SERVICES.txt b/FRAMEWORKS/STPROC/HTTP_WEBACCOUNTS_SERVICES.txt new file mode 100644 index 0000000..082998d --- /dev/null +++ b/FRAMEWORKS/STPROC/HTTP_WEBACCOUNTS_SERVICES.txt @@ -0,0 +1,251 @@ +Function HTTP_WebAccounts_Services(RemainingURL) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_WebAccounts_Services + + Description : Handler program for the HTTP WebAccounts service module. + + Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful + variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + SelfURL - The URL path representing the current service. + FullEndPointURL - The URL submitted by the client. This can be the same or longer than + the SelfURL. + NextSegment - The URL segment immediately following the SelfURL (if any). This + could contain the name of the next service or it could contain the + Item ID for the current service (aka resource). + CurrentServiceHandler - The name of this stored procedure. + + Parameters : + RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current + service. This information is used in the HTTP_SERVICE_SETUP insert to populate other + useful variables (see Notes above). + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 10/12/18 dmb Original programmer. - [SRPFW-254] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert HTTP_SERVICE_SETUP +$insert HTTP_INSERTS + +Declare subroutine WebAccounts_Services, HTTP_Authentication_Services +Declare function WebAccounts_Services, HTTP_Authentication_Services + +// Assume the current HTTP method is valid until proven otherwise. +ValidMethod = True$ +// Assume the current web service is valid until provent otherwise. +ValidService = True$ +// Assume no HTTP methods are valid until proven otherwise. +AllowedMethods = '' +// A list of all services able to be called from this URL. +AllowedServices = 'password' + +AuthenticatedAccountID = HTTP_Authentication_Services('GetAuthenticatedAccountID') + +// Handle the HTTP request as needed. +Begin Case + Case Count(RemainingURL, '/') GE 1 + // This means the URL ends with /webaccounts/{KeyID}/{property}. + Property = FullEndPointURL[-1, 'B/'] + Locate Property in AllowedServices using ',' setting ServicePos then + AllowedMethods = 'PATCH,GET,OPTIONS' + Locate HTTPMethod in AllowedMethods using ',' setting MethodPos then + On MethodPos GoSub PatchItemProperty, GetItemProperty, OptionsItemProperty + end else + ValidMethod = False$ + end + end else + ValidService = False$ + end + + Case Otherwise$ + ValidService = False$ +End Case + +// Resolve any invalid conditions with the HTTP request. +Begin Case + Case Not(ValidService) + HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + + Case Not(ValidMethod) + HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') + + GoSub SetAllowedMethods +End Case + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// PatchItemProperty +// +// Attempts to update the property of a specific resource. +//---------------------------------------------------------------------------------------------------------------------- +PatchItemProperty: + + // Get the name of the property by looking at the last segment in the FullEndPointURL variable. An assumption is + // being made that there are no other segments in the URL that follow the property name. + Property = FullEndPointURL[-1, 'B/'] + + If Property _EQC 'password' then + AccountID = NextSegment + If AccountID EQ AuthenticatedAccountID then + Password = HTTP_Authentication_Services('GetWebAccountPassword', AccountID, False$) + Body = HTTP_Services('GetHTTPPostString') + Body = HTTP_Services('DecodePercentString', Body) + If SRP_JSON(objJSON, 'Parse', Body) EQ '' then + NewPassword = SRP_JSON(objJSON, 'GetValue', 'value') + SRP_JSON(objJSON, 'Release') + HTTP_Authentication_Services('SetWebAccountPassword', AccountID, Password, NewPassword) + If Error_Services('NoError') then + If SRP_JSON(objJSON, 'New', 'Object') then + If SRP_JSON(objLinks, 'New', 'Object') then + If SRP_JSON(objSelf, 'New', 'Object') then + SRP_JSON(objSelf, 'SetValue', 'href', FullEndPointURL) + SRP_JSON(objLinks, 'Set', 'self', objSelf) + SRP_JSON(objSelf, 'Release') + end + SRP_JSON(objJSON, 'Set', '_links', objLinks) + SRP_JSON(objLinks, 'Release') + end + SRP_JSON(objJSON, 'SetValue', 'value', NewPassword, 'String') + HAL = SRP_JSON(objJSON, 'Stringify', 'Fast') + SRP_JSON(objJSON, 'Release') + HTTP_Services('SetResponseBody', HAL, False$, 'application/hal+json') + end + end else + HTTP_Services('SetResponseStatus', '403', Error_Services('GetMessage')) + end + end else + Error_Services('Add', 'Error parsing JSON body within the ' : CurrentServiceHandler : ' module.') + HTTP_Services('SetResponseStatus', '500', Error_Services('GetMessage')) + end + end else + HTTP_Services('SetResponseStatus', '401', 'This account is not authorized for this endpoint.') + end + end else + // The URL contains an unsupported property. Return a 404 error. + HTTP_Services('SetResponseStatus', 404, Property : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// GetItemProperty +// +// Returns the property of a specific resource. +//---------------------------------------------------------------------------------------------------------------------- +GetItemProperty: + + // Get the name of the property by looking at the last segment in the FullEndPointURL variable. An assumption is + // being made that there are no other segments in the URL that follow the property name. + Property = FullEndPointURL[-1, 'B/'] + If Property _EQC 'password' then + AccountID = NextSegment + If AccountID EQ AuthenticatedAccountID then + Password = HTTP_Authentication_Services('GetWebAccountPassword', AccountID, False$) + jsonWebAccounts = WebAccounts_Services('GetWebAccounts', AccountID, True$) + If Error_Services('NoError') then + If SRP_JSON(objJSON, 'Parse', jsonWebAccounts) EQ '' then + objPassword = SRP_JSON(objJSON, 'Get', 'password') + SRP_JSON(objJSON, 'Release') + If SRP_JSON(objLinks, 'New', 'Object') then + If SRP_JSON(objSelf, 'New', 'Object') then + SRP_JSON(objSelf, 'SetValue', 'href', FullEndPointURL) + SRP_JSON(objLinks, 'Set', 'self', objSelf) + SRP_JSON(objSelf, 'Release') + end + SRP_JSON(objPassword, 'Set', '_links', objLinks) + SRP_JSON(objLinks, 'Release') + end + HAL = SRP_JSON(objPassword, 'Stringify', 'Fast') + SRP_JSON(objPassword, 'Release') + HTTP_Services('SetResponseBody', HAL, False$, 'application/hal+json') + end else + Error_Services('Add', 'Error parsing JSON body within the ' : CurrentServiceHandler : ' module.') + HTTP_Services('SetResponseStatus', '500', Error_Services('GetMessage')) + end + end else + HTTP_Services('SetResponseStatus', '403', Error_Services('GetMessage')) + end + end else + HTTP_Services('SetResponseStatus', '401', 'This account is not authorized for this endpoint.') + end + end else + // The URL contains an unsupported property. Return a 404 error. + HTTP_Services('SetResponseStatus', 404, Property : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// OptionsItemProperty +// +// Sets the appropriate response header fields for an OPTIONS request. +//---------------------------------------------------------------------------------------------------------------------- +OptionsItemProperty: + + GoSub SetCommonOptionResponseHeaders + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// SetCommonOptionResponseHeaders +// +// Sets the response headers that will be common for all OPTIONS methods. +//---------------------------------------------------------------------------------------------------------------------- +SetCommonOptionResponseHeaders: + + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) + HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) + + GoSub SetAllowedMethods + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// SetAllowedMethods +// +// Sets the Allow response header field as appropriate for the requested URL. +//---------------------------------------------------------------------------------------------------------------------- +SetAllowedMethods: + + If AllowedMethods NE '' then + For Each Method in AllowedMethods using ',' + HTTP_Services('SetResponseHeaderField', 'Allow', Method, True$) + Next Method + end + +return diff --git a/FRAMEWORKS/STPROC/LOGGING_SERVICES.txt b/FRAMEWORKS/STPROC/LOGGING_SERVICES.txt new file mode 100644 index 0000000..13e6276 --- /dev/null +++ b/FRAMEWORKS/STPROC/LOGGING_SERVICES.txt @@ -0,0 +1,506 @@ +Function Logging_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Logging_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 08/30/17 dmb Original programmer. + 02/17/18 dmb Use the new named cache feature of Memory_Services so logging data is protected when other + processes release a cache table. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert SERVICE_SETUP +$insert SRPMail_Inserts + +Equ CRLF$ to \0D0A\ +Equ CR$ to \0D\ +Equ LF$ to \0A\ +Equ TAB$ to \09\ +Equ COMMA$ to ',' + +Common /LogginServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@ + +Declare function Logging_Services, Memory_Services, SRP_Hash, SRP_Path, SRP_Send_Mail, Environment_Services +Declare subroutine Logging_Services, Memory_Services, SetInitDirOptions + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the Logging services module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// NewLog +// +// LogPath - Path to where the log file is located. - [Required] +// LogFileName - Name of the log file. - [Required] +// RowDelimiter - Delimiter used to separate each log row. Default is CR/LF. - [Optional] +// ColumnDelimiter - Delimiter used to separate each column value. If ColumnWidths is empty then this will default to a +// comma. - [Optional] +// ColumnHeaders - @FM list of Column headers to use in the log file. Default is no column headers will be used. +// - [Optional] +// ColumnWidths - @FM list of Column widths for each column data value. If empty then the entire column value will +// be stored. - [Optional] +// QuoteValues - Boolean flag to indicate if column values should be quoted. Default is false. - [Optional] +// ClearLog - Boolean flag to indicate if any existing log file should be cleared. Default is false. +// - [Optional] +// +// Returns an object handle to a log file. +//---------------------------------------------------------------------------------------------------------------------- +Service NewLog(LogPath, LogFileName, RowDelimiter, ColumnDelimiter, ColumnHeaders, ColumnWidths, QuoteValues=BOOLEAN, ClearLog=BOOLEAN) + + objLog = '' + + If (LogPath NE '') AND (LogFileName NE '') then + If SRP_Path('Exists', LogPath) then + LogFullPath = SRP_Path('Combine', LogPath, LogFileName) + If LogFullPath[1, 1] EQ '\' AND LogFullPath[2, 1] NE '\' then LogFullPath = '\' : LogFullPath + objLog = SRP_Hash(LogFullPath, 'SHA-1', 'BASE32') + Memory_Services('SetValue', objLog : '*LogPath', LogPath, ServiceModule) + Memory_Services('SetValue', objLog : '*LogFileName', LogFileName, ServiceModule) + Memory_Services('SetValue', objLog : '*LogFullPath', LogFullPath, ServiceModule) + If Dir(LogFullPath) NE '' then + If ClearLog then + Logging_Services('CreateLogFile', objLog) + end + end else + Logging_Services('CreateLogFile', objLog) + end + If Error_Services('NoError') then + If RowDelimiter EQ '' then RowDelimiter = CRLF$ + Memory_Services('SetValue', objLog : '*RowDelimiter', RowDelimiter, ServiceModule) + If (ColumnDelimiter EQ '') AND (ColumnWidths EQ '') then ColumnDelimiter = COMMA$ + Memory_Services('SetValue', objLog : '*ColumnDelimiter', ColumnDelimiter, ServiceModule) + Memory_Services('SetValue', objLog : '*ColumnHeaders', ColumnHeaders, ServiceModule) + Memory_Services('SetValue', objLog : '*ColumnWidths', ColumnWidths, ServiceModule) + If QuoteValues NE True$ then QuoteValues = False$ + Memory_Services('SetValue', objLog : '*QuoteValues', QuoteValues, ServiceModule) + If Dir(LogFullPath)<1> EQ 0 AND ColumnHeaders NE '' then + // Add the column headers since this is a new log file. + Logging_Services('AppendLog', objLog, ColumnHeaders, '', @FM, True$) + end + end + end else + Error_Services('Add', LogPath : ' does not exist.') + end + end else + Error_Services('Add', 'LogPath or LogFileName argument was missing from the ' : Service : ' service.') + end + + Response = objLog + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AppendLog +// +// objLog - Object handle to the log file. - [Required] +// LogData - Data to be appended to the log file. - [Required] +// IncomingRowDelimiter - Delimiter used to separate each log row coming in. This allows incoming log data to have +// a different delimiter than what will be used in the log file. Default is the RowDelimiter +// used for appending the log data. - [Optional] +// IncomingColumnDelimiter - Delimiter used to separate each column value in the log data. This allows incoming log +// data to have a different delimiter than what will be used in the log file. Default is the +// column delimiter used to separate the log data or a comma if fixed widths only are +// indicated. - [Optional] +// IgnoreColumnHeaders - Boolean flag to indicate if the service should attempt to add column headers to an empty +// log file. Default is false. - [Optional] +// EmailAddresses - Comma delimited list of email addresses that should be notified when this log is appended. +// - [Optional] +// EmailMessage - Message to be sent to the email addresses. +// +// Appends data to the log file associated with the indicated log object handle. +//---------------------------------------------------------------------------------------------------------------------- +Service AppendLog(objLog, LogData, IncomingRowDelimiter, IncomingColumnDelimiter, IgnoreColumnHeaders, EmailAddresses, EmailMessage) + + If (objLog NE '') AND (LogData NE '') then + If IgnoreColumnHeaders NE True$ then IgnoreColumnHeaders = False$ + LogFullPath = Logging_Services('GetLogFullPath', objLog) + ColumnDelimiter = Logging_Services('GetColumnDelimiter', objLog) + LenColDel = Len(ColumnDelimiter) + ColumnHeaders = Logging_Services('GetColumnHeaders', objLog) + ColumnWidths = Logging_Services('GetColumnWidths', objLog) + QuoteValues = Logging_Services('GetQuoteValues', objLog) + RowDelimiter = Logging_Services('GetRowDelimiter', objLog) + If IncomingRowDelimiter EQ '' then IncomingRowDelimiter = RowDelimiter + If (IncomingColumnDelimiter EQ '') AND (ColumnWidths EQ '') then IncomingColumnDelimiter = ColumnDelimiter + LenRowDel = Len(RowDelimiter) + FileInfo = Dir(LogFullPath) + FileSize = FileInfo<1> + Status() = 0 + OutData = '' + OSOpen LogFullPath to hFile then + If (FileSize EQ 0) AND (ColumnHeaders NE '') AND (Not(IgnoreColumnHeaders)) then + Logging_Services('AppendLog', objLog, ColumnHeaders, @RM, @FM, True$) + end + For Each RowData in LogData using IncomingRowDelimiter + If RowData NE '' then + For Each ColumnData in RowData using IncomingColumnDelimiter setting cPos + If ColumnWidths NE '' then + ColumnWidth = ColumnWidths + ColumnData = ColumnData[1, ColumnWidth] : Str(' ', ColumnWidth - Len(ColumnData)) + end + If QuoteValues then + Swap '"' with '""' in ColumnData ; // Encode the quotes properly. + ColumnData = Quote(ColumnData) + end + OutData := ColumnData : ColumnDelimiter + Next ColumnData + OutData[Neg(LenColDel), LenColDel] = '' ; // Strip off the last column delimiter. + OutData := RowDelimiter ; // Append a row delimiter. + end + Next LogRow + OutData[Neg(LenRowDel), LenRowDel] = '' ; // Strip off the last row delimiter. + If (FileSize NE 0) then OutData = RowDelimiter : OutData ; // Prepend a row delimiter since there is existing data. + OSBWrite OutData to hFile at FileSize + OSError = Status() + If OSError then + Error_Services('Add', 'OSBWrite error code ' : OSError : ' in the ' : Service : ' service.') + end + OSClose hFile + end else + OSError = Status() + Error_Services('Add', 'OSOpen error code ' : OSError : ' in the ' : Service : ' service.') + end + + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + If EmailAddresses NE '' then + GoSub EmailMessage + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLogPath +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the path for the log file associated with the indicated log object handle. This will not include the name of +// the log file itself. +//---------------------------------------------------------------------------------------------------------------------- +Service GetLogPath(objLog) + + LogPath = '' + + If objLog NE '' then + LogPath = Memory_Services('GetValue', objLog : '*LogPath', '', '', ServiceModule) + If LogPath EQ '' then + Error_Services('Add', 'Log path not found in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = LogPath + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLogFileName +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the file name for the log file associated with the indicated log object handle. This will not include the +// path to where the log file is located. +//---------------------------------------------------------------------------------------------------------------------- +Service GetLogFileName(objLog) + + LogFileName = '' + + If objLog NE '' then + LogFileName = Memory_Services('GetValue', objLog : '*LogFileName', '', '', ServiceModule) + If LogFileName EQ '' then + Error_Services('Add', 'Log file name not found in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = LogFileName + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLogFullPath +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the full path for the log file associated with the indicated log object handle. +//---------------------------------------------------------------------------------------------------------------------- +Service GetLogFullPath(objLog) + + LogFullPath = '' + + If objLog NE '' then + LogFullPath = Memory_Services('GetValue', objLog : '*LogFullPath', '', '', ServiceModule) + If LogFullPath EQ '' then + Error_Services('Add', 'Log full path not found in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = LogFullPath + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRowDelimiter +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the delimiter to use to separate each row in the log. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRowDelimiter(objLog) + + RowDelimiter = '' + + If objLog NE '' then + RowDelimiter = Memory_Services('GetValue', objLog : '*RowDelimiter', '', '', ServiceModule) + If RowDelimiter EQ '' then + Error_Services('Add', 'Row delimiter not found in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = RowDelimiter + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetColumnDelimiter +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the delimiter to use to separate each column in the log. +//---------------------------------------------------------------------------------------------------------------------- +Service GetColumnDelimiter(objLog) + + ColumnDelimiter = '' + + If objLog NE '' then + ColumnDelimiter = Memory_Services('GetValue', objLog : '*ColumnDelimiter', '', '', ServiceModule) + If ColumnDelimiter EQ '' then + Error_Services('Add', 'Column delimiter not found in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = ColumnDelimiter + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetColumnHeaders +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the column headers that should be in the log. +//---------------------------------------------------------------------------------------------------------------------- +Service GetColumnHeaders(objLog) + + ColumnHeaders = '' + + If objLog NE '' then + ColumnHeaders = Memory_Services('GetValue', objLog : '*ColumnHeaders', '', '', ServiceModule) + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = ColumnHeaders + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetColumnWidths +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the column widths that should be used to truncate or pad each column in the log. +//---------------------------------------------------------------------------------------------------------------------- +Service GetColumnWidths(objLog) + + ColumnWidths = '' + + If objLog NE '' then + ColumnWidths = Memory_Services('GetValue', objLog : '*ColumnWidths', '', '', ServiceModule) + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = ColumnWidths + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetQuoteValues +// +// objLog - Object handle to the log file. - [Required] +// +// Returns the flag to indicate whether column values should be quoted or not. +//---------------------------------------------------------------------------------------------------------------------- +Service GetQuoteValues(objLog) + + QuoteValues = '' + + If objLog NE '' then + QuoteValues = Memory_Services('GetValue', objLog : '*QuoteValues', '', '', ServiceModule) + If QuoteValues NE True$ then QuoteValues = False$ + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + + Response = QuoteValues + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// CreateLogFile +// +// objLog - Object handle to the log file. - [Required] +// +// Creates (or clears out) a log file associated with the indicated log object handle. +//---------------------------------------------------------------------------------------------------------------------- +Service CreateLogFile(objLog) + + If objLog NE '' then + LogFullPath = Logging_Services('GetLogFullPath', objLog) + If Error_Services('NoError') then + Status() = 0 + OSWrite '' to LogFullPath + Status = Status() + If Status GT 0 then + Error_Services('Add', 'Unable to clear ' : LogFullPath : ' in the ' : Service : ' service.') + end + end + end else + Error_Services('Add', 'objLog argument was missing from the ' : Service : ' service.') + end + +end service + + +Service CleanLogFolders(NumDays) + + FileExclusionList = 'Canary.txt':@VM:'Canary.vbs' + AppRootPath = Environment_Services('GetApplicationRootPath') + LogPath = AppRootPath : '\LogFiles\' + SetInitDirOptions("D") + InitDir LogPath:'*' + FolderList = DirList() + // Remove . directory listing + FolderList = Delete(FolderList, 1, 0, 0) + // Remove .. directory listing + FolderList = Delete(FolderList, 1, 0, 0) + Today = Date() + SetInitDirOptions("") + For each Folder in FolderList + FolderPath = LogPath:Folder:'\' + InitDir FolderPath:'*' + FileList = DirList() + If FileList NE '' then + For each Filename in FileList + Locate FileName in FileExclusionList using @VM setting vPos else + FilePath = FolderPath:Filename + FileInfo = Dir(FilePath) + LastWriteDate = FileInfo<2> + FileAge = Today - LastWriteDate + If FileAge GT NumDays then + OSDelete FilePath + end + end + Next Filename + end + Next Folder + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +EmailMessage: + + Done = False$ + Error = False$ + MsgSent = '' + + ConfigFile = '' + ConfigFile<1> = SendUsing_Port$ + ConfigFile<2> = '' + ConfigFile<3> = 25 ; // Server port + *ConfigFile<4> = 'appmail.eu.infineon.com' ; // Mail server + ConfigFile<4> = 'mailrelay-external.infineon.com' ; // Mail server + ConfigFile<5> = True$ ; // Authenticate + ConfigFile<6> = 'oinotify@infineon.com' ; // Username + ConfigFile<7> = 'oinotify1' ; // Password + ConfigFile<8> = False$ ; // Use SSL + + If EmailMessage EQ '' then + EmailMessage = LogData : \0D0A0D0A\ : RetStack()<2> + end else + EmailMessage := \0D0A0D0A\ : LogData : \0D0A0D0A\ : RetStack()<2> + end + + SentFrom = '' + SentTo = '' + Message = '' + Message<1> = 'AppendLog Message' ; // Subject + Message<2> = 'oinotify@infineon.com' ; // From (email address) + Message<3> = EmailAddresses ; // Send to (email address) + Message<5> = '' ; // Blind Carbon Copy (email address) + Message<6> = '' ; // Reply To (email address) + Message<7> = 'TEXT' ; // Content Type (TEXT or HTML) + Message<8> = EmailMessage ; // Content / Body + Message<9> = '' ; // Attachment(s) (path to file name(s)) + + Result = SRP_Send_Mail(Message, ConfigFile) + +return + diff --git a/FRAMEWORKS/STPROC/MEMORY_SERVICES.txt b/FRAMEWORKS/STPROC/MEMORY_SERVICES.txt new file mode 100644 index 0000000..f008d92 --- /dev/null +++ b/FRAMEWORKS/STPROC/MEMORY_SERVICES.txt @@ -0,0 +1,408 @@ +Function Memory_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Memory_Services + + Description : Handler program for all module related services. + + Notes : The generic parameters should contain all the necessary information to process the services. Often + this will be information like the data Record and Key ID. + + Parameters : + Service [in] -- Name of the service being requested + Error [out] -- Any errors that were created + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + History : (Date, Initials, Notes) + 03/29/13 dmb [SRPFW-9] Original programmer. + 08/01/13 dmb [SRPFW-16] Add PM_CURRENT_IMAGE_PATH as an option to the GETVALUES list. + 10/01/13 dmb [SRPFW-18] Replace APP_INSERTS with LOGICAL and declare Error_Services. - + 10/05/13 dmb [SRPFW-18] Add the RemoveKey service. + 11/06/14 dmb [SRPFW-79] Add support to tag cached data with a time marker in the SetValue service so + subsequent GetValue calls can avoid using data that might be too old. + 10/29/17 dmb Retrofit to use Enhanced BASIC+. + 02/17/18 dmb Add support to name specific memory service caches. This was to allow some memory service + data to be protect from the ReleaseHashTable service. All services will default to the + general cache if no cache name is specified. Added ReleaseAllHashTables to clear all caches. + 09/25/19 dmb [SRPFW-278] Update all services that support named caches so that whenever the named cache + doesn't exist it will create one automatically rather than default to the primary cache. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert SERVICE_SETUP + +Common /MemoryServices/ MemoryServicesManagers@, MemoryCacheNames@, Unused3@, Unused4@, Unused5@, Unused6@ + +Equ Day$ to 86400 ; // Seconds in one day. + +// Self referencing declarations. +Declare function Memory_Services +Declare subroutine Memory_Services, Error_Services +// SRP FastArray declarations. +Declare function SRP_FastArray_Count, SRP_FastArray_Create, SRP_FastArray_Extract, SRP_FastArray_GetVariable, +Declare subroutine SRP_FastArray_Delete, SRP_FastArray_Insert, SRP_FastArray_InsertFromList, SRP_FastArray_Release, SRP_FastArray_Replace, SRP_FastArray_ReplaceWithList +// SRP HashTable declarations. +Declare function SRP_HashTable_Create, SRP_HashTable_Contains, SRP_HashTable_Count, SRP_HashTable_Get, SRP_HashTable_GetKeys, SRP_HashTable_GetValues, SRP_HashTable_GetKeyValuePairs +Declare subroutine SRP_HashTable_Set, SRP_HashTable_Release, SRP_HashTable_Remove +// SRP List declarations. +Declare function SRP_List_Create, SRP_List_CreateFromFastArray, SRP_List_Count, SRP_List_GetAt, SRP_List_GetVariable, SRP_List_Locate +Declare subroutine SRP_List_Add, SRP_List_InsertAt, SRP_List_Release, SRP_List_RemoveAt, SRP_List_SetAt +// SRP Array declarations. +Declare function SRP_Clean_Array, SRP_Join_Arrays, SRP_Reorder_Array, SRP_Rotate_Array, SRP_Sort_Array + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// KeyExists +// +// Returns a True or False depending on whether the Key ID exists. +//---------------------------------------------------------------------------------------------------------------------- +Service KeyExists(KeyID, CacheName) + + KeyExists = False$ ; // Assume it does not exist for now. + + If Len(KeyID) then + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) then + KeyExists = SRP_HashTable_Contains(MemoryServicesManagers@, KeyID) + end + end else + Error_Services('Set', 'Key ID did not contain a value in the KeyExists service request.') + end + + Response = KeyExists + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetValue +// +// Returns the value pair stored in the SRP Hash Table for the current Key ID. If the NotExpired flag is set, the +// ExpirationDuration will be used to compare against the last time marker set for the current data. +//---------------------------------------------------------------------------------------------------------------------- +Service GetValue(KeyID, NotExpired, ExpirationDuration, CacheName) + + Value = '' ; // Assume the value is null for now. + + If Len(KeyID) then + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) then + If NotExpired then + CurrMarker = (Date() * Day$) + Time() + PrevMarker = SRP_HashTable_Get(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID) + If (CurrMarker - PrevMarker) LT ExpirationDuration then + Value = SRP_HashTable_Get(MemoryServicesManagers@, KeyID) + end + end else + Value = SRP_HashTable_Get(MemoryServicesManagers@, KeyID) + end + end + end else + Error_Services('Set', 'Key ID did not contain a value in the GetValue service request.') + end + + Response = Value + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetValue +// +// Updates the value pair stored in the SRP Hash Table for the current Key ID. +//---------------------------------------------------------------------------------------------------------------------- +Service SetValue(KeyID, Value, CacheName) + + If Len(KeyID) then + // If the Memory Services's hash table does not yet exist then create it now. + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) else + Memory_Services('CreateHashTable', CacheName) + end + SRP_HashTable_Set(MemoryServicesManagers@, KeyID, Value) + // Set a time marker for this data in case future GetValue services need to know how old the data is. + TimeMarker = (Date() * Day$) + Time() + SRP_HashTable_Set(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID, TimeMarker) + end else + Error_Services('Set', 'Key ID did not contain a value in the SetValue service request.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsValueExpired +// +// Returns a Boolean flag indicated whether the current value for the indicated KeyID has expired. This relies upon the +// time marker set using the SetValue service. If this value has net yet been set then the value will be considered as +// expired. +//---------------------------------------------------------------------------------------------------------------------- +Service IsValueExpired(KeyID, ExpirationDuration, ResetAge, CacheName) + + If Not(Num(ExpirationDuration)) then ExpirationDuration = 0 + ValueExpired = True$ ; // Assume the value has expired for now. + If ResetAge NE True$ then ResetAge = False$ ; // Default is false unless otherwise specified. + + If Len(KeyID) AND (ExpirationDuration GT 0) then + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) then + PrevMarker = SRP_HashTable_Get(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID) + If PrevMarker NE '' then + TimeMarker = (Date() * Day$) + Time() + If (TimeMarker - PrevMarker) LE ExpirationDuration then + ValueExpired = False$ + If ResetAge EQ True$ then + SRP_HashTable_Set(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID, TimeMarker) + end + end + end + end + end else + Error_Services('Set', 'KeyID or ExpirationDuraton was missing in the IsValueExpired service.') + end + + Response = ValueExpired + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// IsValueCurrent +// +// Returns a Boolean flag indicated whether the current value for the indicated KeyID is still current. This relies upon the +// time marker set using the SetValue service. If this value has net yet been set then the value will be considered as +// expired. +//---------------------------------------------------------------------------------------------------------------------- +Service IsValueCurrent(KeyID, ExpirationDuration, ResetAge, CacheName) + + If Not(Num(ExpirationDuration)) then ExpirationDuration = 0 + ValueCurrent = False$ ; // Assume the value is not current for now. + If ResetAge NE True$ then ResetAge = False$ ; // Default is false unless otherwise specified. + + If Len(KeyID) AND (ExpirationDuration GT 0) then + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) then + PrevMarker = SRP_HashTable_Get(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID) + If PrevMarker NE '' then + TimeMarker = (Date() * Day$) + Time() + If (TimeMarker - PrevMarker) LE ExpirationDuration then + ValueCurrent = True$ + If ResetAge EQ True$ then + SRP_HashTable_Set(MemoryServicesManagers@, 'TIMEMARKER*' : KeyID, TimeMarker) + end + end + end + end + end else + Error_Services('Set', 'KeyID or ExpirationDuraton was missing in the IsValueCurrent service.') + end + + Response = ValueCurrent + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RemoveKey +// +// Removes the Key ID, and its value pair, from the SRP Hash Table. +//---------------------------------------------------------------------------------------------------------------------- +Service RemoveKey(KeyID, CacheName) + + If Len(KeyID) then + // If the Memory Services's hash table does not yet exist then create it now. + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + // The named cache does not exist so create it now. + Memory_Services('CreateHashTable', CacheName) + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else + HandlePos = 1 + end + end + end + If Len(MemoryServicesManagers@) then + SRP_HashTable_Remove(MemoryServicesManagers@, KeyID) + end + end else + Error_Services('Set', 'Key ID did not contain a value in the RemoveKey service request.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// CreateHashTable +// +// Creates the SRP Hash Table that the Memory_Services module will use to manage various Key ID and Value pairs. A +// check will first be made to see if the handle to the Hash Table already exists. If so then it will be released and +// a new Hash Table will be created. +//---------------------------------------------------------------------------------------------------------------------- +Service CreateHashTable(CacheName) + + If CacheName EQ '' then + HandlePos = 1 + If Len(MemoryServicesManagers@) then + Memory_Services('ReleaseHashTable') + end + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos then + Memory_Services('ReleaseHashTable', CacheName) + end else + HandlePos = DCount(MemoryCacheNames@, @FM) + 1 + If HandlePos EQ 1 then HandlePos = 2 ; // Handle position 1 is reserved for the default cache. + end + end + + MemoryServicesManagers@ = SRP_HashTable_Create() + If HandlePos GT 1 then + MemoryCacheNames@ = CacheName + end + + Response = MemoryServicesManagers@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ReleaseHashTable +// +// Releases the SRP Hash Table handle. If CacheName is empty then the default handle is released. +//---------------------------------------------------------------------------------------------------------------------- +Service ReleaseHashTable(CacheName) + + HandlePos = '' + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else Null + end + + If HandlePos GE 1 then + SRP_HashTable_Release(MemoryServicesManagers@) + MemoryServicesManagers@ = '' + MemoryCacheNames@ = '' + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ReleaseAllHashTables +// +// Releases all SRP Hash Table handles. +//---------------------------------------------------------------------------------------------------------------------- +Service ReleaseAllHashTables(CacheName) + + If MemoryServicesManagers@ NE '' then + For Each Handle in MemoryServicesManagers@ using @FM + If Handle NE '' then SRP_HashTable_Release(Handle) + Next Handle + end + MemoryServicesManagers@ = '' + MemoryCacheNames@ = '' + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetHandle +// +// Returns the handle to the SRP Hash Table used by Memory_Services. +//---------------------------------------------------------------------------------------------------------------------- +Service GetHandle(CacheName) + + HandlePos = '' + If CacheName EQ '' then + HandlePos = 1 + end else + Locate CacheName in MemoryCacheNames@ using @FM setting HandlePos else Null + end + + If HandlePos GE 1 then + Handle = MemoryServicesManagers@ + end + + Response = Handle + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////? + diff --git a/FRAMEWORKS/STPROC/NDW_AUDIT_TRAIL_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_AUDIT_TRAIL_EVENTS.txt new file mode 100644 index 0000000..3f8d96f --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_AUDIT_TRAIL_EVENTS.txt @@ -0,0 +1,1141 @@ +Function NDW_Audit_Trail_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// This program is proprietary and is not to be used by or disclosed to others, nor is it to +// be copied without written permission from SRP Computer Solutions, Inc. +// +// Name : NDW_Audit_Trail_Events +// +// Description: This function acts as a commuter module for all events related to this window. +// +// Notes: Commuter Modules are automatically called from the Promoted_Events function +// which is called by the application-specific promoted event handler. This makes +// it possible to add QuickEvents that need to execute Basic+ logic without having +// use the Form Designer to make the association, although this is limited to the +// events which are currently promoted. +// +// If the form needs to call the commuter module directly then the QuickEvent +// parameters should be formatted like this: +// +// '@SELF','@EVENT',['@PARAM1','@PARAMx'] +// +// Parameters: +// CtrlEntId [in] -- The fully qualified name of the control calling the promoted event +// Event [in] -- The event being executed. See the Notes section regarding "PRE" events +// Param1-15 [in] -- Additional event parameter holders +// EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to +// chain forward. See comments in EVENT_SETUP insert +// +// History (Date, Initials, Notes) +// 07/23/98 dmb Original programmer +// 11/17/05 dmb Use LoadTextW method instead of LoadText for UTF8 compatibility +// 03/30/06 axf Replaced application.dll to application.img added logic to accommodate +// that change +// +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// + +$insert APP_INSERTS +$insert EVENT_SETUP +$insert MSG_EQUATES + +Equ WM_USER$ To 1024 +Equ WM_SETREADONLY$ To WM_USER$ + 31 + +Equ DLL$ to Drive():"\application.img#" ; // Application.Png is locate at the root of OI + +AuditManagerTable = "APP_INFO" + +Declare Subroutine Msg, Send_Event, V119, SRP_Set_Prop_Array, Utility, SRP_Show_Window, Start_Window, Send_Message, Get_SysInfo, Set_Property +Declare Function GetPointer, GetSystemInfo, Str_Unicode, Get_Property, Start_MDIChild, Start_Window, Popup + +Begin Case + Case Control EQ Window + // This event is window specific. + + Begin Case + Case Event EQ "CREATE" ; GoSub CREATE + Case Event EQ "CLEAR" ; GoSub CLEAR + End Case + + Case Control EQ "COB_TABLE" + + Begin Case + Case Event EQ "GOTFOCUS" ; GoSub GOTFOCUS.COB_TABLE + Case Event EQ "CHANGED" ; GoSub CHANGED.COB_TABLE + Case Event EQ "LOSTFOCUS" ; GoSub LOSTFOCUS.COB_TABLE + Case Event EQ "CHANGED" ; GoSub CHANGED.COB_TABLE + End Case + + Case Control EQ "EDL_ID" + + Begin Case + Case Event EQ "GOTFOCUS" ; GoSub GOTFOCUS.EDL_ID + Case Event EQ "OPTIONS" ; GoSub OPTIONS.EDL_ID + Case Event EQ "LOSTFOCUS" ; GoSub LOSTFOCUS.EDL_ID + End Case + + Case Control EQ "EDT_AUDIT_INFO" + + Begin Case + Case Event EQ "OnHeaderClick" ; GoSub OnHeaderClick.EDT_AUDIT_INFO + Case Event EQ "OnClick" ; GoSub OnClick.EDT_AUDIT_INFO + Case Event EQ "PosChanged" ; GoSub PosChanged.EDT_AUDIT_INFO + Case Event EQ "BeforeDeleteRecords" ; GoSub BeforeDeleteRecords.EDT_AUDIT_INFO + Case Event EQ "BeforeInsertRecords" ; GoSub BeforeInsertRecords.EDT_AUDIT_INFO + End Case + + Case Control EQ "OLE_SUBCLASS" + + Begin Case + Case Event EQ "OnOptionClick" ; GoSub OnOptionClick.OLE_SUBCLASS + End Case + + Case EventType EQ "CLICK" + + Begin Case + Case Control EQ "PUB_ALL_IDS" ; GoSub PUB_ALL_IDS_CLICK + Case Control EQ "PUB_RESTORE" ; GoSub PUB_RESTORE_CLICK + Case Control EQ "PUB_VIEW" ; GoSub PUB_VIEW_CLICK + End Case + +End Case + +If Assigned(EventFlow) else EventFlow = EVENT_CONTINUE$ + +Return EventFlow + +CREATE: + *------------------------------------------------------------------------------------------------------------------- + * 1. Generates Outline using the SRP.Tab.1 and Contructs the OLE Edit Table + * 2. Sorts the Available Tables + *------------------------------------------------------------------------------------------------------------------- + + Color = "3D Face L=90" + PropArray = @Window:".OLE_TAB" + PropArray<-1> = "OLE.TabCount" :@VM: 0 + PropArray<-1> = "OLE.Height" :@VM: "-43" + PropArray<-1> = "OLE.AllowXPTheme" :@VM: Yes$ + SRP_Set_Prop_Array(PropArray) + + PropArray = @Window:".EDT_AUDIT_INFO" + PropArray<-1> = "OLE.WorkspaceBkColor" :@VM: "Window" + PropArray<-1> = "OLE.BorderType" :@VM: "XP" + PropArray<-1> = "OLE.Dimension<1>" :@VM: 8 ;* number of columns + PropArray<-1> = "OLE.Dimension<2>" :@VM: 15 ;* number of rows + PropArray<-1> = "OLE.HeaderColumn[1]<1>" :@VM: 20 + PropArray<-1> = "OLE.HeaderColumn[1]<2>" :@VM: 1 ;* Visable (Column Numbers?) + PropArray<-1> = "OLE.AutoNumbers<1,1>" :@VM: "I" + PropArray<-1> = "OLE.AutoNumbers<1,2>" :@VM: 1 + PropArray<-1> = "OLE.TitleList<1,1>" :@VM: "Date" ;* Date Column 1 + PropArray<-1> = "OLE.TitleList<1,2>" :@VM: "Time" ;* Time Column 2 + PropArray<-1> = "OLE.TitleList<1,3>" :@VM: "User Name" ;* User Column 3 + PropArray<-1> = "OLE.TitleList<1,4>" :@VM: "Station" ;* Station Id Column 4 + PropArray<-1> = "OLE.TitleList<1,5>" :@VM: "MAC Address" ;* Mac Address + PropArray<-1> = "OLE.TitleList<1,6>" :@VM: "Program Name" + PropArray<-1> = "OLE.TitleList<1,7>" :@VM: "Marker" + PropArray<-1> = "OLE.TitleList<1,8>" :@VM: "Activity" ;* Activity Type + PropArray<-1> = "OLE.CellProtection[1; All]" :@VM: "Selectable" + PropArray<-1> = "OLE.CellProtection[2; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[3; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[4; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[5; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[6; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[7; All]" :@VM: "Full" + PropArray<-1> = "OLE.CellProtection[8; All]" :@VM: "Full" + PropArray<-1> = "OLE.QuickTabOut" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[1]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[1]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[1]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[2]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[2]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[2]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[3]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[3]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[3]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[4]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[4]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[4]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[4]<4>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[5]<1>" :@VM: 110 + PropArray<-1> = "OLE.DataColumn[5]<2>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[5]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<1>" :@VM: 150 + PropArray<-1> = "OLE.DataColumn[6]<2>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[6]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[7]<1>" :@VM: 80 + PropArray<-1> = "OLE.DataColumn[7]<2>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[7]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[8]<1>" :@VM: 55 + PropArray<-1> = "OLE.DataColumn[8]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[8]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[8]<4>" :@VM: 1 + PropArray<-1> = "OLE.MinCellSize" :@VM: 16 + SRP_Set_Prop_Array(PropArray) + + cWin$ = Window + Gosub ResetTabOrder + + Qualifier = "" + Qualifier<1> = Yes$ + Qualifier<4> = Yes$ + + Send_Message(@Window:".EDT_AUDIT_INFO", "QUALIFY_EVENT", "ALL_OLES", Qualifier) + Send_Message(@Window:".OLE_SUBCLASS", "QUALIFY_EVENT", "ALL_OLES", Qualifier) + + Handle = Get_Property(@Window:".EDL_ID", "HANDLE") + Set_Property(@Window:".OLE_SUBCLASS", "OLE.CurrentWindow", @Window) + Send_Message(@Window:".OLE_SUBCLASS", "OLE.Subclass", Handle, @Window:".EDL_ID") +* Set_Property(@Window:".OLE_SUBCLASS", "OLE.OptionButton[EDL_ID]", Yes$) + + Gosub Get_AuditM_Settings + + Set_Property(@Window:".PUB_RESTORE", "ENABLED", No$) + + Parent = Get_Property(@Window, "PARENT") + + SRP_Show_Window(@Window, "", "L", "T", Yes$, "", No$, No$) + + Size = Get_Property(@Window, "SIZE") + Set_Property(@Window:".EDL_SIZE", "INVALUE", Size) + +return + +GOTFOCUS.COB_TABLE: + *---------------------------------------------------------------------------------------------------- + * Activates the Option Button + *---------------------------------------------------------------------------------------------------- + GoSub Check_For_Options_Event + +return + + +CHANGED.COB_TABLE: + *---------------------------------------------------------------------------------------------------- + * Clears info in .EDL_ID field + *---------------------------------------------------------------------------------------------------- + Ctrls = @Window:".EDL_ID":@RM:@Window:".EDT_AUDIT_INFO" + Props = "DEFPROP":@RM:"OLE.Array" + Vals = "":@RM:"" + Set_Property(Ctrls, Props, Vals) + + Ctrls = @Window:".COB_TABLE":@RM:@Window:".EDT_SETTINGS" + Props = "INVALUE":@RM:"ARRAY" + rv = Get_Property(Ctrls, Props) + Table = Field(rv, @RM, 1, 1) + Tracker = Field(rv, @RM, 2, 1) + Locate Table in Tracker<1> Using @VM Setting Pos Then + PropArray = @Window:".EDT_AUDIT_INFO" + If Tracker<6,Pos> = Yes$ Then + Size = Get_Property(@Window:".EDL_SIZE", "INVALUE") + Size<3> = Size<3> + 180 + PropArray<-1> = "OLE.DataColumn[1]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[2]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[3]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[4]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[4]<4>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[6]<1>" :@VM: 150 + PropArray<-1> = "OLE.DataColumn[6]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<4>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[7]<1>" :@VM: 80 + PropArray<-1> = "OLE.DataColumn[7]<2>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[7]<3>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[8]<1>" :@VM: 55 + End Else + Size = Get_Property(@Window:".EDL_SIZE", "INVALUE") + PropArray<-1> = "OLE.DataColumn[1]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[2]<1>" :@VM: 70 + PropArray<-1> = "OLE.DataColumn[3]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[4]<1>" :@VM: 105 + PropArray<-1> = "OLE.DataColumn[4]<4>" :@VM: 1 + PropArray<-1> = "OLE.DataColumn[6]<2>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[6]<4>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[7]<2>" :@VM: 0 + PropArray<-1> = "OLE.DataColumn[8]<1>" :@VM: 55 + End + Set_Property(@Window, "SIZE", Size) + SRP_Set_Prop_Array(PropArray) + End + + // KRF - 11/26/14 - Populate IDs with quick-list if available + Table = Get_Property(@Window:".COB_TABLE", "DEFPROP") + RecentlyUpdatedList = Xlate("AUDIT_":Table, "%RECENTLY_UPDATED%", "", "X") + If Len(RecentlyUpdatedList) then + Convert @FM to @TM in RecentlyUpdatedList + ComboDropDown = 1 + ComboDropDown<2, 1> = "" +* ComboDropDown<2, 2> = + ComboDropDown<2, 3> = RecentlyUpdatedList + ComboDropDown<2, 4> = 2 ;// column 2 contains the values we care about + ComboDropDown<2, 5> = 1 ;// auto fill on + ComboDropDown<2, 6> = 0 ;// case sensitive off + ComboDropDown<2, 7> = 10 ;// 10 visible rows max + ComboDropDown<2, 8> = 0 ;// Don't fire the OnOptionClick + ComboDropDown<2, 9> = 1 ;// Reduce the list to partial matches + ComboDropDown<2, 10> = 0 ;// Only show the drop down when the user types + ComboDropDown<2, 11> = 1 ;// Do not use LIST Format + ComboDropDown<2, 12> = 1 ;// Autofill on first names + ComboDropDown<2, 13> = 1 ;// Hide dropdown when user clears cell + ComboDropDown<2, 14> = 0 ;// Let navigation keys show the drop down + ComboDropDown<2, 15> = 0 ;// Show the drop down regardless of the contents + ComboDropDown<2, 16> = 0 ;// Show the drop down during autofill + ComboDropDown<2, 17> = 1 ;// Remove selection when user backspaces/deletes + ComboDropDown<2, 18> = 0 ;// Show Popup while in read only mode + ComboDropDown<2, 19> = 1 ;// Show Popup When Navigating + ComboDropDown<2, 20> = 1 ;// Always Tab Out on Enter + ComboDropDown<2, 21> = -1 ;// Always show the dropdown above when close to the screen bottom + Set_Property(@Window:".OLE_SUBCLASS", "OLE.Combo[EDL_ID]", ComboDropDown) + end else + Set_Property(@Window:".OLE_SUBCLASS", "OLE.Combo[EDL_ID]", No$) + end + +return + + +LOSTFOCUS.COB_TABLE: + *---------------------------------------------------------------------------------------------------- + * Disables Option Button + *---------------------------------------------------------------------------------------------------- + GoSub Check_For_Options_Event +return + + +GOTFOCUS.EDL_ID: + *---------------------------------------------------------------------------------------------------- + * Activates the Option Button + *---------------------------------------------------------------------------------------------------- + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", Yes$) +return + + +OPTIONS.EDL_ID: + *---------------------------------------------------------------------------------------------------- + * Activates the Option Button + *---------------------------------------------------------------------------------------------------- + rv = Get_Property(@Window:".COB_TABLE", "INVALUE") + If rv NE "" Then + GoSub Get_Table_Name + Gosub Get_Record_Ids + If Assigned(ID) Else ID = "" + If ID then + Locate ID In List Using @VM Setting Pos Then + tEDL = Get_Property(@Window:".EDL_ID", "INVALUE") + If ID NE tEDL Then + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", "") + Gosub ReInitialize + End + OrigId = OrigList + Set_Property(@Window:".EDL_ID", "DEFPROP", ID) + End + Send_Event(@Window:".EDL_ID", "LOSTFOCUS") + End + End Else + ErrorMsg = "NOTABLE" + Gosub MsgAlert + Set_Property("SYSTEM", "FOCUS", @Window:".COB_TABLE") + End +return + +CHANGED.EDL_ID: + *---------------------------------------------------------------------------------------------------- + * Clears OLE Table if the EDL ID field Being is blank + *---------------------------------------------------------------------------------------------------- + + rv = Get_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array") + If rv<1,1> NE "" And Trim(Param1) EQ "" Then + Set_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array", "") + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", "") + Gosub Reinitialize + End + +return + + +LOSTFOCUS.EDL_ID: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + + ByPassFlag = No$ + tVal = Get_Property(@Window:".COB_TABLE", "INVALUE") + eVal = Get_Property(@Window:".EDL_ID", "INVALUE") + Begin Case + Case Assigned(ErrorMsg) + ByPassFlag = Yes$ + Case tVal = "" + ByPassFlag = Yes$ + Case eVal = "" + ByPassFlag = Yes$ + End Case + + If ByPassFlag EQ No$ Then + Parent = Get_Property(@Window, "PARENT") + Parent = Field(Parent, ".", 1, 1) + CurControl = Get_Property(Parent, "FOCUS") + If CurControl = Parent:".PUB_TB_OPTIONS" else + GoSub Get_Table_Name + * Test to see if client manually entered in an Id + ID = Get_Property(@Window:".EDL_ID", "INVALUE") + v.IdOrig = ID + v.IdVis = Get_Property(@Window:".EDL_ID", "INVALUE") + If ID = "" Then Gosub Get_Record_Ids + Tracker = Get_Property(@Window:".EDT_SETTINGS", "ARRAY") + Locate Table In Tracker<1> Using @VM Setting Pos Then + AuditTable = "AUDIT_":Table + Open AuditTable to Handle then + ReadO Record from Handle, ID then + Array = "" + Begin Case + Case Tracker<6,Pos> EQ Yes$ + For X = 1 to 8 + Begin Case + Case X = 1 + Array<1> = OConv(Record<1>, "D/4") + Case X = 2 + Array<2> = OConv(Record<2>, "MTHS") + Case Otherwise$ + Array<-1> = Record + End Case + Next X + Case Record<10> EQ "" + For X = 1 to 8 + Begin Case + Case X = 1 + Array<1> = OConv(Record<1>, "D/4") + Case X = 2 + Array<2> = OConv(Record<2>, "MTHS") + Case Otherwise$ + Array<-1> = Record + End Case + Next X + Case Otherwise$ + MaxRecs = Count(Record<1>, @VM) + (Record<1> NE "") + For X = 1 to MaxRecs + If Record<6,X> EQ "" Then + For Y = 1 To 8 + Begin Case + Case Y = 1 + Array<1,-1> = OConv(Record<1,X>, "D/4") + Case Y = 2 + Array<2,-1> = OConv(Record<2,X>, "MTHS") + Case Otherwise$ + Array = Record + End Case + Next Y + End + Next X + End Case + Set_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array", Array) + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", No$) + testFocus = Get_Property(@Window, "FOCUS") + If testFocus EQ @Window:".EDL_ID" Then Set_Property(@Window:".EDT_AUDIT_INFO", "FOCUS", Yes$) + End Else + Set_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array", "") + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", "") + Gosub ReInitialize + End + End Else + ErrorMsg = "OPEN" + TableName = AuditTable + Gosub MsgAlert + Set_Property(@Window:".EDL_ID", "INVALUE", "") + Set_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array", "") + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", "") + Gosub ReInitialize + End + End + End + GoSub Check_For_Options_Event + End Else + Set_Property(@Window:".EDT_AUDIT_INFO", "OLE.Array", "") + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", "") + Gosub ReInitialize + End +return + +OnHeaderClick.EDT_AUDIT_INFO: + + HeaderPos = Field(Param1, ";", 1) + RowPos = Field(Param1, ";", 2) + ColPos = HeaderPos - 1 + + Begin Case + Case HeaderPos = 1 + Case Otherwise$ + PropArray = CtrlEntId + Set_Property(PropArray, "OLE.ImageList", DLL$:"#EDT_HEADER.BMP":@FM:3) + For Pass = 1 to 9 + Begin Case + Case HeaderPos = Pass + PropArray<-1> = "OLE.HeaderImage[":Param1:"]" :@VM: 2 + PropArray<-1> = "OLE.HeaderAlignment[":Param1:"]<3>" :@VM: "R" + Case Otherwise$ + PropArray<-1> = "OLE.HeaderImage[":Pass:";":1:"]" :@VM: 0 + End Case + Next Pass + SRP_Set_Prop_Array(PropArray) + + Utility("CURSOR", "H") + /* User clicked on the column label, so a sort will be performed on this column */ + Invalue = Get_Property(CtrlEntId, "OLE.Array") + If Invalue<1,1> NE "" Then + Numb_cols = Count(Invalue, @FM) + (Invalue NE "") + Numb_rows = Count(Invalue<1>, @VM) + (Invalue<1> NE "") + Dim ClickCols(Numb_cols) + Work = "" + Flag = "" + Just = "L" + ClickCols(1) = ColPos + For Loop = 2 to Numb_cols + ClickCols(Loop) = Loop + Next Loop + ClickCols(ColPos) = 1 + For Row = 1 to Numb_rows + For Col = 1 to Numb_cols + Work := Invalue:@FM + Next Col + Work[-1, 1] = @RM + Next Row + V119("S", "", "A", Just, Work, Flag) + Invalue = "" + For Row = 1 to Numb_rows + Line = Field(Work, @RM, Row, 1) + For Col = 1 to Numb_cols + Invalue = Line + Next Col + Next Row + Set_Property(CtrlEntId, "OLE.Array", Invalue) + Utility("CURSOR", "A") + End + End Case + +return + +OnClick.EDT_AUDIT_INFO: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + RowPos = Field(Param1, ";", 2) + + If RowPos EQ 0 Else + Ctrls = @Window:".EDL_ID":@RM:CtrlEntId:@RM:CtrlEntId:@RM:CtrlEntId:@RM:CtrlEntId:@RM:CtrlEntId:@RM:@Window:".COB_TABLE":@RM:@Window:".EDT_SETTINGS" + Props = "INVALUE":@RM:"OLE.CellText[4;":RowPos:"]":@RM:"OLE.CellText[1;":RowPos:"]":@RM:"OLE.CellText[2;":RowPos:"]":@RM:"OLE.CellText[6;":RowPos:"]":@RM:"OLE.CellText[8;":RowPos:"]":@RM:"INVALUE":@RM:"ARRAY" + rv = Get_Property(Ctrls, Props) + ID = Field(rv, @RM, 1, 1) + Station = Field(rv, @RM, 2, 1) + DateIn = Iconv(Field(rv, @RM, 3, 1), "D") + TimeIn = Iconv(Field(rv, @RM, 4, 1), "MTHS") + pRec = Field(rv, @RM, 5, 1) + vRec = Field(rv, @RM, 6, 1) + TableId = Field(rv, @RM, 7, 1) + Settings = Field(rv, @RM, 8, 1) + Convert @Lower_Case to @Upper_Case in TableId + Locate TableId in Settings<1> Using @VM Setting iPos Then + If pRec NE "" Then + tRec = Settings<6,iPos> + End Else + tRec = 0 + End + If tRec EQ "" Then tRec = 0 + If tRec EQ No$ And vRec EQ "Read" Else + RecId = ID:"*":Station:"*":DateIn:"*":TimeIn + Open "AUDIT_":TableId to Handle Then + ReadO StoredRec From Handle, RecId Then + Pos = Field(Param1, ";", 2) + sVal = "" + ColorInfo = "OLE.CellColors[":Param1:"]" + rv = Get_Property(@Window:".EDT_AUDIT_INFO", ColorInfo) + + Color = "Select L=80" + CHB_None = "3D Face L=90" + CHB_Color = "3D Face L=80" + + rVal = Get_Property(@Window:".EDT_INFO_BAK", "ARRAY") + + If rv<2> NE Color Then + PropArray = @Window:".EDT_AUDIT_INFO" + PropArray<-1> = "OLE.CellColors[1;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[2;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[3;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[4;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[5;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[6;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[7;":Pos:"]<2>" :@VM:Color + PropArray<-1> = "OLE.CellColors[8;":Pos:"]<2>" :@VM:Color + SRP_Set_Prop_Array(PropArray) + + TestCol = rVal + Convert @FM to "" In TestCol + Convert @VM to "" In TestCol + If Trim(TestCol) = "" Then rVal = "" + MaxR = Count(rVal<1>, @VM) + (rVal NE "") + 1 + rVal = Insert(rVal, 1, -1, 0, RecId) + Swap @VM:@VM With @VM in rVal + If MaxR EQ 1 Then + Set_Property(@Window:".PUB_RESTORE", "ENABLED", Yes$) + End Else + Set_Property(@Window:".PUB_RESTORE", "ENABLED", No$) + End + Set_Property(@Window:".PUB_VIEW", "ENABLED", Yes$) + End Else + PropArray = @Window:".EDT_AUDIT_INFO" + PropArray<-1> = "OLE.CellColors[1;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[2;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[3;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[4;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[5;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[6;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[7;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[8;":Pos:"]<2>" :@VM:"None" + SRP_Set_Prop_Array(PropArray) + Locate RecId in rVal<1> Using @VM Setting xPos Then + rVal = Delete(rVal, 1, xPos, 0) + Swap @VM:@VM With @VM in rVal + Convert @VM to " " in rVal + rVal = Trim(rVal) + MaxR = Count(rVal, " ") + (rVal NE "") + Begin Case + Case MaxR EQ 0 + Set_Property(@Window:".PUB_RESTORE", "ENABLED", No$) + Set_Property(@Window:".PUB_VIEW", "ENABLED", No$) + Case MaxR EQ 1 + Set_Property(@Window:".PUB_RESTORE", "ENABLED", Yes$) + Set_Property(@Window:".PUB_VIEW", "ENABLED", Yes$) + Case Otherwise$ + Set_Property(@Window:".PUB_VIEW", "ENABLED", Yes$) + End Case + Convert " " to @VM in rVal + End + End + Set_Property(@Window:".EDT_INFO_BAK", "ARRAY", rVal) + End + End + End + End + End +return + + +PosChanged.EDT_AUDIT_INFO: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + Pos = Field(Param1, ";", 2) + PropArray = @Window:".EDT_AUDIT_INFO" + rv = Get_Property(PropArray, "OLE.CellText[1;":Pos:"]") + If rv EQ "" Then + PropArray<-1> = "OLE.CellColors[1;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[2;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[3;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[4;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[5;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[6;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[7;":Pos:"]<2>" :@VM:"None" + PropArray<-1> = "OLE.CellColors[8;":Pos:"]<2>" :@VM:"None" + SRP_Set_Prop_Array(PropArray) + End + +return + +BeforeDeleteRecords.EDT_AUDIT_INFO: + *---------------------------------------------------------------------------------------------------- + * Process does not allow rows to be deleted + *---------------------------------------------------------------------------------------------------- + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + +return + + +BeforeInsertRecords.EDT_AUDIT_INFO: + *---------------------------------------------------------------------------------------------------- + * Process does not allow rows to be inserted + *---------------------------------------------------------------------------------------------------- + Set_Property(CtrlEntId, "OLE.Cancel", Yes$) + +return + +OnOptionClick.OLE_SUBCLASS: + *---------------------------------------------------------------------------------------------------- + * KRF - 11/26/14 - No longer needed because we switched from an option button to a regular button + *---------------------------------------------------------------------------------------------------- +* Gosub OPTIONS.EDL_ID + +return + + +PUB_ALL_IDS_CLICK: + *---------------------------------------------------------------------------------------------------- + * KEF - 11/26/14 - New button for the popup since the ID dropdown now only contains 500 most recent + *---------------------------------------------------------------------------------------------------- + GoSub OPTIONS.EDL_ID +return + + +PUB_RESTORE_CLICK: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + + Begin Case + Case Window = "NDW_AUDIT_TRAIL" + Win$ = @Window + Case Otherwise$ + Win$ = Get_Property(@Window:".EDL_WINDOW", "INVALUE") + End Case + TableName = Get_Property(Win$:".COB_TABLE", "INVALUE") + Convert @Lower_Case to @Upper_Case in TableName + rVal = Get_Property(Win$:".EDT_INFO_BAK", "ARRAY") + Convert @VM to " " in rVal + rVal = Trim(rVal) + TestVal = Count(rVal, " ") + If TestVal GT 0 Then + ErrorMsg = "TOOMANY" + Gosub MsgAlert + End Else + ErrorMsg = "RESTORE" + Gosub MsgAlert + If rv = Yes$ Then + AuditId = rVal + OrigId = Get_Property(Win$:".EDL_ID", "INVALUE") + Begin Case + Case AuditId = "" + ErrorMsg = "ID" + IdName = "Audit Primary Key" + Gosub MsgAlert + Case OrigId = "" + ErorMsg = "ID" + IdName = "Primary Key" + Gosub MsgAlert + Case Otherwise$ + Open TableName To hORT Then + Open "AUDIT_":TableName To hADT Then + ReadO Record From hADT, AuditId Then + Write Record To hORT, OrigId Then + ErrorMsg = "RESTORED" + Gosub MsgAlert + End Else + RecId = OrigId + ErrorMsg = "WRITE" + Gosub MsgAlert + End + End Else + ErrorMsg = "READ" + RecId = AuditId + Gosub MsgAlert + End + End Else + ErrorMsg = "OPEN" + Gosub MsgAlert + End + End Else + ErrorMsg = "OPEN" + Gosub MsgAlert + End + End Case + End + End + +return + + +PUB_VIEW_CLICK: + *---------------------------------------------------------------------------------------------------- + * Generates the Audit Viewer Windows + *---------------------------------------------------------------------------------------------------- + TableName = Get_Property(@Window:".COB_TABLE", "INVALUE") + Convert @Lower_Case to @Upper_Case In TableName + RecId = Get_Property(@Window:".EDT_INFO_BAK", "ARRAY") + Win$ = @Window + Open "AUDIT_":TableName to hAGT Then + MaxRecs = Count(RecId, @VM) + (RecId NE "") + For X = 1 to MaxRecs + ReadO RecInfo From hAGT, RecId<1,X> Then + Parent = @Window + Frame = Get_Property(Parent, "MDIFRAME") + If Len(Frame) Then Parent = Frame + Begin Case + Case Parent = "FRW_MAIN" + LStartPt = 20 + TStartPt = 10 + rv = Start_MDIChild("NDW_AUDIT_VIEWER", Parent) + Case Otherwise$ + LStartPt = 20 + TStartPt = 10 + rv = Start_Window("NDW_AUDIT_VIEWER", Parent) + End Case + + Qualifier = "" + Qualifier<1> = Yes$ + Qualifier<4> = Yes$ + Send_Message(rv:".OLE_VIEWER", "QUALIFY_EVENT", "ALL_OLES", 1) + Send_Message(rv:".OLE_ARCHIVE", "QUALIFY_EVENT", "ALL_OLES", 1) + Send_Message(rv:".OLE_ORIGINAL", "QUALIFY_EVENT", "ALL_OLES", 1) + + MxAs = Count(RecID<1,X>, "*") + (RecId<1,X> NE "") + oId = MxAs - 3 + Date = Oconv(Field(RecId<1,X>, "*", MxAs - 1), "D/4") + Time = Oconv(Field(RecId<1,X>, "*", MxAs), "MTHS") + RecTitle = "Table: ":TableName:" - ID: ":Field(RecId<1,X>, "*", 1, oId):" - ":Date:" - ":Time + Title = Get_Property(rv, "TEXT") + Title = Title:" - ":RecTitle + ViewerCtrl = rv:".OLE_VIEWER" + Ctrls = rv:".EDL_WINDOW":@RM:rv:".EDL_AREC_ID":@RM:rv + Props = "INVALUE":@RM:"INVALUE":@RM:"TEXT" + Vals = Win$:@RM:RecId<1,X>:@RM:Title + Set_Property(Ctrls, Props, Vals) + + * Send_Message(ViewerCtrl, "OLE.LoadText", GetPointer(RecInfo), Len(RecInfo), 1) + LenData = Len(RecInfo) + RecInfo = Str_Unicode(RecInfo) + LockVariable RecInfo as Char + Send_Message(ViewerCtrl, "OLE.LoadTextW", GetPointer(RecInfo), LenData, 1) + Set_Property(ViewerCtrl, "OLE.ReadOnly", Yes$) + + ViewerCtrl = rv:".OLE_ARCHIVE" + * Send_Message(ViewerCtrl, "OLE.LoadText", GetPointer(RecInfo), Len(RecInfo), 1) + Send_Message(ViewerCtrl, "OLE.LoadTextW", GetPointer(RecInfo), LenData, 1) + UnlockVariable Data + + Set_Property(ViewerCtrl, "OLE.ReadOnly", Yes$) + Set_Property(rv:".PUB_RESTORE", "PAGELIST", -1) + Set_Property(rv:".PUB_CANCEL", "PAGELIST", -1) + oRecId = Get_Property(Win$:".EDL_ID", "INVALUE") + Open TableName to hORT Then + ReadO RecInfo From hORT, oRecId Then + ViewerCtrl = rv:".OLE_ORIGINAL" + + * Send_Message(ViewerCtrl, "OLE.LoadText", GetPointer(RecInfo), Len(RecInfo), 1) + LenData = Len(RecInfo) + RecInfo = Str_Unicode(RecInfo) + LockVariable RecInfo as Char + Send_Message(ViewerCtrl, "OLE.LoadTextW", GetPointer(RecInfo), LenData, 1) + UnlockVariable Data + + Set_Property(ViewerCtrl, "OLE.ReadOnly", Yes$) + End + cWin$ = rv + Page = 1 + Gosub ResetTabOrder + End + SRP_Show_Window(rv, "", "L":(LStartPt) + (X*10),"T":(TStartPt) + (X*20), Yes$) + End + Next X + End + +return + +CLEAR: + *---------------------------------------------------------------------------------------------------- + * This Gosub clears the viewable Audit Trail Information + *---------------------------------------------------------------------------------------------------- + Ctrls = @Window:".EDT_AUDIT_INFO":@RM:@Window:".EDT_INFO_BAK":@RM:@Window:".COB_TABLE":@RM:@Window:".EDL_ID" + Props = "OLE.Array":@RM:"ARRAY":@RM:"INVALUE":@RM:"INVALUE" + Vals = "":@RM:"":@RM:"":@RM:"" + Set_Property(Ctrls, Props, Vals) + Gosub ReInitialize + +return + + +*------------------------ +* Internal Processes +*------------------------ + +Check_For_Options_Event: + Temp = Get_Property(@Window, "FOCUS") + Events = Get_Property(Temp, "ORIG_STRUCT")<1, 21> + If Index(Events, "OPTIONS*", 1) then + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", Yes$) + end else + Set_Property(Get_Property(@Window, "MDIFRAME"):".PUB_TB_OPTIONS", "ENABLED", No$) + end +return + + +First_Caps: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + FM_Count = Count(List, @FM) + (List NE "") + For FM = 1 to FM_Count + VM_Count = Count(List, @VM) + (List NE "") + For VM = 1 to VM_Count + Temp = List + Convert "_" to " " in Temp + Convert @Upper_case to @Lower_case in Temp + Len_temp = Len(Temp) + For Pos = 1 to Len_temp + Cur_char = Temp[Pos, 1] + If (Pos EQ 1) OR (Temp[(Pos - 1), 1] EQ " ") then + Convert @Lower_case to @Upper_case in Cur_char + end + Temp[Pos, 1] = Cur_char + Next Pos + List = Temp + Next VM + Next FM +return + + +Get_Table_Name: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + Gosub Get_AuditM_Settings + TableList = Get_Property(@Window, "@TABLE_LIST") + SelectedRow = Get_Property(@Window:".COB_TABLE", "SELPOS") + Table = TableList +return + + +Get_Record_Ids: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + Open "AUDIT_":Table to hADT Then + List = "" + cPos = 0 + Done = No$ + Select hADT + Loop + ReadNext aID Else Done = Yes$ + Until Done = Yes$ + ReadO TempRec From hADT, aID Then + If TempRec<9> EQ "AUDIT TRACKING RECORD" Then + List<-1> = aID + End + End Else + ErrorMsg = "READ" + RecId = aID + Gosub MsgAlert + End + Repeat + + If List GT "" Then + Flag = "" + Swap @FM with @RM in List + List := @RM + V119("S", "", "A", "L", List, Flag) + List[-1, 1] = "" + Swap @RM with @FM in List + OrigList = List + * GoSub First_Caps + Convert @FM to @VM in List + Begin Case + Case Event = "OPTIONS.EDL_ID" or EventAction = "OnOptionClick.OLE_SUBCLASS" or EventAction = "CLICK.PUB_ALL_IDS" + PopupStats = "" + PopupStats<1> = -2 + PopupStats<2> = -2 + PopupStats<3> = -1 + PopupStats<4> = -1 + PopupStats<5> = 16777215 + PopupStats<6> = "MS Sans Serif":@SVM:-11:@SVM:400:@SVM:0:@SVM:0:@SVM:6:@SVM:0:@SVM:33:@SVM:0:@SVM:0:@SVM:0:@SVM:0:@SVM:11:@SVM:2:@SVM:0:@SVM:12 + PopupStats<8> = List + PopupStats<9> = @SVM:30:@SVM:"L":@SVM:"L":@SVM:@SVM:"Record IDs" + PopupStats<10> = "L" + PopupStats<11> = 1 + PopupStats<12> = "Record IDs" + PopupStats<13> = 1 + PopupStats<14> = "F" + PopupStats<15> = 0 + PopupStats<16> = 0 + PopupStats<17> = 0 + PopupStats<18> = 1 + PopupStats<19> = 1 + PopupStats<20> = 1 + PopupStats<21> = 1 + PopupStats<22> = 1 + ID = PopUp(@Window, PopupStats) + Case Otherwise$ + rv = Get_Property(@Window:".EDL_ID", "INVALUE") + End Case + End Else + ErrorMsg = "NOIDS" + TableName = Table + Gosub MsgAlert + End + End Else + ErrorMsg = "OPEN" + TableName = "AUDIT_":Table + Gosub MsgAlert + End +return + + +CompareValues: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + dRow = "" + MxORows = Count(RecInfo, @FM) + (RecInfo NE "") + MxARows = Count(ARecINfo, @FM) + (ARecInfo NE "") + + If MxORows GE MxARows Then + MxRows = MxORows + End Else + MxRows = MxARows + End + + For X = 1 to MxRows + If RecInfo NE ARecInfo Then + dRow<-1> = X + End + Next X + + If dRow NE "" Then + Ctrls = @Window:".OLE_ARCHIVE":@RM:@Window:".OLE_ORIGINAL":@RM:@Window:".OLE_VIEWER" + Props = "OLE.ErrorLines":@RM:"OLE.ErrorLines":@RM:"OLE.ErrorLines" + Vals = dRow:@RM:dRow:@RM:dRow + Set_Property(Ctrls, Props, Vals) + End +return + +Get_AuditM_Settings: + + Open AuditManagerTable to hAIT then + AppID = "AUDIT_MANAGER_SETTINGS" + ReadO AppRec from hAIT, AppID then + tableVal = Get_Property(@Window:".COB_TABLE", "INVALUE") + List = AppRec<1> + Flag = "" + Swap @VM with @RM in List + List := @RM + V119("S", "", "A", "L", List, Flag) + List[-1, 1] = "" + Swap @RM with @FM in List + Set_Property(@Window, "@TABLE_LIST", List) + * GoSub First_Caps + Ctrls = @Window:".COB_TABLE":@RM:@Window:".COB_TABLE":@RM:@Window:".EDT_SETTINGS" + Props = "LIST":@RM:"INVALUE":@RM:"ARRAY" + Vals = List:@RM:tableVal:@RM:AppRec + Set_Property(Ctrls, Props, Vals) + end + end + +return + +ReInitialize: + *------------------------------------------------------------------------------------------------------------------------------------- + * Disables the View and Restore Buttons and returns the Cell to our default color. + *------------------------------------------------------------------------------------------------------------------------------------- + + Ctrls = @Window:".PUB_VIEW":@RM:@Window:".PUB_RESTORE" + Props = "ENABLED":@RM:"ENABLED" + Vals = 0:@RM:0 + Set_Property(Ctrls, Props, Vals) + + PropArray = @Window:".EDT_AUDIT_INFO" + PropArray<-1> = "OLE.CellColors[All;All]<2>" :@VM:"None" + SRP_Set_Prop_Array(PropArray) + +return + + +MsgAlert: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + Mess = "" + Mess = "BO" + Mess = "!" + Mess = "Audit Trail" + + Error = "An undefined error has occurred with this process" + Begin Case + Case ErrorMsg = "OPEN" + Error = "Unable to Open the ": TableName: " table." + + Case ErrorMsg = "READ" + Error = "Unable to Read ": RecId:" record." + + Case ErrorMsg = "WRITE" + Error = "Unable to Write ": RecId:" record." + + Case ErrorMsg = "NOIDS" + Error = "There are no audit records for the ":TableName:" table." + + Case ErrorMsg = "ID" + Error = IdName: " is Null." + + Case ErrorMsg = "RESTORED" + Error = "Record ":OrigId:" has been restored to the ":TableName:" table." + + Case ErrorMsg = "TOOMANY" + Error = "You only restore one record at a time." + + Case ErrorMsg = "RESTORE" + Mess = "?" + Mess = "BNY" + Error = "Would you like to restore this entry?" + + Case ErrorMsg = "NOTABLE" + Error = "No Table Selected" + End Case + + Mess = Error + rv = Msg("",Mess) + +return + +ResetTabOrder: + *------------------------------------------------------------------------------------------------------------------------- + * Resets Tab Order + *------------------------------------------------------------------------------------------------------------------------- + + LastPageCtrl = "" + LastCtrl = "" + FirstCtrl = "" + rVal = "" + PCtrls = "" + NCtrls = "" + NProps = "" + + Begin Case + Case cWin$ EQ "NDW_AUDIT_TRAIL" + rVal<1> = @Window:".COB_TABLE" + rVal<2> = @Window:".EDL_ID" + rVal<3> = @Window:".EDT_AUDIT_INFO" + rVal<4> = @Window:".PUB_RESTORE" + rVal<5> = @Window:".PUB_VIEW" + + Case Otherwise$ + Begin Case + Case Page EQ 1 + Set_Property("SYSTEM", "FOCUS", cWin$:".OLE_VIEWER") + rVal<1> = cWin$:".OLE_VIEWER" + rVal<2> = cWin$:".PUB_RESTORE" + rVal<3> = cWin$:".PUB_COMPARE" + rVal<4> = cWin$:".PUB_CLOSE" + Case Page EQ 2 + Set_Property("SYSTEM", "FOCUS", cWin$:".OLE_ARCHIVE") + rVal<1> = cWin$:".OLE_ARCHIVE" + rVal<2> = cWin$:".OLE_ORIGINAL" + rVal<3> = cWin$:".PUB_RESTORE" + rVal<4> = cWin$:".PUB_RETURN" + rVal<5> = cWin$:".PUB_CLOSE" + End Case + End Case + MxC = Count(rVal,@FM) + (rVal NE "") + + For i = 1 to MxC + If i = MxC Then + nVal = 1 + End Else + nVal = i + 1 + End + PCtrls<-1> = rVal + NCtrls<-1> = rVal + NProps<-1> = "NEXT" + Next i + + Convert @FM to @RM in PCtrls + Convert @FM to @RM in NCtrls + Convert @FM to @RM in NProps + + Set_Property(PCtrls, NProps, NCtrls) +return + diff --git a/FRAMEWORKS/STPROC/NDW_AUDIT_VIEWER_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_AUDIT_VIEWER_EVENTS.txt new file mode 100644 index 0000000..6ff4b13 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_AUDIT_VIEWER_EVENTS.txt @@ -0,0 +1,437 @@ +Function NDW_Audit_Viewer_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) + +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_Audit_Viewer_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History : (Date, Initials, Notes) + 07/23/98 dmb Original programmer. + 03/30/06 axf Removed reference to Application.dll. + 04/06/13 dmb Replace ErrorLines property with MismatchLines property for better comparison viewing. + - [SRPFW-9] + +***********************************************************************************************************************/ + +$insert APP_INSERTS +$insert EVENT_SETUP +$insert MSG_EQUATES + +Equ WM_USER$ To 1024 +Equ WM_SETREADONLY$ To WM_USER$ + 31 + +AuditManagerTable = "APP_INFO" + +Declare Subroutine Msg, Send_Event, V119, SRP_Set_Prop_Array, Utility, Start_Window, Send_Message, Get_SysInfo, SRP_Show_Window, Set_Property, Post_Event +Declare Function GetPointer, GetSystemInfo, Send_Message + +Begin Case + Case Control EQ Window + // This event is window specific. + + Begin Case + Case Event EQ "CREATE" ; GoSub CREATE + Case Event EQ 'EXPAND_ROW' ; GoSub EXPAND_ROW + Case Event EQ 'COLLAPSE_ROW' ; GoSub COLLAPSE_ROW + Case Event EQ 'GOTO_MARKER' ; GoSub TOGGLE_CURSOR + End Case + + Case EventType EQ "CLICK" + + Begin Case + Case Control EQ "PUB_RESTORE" ; GoSub CLICK.PUB_RESTORE + Case Control EQ "PUB_COMPARE" ; GoSub CLICK.PUB_COMPARE + Case Control EQ "PUB_RETURN" ; GoSub CLICK.PUB_RETURN + End Case + + Case Event EQ "PosChanged" ; GoSub PosChanged + Case Event EQ "OnGotFocus" ; GoSub PosChanged + Case Event EQ "OnVScroll" + + Begin Case + Case Control EQ "OLE_ARCHIVE" ; GoSub OnVScroll.OLE_ARCHIVE + Case Control EQ "OLE_ORIGINAL" ; GoSub OnVScroll.OLE_ORIGINAL + End Case + + Case Event EQ 'MENU.EXPAND_ROW' ; GoSub MENU.EXPAND_ROW + Case Event EQ 'MENU.COLLAPSE_ROW' ; GoSub MENU.COLLAPSE_ROW + Case Event EQ 'MENU.NEXT_DIFFERENCE' ; GoSub MENU.NEXT_DIFFERENCE + +End Case + +If Assigned(EventFlow) else EventFlow = EVENT_CONTINUE$ + +Return EventFlow + +CREATE: + + // qualify editor events + Events = "PosChanged,OnGotFocus,OnVScroll" + LenEvents = Len(Events) + Pos = 1 + Loop Until Pos GE LenEvents + Event = "OLE.":Events[Pos, ","] + Pos = Col2() + 1 + Send_Message(@Window:".OLE_ARCHIVE", "QUALIFY_EVENT", Event, Yes$) + Send_Message(@Window:".OLE_ORIGINAL", "QUALIFY_EVENT", Event, Yes$) + Repeat + Send_Message(@Window:".OLE_VIEWER", "QUALIFY_EVENT", "PosChanged", Yes$) + + // show the viewer + SRP_Show_Window(@Window, "", "L", "T", Yes$, "", No$, No$) + +return + +EXPAND_ROW: + *---------------------------------------------------------------------------------------------------- + * Expands row(s) in the Audit Viewer Window + *---------------------------------------------------------------------------------------------------- + WindowControl = Get_Property(@Window, "FOCUS") + Set_Property(WindowControl, "READONLY", No$) + rv = Send_Message(WindowControl, "OLE.ExpandCurrLine") + Set_Property(WindowControl, "READONLY", Yes$) + +return + +COLLAPSE_ROW: + *---------------------------------------------------------------------------------------------------- + * Collapses Row(s) in the Audit Viewer Window + *---------------------------------------------------------------------------------------------------- + WindowControl = Get_Property(@Window, "FOCUS") + Set_Property(WindowControl, "READONLY", No$) + rv = Send_Message(WindowControl, "OLE.CollapseCurrLine") + Set_Property(WindowControl, "READONLY", Yes$) +return + +TOGGLE_CURSOR: + *---------------------------------------------------------------------------------------------------- + * Toggles from marker to marker in the Audit View Window + *---------------------------------------------------------------------------------------------------- + Set_Property(WindowControl, "READONLY", No$) + WindowControl = Get_Property(@Window, "FOCUS") + rv = Send_Message(WindowControl, "OLE.GoToMarker") + Set_Property(WindowControl, "READONLY", Yes$) +return + +CLICK.PUB_RESTORE: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + + Begin Case + Case Window = "NDW_AUDIT_TRAIL" + Win$ = @Window + Case Otherwise$ + Win$ = Get_Property(@Window:".EDL_WINDOW", "INVALUE") + End Case + TableName = Get_Property(Win$:".COB_TABLE", "INVALUE") + Convert @Lower_Case to @Upper_Case in TableName + rVal = Get_Property(Win$:".EDT_INFO_BAK", "ARRAY") + Convert @VM to " " in rVal + rVal = Trim(rVal) + TestVal = Count(rVal, " ") + If TestVal GT 0 Then + ErrorMsg = "TOOMANY" + Gosub MsgAlert + End Else + ErrorMsg = "RESTORE" + Gosub MsgAlert + If rv = Yes$ Then + AuditId = rVal + OrigId = Get_Property(Win$:".EDL_ID", "INVALUE") + Begin Case + Case AuditId = "" + ErrorMsg = "ID" + IdName = "Audit Primary Key" + Gosub MsgAlert + Case OrigId = "" + ErorMsg = "ID" + IdName = "Primary Key" + Gosub MsgAlert + Case Otherwise$ + Open TableName To hORT Then + Open "AUDIT_":TableName To hADT Then + ReadO Record From hADT, AuditId Then + Write Record To hORT, OrigId Then + ErrorMsg = "RESTORED" + Gosub MsgAlert + End Else + RecId = OrigId + ErrorMsg = "WRITE" + Gosub MsgAlert + End + End Else + ErrorMsg = "READ" + RecId = AuditId + Gosub MsgAlert + End + End Else + ErrorMsg = "OPEN" + Gosub MsgAlert + End + End Else + ErrorMsg = "OPEN" + Gosub MsgAlert + End + End Case + End + End + +return + +CLICK.PUB_RETURN: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + Send_Event(@Window, "PAGE", 1) + cWin$ = @Window + Page = 1 + Gosub ResetTabOrder + +return + +CLICK.PUB_COMPARE: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + Post_Event(@Window, "PAGE", 2) + OrigWin$ = Get_Property(@Window:".EDL_WINDOW", "INVALUE") + TableName = Get_Property(OrigWin$:".COB_TABLE", "INVALUE") + Convert @Lower_Case to @Upper_Case In TableName + RecId = Get_Property(OrigWin$:".EDL_ID", "INVALUE") + Open TableName to hORT Then + ReadO RecInfo From hORT, RecId Then + Open "AUDIT_":TableName to hART Then + ARecId = Get_Property(@Window:".EDL_AREC_ID", "INVALUE") + ReadO ARecInfo From hART, ARecId Then + cWin$ = @Window + Page = 2 + Gosub ResetTabOrder + Gosub CompareValues + End + End + End + End + +return + +MENU.EXPAND_ROW: + FocusCtrl = Get_Property("SYSTEM", "FOCUS") +* Set_Property(FocusCtrl, "OLE.ReadOnly", No$) + Send_Message(FocusCtrl, "OLE.ExpandCurrLine") +* Set_Property(FocusCtrl, "OLE.ReadOnly", Yes$) +return + +MENU.COLLAPSE_ROW: + FocusCtrl = Get_Property("SYSTEM", "FOCUS") +* Set_Property(FocusCtrl, "OLE.ReadOnly", No$) + Send_Message(FocusCtrl, "OLE.CollapseCurrLine") +* Set_Property(FocusCtrl, "OLE.ReadOnly", Yes$) +return + +MENU.NEXT_DIFFERENCE: + FocusCtrl = Get_Property("SYSTEM", "FOCUS") + Send_Message(FocusCtrl, "OLE.GotoMarker") + Begin Case + Case FocusCtrl EQ @Window:".OLE_ARCHIVE" + Set_Property(@Window:".OLE_ORIGINAL", "OLE.TopLine", Get_Property(@Window:".OLE_ARCHIVE", "OLE.TopLine")) + Case FocusCtrl EQ @Window:".OLE_ORIGINAL" + Set_Property(@Window:".OLE_ARCHIVE", "OLE.TopLine", Get_Property(@Window:".OLE_ORIGINAL", "OLE.TopLine")) + End Case +return + +PosChanged: + + TrailWindow = Get_Property(@Window:".EDL_WINDOW", "TEXT") + Table = Get_Property(TrailWindow:".COB_TABLE", "TEXT") + FieldsRec = Get_Property(@Window, "@RECORD_FIELDS") + CurrLine = Get_Property(CtrlEntId, "OLE.CurrPos")<2> + Line = Send_Message(CtrlEntId, "OLE.GetLineField", CurrLine) + + Field = "" + If FieldsRec EQ "" then + DictTable = If Table[1, 5] EQ "DICT." then "DICT.SYSCOLUMNS" else "DICT.":Table + Open DictTable to hTable then + Read FieldsRec from hTable, "%FIELDS%" then + Set_Property(@Window, "@RECORD_FIELDS", FieldsRec) + end + end + end + + Fields = FieldsRec<3> + Positions = FieldsRec<5> + Locate Line in Positions setting Pos then + Field = Fields<1, Pos> + end + + Set_Property(@Window:".STA_COLUMN", "TEXT", Field) + +return + +OnVScroll.OLE_ARCHIVE: + Set_Property(@Window:".OLE_ORIGINAL", "OLE.TopLine", Param1) +return + +OnVScroll.OLE_ORIGINAL: + Set_Property(@Window:".OLE_ARCHIVE", "OLE.TopLine", Param1) +return + +*------------------------ +* Internal Processes +*------------------------ + +CompareValues: + *---------------------------------------------------------------------------------------------------- + * + *---------------------------------------------------------------------------------------------------- + dRow = "" + MxORows = Count(RecInfo, @FM) + (RecInfo NE "") + MxARows = Count(ARecINfo, @FM) + (ARecInfo NE "") + + If MxORows GE MxARows Then + MxRows = MxORows + End Else + MxRows = MxARows + End + + For X = 1 to MxRows + If RecInfo NE ARecInfo Then + dRow<-1> = X + End + Next X + + If dRow NE "" Then + Ctrls = @Window:".OLE_ARCHIVE":@RM:@Window:".OLE_ORIGINAL":@RM:@Window:".OLE_VIEWER" +* Props = "OLE.ErrorLines":@RM:"OLE.ErrorLines":@RM:"OLE.ErrorLines" + Props = "OLE.MismatchLines":@RM:"OLE.MismatchLines":@RM:"OLE.MismatchLines" + Vals = dRow:@RM:dRow:@RM:dRow + Set_Property(Ctrls, Props, Vals) + End +return + +MsgAlert: + *------------------------------------------------------------------------------------------------------------------------------------- + * + *------------------------------------------------------------------------------------------------------------------------------------- + + Mess = "" + Mess = "BO" + Mess = "!" + Mess = "Audit Trail" + + Error = "An undefined error has occurred with this process" + Begin Case + Case ErrorMsg = "OPEN" + Error = "Unable to Open the ": TableName: " table." + + Case ErrorMsg = "READ" + Error = "Unable to Read ": RecId:" record." + + Case ErrorMsg = "WRITE" + Error = "Unable to Write ": RecId:" record." + + Case ErrorMsg = "NOIDS" + Error = "There are no audit records for the ":TableName:" table." + + Case ErrorMsg = "ID" + Error = IdName: " is Null." + + Case ErrorMsg = "RESTORED" + Error = "Record ":OrigId:" has been restored to the ":TableName:" table." + + Case ErrorMsg = "TOOMANY" + Error = "You only restore one record at a time." + + Case ErrorMsg = "RESTORE" + Mess = "?" + Mess = "BNY" + Error = "Would you like to restore this entry?" + + Case ErrorMsg = "NOTABLE" + Error = "No Table Selected" + End Case + + Mess = Error + rv = Msg("",Mess) + +return + +ResetTabOrder: + *------------------------------------------------------------------------------------------------------------------------- + * Resets Tab Order + *------------------------------------------------------------------------------------------------------------------------- + + LastPageCtrl = "" + LastCtrl = "" + FirstCtrl = "" + rVal = "" + PCtrls = "" + NCtrls = "" + NProps = "" + + Begin Case + Case cWin$ EQ "NDW_AUDIT_TRAIL" + rVal<1> = @Window:".COB_TABLE" + rVal<2> = @Window:".EDL_ID" + rVal<3> = @Window:".EDT_AUDIT_INFO" + rVal<4> = @Window:".PUB_RESTORE" + rVal<5> = @Window:".PUB_VIEW" + + Case Otherwise$ + Begin Case + Case Page EQ 1 + Set_Property("SYSTEM", "FOCUS", cWin$:".OLE_VIEWER") + rVal<1> = cWin$:".OLE_VIEWER" + rVal<2> = cWin$:".PUB_RESTORE" + rVal<3> = cWin$:".PUB_COMPARE" + rVal<4> = cWin$:".PUB_CLOSE" + Case Page EQ 2 + Set_Property("SYSTEM", "FOCUS", cWin$:".OLE_ARCHIVE") + rVal<1> = cWin$:".OLE_ARCHIVE" + rVal<2> = cWin$:".OLE_ORIGINAL" + rVal<3> = cWin$:".PUB_RESTORE" + rVal<4> = cWin$:".PUB_RETURN" + rVal<5> = cWin$:".PUB_CLOSE" + End Case + End Case + MxC = Count(rVal,@FM) + (rVal NE "") + + For i = 1 to MxC + If i = MxC Then + nVal = 1 + End Else + nVal = i + 1 + End + PCtrls<-1> = rVal + NCtrls<-1> = rVal + NProps<-1> = "NEXT" + Next i + + Convert @FM to @RM in PCtrls + Convert @FM to @RM in NCtrls + Convert @FM to @RM in NProps + + Set_Property(PCtrls, NProps, NCtrls) +return + diff --git a/FRAMEWORKS/STPROC/NDW_HTTP_DATEPICKER_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_HTTP_DATEPICKER_EVENTS.txt new file mode 100644 index 0000000..3787d74 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_HTTP_DATEPICKER_EVENTS.txt @@ -0,0 +1,290 @@ +Function NDW_HTTP_DatePicker_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_HTTP_DatePicker_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History (Date, Initials, Notes) + 07/18/19 dmb Original programmer although ported the NDW_DATEPICKER from FrameWorks as a base. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler +#window NDW_HTTP_DATEPICKER + +$insert LOGICAL +$insert MSG_EQUATES + +Equ EVENT_CONTINUE$ to 1 +Equ EVENT_CONTINUE_NO_SYSTEM$ to 3 +Equ EVENT_STOP$ to 0 +Equ CRLF$ to \0D0A\ + +Declare subroutine Set_Property, Send_Event, Post_Event, Send_Message, SendMessage, End_Dialog +Declare function Get_Property, SRP_Get_Window_Rect, Send_Message, SendMessage + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Control = Field(CtrlEntId, '.', 2, 2) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +If Event EQ 'OLE' then GoSub TransferParams +GoToEvent Event for CtrlEntID +If Event EQ 'OLE' then GoSub RestoreParams + +Return EventFlow OR EVENT_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Event WINDOW.CREATE(CreateParam) + + GoSub SetupOLEControls + GoSub DeterminePosition + Set_Property(@Window, 'SIZE', Size) + +end event + + +Event WINDOW.INACTIVATED() + + Post_Event(@Window, 'CLOSE') + +end event + + +Event PUB_OK.CLICK() + + GoSub ReturnDate + +return + + +Event OLE_DATEPICKER.OnDblClick(Month, Week, DayOfWeek, Date, Point, Button, Shift, Ctrl) + + If Date NE '' then + GoSub ReturnDate + end + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SetupOLEControls: + + // All OLE controls can use this qualify configuration. + Qualify = '' + Qualify<1> = 1 + Qualify<3> = '' + Qualify<4> = 0 + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP DatePicker Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_DATEPICKER' + SizeWindow = Get_Property(@Window, 'SIZE') + SizePicker = -1 : @FM : -1 : @FM : SizeWindow<3> : @FM : SizeWindow<4> + Set_Property(Ctrl, 'SIZE', SizePicker) + Set_Property(Ctrl, 'OLE.Theme', 'Windows7Blue') + Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : 9 : @SVM : 400) + + // Use asynchronous event handling (because in Dialog Box) + Send_Message(@Window : '.OLE_DATEPICKER', 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualify) + +return + + +TransferParams: + + // ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to + // OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight + // event and ActiveX (OLE) events. + Transfer Param1 to Event + Transfer Param2 to Param1 + Transfer Param3 to Param2 + Transfer Param4 to Param3 + Transfer Param5 to Param4 + Transfer Param6 to Param5 + Transfer Param7 to Param6 + Transfer Param8 to Param7 + Transfer Param9 to Param8 + Transfer Param10 to Param9 + Transfer Param11 to Param10 + Transfer Param12 to Param11 + Transfer Param13 to Param12 + Transfer Param14 to Param13 + Transfer Param15 to Param14 + +return + + +RestoreParams: + + // Restore the event parameters so the rest of the event chain will see the parameter values as they were originally + // created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case + // there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*). + Transfer Param14 to Param15 + Transfer Param13 to Param14 + Transfer Param12 to Param13 + Transfer Param11 to Param12 + Transfer Param10 to Param11 + Transfer Param9 to Param10 + Transfer Param8 to Param9 + Transfer Param7 to Param8 + Transfer Param6 to Param7 + Transfer Param5 to Param6 + Transfer Param4 to Param5 + Transfer Param3 to Param4 + Transfer Param2 to Param3 + Transfer Param1 to Param2 + Transfer Event to Param1 + Event = 'OLE' + +return + + +DeterminePosition: + + Parent = Get_Property(@Window, 'PARENT') + + // Determine the control to do the lookup for + CtrlId = Get_Property(Parent, 'FOCUS') + + // Get some property values + Ctrls = Parent : @RM : @Window : @RM : CtrlId : @RM : CtrlId : @RM : CtrlId : @RM : CtrlId : @RM : 'SYSTEM' + Props = 'MDIFRAME' : @RM : 'SIZE' : @RM : 'TYPE' : @RM : 'HANDLE' : @RM : 'SELPOS' : @RM : 'ORIG_TEXT' : @RM : 'SIZE' + Vals = Get_Property(Ctrls, Props) + + Frame = Field(Vals, @RM, 1) + Size = Field(Vals, @RM, 2) + Type = Field(Vals, @RM, 3) + CtlHdl = Field(Vals, @RM, 4) + SelPos = Field(Vals, @RM, 5) + ProgID = Field(Vals, @RM, 6) ; // To check for OLE EditTables + Screen = Field(Vals, @RM, 7) + + // If no frame, use window size to determine if calendar should show below or above control + If Frame then + WinSize = SRP_Get_Window_Rect(Frame) + end else + WinSize = SRP_Get_Window_Rect(Parent) + end + + Table = (Type EQ 'EDITTABLE') OR (ProgID _EQC 'SRP.EditTable.1') + If Table else + SelPos = '' + end + + If ProgID _EQC 'SRP.EditTable.1' then + // OLE EditTables need to use the CellText property + ColNo = SelPos<1> + RowNo = SelPos<2> + Convert @FM to ';' in SelPos + DfltDate = Iconv(Get_Property(CtrlId, 'OLE.CellText[':SelPos:']'), 'D') + end else + DfltDate = Get_Property(CtrlId, 'INVALUE', SelPos) + end + // Set initial selection to date passed in and make it visible + If DfltDate then + Set_Property(@Window:'.OLE_DATEPICKER', 'OLE.Selection', DfltDate) + Send_Message(@Window:'.OLE_DATEPICKER', 'OLE.EnsureVisible', DfltDate) + end + + Rect = Str(\00\, 16) + + CtlSize = SRP_Get_Window_Rect(CtrlId) + xPos = CtlSize<1> + yPos = CtlSize<2> + + If Table then + // add x, y and y+h of cell + If ProgID _EQC 'SRP.EditTable.1' then + CellSize = Send_Message(CtrlId, 'OLE.GetCellRect', ColNo:@FM:RowNo) + *xPos += CellSize<1> + xPos += CellSize<1> + 1 ; // This makes alignment better + yPos += CellSize<2> + cyPos = yPos + CellSize<4> + end else + LeftBottom = SendMessage(CtlHdl, DTM_GETCELLLEFTBOTTOM$, DTA_CURRENT$, 0) + xPos += mod(LeftBottom, 65536) + cyPos = yPos + int(LeftBottom / 65536) + + // Get y position with different SendMessage call + SendMessage(CtlHdl, DTM_READCELLRECT$, DTA_CURRENT$, GetPointer(Rect)) + yPos += seq(Rect [5,1]) + (seq(Rect [6,1]) * 256) + end + end else + // get y+h of control + cyPos = CtlSize<2> + CtlSize<4> + end + + // get y+h of frame or parent window + MaxCy = WinSize<2> + WinSize<4> + + // Set x and y of calendar window + Size<1> = xPos + If Size<1> + Size<3> GT Screen<1> AND (Screen<1> GT Size<1>) then + // Shift calendar to left to fit on screen + Size<1> = Screen<1> - Size<3> + end + If cyPos+Size<4> GT MaxCy then + // Position above control so calendar shows fully + Size<2> = yPos - Size<4> + end else + Size<2> = cyPos + end + +return + + +ReturnDate: + + SelDate = Get_Property(@Window : '.OLE_DATEPICKER', 'OLE.Selection') + End_Dialog(@Window, SelDate) + + // Since we are ending the window now, there is no need to allow the event chain to continue. + // If we do, then we will get the "labeled common variable has been freed and is no longer valid" error. + EventFlow = EVENT_CONTINUE_NO_SYSTEM$ + +return diff --git a/FRAMEWORKS/STPROC/NDW_HTTP_FRAMEWORK_SETUP_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_HTTP_FRAMEWORK_SETUP_EVENTS.txt new file mode 100644 index 0000000..9cfb8f5 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_HTTP_FRAMEWORK_SETUP_EVENTS.txt @@ -0,0 +1,2172 @@ +Function NDW_HTTP_Framework_Setup_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_HTTP_Framework_Setup_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History (Date, Initials, Notes) + 11/07/16 dmb Initial development. + 02/27/17 dmb [SRPFW-125] Add support for Aborted Service. + 03/04/17 dmb [SRPFW-154] Add support for Enable Logging flag. + 03/07/17 dmb [SRPFW-155] Add support for Debugger Setting options. + 10/22/18 dmb [SRPFW-253] Add support for Whitelisted IPs. + 10/29/18 dmb [SRPFW-253] Insert empty row if edit table controls are created empty. This allows a new + item to be entered. + 10/31/18 dmb [SRPFW-255] Add support for ActiveX controls and the new UI layout. + 11/01/18 dmb [SRPFW-255] Add HTTP Basic Authentication configuration controls. + 11/01/18 dmb [SRPFW-255] Add Info buttons and tooltips for all fields. + 11/03/18 dmb [SRPFW-256] Add Server Enabled checkbox and associated logic. + 11/03/18 dmb [SRPFW-256] Add TIMER event handler to dynamically update the Server Enabled checkbox. + 11/03/18 dmb [SRPFW-256] Retrofit code to use Database_Services and Error_Services. + 11/07/18 dmb [SRPFW-255] Add Resource Manager controls and UI functionality. + 11/18/18 dmb [SRPFW-257] Add support for API Call Procedure option. + 11/19/18 dmb [SRPFW-257] Add PUB_RESET_TOTAL_INVALID_PASSWORD_ATTEMPTS button. + 11/19/18 dmb [SRPFW-257] Add support to call the UpdateWebAPIs service from the UpdateSetupInfo gosub if + there is a change in the resource manager. + 11/20/18 dmb [SRPFW-257] Add COB_API_CALL_PROCEDURE.CHANGED event handler. + 11/20/18 dmb [SRPFW-257] Replace CHB_SERVER_ENABLED control with PUB_SERVER_STATUS. + 11/20/18 dmb [SRPFW-257] Add support to store SYSENV records keyed to the local application. + 11/21/18 dmb Add OLE_PUB_CREATE_APIS.OnClick event handler so APIs can be created on-demand rather than + [SRPFW-257] when the Apply/OK buttons are clicked. + 11/22/18 dmb [SRPFW-253] Update Info help for the Whitelisted IPs to indicate support for wildcards and + ranges. + 12/02/18 dmb [SRPFW-255] Add EDL_RESOURCE_TITLE control and supporting logic. + 12/10/18 dmb [SRPFW-257] Add support for sub-resources (i.e., resources of resources). + 06/24/19 dmb [SRPFW-276] Replace calls to GetLocalAppKey gosub with calls to GetLocalAppKeyID service. + 06/24/19 dmb [SRPFW-276] Add support for resource endpoints to be excluded from logging. + 06/24/19 dmb [SRPFW-276] Display the SRP HTTP Framework version. + 06/24/19 dmb [SRPFW-276] Update the Home URL help in the DisplayInfoHelp service. + 09/24/19 dmb [SRPFW-278] Update UpdateSetupInfo internal method to call the ReleaseAllHashTables service + so changes in the resources can be retrieved immediately by other services. + 09/24/19 dmb [SRPFW-278] Update the OLE_PUB_CREATE_APIS.OnClick event handler to support prompting the + user to make a copy of an inherited API. + 12/09/19 dmb [SRPFW-296] Update all calls to Memory_Services to use a specific cache name. + 12/16/19 dmb [SRPFW-296] Update the UpdateSetupInfo internal method to get the Item key of the + OLE_TRE_RESOURCES control instead of hard-coding this to APIROOT. This allows the + UpdateURLPath internal method to set the URL correctly. + 12/16/19 dmb [SRPFW-296] Update the WINDOW.CREATE event handler and the SetupOLEControls internal method + so the OLE_TRE_RESOURCES control no longer defaults all items to be expanded but the APIROOT + will be expanded upon launch. This is to help make it easier to see long lists of resources. + 12/16/19 dmb [SRPFW-296] Add OLE_PUB_CONTRACT.OnClick handler to display only top-level resources. + 12/16/19 dmb [SRPFW-296] Enable drag-and-drop with the OLE_TRE_RESOURCES control and add the + OLE_TRE_RESOURCES.OnDrop event so users can re-sort top-level resource items. + 01/23/20 dmb [SRPFW-296] Modify the OLE_TRE_RESOURCE_METHODS control to display "GET / HEAD" rather than + "GET". + 01/23/20 dmb [SRPFW-296] Modify the OLE_TRE_RESOURCES.OnSelChange API to support the change to + "GET / HEAD" in the OLE_TRE_RESOURCE_METHODS control. + 01/23/20 dmb [SRPFW-296] Modify the OLE_TRE_RESOURCE_METHODS.OnItemCheck API to support the change to + "GET / HEAD" in the OLE_TRE_RESOURCE_METHODS control. + 02/12/20 dmb [SRPFW-311] Fix minor typo in DisplayInfoHelp gosub. + 06/15/20 dmb [SRPFW-313] Replace EDT_NON_AUTHENTICATED_URLS (an OI edit table control) with + OLE_EDT_NON_AUTHENTICATED_URLS (an SRP EditTable control) in preparation of adding new + features. + 06/15/20 dmb [SRPFW-313] Replace EDT_WHITELISTED_IPS (an OI edit table control) with + OLE_EDT_WHITELISTED_IPS (an SRP EditTable control) to remain consistent with the + OLE_EDT_NON_AUTHENTICATED_URLS control. + 06/15/20 dmb [SRPFW-313] Replace all references to OLE_INFO_NON_AUTHENTICATED_URLS with + OLE_INFO_NON_AUTHENTICATED_PATHS, including relevant labels and help verbiage. This is to + better describe the purpose of this feature. + 06/15/20 dmb [SRPFW-313] Make changes where needed to support the new Query Params column in the + OLE_INFO_NON_AUTHENTICATED_PATHS control. + 06/30/20 dmb [SRPFW-313] Make changes where needed to support Banned IPs. + 07/26/20 dmb [SRPFW-313] Add support for the RAG_WHITELISTED_IPS control so that Whitelisted IPs can now + be configured to work as an "only IPs allowed" or "always IPs allowed" setting. + 07/26/20 dmb [SRPFW-313] Update the DisplayInfoHelp gosub so the OLE_INFO_WHITELISTED_IPS help includes + information related to the whitelist type. + 12/22/21 dmb Update the PUB_CANCEL.CLICK event handler to make the form invisible before calling + End_Dialog. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler +#window NDW_HTTP_FRAMEWORK_SETUP + +$insert LOGICAL +$insert MSG_EQUATES +$insert HTTP_FRAMEWORK_SETUP_EQUATES +$insert REPOSERRORS + +Equ CacheName$ to 'SRPHTTPFramework' + +Declare subroutine HTTP_Services, Database_Services, Error_Services, Memory_Services, Set_Property, PlaceDialog +Declare subroutine End_Dialog, Msg, Send_Event, Send_Message, Yield +Declare function HTTP_Services, Database_Services, Error_Services, Get_Property, Utility, SRP_String, SRP_Get_Window_Rect +Declare function SRP_Array + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Control = Field(CtrlEntId, '.', 2, 2) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +If Event EQ 'OLE' then GoSub TransferParams +GoToEvent Event for CtrlEntID +If Event EQ 'OLE' then GoSub RestoreParams + +Return EventFlow OR EVENT_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Event WINDOW.CREATE(CreateParam) + + Set_Property('SYSTEM', 'BLOCK_EVENTS', True$) + + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + SetupInfo = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + + GoSub SetupOLEControls + + // Create closed tab loops to avoid accidental page changes. + Set_Property(@Window : '.OLE_TRE_MENU', 'NEXT', @Window : '.OLE_TRE_MENU') + Set_Property(@Window : '.OLE_INFO_SERVER_ENABLED', 'NEXT', @Window : '.EDL_HOME_URL') + Set_Property(@Window : '.OLE_EDT_BANNED_IPS', 'NEXT', @Window : '.CHB_ENABLE_AUTHENTICATION') + Set_Property(@Window : '.OLE_PUB_RESOURCE_QUERY_PARAMS_REMOVE', 'NEXT', @Window : '.OLE_TRE_RESOURCES') + + Set_Property(@Window : '.EDL_HOME_URL', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_API_URL', 'TEXT', SetupInfo) + APICallProcedure = SetupInfo + If APICallProcedure EQ '' then APICallProcedure = 'Web API' + Set_Property(@Window : '.COB_API_CALL_PROCEDURE', 'TEXT', APICallProcedure) + Set_Property(@Window : '.CHB_ENABLE_LOGGING', 'CHECK', SetupInfo) + Set_Property(@Window : '.CHB_LOG_ERRORS_ONLY', 'CHECK', SetupInfo) + Set_Property(@Window : '.EDL_CAPTURE_PATH', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_REALM_VALUE', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_ENTRY_POINT_SERVICE', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_ABORTED_SERVICE', 'TEXT', SetupInfo) + DebuggerSetting = SetupInfo + If DebuggerSetting EQ '' then DebuggerSetting = 0 + DebuggerSetting += 1 + SettingText = Field('Disabled,Enabled,Intercept', ',', DebuggerSetting, 1) + Set_Property(@Window : '.COB_DEBUGGER_SETTING', 'TEXT', SettingText) + Set_Property(@Window : '.EDL_DEBUGGER_INTERCEPT', 'TEXT', SetupInfo) + Set_Property(@Window : '.CHB_FLUSH_CACHE', 'CHECK', SetupInfo) + Set_Property(@Window : '.CHB_ENABLE_AUTHENTICATION', 'CHECK', SetupInfo) + Set_Property(@Window : '.CHB_ENABLE_HTTP_BASIC_AUTHENTICATION', 'CHECK', SetupInfo) + Set_Property(@Window : '.EDL_NEW_PASSWORD_TIME_TO_LIVE', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_OLD_PASSWORD_TIME_TO_LIVE', 'TEXT', SetupInfo) + Set_Property(@Window : '.EDL_INVALID_PASSWORD_LIMIT', 'TEXT', SetupInfo) + Set_Property(@Window : '.COB_CONTAINMENT_ACTION', 'TEXT', SetupInfo) + WhitelistedIPsType = SetupInfo + If WhitelistedIPsType EQ '' then WhitelistedIPsType = 1 + Set_Property(@Window : '.RAG_WHITELISTED_IPS', 'VALUE', WhitelistedIPsType) + + Send_Event(@Window : '.COB_API_CALL_PROCEDURE', 'CHANGED') + Send_Event(@Window : '.COB_DEBUGGER_SETTING', 'CHANGED') + Send_Event(@Window : '.CHB_ENABLE_LOGGING', 'CLICK') + Send_Event(@Window : '.CHB_ENABLE_AUTHENTICATION', 'CLICK') + + Attempts = HTTP_Services('GetTotalInvalidPasswordAttempts') + Set_Property(@Window : '.EDL_TOTAL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', Attempts) + + GoSub CheckServerStatus + + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', ResourcesKeyID$) + ItemList = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + If ItemList EQ '' then + ItemList = '' + ItemList<0, 1> = 1 + ItemList<0, 2> = 'APIROOT' + APIRootURL = HTTP_Services('GetAPIRootURL', False$) + If APIRootURL[1, 1] EQ '/' then APIRootURL = APIRootURL[2, 99] + ItemList<0, 3> = APIRootURL + ItemList<0, 5> = 'APIROOT' + ItemList<0, 19, 1> = 'METHODS' : @TM : 'GET' + ItemList<0, 19, 2> = 'QUERY_PARAMS' : @TM : '' + ItemList<0, 19, 3> = 'DESCRIPTION' : @TM : 'This is the API entry point.' + ItemList<0, 19, 4> = 'TITLE' : @TM : 'API Entry Point.' + ItemList<0, 19, 5> = 'EXCLUDE_LOGGING' : @TM : False$ + end + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemList', ItemList) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems', 'APIROOT') + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.FocusItem', 'APIROOT') + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemExpanded[APIROOT]', True$) + ItemKey = 'APIROOT' + GoSub UpdateURLPath + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'OnSelChange', ItemKey : '') + + Version = Get_Property(@Window : '.STA_SRP_HTTP_FRAMEWORK_VERSION', 'TEXT') + Swap '#' with HTTP_Services('GetVersion')[1, \0D\] in Version + Set_Property(@Window : '.STA_SRP_HTTP_FRAMEWORK_VERSION', 'TEXT', Version) + + // Start a TIMER event to track activity and facilitate the closing of the form if needed. + Set_Property(@Window, 'TIMER', 5000) + + PlaceDialog(-2, -2) + + Set_Property('SYSTEM', 'BLOCK_EVENTS', False$) + +end event + + +Event WINDOW.TIMER() + + GoSub CheckServerStatus + Attempts = HTTP_Services('GetTotalInvalidPasswordAttempts') + Set_Property(@Window : '.EDL_TOTAL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', Attempts) + Yield(); Yield(); Yield(); Yield(); Yield(); Yield(); Yield(); Yield() + +end event + + +Event EDL_HOME_URL.LOSTFOCUS(Flag, FocusID) + + GotFocusValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + Text = Get_Property(CtrlEntId, 'TEXT') + If GotFocusValue NE Text then + ItemKey = 'APIROOT' + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'RenameItemChildren', ItemKey : '') + GoSub UpdateURLPath + end + +end event + + +Event EDL_API_URL.LOSTFOCUS(Flag, FocusID) + + GotFocusValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + Text = Get_Property(CtrlEntId, 'TEXT') + If GotFocusValue NE Text then + ItemKey = 'APIROOT' + If Text[1, 1] NE '/' then + Text = '/' : Text + Set_Property(CtrlEntId, 'TEXT', Text) + end + Text = Text[2, 99] + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[' : ItemKey : ']', Text) + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'RenameItemChildren', ItemKey : '') + GoSub UpdateURLPath + end + +end event + + +Event PUB_OK.CLICK() + + GoSub UpdateSetupInfo + If Error_Services('NoError') then + Set_Property(@Window, 'VISIBLE', False$) + End_Dialog(@Window) + end + + EventFlow = False$ + +end event + + +Event PUB_SERVER_STATUS.CLICK() + + Text = Get_Property(CtrlEntId, 'TEXT') + If Index(Text, 'Disable', 1) then + ServerEnabled = False$ + end else + ServerEnabled = True$ + end + HTTP_Services('SetServerEnabled', ServerEnabled) + If Error_Services('HasError') then + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + +end event + + +Event PUB_RESET_TOTAL_INVALID_PASSWORD_ATTEMPTS.CLICK() + + HTTP_Services('SetTotalInvalidPasswordAttempts', 0) + + If Error_Services('HasError') then + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end else + Set_Property(@Window : '.EDL_TOTAL_INVALID_PASSWORD_ATTEMPTS', 'TEXT', 0) + end + +end event + + +Event PUB_CANCEL.CLICK() + + Set_Property(@Window, 'VISIBLE', False$) + End_Dialog(@Window) + EventFlow = False$ + +end event + + +Event PUB_APPLY.CLICK() + + GoSub UpdateSetupInfo + +end event + + +Event COB_API_CALL_PROCEDURE.CHANGED(NewData) + + CallProc = Get_Property(CtrlEntId, 'TEXT') + If CallProc _EQC 'HTTP Service' then + Set_Property(@Window : '.EDL_ENTRY_POINT_SERVICE', 'ENABLED', True$) + end else + Set_Property(@Window : '.EDL_ENTRY_POINT_SERVICE', 'ENABLED', False$) + end + +end event + + +Event COB_DEBUGGER_SETTING.CHANGED(NewData) + + SettingText = Get_Property(CtrlEntId, 'TEXT') + If SettingText _EQC 'Intercept' then + Set_Property(@Window : '.EDL_DEBUGGER_INTERCEPT', 'ENABLED', True$) + end else + Set_Property(@Window : '.EDL_DEBUGGER_INTERCEPT', 'ENABLED', False$) + end + +end event + + +Event CHB_ENABLE_LOGGING.CLICK() + + Checked = Get_Property(CtrlEntId, 'CHECK') + If Checked then + Set_Property(@Window : '.STA_CAPTURE_PATH', 'ENABLED', True$) + Set_Property(@Window : '.EDL_CAPTURE_PATH', 'ENABLED', True$) + Set_Property(@Window : '.CHB_LOG_ERRORS_ONLY', 'ENABLED', True$) + end else + Set_Property(@Window : '.STA_CAPTURE_PATH', 'ENABLED', False$) + Set_Property(@Window : '.EDL_CAPTURE_PATH', 'ENABLED', False$) + Set_Property(@Window : '.CHB_LOG_ERRORS_ONLY', 'ENABLED', False$) + end + +end event + + +Event OLE_TRE_MENU.OnSelChange(Selection) + + Begin Case + Case Selection _EQC 'Settings' + Page = 1 + FocusCtrl = @Window : '.EDL_HOME_URL' + Case Selection _EQC 'Authentication' + Page = 2 + FocusCtrl = @Window : '.CHB_ENABLE_AUTHENTICATION' + Case Selection _EQC 'Resources' + Page = 3 + FocusCtrl = @Window : '.OLE_TRE_RESOURCES' + Case Otherwise$ + Page = 1 + FocusCtrl = @Window : '.EDL_HOME_URL' + End Case + + Send_Event(@Window, 'PAGE', Page) + Send_Event(@Window, 'VSCROLL', Page) + Set_Property('SYSTEM', 'FOCUS', FocusCtrl) + ProgID = Get_Property(FocusCtrl, 'OLE.ProgID') + If ProgID _EQC 'SRP.Tree.1' then + Set_Property(FocusCtrl, 'OLE.Focus', True$) + FocusItem = Get_Property(FocusCtrl, 'OLE.FocusItem') + Set_Property(FocusCtrl, 'OLE.FocusItem', FocusItem) + end + +end event + + +Event OLE_INFO_HOME_URL.OnMouseEnter() +Event OLE_INFO_API_URL.OnMouseEnter() +Event OLE_INFO_API_CALL_PROCEDURE.OnMouseEnter() +Event OLE_INFO_ENABLE_LOGGING.OnMouseEnter() +Event OLE_INFO_LOG_ERRORS_ONLY.OnMouseEnter() +Event OLE_INFO_CAPTURE_PATH.OnMouseEnter() +Event OLE_INFO_REALM_VALUE.OnMouseEnter() +Event OLE_INFO_ENTRY_POINT_SERVICE.OnMouseEnter() +Event OLE_INFO_ABORTED_SERVICE.OnMouseEnter() +Event OLE_INFO_DEBUGGER_SETTING.OnMouseEnter() +Event OLE_INFO_FLUSH_CACHE.OnMouseEnter() +Event OLE_INFO_SERVER_ENABLED.OnMouseEnter() +Event OLE_INFO_ENABLE_AUTHENTICATION.OnMouseEnter() +Event OLE_INFO_ENABLE_HTTP_BASIC_AUTHENTICATION.OnMouseEnter() +Event OLE_INFO_NEW_PASSWORD_TIME_TO_LIVE.OnMouseEnter() +Event OLE_INFO_OLD_PASSWORD_TIME_TO_LIVE.OnMouseEnter() +Event OLE_INFO_INVALID_PASSWORD_LIMIT.OnMouseEnter() +Event OLE_INFO_TOTAL_INVALID_PASSWORD_ATTEMPTS.OnMouseEnter() +Event OLE_INFO_CONTAINMENT_ACTION.OnMouseEnter() +Event OLE_INFO_NON_AUTHENTICATED_PATHS.OnMouseEnter() +Event OLE_INFO_WHITELISTED_IPS.OnMouseEnter() +Event OLE_INFO_BANNED_IPS.OnMouseEnter() +Event OLE_INFO_RESOURCES.OnMouseEnter() +Event OLE_INFO_RESOURCE_TITLE.OnMouseEnter() +Event OLE_INFO_RESOURCE_DESCRIPTION.OnMouseEnter() +Event OLE_INFO_RESOURCE_METHODS.OnMouseEnter() +Event OLE_INFO_RESOURCE_QUERY_PARAMS.OnMouseEnter() +Event OLE_INFO_RESOURCE_EXCLUDE_FROM_LOGGING.OnMouseEnter() + + GoSub DisplayInfoHelp + +end event + + +Event OLE_INFO_HOME_URL.OnMouseExit() +Event OLE_INFO_API_URL.OnMouseExit() +Event OLE_INFO_API_CALL_PROCEDURE.OnMouseExit() +Event OLE_INFO_ENABLE_LOGGING.OnMouseExit() +Event OLE_INFO_LOG_ERRORS_ONLY.OnMouseExit() +Event OLE_INFO_CAPTURE_PATH.OnMouseExit() +Event OLE_INFO_REALM_VALUE.OnMouseExit() +Event OLE_INFO_ENTRY_POINT_SERVICE.OnMouseExit() +Event OLE_INFO_ABORTED_SERVICE.OnMouseExit() +Event OLE_INFO_DEBUGGER_SETTING.OnMouseExit() +Event OLE_INFO_FLUSH_CACHE.OnMouseExit() +Event OLE_INFO_SERVER_ENABLED.OnMouseExit() +Event OLE_INFO_ENABLE_AUTHENTICATION.OnMouseExit() +Event OLE_INFO_ENABLE_HTTP_BASIC_AUTHENTICATION.OnMouseExit() +Event OLE_INFO_NEW_PASSWORD_TIME_TO_LIVE.OnMouseExit() +Event OLE_INFO_OLD_PASSWORD_TIME_TO_LIVE.OnMouseExit() +Event OLE_INFO_INVALID_PASSWORD_LIMIT.OnMouseExit() +Event OLE_INFO_TOTAL_INVALID_PASSWORD_ATTEMPTS.OnMouseExit() +Event OLE_INFO_CONTAINMENT_ACTION.OnMouseExit() +Event OLE_INFO_NON_AUTHENTICATED_PATHS.OnMouseExit() +Event OLE_INFO_WHITELISTED_IPS.OnMouseExit() +Event OLE_INFO_BANNED_IPS.OnMouseExit() +Event OLE_INFO_RESOURCES.OnMouseExit() +Event OLE_INFO_RESOURCE_TITLE.OnMouseExit() +Event OLE_INFO_RESOURCE_DESCRIPTION.OnMouseExit() +Event OLE_INFO_RESOURCE_METHODS.OnMouseExit() +Event OLE_INFO_RESOURCE_QUERY_PARAMS.OnMouseExit() +Event OLE_INFO_RESOURCE_EXCLUDE_FROM_LOGGING.OnMouseExit() + + GoSub HideInfoHelp + +end event + + +Event OLE_TRE_RESOURCES.OnSelChange(Selection) + + // Build a full endpoint URL based on the currently selected item in the URL Tree and display it in the URL Path + // control. + ItemKey = Selection + Set_Property(CtrlEntId, '@PREV_ITEMKEY', ItemKey) ; // Used by LOSTFOCUS event handlers that might be triggered when the user changes the item selected. + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + ItemClass = Get_Property(CtrlEntId, 'OLE.ItemClass[' : ItemKey : ']') + Methods = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';METHODS]') + Swap 'GET' with 'GET / HEAD' in Methods + MethodList = Get_Property(@Window : '.OLE_TRE_RESOURCE_METHODS', 'OLE.ItemList') + MethodList = SRP_Array('Rotate', MethodList) + MethodList = MethodList<2> + Convert @VM to @FM in MethodList + For Each Method in MethodList using @FM + Locate Method in Methods using ',' setting cPos then + Checked = True$ + end else + Checked = False$ + end + Set_Property(@Window : '.OLE_TRE_RESOURCE_METHODS', 'OLE.ItemChecked[' : Method : ']', Checked) + Next Method + QueryParams = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';QUERY_PARAMS]') + QueryParamsList = '' + If QueryParams NE '' then + For Each QueryParam in QueryParams using ',' + QueryParamsList<-1> = 1 : @VM : QueryParam : @VM : QueryParam : @VM : @VM : 'QUERY_PARAM' + Next QueryParam + Set_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.ItemList', QueryParamsList) + end else + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.RemoveAllItems') + end + Title = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';TITLE]') + Set_Property(@Window : '.EDL_RESOURCE_TITLE', 'INVALUE', Title) + Description = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';DESCRIPTION]') + Set_Property(@Window : '.EDB_RESOURCE_DESCRIPTION', 'INVALUE', Description) + ExcludeLogging = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';EXCLUDE_LOGGING]') + Set_Property(@Window : '.CHB_RESOURCE_EXCLUDE_FROM_LOGGING', 'INVALUE', ExcludeLogging) + GoSub UpdateURLPath + Begin Case + Case ItemClass EQ 'APIROOT' + ResourceEnabled = True$ + ResourceIDEnabled = False$ + PropertyEnabled = False$ + RemoveEnabled = False$ + Case ItemClass EQ 'RESOURCE' + ResourceEnabled = True$ + ResourceIDEnabled = True$ + PropertyEnabled = True$ + RemoveEnabled = True$ + Case ItemClass EQ 'RESOURCE_ID' + ResourceEnabled = True$ + ResourceIDEnabled = False$ + PropertyEnabled = True$ + RemoveEnabled = True$ + Case ItemClass EQ 'PROPERTY' + ResourceEnabled = False$ + ResourceIDEnabled = False$ + PropertyEnabled = False$ + RemoveEnabled = True$ + End Case + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE', 'ENABLED', ResourceEnabled) + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE_ID', 'ENABLED', ResourceIDEnabled) + Set_Property(@Window : '.OLE_PUB_NEW_PROPERTY', 'ENABLED', PropertyEnabled) + Set_Property(@Window : '.OLE_PUB_REMOVE_ENDPOINT', 'ENABLED', RemoveEnabled) + +end event + + +Event OLE_TRE_RESOURCES.OnClick(ItemKey, Point, Button, Shift, Ctrl) + + If ItemKey NE '' AND Button _EQC 'Right' then + ItemClass = Get_Property(CtrlEntId, 'OLE.ItemClass[' : ItemKey : ']') + ItemData = Get_Property(CtrlEntId, 'OLE.ItemData[' : ItemKey : ']') + Menu = '' + Begin Case + Case ItemClass EQ 'APIROOT' + Menu<-1> = 'NEW_RESOURCE' : @VM : 'New Resource' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'RENAME' : @VM : 'Rename "' : ItemData : '"' : @VM : 1 + Case ItemClass EQ 'RESOURCE' + Menu<-1> = 'NEW_RESOURCE' : @VM : 'New Resource' : @VM : 1 + Menu<-1> = 'NEW_RESOURCE_ID' : @VM : 'New Resource ID' : @VM : 1 + Menu<-1> = 'NEW_PROPERTY' : @VM : 'New Property' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'RENAME' : @VM : 'Rename "' : ItemData : '"' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'REMOVE' : @VM : 'Remove "' : ItemData : '"...' : @VM : 1 + Case ItemClass EQ 'RESOURCE_ID' + Menu<-1> = 'NEW_RESOURCE' : @VM : 'New Resource' : @VM : 1 + Menu<-1> = 'NEW_PROPERTY' : @VM : 'New Property' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'RENAME' : @VM : 'Rename "' : ItemData : '"' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'REMOVE' : @VM : 'Remove "' : ItemData : '"...' : @VM : 1 + Case ItemClass EQ 'PROPERTY' + Menu<-1> = 'RENAME' : @VM : 'Rename "' : ItemData : '"' : @VM : 1 + Menu<-1> = '' + Menu<-1> = 'REMOVE' : @VM : 'Remove "' : ItemData : '"...' : @VM : 1 + End Case + Send_Message(CtrlEntId, 'OLE.ShowContextMenu', Point, Menu, ItemKey) + end + +end event + + +Event OLE_TRE_RESOURCES.OnDblClick(ItemKey, Point, Button, Shift, Ctrl) + + If (ItemKey NE '') AND (Button EQ 'Left') then + Send_Message(CtrlEntId, 'OLE.EditItem', ItemKey, False$, False$, True$) + end + +end event + + +Event OLE_TRE_RESOURCES.AfterUpdate(ItemKey, NewText, OldText) + + // When the user renames a resource item, this needs to update the ItemKey in the Tree control. This means creating + // a new item based on the new resource name and then removing the original item. + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + ItemClass = Get_Property(CtrlEntId, 'OLE.ItemClass[' : ItemKey : ']') + ItemParent = Get_Property(CtrlEntId, 'OLE.ItemParent[' : ItemKey : ']') + ItemParentIsRoot = Get_Property(CtrlEntID, 'OLE.ItemParentIsRoot[' : ItemKey : ']') + OrigItemKey = ItemKey + + If OrigItemKey EQ 'NEWITEM' then + Locate NewText in '[Resource]' : @FM : '{Resource ID}' : @FM : '' using @FM setting Pos then + // User did not change the default new resource name so remove it. + Send_Message(CtrlEntId, 'OLE.RemoveItems', OrigItemKey) + // Make the parent item the current item so it can get focus. + ItemKey = ItemParent + end else + // Get a fully qualified URL path for the current value of ItemKey. + ItemKey = ItemParent + GoSub GetURLPath + If ItemClass EQ 'RESOURCE_ID' then + // Make sure the resource ID is surrounded by curly braces. + If NewText[1, 1] NE '{' then NewText = '{' : NewText + If NewText[-1, 1] NE '}' then NewText := '}' + Set_Property(CtrlEntId, 'OLE.Item[' : OrigItemKey : ']', NewText) + end + ItemKey = URLPath : '/' : NewText + Convert '.' to '_' in ItemKey + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + If Item EQ '' then + // Rename the original ItemKey to the new ItemKey. + Send_Message(CtrlEntId, 'OLE.ChangeKeys', OrigItemKey, ItemKey) + Send_Event(CtrlEntId, 'OLE', 'RenameItemChildren', ItemKey : '') + end else + // User created an item that already exists. Put this back in edit mode. + MsgStruct = '' + MsgStruct = '"' : NewText : '" already exists. Please enter a different name.' + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'HTTP Framework Setup' + Msg(@Window, MsgStruct) + ItemKey = 'NEWITEM' + Set_Property(CtrlEntId, 'OLE.ItemData[' : ItemKey : ']', OldText) + Send_Event(@Window : '.OLE_PUB_RENAME', 'OLE', 'OnClick', '', 'Left', False$, False$) + end + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'ENABLED', True$) + end + end else + // Create a new ItemKey using the original item's parent and the new item's text. + If ItemParentIsRoot NE True$ then + ItemKey = ItemParent + GoSub GetURLPath + If ItemClass EQ 'RESOURCE_ID' then + // Make sure the resource ID is surrounded by curly braces. + If NewText[1, 1] NE '{' then NewText = '{' : NewText + If NewText[-1, 1] NE '}' then NewText := '}' + Set_Property(CtrlEntId, 'OLE.Item[' : OrigItemKey : ']', NewText) + end + ItemKey = URLPath : '/' : NewText + Convert '.' to '_' in ItemKey + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + If Item EQ '' then + // Rename the original ItemKey to the new ItemKey. Update the API Signatures associated with this resource. + Send_Message(CtrlEntId, 'OLE.ChangeKeys', OrigItemKey, ItemKey) + APISignatures = Get_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';API_SIGNATURES]') + Swap OldText with NewText in APISignatures + Set_Property(CtrlEntId, 'OLE.ItemField[' : ItemKey : ';API_SIGNATURES]', APISignatures) + Send_Event(CtrlEntId, 'OLE', 'RenameItemChildren', ItemKey : '') + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'ENABLED', True$) + end else + If NewText NE OldText then + // User is renaming an item to one that already exists. Put this back in edit mode. + MsgStruct = '' + MsgStruct = '"' : NewText : '" already exists. Please enter a different name.' + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'HTTP Framework Setup' + Msg(@Window, MsgStruct) + ItemKey = OrigItemKey + Set_Property(CtrlEntId, 'OLE.ItemData[' : ItemKey : ']', OldText) + Send_Event(@Window : '.OLE_PUB_RENAME', 'OLE', 'OnClick', '', 'Left', False$, False$) + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'ENABLED', True$) + end + end + end else + // The API Root is being renamed. Update the API URL text. + NewText = '/' : NewText + Set_Property(@Window : '.EDL_API_URL', 'TEXT', NewText) + Send_Event(CtrlEntId, 'OLE', 'RenameItemChildren', ItemKey : '') + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'ENABLED', True$) + end + end + + // Set the focus on the new item and update the fully qualified URL path in the form based on the updated item. + Set_Property(CtrlEntId, 'OLE.SelectedItems', ItemKey) + // Recursively call the service to make sure all dependent children are renamed. + Set_Property(CtrlEntId, 'OLE.FocusItem', ItemKey) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(CtrlEntId, 'OLE', 'OnSelChange', ItemKey : '') + +end event + + +Event OLE_TRE_RESOURCES.RenameItemChildren(ItemKey) + + If ItemKey NE '' then + ItemChildren = Get_Property(CtrlEntId, 'OLE.ItemChildren[' : ItemKey : ']') + If ItemChildren NE '' then + ItemParent = ItemKey + For Each ItemKey in ItemChildren using @FM + // Save the original item key and its current text. + OrigItemKey = ItemKey + ItemText = Get_Property(CtrlEntId, 'OLE.ItemData[' : OrigItemKey : ']') + // Create a new URL path for the parent item. + ItemKey = ItemParent + GoSub GetURLPath + // Create a new item key using the parent's URL path and the current text. + ItemKey = URLPath : '/' : ItemText + Convert '.' to '_' in ItemKey + // Rename the original ItemKey to the new ItemKey. + Send_Message(CtrlEntId, 'OLE.ChangeKeys', OrigItemKey, ItemKey) + // Recursively call the service to make sure all dependent children are renamed. + Send_Event(CtrlEntId, 'OLE', 'RenameItemChildren', ItemKey : '') + Next ItemKey + end + end + +end event + + +Event OLE_TRE_RESOURCES.OnContextMenuClick(Item, UserData) + + ItemKey = UserData + Set_Property(CtrlEntId, 'OLE.SelectedItems', ItemKey) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(CtrlEntId, 'OLE', 'OnSelChange', ItemKey : '') + Begin Case + Case Item EQ 'RENAME' + Send_Event(@Window : '.OLE_PUB_RENAME', 'OLE', 'OnClick', '', 'Left', False$, False$) + Case Item EQ 'REMOVE' + Send_Event(@Window : '.OLE_PUB_REMOVE_ENDPOINT', 'OLE', 'OnClick', '', 'Left', False$, False$) + Case Item[1, 3] EQ 'NEW' + Begin Case + Case Item EQ 'NEW_RESOURCE' + Send_Event(@Window : '.OLE_PUB_NEW_RESOURCE', 'OLE', 'OnClick', '', 'Left', False$, False$) + Case Item EQ 'NEW_RESOURCE_ID' + Send_Event(@Window : '.OLE_PUB_NEW_RESOURCE_ID', 'OLE', 'OnClick', '', 'Left', False$, False$) + Case Item EQ 'NEW_PROPERTY' + Send_Event(@Window : '.OLE_PUB_NEW_PROPERTY', 'OLE', 'OnClick', '', 'Left', False$, False$) + End Case + End Case + +end event + + +Event OLE_TRE_RESOURCES.OnDrop(SourceCtrl, SourceItemKeys, DestItemKey, Action, Shift, Ctrl) + + DestItemKey = Field(DestItemKey, '/', 1, 2) ; // Only need the parent resource. + If DestItemKey _NEC 'APIROOT' then + // Only allow resource items to be sorted among themselves. +* Send_Message(CtrlEntID, 'OLE.SendItems' : @FM : 1, SourceItemKeys : @FM : CtrlEntID : @FM : DestItemKey : @FM : Action : @FM : True$ : @FM : True$) + Send_Message(CtrlEntID, 'OLE.MoveItems', SourceItemKeys, DestItemKey, Action) + end + +end event + + +Event OLE_TRE_RESOURCE_METHODS.OnItemCheck(ItemKey, Checked) + + Swap 'GET / HEAD' with 'GET' in ItemKey + APISignature = '' + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + ResourceClass = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemClass[' : ResourceItemKey : ']') + ResourceName = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[' : ResourceItemKey : ']') + EndpointPattern = ResourceItemKey + If EndpointPattern[1, 1] EQ '/' then EndpointPattern = EndpointPattern[2, 999] + Convert '/' to @FM in EndpointPattern + NumSegments = DCount(EndpointPattern, @FM) + Begin Case + Case (ResourceClass EQ 'APIROOT') OR (ResourceClass EQ 'RESOURCE') + If ResourceClass EQ 'APIROOT' then + APISignature = ResourceClass + end else + APISignature = ResourceName + end + Case ResourceClass EQ 'RESOURCE_ID' + APISignature = EndpointPattern : '.ID' + Case ResourceClass EQ 'PROPERTY' + If EndpointPattern[1, 1] EQ '{' then + APISignature = EndpointPattern : '.ID.' : EndpointPattern + end else + APISignature = EndpointPattern : '.' : EndpointPattern + end + End Case + APISignature := '.' : ItemKey + Methods = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';METHODS]') + APISignatures = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';API_SIGNATURES]') + Convert ',' to @FM in Methods + Convert ',' to @FM in APISignatures + If Checked EQ True$ then + Locate ItemKey in Methods using @FM setting fPos else + Methods = Insert(Methods, fPos, 0, 0, ItemKey) + APISignatures = Insert(APISignatures, fPos, 0, 0, APISignature) + end + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'ENABLED', True$) + end else + Locate ItemKey in Methods using @FM setting fPos then + Methods = Delete(Methods, fPos, 0, 0) + APISignatures = Delete(APISignatures, fPos, 0, 0) + end + end + Convert @FM to ',' in Methods + Convert @FM to ',' in APISignatures + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';METHODS]', Methods) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';API_SIGNATURES]', APISignatures) + + GoSub UpdateSetupInfo + +end event + + +Event OLE_TRE_RESOURCE_QUERY_PARAMS.OnSelChange(Selection) + + ItemKey = Selection + Set_Property(CtrlEntId, '@PREV_ITEMKEY', ItemKey) ; // Used by LOSTFOCUS event handlers that might be triggered when the user changes the item selected. + Set_Property(@Window : '.OLE_PUB_RESOURCE_QUERY_PARAMS_REMOVE', 'ENABLED', True$) + +end event + + +Event OLE_TRE_RESOURCE_QUERY_PARAMS.AfterUpdate(ItemKey, NewText, OldText) + + // When the user renames a resource item, this needs to update the ItemKey in the Tree control. This means creating + // a new item based on the new resource name and then removing the original item. + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + ItemParent = Get_Property(CtrlEntId, 'OLE.ItemParent[' : ItemKey : ']') + OrigItemKey = ItemKey + ItemKey = NewText + + If OrigItemKey EQ 'NEWITEM' then + Locate NewText in '[Query Param]' using @FM setting Pos then + // User did not change the default new resource name so remove it. + Send_Message(CtrlEntId, 'OLE.RemoveItems', OrigItemKey) + end else + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + If Item EQ '' then + // Rename the original ItemKey to the new ItemKey. + Send_Message(CtrlEntId, 'OLE.ChangeKeys', OrigItemKey, ItemKey) + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + QueryParams = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]') + Convert ',' to @FM in QueryParams + Locate OrigItemKey in QueryParams using @FM setting fPos then QueryParams = Delete(QueryParams, fPos, 0, 0) + Locate ItemKey in QueryParams using @FM setting fPos else QueryParams = Insert(QueryParams, fPos, 0, 0, ItemKey) + Convert @FM to ',' in QueryParams + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]', QueryParams) + GoSub UpdateSetupInfo + end else + // User created an item that already exists. Put this back in edit mode. + MsgStruct = '' + MsgStruct = '"' : NewText : '" already exists. Please enter a different name.' + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'HTTP Framework Setup' + Msg(@Window, MsgStruct) + ItemKey = 'NEWITEM' + Set_Property(CtrlEntId, 'OLE.ItemData[' : ItemKey : ']', OldText) + Send_Event(CtrlEntId, 'OLE', 'OnDblClick', ItemKey : '', '', 'Left', False$, False$) + end + end + end else + // Create a new ItemKey using the original item's parent and the new item's text. + Item = Get_Property(CtrlEntId, 'OLE.Item[' : ItemKey : ']') + If Item EQ '' then + // Rename the original ItemKey to the new ItemKey. + Send_Message(CtrlEntId, 'OLE.ChangeKeys', OrigItemKey, ItemKey) + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + QueryParams = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]') + Convert ',' to @FM in QueryParams + Locate OrigItemKey in QueryParams using @FM setting fPos then QueryParams = Delete(QueryParams, fPos, 0, 0) + Locate ItemKey in QueryParams using @FM setting fPos else QueryParams = Insert(QueryParams, fPos, 0, 0, ItemKey) + Convert @FM to ',' in QueryParams + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]', QueryParams) + GoSub UpdateSetupInfo + end else + If NewText NE OldText then + // User is renaming an item to one that already exists. Put this back in edit mode. + MsgStruct = '' + MsgStruct = '"' : NewText : '" already exists. Please enter a different name.' + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'HTTP Framework Setup' + Msg(@Window, MsgStruct) + ItemKey = OrigItemKey + Set_Property(CtrlEntId, 'OLE.ItemData[' : ItemKey : ']', OldText) + Send_Event(CtrlEntId, 'OLE', 'OnDblClick', ItemKey : '', '', 'Left', False$, False$) + end + end + end + + Set_Property(CtrlEntId, 'OLE.SelectedItems', ItemKey) + Set_Property(CtrlEntId, 'OLE.FocusItem', ItemKey) + Send_Event(CtrlEntId, 'OLE', 'OnSelChange', ItemKey : '') + +end event + + +Event OLE_TRE_RESOURCE_QUERY_PARAMS.OnDblClick(ItemKey, Point, Button, Shift, Ctrl) + + If (ItemKey NE '') AND (Button EQ 'Left') then + Send_Message(CtrlEntId, 'OLE.EditItem', ItemKey, False$, False$, True$) + end + +end event + + +Event EDL_RESOURCE_TITLE.LOSTFOCUS(Flag, FocusID) + + GotFocusValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + Text = Get_Property(CtrlEntId, 'TEXT') + If GotFocusValue NE Text then + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', '@PREV_ITEMKEY') + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';TITLE]', Text) + end + +end event + + +Event EDB_RESOURCE_DESCRIPTION.LOSTFOCUS(Flag, FocusID) + + GotFocusValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + Text = Get_Property(CtrlEntId, 'TEXT') + If GotFocusValue NE Text then + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', '@PREV_ITEMKEY') + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';DESCRIPTION]', Text) + end + +end event + + +Event CHB_RESOURCE_EXCLUDE_FROM_LOGGING.CLICK() + + Check = Get_Property(CtrlEntId, 'CHECK') + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', '@PREV_ITEMKEY') + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';EXCLUDE_LOGGING]', Check) + +end event + + +Event OLE_PUB_NEW_RESOURCE.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + NewItemKey = 'NEWITEM' + NewItem = '' + NewItem<0, 1> = '1' + NewItem<0, 2> = NewItemKey + NewItem<0, 3> = '[Resource]' + NewItem<0, 5> = 'RESOURCE' + NewItem<0, 19, 1> = 'METHODS' : @TM : '' + NewItem<0, 19, 2> = 'QUERY_PARAMS' : @TM : '' + NewItem<0, 19, 3> = 'DESCRIPTION' : @TM : '' + NewItem<0, 19, 4> = 'TITLE' : @TM : '' + NewItem<0, 19, 5> = 'EXCLUDE_LOGGING' : @TM : False$ + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.AddItems', ItemKey, NewItem) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems', NewItemKey) + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.EditItem', NewItemKey, False$, False$, True$) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'OnSelChange', ItemKey : '') + +end event + + +Event OLE_PUB_NEW_RESOURCE_ID.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + NewItemKey = 'NEWITEM' + NewItem = '' + NewItem<0, 1> = '1' + NewItem<0, 2> = NewItemKey + NewItem<0, 3> = '{Resource ID}' + NewItem<0, 5> = 'RESOURCE_ID' + NewItem<0, 19, 1> = 'METHODS' : @TM : '' + NewItem<0, 19, 2> = 'QUERY_PARAMS' : @TM : '' + NewItem<0, 19, 3> = 'DESCRIPTION' : @TM : '' + NewItem<0, 19, 4> = 'TITLE' : @TM : '' + NewItem<0, 19, 5> = 'EXCLUDE_LOGGING' : @TM : False$ + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.AddItems', ItemKey, NewItem) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems', NewItemKey) + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.EditItem', NewItemKey, False$, False$, True$) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'OnSelChange', ItemKey : '') + +end event + + +Event OLE_PUB_NEW_PROPERTY.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + NewItemKey = 'NEWITEM' + NewItem = '' + NewItem<0, 1> = '1' + NewItem<0, 2> = NewItemKey + NewItem<0, 3> = '' + NewItem<0, 5> = 'PROPERTY' + NewItem<0, 19, 1> = 'METHODS' : @TM : '' + NewItem<0, 19, 2> = 'QUERY_PARAMS' : @TM : '' + NewItem<0, 19, 3> = 'DESCRIPTION' : @TM : '' + NewItem<0, 19, 4> = 'TITLE' : @TM : '' + NewItem<0, 19, 5> = 'EXCLUDE_LOGGING' : @TM : False$ + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.AddItems', ItemKey, NewItem) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems', NewItemKey) + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.EditItem', NewItemKey, False$, False$, True$) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'OnSelChange', ItemKey : '') + +end event + + +Event OLE_PUB_RENAME.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.EditItem', ItemKey, False$, False$, True$) + +end event + + +Event OLE_PUB_REMOVE_ENDPOINT.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + ItemText = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'ItemData[' : ItemKey : ']') + MsgStruct = '' + MsgStruct = 'Removing "' : ItemText : '" cannot be undone. Are you sure you want to remove it?' + MsgStruct = 'BNY' + MsgStruct = '?' + MsgStruct = 2 + MsgStruct = 'HTTP Framework Setup' + ConfirmRemove = Msg(@Window, MsgStruct) + If ConfirmRemove EQ True$ then + ItemParent = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'ItemParent[' : ItemKey : ']') + Send_Message(@Window : '.OLE_TRE_RESOURCES', 'OLE.RemoveItems', ItemKey) + Transfer ItemParent to ItemKey + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems', ItemKey) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.FocusItem', ItemKey) + // Trigger the OnSelChange event handler to update other control properties. + Send_Event(@Window : '.OLE_TRE_RESOURCES', 'OLE', 'OnSelChange', ItemKey : '') + end + +end event + + +Event OLE_PUB_CREATE_APIS.OnClick(Point, Button, Shift, Ctrl) + + MakeLocal = Get_Property(CtrlEntId, '@MAKELOCAL') + DisplayMessage = True$ ; // Assume the final message will be displayed. + ItemList = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemList') + APIsUpdated = HTTP_Services('UpdateWebAPIs', ItemList, MakeLocal) + MsgStruct = '' + MsgStruct = 'SRP HTTP Framework' + + If Error_Services('HasError') then + Message = Error_Services('GetMessage') + If Index(Message, REP_APP_INHERIT_MOD_ERR$, 1) then + // Attempting to update an inherited Web API. Ask if a local copy should be made instead. + Error_Services('Clear') ; // Clear the message stack since it is being handled in a special way. + MsgStruct = 'BNY' + MsgStruct = '?' + SysReposKeyID = Message[-1, 'B '] + AppID = SysReposKeyID[1, '*'] + TypeID = SysReposKeyID[Col2() + 1, '*'] + ClassID = SysReposKeyID[Col2() + 1, '*'] + EntID = SysReposKeyID[Col2() + 1, '*'] + MsgStruct = EntID : ' is inherited from ' : AppID : ' and cannot be updated. Would you like to make a copy in the local application?' + MakeCopy = Msg(@Window, MsgStruct) + If MakeCopy EQ True$ then + Set_Property(CtrlEntId, '@MAKELOCAL', True$) + Send_Event(CtrlEntID, 'OLE', 'OnClick', Point : '', Button : '', Shift : '', Ctrl : '') + DisplayMessage = False$ ; // Do not display the final message since it will be handled in the recursive event. + end + end + end + + If DisplayMessage EQ True$ then + MsgStruct = 'BO' + If Error_Services('HasError') then + MsgStruct = 'H' + MsgStruct = Error_Services('GetMessage') + end else + If APIsUpdated EQ True$ then + MsgStruct = '*' + MsgStruct = 'New APIs have been created!' + end else + MsgStruct = '*' + MsgStruct = 'No new APIs needed to be created.' + end + Set_Property(CtrlEntId, 'ENABLED', False$) + end + Msg(@Window, MsgStruct) + end + + // Turn off the MakeLocal flag to prevent accidental attempts to localize an inherited API. + Set_Property(CtrlEntId, '@MAKELOCAL', False$) + +end event + + +Event OLE_PUB_RESOURCE_QUERY_PARAMS_NEW.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = 'NEWITEM' + NewItem = '' + NewItem<0, 1> = '1' + NewItem<0, 2> = ItemKey + NewItem<0, 3> = '[Query Param]' + NewItem<0, 5> = 'QUERY_PARAM' + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.AddItems', '', NewItem) + Set_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.SelectedItems', ItemKey) + // Trigger the OnSelChange event handler to update other control properties. +* Send_Event(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE', 'OnSelChange', ItemKey) + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.EditItem', ItemKey, False$, False$, True$) + +end event + + +Event OLE_PUB_RESOURCE_QUERY_PARAMS_REMOVE.OnClick(Point, Button, Shift, Ctrl) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.SelectedItems') + ItemText = Get_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'ItemData[' : ItemKey : ']') + MsgStruct = '' + MsgStruct = 'Removing "' : ItemText : '" cannot be undone. Are you sure you want to remove it?' + MsgStruct = 'BNY' + MsgStruct = '?' + MsgStruct = 2 + MsgStruct = 'HTTP Framework Setup' + ConfirmRemove = Msg(@Window, MsgStruct) + If ConfirmRemove EQ True$ then + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.RemoveItems', ItemKey) + ResourceItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + QueryParams = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]') + Convert ',' to @FM in QueryParams + Locate ItemKey in QueryParams using @FM setting fPos then QueryParams = Delete(QueryParams, fPos, 0, 0) + Convert @FM to ',' in QueryParams + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemField[' : ResourceItemKey : ';QUERY_PARAMS]', QueryParams) + Set_Property(CtrlEntId, 'ENABLED', False$) + GoSub UpdateSetupInfo + end + +end event + + +Event OLE_PUB_CONTRACT.OnClick(Point, Button, Shift, Ctrl) + + // Collapse all resource tree items and then expand the APIROOT so only the top-level resources are seen. + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemExpanded[All]', False$) + Set_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemExpanded[APIROOT]', True$) + +end event + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SetupOLEControls: + + // All OLE controls can use this qualify configuration. + Qualify = '' + Qualify<1> = 1 + Qualify<3> = '' + Qualify<4> = 0 + + //------------------------------------------------------------------------------------------------------------------ + // + // Left side menu (SRP Tree Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_TRE_MENU' + Set_Property(Ctrl, 'OLE.Border', 'Flat') + Set_Property(Ctrl, 'OLE.DefFont', 'Segoe UI' : @SVM : '8' : @SVM : '100') + Set_Property(Ctrl, 'OLE.DefColors', 'RGB(88,88,88)' : @FM : 'White') + Set_Property(Ctrl, 'OLE.DefHeight', '25') + Colors = '' + Colors<1> = 'Black' : @VM : 'RGB(197,197,197)' + Colors<2> = 'Black' : @VM : 'RGB(197,197,197)' + Colors<3> = 'Black' : @VM : 'Vertical(Gradient(RGB(197,197,197), RGB(197,197,197)), Border(RGB(155,155,155)))' + Colors<4> = 'Black' : @VM : 'RGB(197,197,197)' + Set_Property(Ctrl, 'OLE.Colors', Colors) + Set_Property(Ctrl, 'OLE.FullRowSelect', True$) + Set_Property(Ctrl, 'OLE.LinesEnabled', False$) + Set_Property(Ctrl, 'OLE.RootIndent', True$) + Set_Property(Ctrl, 'OLE.Indent', '10') + Set_Property(Ctrl, 'OLE.ShowFocusItem', False$) + ItemList = '' + ItemList<1> = 1 : @VM : 'Settings' : @VM : 'Settings' + ItemList<2> = 1 : @VM : 'Authentication' : @VM : 'Authentication' + ItemList<3> = 1 : @VM : 'Resources' : @VM : 'Resources' + Set_Property(Ctrl, 'OLE.ItemList', ItemList) + Set_Property(Ctrl, 'OLE.SelectedItems', 'Settings') + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnSelChange', Qualify) + + + //------------------------------------------------------------------------------------------------------------------ + // + // Right side main borders (SRP Tab Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + TabCtrls = 'OLE_TAB,OLE_TAB_RESOURCE_METADATA' + NumTabs = DCount(TabCtrls, ',') + For TabCnt = 1 to NumTabs + Ctrl = @Window : '.' : Field(TabCtrls, ',', TabCnt, 1) + Set_Property(Ctrl, 'OLE.AllowXPTheme', False$) + Set_Property(Ctrl, 'OLE.CustomPaneColor', 'Vertical(White, White, Border(RGB(160,160,160)))') + Set_Property(Ctrl, 'OLE.FlickerFree', True$) + Next TabCnt + Set_Property(@Window : '.OLE_TAB', 'OLE.Height', '-34') + Set_Property(@Window : '.OLE_TAB_RESOURCE_METADATA', 'OLE.Height', '-96') + + + //------------------------------------------------------------------------------------------------------------------ + // + // Command buttons (SRP Button Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + ButtonCtrls = 'OLE_PUB_NEW_RESOURCE,OLE_PUB_NEW_RESOURCE_ID,OLE_PUB_NEW_PROPERTY,OLE_PUB_RENAME,OLE_PUB_REMOVE_ENDPOINT,OLE_PUB_CREATE_APIS,OLE_PUB_RESOURCE_QUERY_PARAMS_NEW,OLE_PUB_RESOURCE_QUERY_PARAMS_REMOVE' + ToolTips = 'Creates a new resource that is subordinate to the current resource.' : @FM + ToolTips := 'Creates a new resource ID for the current resource.' : @FM + ToolTips := 'Creates a new property for the current resource.' : @FM + ToolTips := 'Renames the current resource, resource ID, or property.' : @FM + ToolTips := 'Removes the current resource, resource ID, or property.' : @FM + ToolTips := 'Creates new API procedures or endpoint handlers as needed.' : @FM + ToolTips := 'Creates a new query parameter for the current resource.' : @FM + ToolTips := 'Removes the current query parameter.' : @FM + NumButtons = DCount(ButtonCtrls, ',') + For ButtonCnt = 1 to NumButtons + Ctrl = @Window : '.' : Field(ButtonCtrls, ',', ButtonCnt, 1) + Set_Property(Ctrl, 'OLE.BackVisible', False$) + ToolTip = ToolTips + Set_Property(Ctrl, 'OLE.ToolTip', ToolTip) + Forecolor = '' + Forecolor<1> = 'RGB(68,68,68)' + Forecolor<2> = 'RGB(68,68,68)' + Forecolor<3> = 'RGB(68,68,68)' + Forecolor<4> = 'RGB(171,171,171)' + Forecolor<5> = 'RGB(68,68,68)' + Set_Property(Ctrl, 'OLE.Forecolor', Forecolor) + Background = '' + Background<1> = 'Vertical(Gradient(RGB(253,253,253), RGB(253,253,253)), Border(RGB(171,171,171)))' + Background<2> = 'Vertical(Gradient(RGB(213,225,242), RGB(213,225,242)), Border(RGB(163,189,227)))' + Background<3> = 'Vertical(Gradient(RGB(163,189,227), RGB(163,189,227)), Border(RGB(120,153,203)))' + Background<4> = 'Vertical(Gradient(RGB(253,253,253), RGB(253,253,253)), Border(RGB(171,171,171)))' + Background<5> = 'Vertical(Gradient(RGB(253,253,253), RGB(253,253,253)), Border(RGB(171,171,171)))' + Set_Property(Ctrl, 'OLE.Background', Background) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + Next ButtonCnt + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPResource.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE_ID', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPResourceID.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_NEW_PROPERTY', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPProperty.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_RENAME', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPRename.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_REMOVE_ENDPOINT', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPRemove.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPCreateAPIs.png' : @VM : 'L5' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE_ID', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_NEW_PROPERTY', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_RENAME', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_REMOVE_ENDPOINT', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'OLE.Caption', '') + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE', 'OLE.CaptionList', 'New Resource' : @VM : 'L25' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_NEW_RESOURCE_ID', 'OLE.CaptionList', 'New Resource ID' : @VM : 'L25' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_NEW_PROPERTY', 'OLE.CaptionList', 'New Property' : @VM : 'L25' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_RENAME', 'OLE.CaptionList', 'Rename' : @VM : 'L25' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_REMOVE_ENDPOINT', 'OLE.CaptionList', 'Remove Endpoint...' : @VM : 'L25' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_CREATE_APIS', 'OLE.CaptionList', 'Create APIs' : @VM : 'L25' : @VM : 'C') + + + //------------------------------------------------------------------------------------------------------------------ + // + // Horizontal group banners (SRP Picture Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + PictureCtrls = 'OLE_PIC_SERVER_OPTIONS,OLE_PIC_AUTHENTICATION_OPTIONS,OLE_PIC_RESOURCE_MANAGER' + NumPictures = DCount(PictureCtrls, ',') + GroupLeftBorder = 151 + 14 ; // The distance between the left border of the panel control and a group banner. + ItemLeftBorder = GroupLeftBorder + 14 ; // The distance between the left border of the panel control and an item. + ItemBuffer = 22 ; // The distance between the upper border of a single line item and the upper border of the next item. + GroupVPos = 14 * 5 ; // Group vertical position. + GroupHeight = 24 ; // Height of the group banner. + GroupBuffer = 40 ; // The distance between the upper border of a group banner and the upper border of the first item. + For PictureCnt = 1 to NumPictures + Ctrl = @Window : '.' : Field(PictureCtrls, ',', PictureCnt, 1) + OrigSize = Get_Property(Ctrl, 'SIZE') + GroupVPos = OrigSize<2> + Set_Property(Ctrl, 'OLE.BackgroundColor', 'RGB(238, 238, 238)') + Set_Property(Ctrl, 'OLE.CaptionAlignment', 'Center' : @FM : 'Left') + Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : '10' : @SVM : '700') + Set_Property(Ctrl, 'OLE.CaptionColor', 'RGB(119, 119, 119)') + Set_Property(Ctrl, 'SIZE', GroupLeftBorder : @FM : GroupVPos : @FM : 916 : @FM : GroupHeight) + Next PictureCnt + Set_Property(@Window : '.OLE_PIC_SERVER_OPTIONS', 'OLE.Caption', ' ' : 'API Server Settings') + Set_Property(@Window : '.OLE_PIC_AUTHENTICATION_OPTIONS', 'OLE.Caption', ' ' : 'Authentication Options') + Set_Property(@Window : '.OLE_PIC_RESOURCE_MANAGER', 'OLE.Caption', ' ' : 'Resource Manager') + + + //------------------------------------------------------------------------------------------------------------------ + // + // Labels with borders (SRP Picture Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + PictureCtrls = 'OLE_PIC_HTTP,OLE_PIC_SERVER_STATUS' + NumPictures = DCount(PictureCtrls, ',') + For PictureCnt = 1 to NumPictures + Ctrl = @Window : '.' : Field(PictureCtrls, ',', PictureCnt, 1) + Set_Property(Ctrl, 'OLE.Border', 'XP') + Set_Property(Ctrl, 'OLE.BackgroundColor', 'RGB(238, 238, 238)') + Set_Property(Ctrl, 'OLE.CaptionAlignment', 'Center' : @FM : 'Center') + Next PictureCnt + Set_Property(@Window : '.OLE_PIC_HTTP', 'OLE.Caption', 'http+https://') + Set_Property(@Window : '.OLE_PIC_SERVER_STATUS', 'OLE.Caption', 'Server Status: ') + + + //------------------------------------------------------------------------------------------------------------------ + // + // Labels with partial borders (SRP Picture Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + PictureCtrls = 'OLE_PIC_URL' + NumPictures = DCount(PictureCtrls, ',') + For PictureCnt = 1 to NumPictures + Ctrl = @Window : '.' : Field(PictureCtrls, ',', PictureCnt, 1) + Set_Property(Ctrl, 'OLE.Border', 'None') + *Set_Property(Ctrl, 'OLE.BackgroundColor', 'RGB(238, 238, 238)') + Set_Property(Ctrl, 'OLE.BackgroundColor', 'White') + Set_Property(Ctrl, 'OLE.CaptionAlignment', 'Center' : @FM : 'Left') + Set_Property(Ctrl, 'OLE.CaptionOffset', 0 : @FM : 5) + Set_Property(Ctrl, 'OLE.Alignment', 'Center' : @FM : 'Left') + Next PictureCnt + APIURL = HTTP_Services('GetAPIRootURL', True$) + Set_Property(@Window : '.OLE_PIC_URL', 'OLE.Caption', APIURL) + + + //------------------------------------------------------------------------------------------------------------------ + // + // Non-Authenticted Paths, Whitelisted IPs, and Banned IPs (SRP EditTable Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + EditTableCtrls = 'OLE_EDT_NON_AUTHENTICATED_PATHS,OLE_EDT_WHITELISTED_IPS,OLE_EDT_BANNED_IPS' + For Each EditTableCtrl in EditTableCtrls using ',' setting EditTableCnt + Ctrl = @Window : '.' : EditTableCtrl + Begin Case + Case EditTableCtrl EQ 'OLE_EDT_NON_AUTHENTICATED_PATHS' + TableDimension = 2 : @FM : 1 + TitleList = 'Path' : @VM : 'Query Params' + PromptText1 = 'Enter a URL path without query params' + PromptText2 = 'Query params' + Case EditTableCtrl EQ 'OLE_EDT_WHITELISTED_IPS' + TableDimension = 1 : @FM : 1 + TitleList = '' + PromptText1 = 'Enter an IP or URL authority' + PromptText2 = '' + Case EditTableCtrl EQ 'OLE_EDT_BANNED_IPS' + TableDimension = 1 : @FM : 1 + TitleList = '' + PromptText1 = 'Enter an IP or URL authority' + PromptText2 = '' + End Case + Set_Property(Ctrl, 'OLE.Dimension', TableDimension) + Set_Property(Ctrl, 'OLE.Border', 'Flat') + Set_Property(Ctrl, 'OLE.WorkspaceBkColor', 'White') + If TitleList NE '' then + Set_Property(Ctrl, 'OLE.TitleList', TitleList) + Set_Property(Ctrl, 'OLE.HeaderRow[1]', 18 : @FM : True$) + end else + Set_Property(Ctrl, 'OLE.HeaderRow[1]', '' : @FM : False$) + end + Set_Property(Ctrl, 'OLE.HeaderFont[All; All]', 'Segoe UI' : @SVM : '9' : @SVM : '400') + Set_Property(Ctrl, 'OLE.HeaderColumn[1]', '' : @FM : False$) + Set_Property(Ctrl, 'OLE.DataRow[All]', 18 : @FM : True$ : @FM : False$ : @FM : False$) + Set_Property(Ctrl, 'OLE.DataColumn[1]', 100 : @FM : True$ : @FM : False$ : @FM : True$) + Set_Property(Ctrl, 'OLE.CellEditMode[All; All]', '' : @FM : 'Insert') + Set_Property(Ctrl, 'OLE.CellFont[All; All]', 'Segoe UI' : @SVM : '9' : @SVM : '400') +* Set_Property(Ctrl, 'OLE.CellGridLines[All;All]', 'None' : @FM : 'None' : @FM : 'None' : @FM : 'None') + Set_Property(Ctrl, 'OLE.CellGridLines[All; All]', 'None' : @FM : '' : @FM : 'None' : @FM : '') + CellColors = '' + CellColors<1> = 'RGB(68,68,68)' + CellColors<2> = 'White' + CellColors<3> = 'RGB(68,68,68)' + CellColors<4> = 'RGB(192,224,255)' + CellColors<5> = 'RGB(68,68,68)' + Set_Property(Ctrl, 'OLE.CellColors[All; All]', CellColors) + CellColors<4> = 'White' + CellColors<5> = True$ + Set_Property(Ctrl, 'OLE.HeaderColors[All; All]', CellColors) + SelectionStyle = '' + SelectionStyle<1> = 'RGB(68,68,68)' : @VM : 'RGB(192,224,255)' + SelectionStyle<4> = 'None' + SelectionStyle<5> = 0 + SelectionStyle<6> = 'None' + Set_Property(Ctrl, 'OLE.SelectionStyle', SelectionStyle) + CellPromptArray = '' + CellPromptArray<1> = PromptText1 + CellPromptArray<2> = 'Segoe UI' : @SVM : '9' : @SVM : '100' + CellPromptArray<4> = 'Center' + CellPromptArray<6> = True$ + CellPromptArray<7> = 'Both' + Set_Property(Ctrl, 'OLE.CellPrompt[1; All]', CellPromptArray) + If PromptText2 NE '' then + CellPromptArray<1> = PromptText2 + Set_Property(Ctrl, 'OLE.CellPrompt[2; All]', CellPromptArray) + end + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.AfterDeleteRecords', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.AfterInsertRecords', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.AfterNewRecords', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualify) + Next PictureCnt + Ctrl = @Window : '.OLE_EDT_NON_AUTHENTICATED_PATHS' + Set_Property(Ctrl, 'OLE.DataColumn[2]', 150 : @FM : True$ : @FM : False$ : @FM : False$) + Set_Property(Ctrl, 'OLE.CellMultilined[2; All]', True$) + NonAuthPaths = SetupInfo + NonAuthQueryParams = SetupInfo + Array = NonAuthPaths : @FM : NonAuthQueryParams + Set_Property(Ctrl, 'OLE.Array', Array) + Ctrl = @Window : '.OLE_EDT_WHITELISTED_IPS' + WhitelistIPs = SetupInfo + Set_Property(Ctrl, 'OLE.Array', WhitelistIPs) + Ctrl = @Window : '.OLE_EDT_BANNED_IPS' + BannedIPs = SetupInfo + Set_Property(Ctrl, 'OLE.Array', BannedIPs) + + + //------------------------------------------------------------------------------------------------------------------ + // + // Resource hierarchical view (SRP Tree Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_TRE_RESOURCES' + + // Set common tree properties + Set_Property(Ctrl, 'OLE.CtrlEntId', Ctrl) + Set_Property(Ctrl, 'OLE.FullRowSelect', True$) + Set_Property(Ctrl, 'OLE.ShowFocusItem', False$) + Set_Property(Ctrl, 'OLE.LinesEnabled', False$) + Set_Property(Ctrl, 'OLE.RootIndent', True$) + Set_Property(Ctrl, 'OLE.ButtonsEnabled', True$) + Set_Property(Ctrl, 'OLE.DefHeight', 24) + Set_Property(Ctrl, 'OLE.ExpandBehavior', 'None') + Set_Property(Ctrl, 'OLE.EnterBehavior', 'None') + Set_Property(Ctrl, 'OLE.DragEnabled', True$) + Set_Property(Ctrl, 'OLE.DropBehavior', 'Insert') + Set_Property(Ctrl, 'OLE.DropSources', Ctrl) + Set_Property(Ctrl, 'OLE.DragCondition', 'Level EQ 2') + + // Setup glyphs + Images = '' + Images<1> = ApplicationPath$ : '\BMPS\' : 'SRPHTTPTreeExpanded.png' + Images<2> = ApplicationPath$ : '\BMPS\' : 'SRPHTTPTreeCollapsed.png' + Set_Property(Ctrl, 'OLE.GlyphImages', Images) + + // Set tree theme + Colors = '' + Colors<1, 1> = 'RGB(068,068,068)' + Colors<1, 2> = 'RGB(194,213,242)' + Colors<2, 1> = 'RGB(068,068,068)' + Colors<2, 2> = 'RGB(213,225,242)' + Colors<3, 1> = 'RGB(068,068,068)' + Colors<3, 2> = 'Vertical(Gradient(RGB(213,225,242), RGB(213,225,242)), Border(RGB(163,189,227)), Margin(0, 0, 0, 0))' + Colors<4, 1> = 'RGB(068,068,068)' + Colors<4, 2> = 'RGB(194,213,242)' + Set_Property(Ctrl, 'OLE.Colors', Colors) + + Colors = '' + Colors<1> = 'RGB(068,068,068)' + Colors<2> = 'White' + Set_Property(Ctrl, 'OLE.DefColors', Colors) + Set_Property(Ctrl, 'OLE.Border', 'None') + Set_Property(Ctrl, 'OLE.Background', 'White') + Set_Property(Ctrl, 'OLE.DefFont', 'Segoe UI' : @SVM : '-12' : @SVM : '400' : @SVM : '0' : @SVM : '0') + Set_Property(Ctrl, 'OLE.ImageSize', '16x16') + Set_Property(Ctrl, 'OLE.LinesEnabled', False$) + Set_Property(Ctrl, 'OLE.ButtonsEnabled', True$) + + // Setup tree images + Images = '' + Images<-1> = 'APIROOT' : @VM : ApplicationPath$ : '\BMPS\' : 'SRPHTTPEntryPoint.png' + Images<-1> = 'RESOURCE' : @VM : ApplicationPath$ : '\BMPS\' : 'SRPHTTPResource.png' + Images<-1> = 'RESOURCE_ID' : @VM : ApplicationPath$ : '\BMPS\' : 'SRPHTTPResourceID.png' + Images<-1> = 'PROPERTY' : @VM : ApplicationPath$ : '\BMPS\' : 'SRPHTTPProperty.png' + Set_Property(Ctrl, 'OLE.Images', Images) + + // Set common image conditions + Conditions = '' + Conditions<-1> = 'APIROOT' : @VM : 'Class EQ "APIROOT"' + Conditions<-1> = 'RESOURCE' : @VM : 'Class EQ "RESOURCE"' + Conditions<-1> = 'RESOURCE_ID' : @VM : 'Class EQ "RESOURCE_ID"' + Conditions<-1> = 'PROPERTY' : @VM : 'Class EQ "PROPERTY"' + Set_Property(Ctrl, 'OLE.ImageConditions', Conditions) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnSelChange', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnDrop', Qualify) + + + //------------------------------------------------------------------------------------------------------------------ + // + // Resource Tree buttons (SRP Button Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + ButtonCtrls = 'OLE_PUB_CONTRACT' + ToolTips = 'View only top-level resources.' + NumButtons = DCount(ButtonCtrls, ',') + For ButtonCnt = 1 to NumButtons + Ctrl = @Window : '.' : Field(ButtonCtrls, ',', ButtonCnt, 1) + Set_Property(Ctrl, 'OLE.BackVisible', False$) + ToolTip = ToolTips + Set_Property(Ctrl, 'OLE.ToolTip', ToolTip) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + Next ButtonCnt + Set_Property(@Window : '.OLE_PUB_CONTRACT', 'OLE.IconList', ApplicationPath$ : '\BMPS\' : 'SRPHTTPTreeTopLevelResources.png' : @VM : 'C' : @VM : 'C') + Set_Property(@Window : '.OLE_PUB_CONTRACT', 'OLE.Caption', '') + + + //------------------------------------------------------------------------------------------------------------------ + // + // Methods and Query Params view (SRP Tree Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + TreeCtrls = 'OLE_TRE_RESOURCE_METHODS,OLE_TRE_RESOURCE_QUERY_PARAMS' + NumTrees = DCount(TreeCtrls, ',') + For TreeCnt = 1 to NumTrees + Ctrl = @Window : '.' : Field(TreeCtrls, ',', TreeCnt, 1) + + // Set common tree properties + Set_Property(Ctrl, 'OLE.CtrlEntId', Ctrl) + Set_Property(Ctrl, 'OLE.FullRowSelect', True$) + Set_Property(Ctrl, 'OLE.ShowFocusItem', False$) + Set_Property(Ctrl, 'OLE.LinesEnabled', False$) + Set_Property(Ctrl, 'OLE.RootIndent', False$) + Set_Property(Ctrl, 'OLE.ButtonsEnabled', False$) + Set_Property(Ctrl, 'OLE.ExpandBehavior', 'None') + Set_Property(Ctrl, 'OLE.EnterBehavior', 'None') + + // Set tree theme + Colors = '' + Colors<1, 1> = 'RGB(068,068,068)' + Colors<1, 2> = 'RGB(194,213,242)' + Colors<2, 1> = 'RGB(068,068,068)' + Colors<2, 2> = 'RGB(213,225,242)' + Colors<3, 1> = 'RGB(068,068,068)' + Colors<3, 2> = 'Vertical(Gradient(RGB(213,225,242), RGB(213,225,242)), Border(RGB(163,189,227)), Margin(0, 0, 0, 0))' + Colors<4, 1> = 'RGB(068,068,068)' + Colors<4, 2> = 'RGB(194,213,242)' + Set_Property(Ctrl, 'OLE.Colors', Colors) + + Colors = '' + Colors<1> = 'RGB(068,068,068)' + Colors<2> = 'White' + Set_Property(Ctrl, 'OLE.DefColors', Colors) + Set_Property(Ctrl, 'OLE.Background', 'White') + Set_Property(Ctrl, 'OLE.DefFont', 'Segoe UI' : @SVM : '-12' : @SVM : '400' : @SVM : '0' : @SVM : '0') + Set_Property(Ctrl, 'OLE.LinesEnabled', False$) + Set_Property(Ctrl, 'OLE.ButtonsEnabled', False$) + Next TreeCnt + + Methods = 'GET / HEAD,POST,PUT,PATCH,DELETE' + ItemList = '' + For Each Method in Methods using ',' setting cPos + ItemList = 1 + ItemList = Method + ItemList = Method + ItemList = 'Left' + Next Method + Set_Property(@Window : '.OLE_TRE_RESOURCE_METHODS', 'OLE.DefHeight', 24) + Set_Property(@Window : '.OLE_TRE_RESOURCE_METHODS', 'OLE.ItemList', ItemList) + Set_Property(@Window : '.OLE_TRE_RESOURCE_METHODS', 'OLE.DefSelectable', False$) + Send_Message(@Window : '.OLE_TRE_RESOURCE_METHODS', 'QUALIFY_EVENT', 'OLE.OnItemCheck', Qualify) + Set_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.DefSelectable', True$) + Set_Property(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'OLE.Prompts', 'There are no query params.') + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'QUALIFY_EVENT', 'OLE.OnSelChange', Qualify) + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualify) + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualify) + Send_Message(@Window : '.OLE_TRE_RESOURCE_QUERY_PARAMS', 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualify) + + + //------------------------------------------------------------------------------------------------------------------ + // + // Info help (SRP Picture Control) + // + // The styling configuration is designed to mimic Office 2016's Option dialog. + // + //------------------------------------------------------------------------------------------------------------------ + AllOLECtrls = Utility('OBJECTLIST', @Window, 'OLECONTROL') + Image = ApplicationPath$ : '\BMPS\' : 'SRPHTTPInfo.png' + NumOLECtrls = DCount(AllOLECtrls, @FM) + For OLECnt = 1 to NumOLECtrls + Ctrl = AllOLECtrls + If Index(Ctrl, '.OLE_INFO_', 1) then + Set_Property(Ctrl, 'OLE.Image', Image) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnMouseEnter', Qualify) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnMouseExit', Qualify) + end + Next PictureCnt + +return + + +UpdateSetupInfo: + + // Get the Setup information from the server and then update based on the data in the form. + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', SetupRowKeyID$) + SetupInfo = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + SetupInfo = Get_Property(@Window : '.EDL_HOME_URL', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_API_URL', 'TEXT') + SetupInfo = Get_Property(@Window : '.COB_API_CALL_PROCEDURE', 'TEXT') + SetupInfo = Get_Property(@Window : '.CHB_ENABLE_LOGGING', 'CHECK') + SetupInfo = Get_Property(@Window : '.CHB_LOG_ERRORS_ONLY', 'CHECK') + SetupInfo = Get_Property(@Window : '.EDL_CAPTURE_PATH', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_REALM_VALUE', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_ENTRY_POINT_SERVICE', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_ABORTED_SERVICE', 'TEXT') + SettingText = Get_Property(@Window : '.COB_DEBUGGER_SETTING', 'TEXT') + Locate SettingText in 'Disabled,Enabled,Intercept' using ',' setting DebuggerSetting else DebuggerSetting = 1 + DebuggerSetting -= 1 + SetupInfo = DebuggerSetting + SetupInfo = Get_Property(@Window : '.EDL_DEBUGGER_INTERCEPT', 'TEXT') + SetupInfo = Get_Property(@Window : '.CHB_FLUSH_CACHE', 'CHECK') + SetupInfo = Get_Property(@Window : '.CHB_ENABLE_AUTHENTICATION', 'CHECK') + SetupInfo = Get_Property(@Window : '.CHB_ENABLE_HTTP_BASIC_AUTHENTICATION', 'CHECK') + SetupInfo = Get_Property(@Window : '.EDL_NEW_PASSWORD_TIME_TO_LIVE', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_OLD_PASSWORD_TIME_TO_LIVE', 'TEXT') + SetupInfo = Get_Property(@Window : '.EDL_INVALID_PASSWORD_LIMIT', 'TEXT') + SetupInfo = Get_Property(@Window : '.COB_CONTAINMENT_ACTION', 'TEXT') + Array = Get_Property(@Window : '.OLE_EDT_NON_AUTHENTICATED_PATHS', 'OLE.Array') + SetupInfo = Array<1> + SetupInfo = Array<2> + SetupInfo = Get_Property(@Window : '.OLE_EDT_WHITELISTED_IPS', 'ARRAY') + SetupInfo = Get_Property(@Window : '.RAG_WHITELISTED_IPS', 'VALUE') + SetupInfo = Get_Property(@Window : '.OLE_EDT_BANNED_IPS', 'ARRAY') + // Save the new Setup information to the server. + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, SetupInfo, True$, False$, False$) + + If Error_Services('HasError') then + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end else + // Save the new Server Enabled information to the server. + // Get the resource map from the SRP Tree control's ItemList property. + LocalSetupKeyID = HTTP_Services('GetLocalAppKeyID', ResourcesKeyID$) + CurrItemList = Database_Services('ReadDataRow', SetupTable$, LocalSetupKeyID) + ItemList = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemList') + If CurrItemList NE ItemList then + Database_Services('WriteDataRow', SetupTable$, LocalSetupKeyID, ItemList, True$, False$, False$) + If Error_Services('HasError') then + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + end + end + + // Since changes have been made, clear the cache so other processses can get fresh data. + Memory_Services('ReleaseHashTable', CacheName$) + + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.SelectedItems') + GoSub UpdateURLPath + +return + + +TransferParams: + + // ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to + // OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight + // event and ActiveX (OLE) events. + Transfer Param1 to Event + Transfer Param2 to Param1 + Transfer Param3 to Param2 + Transfer Param4 to Param3 + Transfer Param5 to Param4 + Transfer Param6 to Param5 + Transfer Param7 to Param6 + Transfer Param8 to Param7 + Transfer Param9 to Param8 + Transfer Param10 to Param9 + Transfer Param11 to Param10 + Transfer Param12 to Param11 + Transfer Param13 to Param12 + Transfer Param14 to Param13 + Transfer Param15 to Param14 + +return + + +RestoreParams: + + // Restore the event parameters so the rest of the event chain will see the parameter values as they were originally + // created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case + // there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*). + Transfer Param14 to Param15 + Transfer Param13 to Param14 + Transfer Param12 to Param13 + Transfer Param11 to Param12 + Transfer Param10 to Param11 + Transfer Param9 to Param10 + Transfer Param8 to Param9 + Transfer Param7 to Param8 + Transfer Param6 to Param7 + Transfer Param5 to Param6 + Transfer Param4 to Param5 + Transfer Param3 to Param4 + Transfer Param2 to Param3 + Transfer Param1 to Param2 + Transfer Event to Param1 + Event = 'OLE' + +return + + +DisplayInfoHelp: + + InfoTitle = '' + + Begin Case + Case Control _EQC 'OLE_INFO_HOME_URL' + InfoTitle = 'Home URL' + InfoText = 'The Home URL for the web site' + InfoText := @FM : @FM + InfoText := 'The home URL (domain) for the API being requested. Normally this is the same URL that directs ' + InfoText := 'the user to a home page. The framework will automatically derive this from the request, but ' + InfoText := 'a default URL should be entered in case one cannot be derived.' + InfoText := @FM : @FM + InfoText := '"http://" or "https://" may be specified as apart of the URL, but it is recommended to leave ' + InfoText := 'it out so the API can dynamically add it in based on the HTTP request details.' + + Case Control _EQC 'OLE_INFO_API_URL' + InfoTitle = 'API URL' + InfoText = 'The API end point' + InfoText := @FM : @FM + InfoText := 'The end point where all API requests begin. This should not include the Home URL. For example, ' + InfoText := 'if the full API URL is "http://www.example.org/api" then the Home URL should be set to "www.example.org" ' + InfoText := 'and the API URL should be set to "/api".' + + Case Control _EQC 'OLE_INFO_API_CALL_PROCEDURE' + InfoTitle = 'API Call Procedure' + InfoText = 'The procedure method used to call the API' + InfoText := @FM : @FM + InfoText := 'There are two procedure methods that can call an API. The classic method is "HTTP Service". This method ' + InfoText := 'calls an HTTP service procedure for each resource segment in the URL. HTTP service procedures are always ' + InfoText := 'responsible for validating the HTTP method, properties, and sub-resources. The current method is "Web API". ' + InfoText := 'This method creates a map for the current URL to a specific API procedure and calls it. HTTP method, ' + InfoText := 'properties, and sub-resources are all validated in common code automatically so the developer no longer has to ' + InfoText := 'handle this in each API procedure.' + + Case Control _EQC 'OLE_INFO_ENABLE_LOGGING' + InfoTitle = 'Enable Logging?' + InfoText = 'Tells the server if logging is enabled' + InfoText := @FM : @FM + InfoText := 'This is used by the CreateLogFile service.' + + Case Control _EQC 'OLE_INFO_LOG_ERRORS_ONLY' + InfoTitle = 'Log Errors Only' + InfoText = 'Tells the server if only error responses should be logged' + InfoText := @FM : @FM + InfoText := 'If set, only error responses (i.e., status codes of 4xx or 5xx) will be logged. This is used ' + InfoText := 'by the CreateLogFile service.' + + Case Control _EQC 'OLE_INFO_CAPTURE_PATH' + InfoTitle = 'Capture Path' + InfoText = 'Path for all logs to be captured' + InfoText := @FM : @FM + InfoText := 'Used in HTTP_MCP to identify the local OS path where request and response content can be saved ' + InfoText := 'for off-line analysis. If the path does not exist, then no attempt to store this information will be made.' + + Case Control _EQC 'OLE_INFO_REALM_VALUE' + InfoTitle = 'Realm Value' + InfoText = 'The HTTP Realm Value' + InfoText := @FM : @FM + InfoText := 'Used with HTTP authentication to associate resource links to the same protective space.' + + Case Control _EQC 'OLE_INFO_ENTRY_POINT_SERVICE' + InfoTitle = 'Entry Point Service' + InfoText = 'Tells the server which HTTP service handles the API entry point' + InfoText := @FM : @FM + InfoText := 'If the HTTP Service API calling procedure type is used, this is the name of the entry point web ' + InfoText := 'service that will be called by HTTP_MCP as the first web service.' + + Case Control _EQC 'OLE_INFO_ABORTED_SERVICE' + InfoTitle = 'Aborted Service' + InfoText = 'Tells the server how to aborted HTTP requests' + InfoText := @FM : @FM + InfoText := 'Service handler for HTTP Requests that get aborted either due to runtime errors or status errors. ' + InfoText := 'If the Debugger Intercept has been enabled, this handler will only receive Status Error aborts.' + + Case Control _EQC 'OLE_INFO_DEBUGGER_SETTING' + InfoTitle = 'Debugger Setting' + InfoText = 'Tells the server how to handle debug or runtime error conditions' + InfoText := @FM : @FM + InfoText := 'Enabled means to allow the interactive debugger to respond to debug statements or runtime errors. ' + InfoText := 'Disabled means to suppress any activity that would normally bring up the interactive debugger. ' + InfoText := 'Intercept means to call the indicated stored procedure to handle the runtime error condition.' + + Case Control _EQC 'OLE_INFO_FLUSH_CACHE' + InfoTitle = 'Flush Cache' + InfoText = 'Tells the server to clear all cached code when finished' + InfoText := @FM : @FM + InfoText := 'This allows changes in web service procedures to always be available without having to restart ' + InfoText := 'the OEngineServer.' + + Case Control _EQC 'OLE_INFO_SERVER_ENABLED' + InfoTitle = 'Server Status' + InfoText = 'Sets the enabled status of the server' + InfoText := @FM : @FM + InfoText := 'If the server is disabled, no API requests will be permitted. The server can be disabled ' + InfoText := 'by clicking the button if it has the caption "Disable Server". If the caption says "Enable Server", ' + InfoText := 'then clicking it will re-enable the server so long as other concerns, such as breach containment ' + InfoText := 'actions, do not disable the server again.' + InfoText := @FM : @FM + InfoText := 'The status message displays the current enable status of the server and will dynamically update ' + InfoText := 'itself every 5 seconds.' + + Case Control _EQC 'OLE_INFO_ENABLE_AUTHENTICATION' + InfoTitle = 'Enable Authentication?' + InfoText = 'Tells the server to enforce authentication' + InfoText := @FM : @FM + InfoText := 'If set, authentication is enforced. The type of authentication methods enforced will depend upon ' + InfoText := 'other settings. If this is not set, no authentication is enforced. Authentication should only ' + InfoText := 'be disabled for testing purposes or when authentication processes are still being configured.' + + Case Control _EQC 'OLE_INFO_ENABLE_HTTP_BASIC_AUTHENTICATION' + InfoTitle = 'Enable HTTP Basic Authentication?' + InfoText = 'Tells the server to enforce HTTP Basic Authentication' + InfoText := @FM : @FM + InfoText := 'If set, HTTP Basic Authentication is enforced. A valid database table name and current password ' + InfoText := 'password column must be defined. This setting is ignored if Enable Authentication is not set.' + + Case Control _EQC 'OLE_INFO_NEW_PASSWORD_TIME_TO_LIVE' + InfoTitle = 'New Password Time to Live' + InfoText = 'Length of time new passwords are valid' + InfoText := @FM : @FM + InfoText := 'If HTTP Basic Authentication is enabled, this is how long (in hours) new passwords that are ' + InfoText := 'created can be valid before needing to be reset. If left empty, passwords do not expire.' + + Case Control _EQC 'OLE_INFO_OLD_PASSWORD_TIME_TO_LIVE' + InfoTitle = 'Old Password Time to Live' + InfoText = 'Length of time old passwords are valid' + InfoText := @FM : @FM + InfoText := 'If HTTP Basic Authentication is enabled, this is how long (in hours) old passwords can remain ' + InfoText := 'valid. This should be a short period of time allowing for the new password to propogate. If ' + InfoText := 'left empty, old passwords will only be valid for 1 hour.' + + Case Control _EQC 'OLE_INFO_INVALID_PASSWORD_LIMIT' + InfoTitle = 'Invalid Password Limit' + InfoText = 'Number in invalid password attempts before containment action' + InfoText := @FM : @FM + InfoText := 'If HTTP Basic Authentication is enabled, this indicates the number of invalid password attempts ' + InfoText := 'can be attempted before containment action takes place.' + + Case Control _EQC 'OLE_INFO_TOTAL_INVALID_PASSWORD_ATTEMPTS' + InfoTitle = 'Total Invalid Password Attempts' + InfoText = 'Total number of invalid password attempts' + InfoText := @FM : @FM + InfoText := 'This indicates the total number of invalid password attempts being made to the server. This can ' + InfoText := 'be reset by clicking the Reset button. This is reset automatically. Clicking the OK or Apply button ' + InfoText := 'is not necessary.' + + Case Control _EQC 'OLE_INFO_CONTAINMENT_ACTION' + InfoTitle = 'Containment Action' + InfoText = 'Action to take to contain a suspected system breach' + InfoText := @FM : @FM + InfoText := 'If HTTP Basic Authentication is enabled, this indicates what action to take if the number of ' + InfoText := 'attempted passwords fails more than the limit. The Quarantine Account option will flag this account ' + InfoText := 'as being disabled until re-enabled. The Disable Server option will disable all connections to the ' + InfoText := 'server until the system access is re-established.' + + Case Control _EQC 'OLE_INFO_NON_AUTHENTICATED_PATHS' + InfoTitle = 'Non-Authenticated Paths' + InfoText = 'List of URL paths that should never be authenticated' + InfoText := @FM : @FM + InfoText := 'Some paths (or endpoints) should never be authenticated because they are used only by trusted ' + InfoText := 'connections. Paths that support OAuth redirects are a good example sinice these requests will ' + InfoText := 'unlikely be authenticated (although they should be secret and secure with the OAuth ' + InfoText := 'authenticating server).' + InfoText := @FM : @FM + InfoText := 'If the path should be limited to an endpoint containing one or more specified query params,' + InfoText := 'then enter these params in the second column.' + InfoText := @FM : @FM + InfoText := 'This should not include the Home URL or the API URL. For example, if the full non-authenticated ' + InfoText := 'URL is "http://www.example.org/api/oauth" then the Home URL should be set to "www.example.org", ' + InfoText := 'the API URL should be set to "/api", and the Non-Authenticated Path should be set to "/oauth".' + + Case Control _EQC 'OLE_INFO_WHITELISTED_IPS' + InfoTitle = 'Whitelisted IPs' + InfoText = 'List of IP addresses that are given special treatment when connecting to the server' + InfoText := @FM : @FM + InfoText := 'The IPs on this list will be treated differently based on other settings. In all cases, an ' + InfoText := 'empty list will have no affect on how the remote IP address is treated.' + InfoText := @FM : @FM + InfoText := 'If "Only allow Whitelisted IPs" is selected, only those IPs listed will be permitted to connect ' + InfoText := 'to the server. If "Always allow Whitelisted IPs" is selected, then those IPs listed will be ' + InfoText := 'permitted even if the IP appears on the ban list.' + InfoText := @FM : @FM + InfoText := 'Whitelisted IPs support wildcard symbols (e.g., 127.0.0.*) or ranges (e.g., 127.0.0.1-100). ' + InfoText := 'Note, even if the IP is permitted, other authentication rules might still be applied.' + + Case Control _EQC 'OLE_INFO_BANNED_IPS' + InfoTitle = 'Banned IPs' + InfoText = 'List of IP addresses that are banned from the server' + InfoText := @FM : @FM + InfoText := 'Even if the IP is whitelisted, this list will have the final jurisdiction over the IP. ' + InfoText := 'Banned IPs support wildcard symbols (e.g., 127.0.0.*) or ranges (e.g., 127.0.0.1-100).' + + Case Control _EQC 'OLE_INFO_RESOURCES' + InfoTitle = 'Resources' + InfoText = 'Hierarchical view of resources' + InfoText := @FM : @FM + InfoText := 'The tree view allows resources, resource IDs, and properties to be created, renamed, or removed ' + InfoText := 'using the command buttons at the bottom or by context menus. Clicking on a specific item in the ' + InfoText := 'tree view automatically enables the appropriate command buttons as well as updates the URL ' + InfoText := 'preview line above. Additional resource meta data, such as the description, supported HTTP methods ' + InfoText := 'and supported query params, are displayed on the right.' + InfoText := @FM : @FM + InfoText := 'When the the OK or Apply button is clicked, API service logic will either be created or updated ' + InfoText := 'as appropriate.' + + Case Control _EQC 'OLE_INFO_RESOURCE_TITLE' + InfoTitle = 'Resource Title' + InfoText = 'Title of this resource. This can be queried and used as the title of the link relationship.' + + Case Control _EQC 'OLE_INFO_RESOURCE_DESCRIPTION' + InfoTitle = 'Resource Description' + InfoText = 'Short description of this resource.' + + Case Control _EQC 'OLE_INFO_RESOURCE_METHODS' + InfoTitle = 'Resource Methods' + InfoText = 'Methods supported by this resource.' + + Case Control _EQC 'OLE_INFO_RESOURCE_QUERY_PARAMS' + InfoTitle = 'Resource Query Params' + InfoText = 'Query params supported by this resource. Click the "+" button to add a new query param. Select ' + InfoText := 'a query param and click the "-" button to remove it. Double-click on a query param to rename it.' + InfoText := @FM : @FM + InfoText := 'If several query params are supported (such as arbitrary resource property names), then just ' + InfoText := 'add a new query param using the "*" character.' + + Case Control _EQC 'OLE_INFO_RESOURCE_EXCLUDE_FROM_LOGGING' + InfoTitle = 'Exclude From Logging' + InfoText = 'By default, a request and response for a resource endpoint is logged (assuming logging is ' + InfoText := 'enabled). An endpoint can be excluded from logging if this is checked.' + + End Case + + If InfoTitle NE '' then + PopupCtrl = @Window : '.OLE_POPUP' + + // Using the InfoTitle and InfoText content, calculate the values needed to determine the property width and + // height of the SRP Popup control. + TitleLen = Len(InfoTitle) + CoreFont = 'Segoe UI' : @SVM : '9' + ItemWidth = SRP_String('GetWidth', InfoTitle, CoreFont : @SVM : '700') + // Minimum width will be 300 pixels but it can be wider if the title requires it. + If ItemWidth LT 300 then ItemWidth = 300 + TitleHeight = SRP_String('GetHeight', InfoTitle, CoreFont : @SVM : '700', ItemWidth, @FM) + 4 + TextHeight = SRP_String('GetHeight', InfoText, CoreFont : @SVM : '400', ItemWidth, @FM) + 4 + + ItemCnt = 0 + LeftMarg = 11 + VertPos = 11 ; // The first item will be 11 pixels from the top of the SRP Popup display. + + // Begin calculation the specific x and y coordinates for the SRP Popup display based on the control's + // information and control type. This will be used in the ShowAt method. + CtrlSize = SRP_Get_Window_Rect(@Window : '.' : Control) + CtrlWidth = CtrlSize<3> + CtrlHeight = CtrlSize<4> + CtrlXpos = CtrlSize<1> + CtrlYpos = CtrlSize<2> + + // Get x and y+h of control for x & y of popup + ShowAtX = CtrlXpos + // Move to the right by 10 pixels. + ShowAtX += 10 + + // Start with the bottom of the info control. + ShowAtY = CtrlYpos + CtrlHeight + // Lower the by 10 pixels. + ShowAtY += 10 + + // Create the items to be displayed in the SRP Popup control. + ItemList = '' + + TextColor = 'RGB(93, 93, 93)' + BackColor = 'Vertical(Gradient(White, White), Border(' : TextColor : '))' + + // Add the InfoTitle. + ItemCnt += 1 + ItemList = LeftMarg : @SVM : VertPos : @SVM : ItemWidth : @SVM : TitleHeight + ItemList = InfoTitle + ItemList = TextColor + ItemList = CoreFont : @SVM : '700' + ItemList = 'Left' : @SVM : 'Top' + + VertPos += TitleHeight ; // Increase the total vertical position by the height of the info title. + VertPos += 5 ; // Add another 5 pixels to give space between the title and the text. + + // Add the InfoText. + Swap @FM with \0D0A\ in InfoText + ItemCnt += 1 + ItemList = LeftMarg : @SVM : VertPos : @SVM : ItemWidth : @SVM : TextHeight + ItemList = InfoText + ItemList = TextColor + ItemList = CoreFont : @SVM : '400' + ItemList = 'Left' : @SVM : 'Top' + + VertPos += TextHeight ; // Increase the total vertical position by the height of the info text. + VertPos += 11 ; // Add another 11 pixels to give a bottom border. + + // Set the Theme property to Custom so the special background settings will work as expected. + Set_Property(PopupCtrl, 'OLE.Theme', 'Custom') + Set_Property(PopupCtrl, 'OLE.Background', BackColor : @FM : 'None' : @FM : 'None') + + // Set the ItemList property. + Set_Property(PopupCtrl, 'OLE.ItemList', ItemList) + + // Keep the SRP Popup display up indefinitely. + Set_Property(PopupCtrl, 'OLE.ShowDelay', 0) + + GoSub HideInfoHelp + + // Set the Size of the SRP Popup display to be the full width and height needed to contain all items. + Set_Property(PopupCtrl, 'OLE.Size', 0 : @FM : 0 : @FM : LeftMarg * 2 + ItemWidth : @FM : VertPos) + + // Finally, display the SRP Popup control. + Send_Message(PopupCtrl, 'OLE.ShowAt', ShowAtX, ShowAtY) + end + +return + + +HideInfoHelp: + + PopupCtrl = @Window : '.OLE_POPUP' + Send_Message(PopupCtrl, 'OLE.Close') + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Check the server enabled status and update the UI accordingly. +// +//---------------------------------------------------------------------------------------------------------------------- +CheckServerStatus: + + ServerEnabledFlag = HTTP_Services('GetServerEnabled') + If ServerEnabledFlag EQ True$ then + ButtonCaption = 'Disable Server' + Caption = 'Server Status: ENABLED' + CaptionColor = 'Green' + end else + ButtonCaption = 'Enable Server' + Caption = 'Server Status: DISABLED' + CaptionColor = 'Red' + end + + Set_Property(@Window : '.PUB_SERVER_STATUS', 'TEXT', ButtonCaption) + Set_Property(@Window : '.OLE_PIC_SERVER_STATUS', 'OLE.Caption', Caption) + Set_Property(@Window : '.OLE_PIC_SERVER_STATUS', 'OLE.CaptionColor', CaptionColor) + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Create a Home URL based on the data in the form. +// +//---------------------------------------------------------------------------------------------------------------------- +GetHomeURL: + + HomeURL = Get_Property(@Window : '.EDL_HOME_URL', 'TEXT') + If HomeURL[1, 4] _NEC 'http' then + HomeURL = 'http://' : HomeURL + end + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Using the current ItemKey, create a full URL path representing this endpoint. +// +//---------------------------------------------------------------------------------------------------------------------- +GetFullURLPath: + + URLPath = '' + + If ItemKey NE '' then + Loop + ItemParentIsRoot = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemParentIsRoot[' : ItemKey : ']') + Until ItemParentIsRoot EQ True$ + ItemData = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[' : ItemKey : ']') + URLPath = Insert(URLPath, 1, 0, 0, '/' : ItemData) + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemParent[' : ItemKey : ']') + Repeat + GoSub GetHomeURL + URLPath = Insert(URLPath, 1, 0, 0, HomeURL : '/' : Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[APIROOT]')) + end + + Convert @FM to '' in URLPath + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Using the current ItemKey, create a URL path representing this endpoint. This URL path will not include the Home or +// API portion of the URL. +// +//---------------------------------------------------------------------------------------------------------------------- +GetURLPath: + + URLPath = '' + + If ItemKey NE '' then + Loop + ItemParentIsRoot = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemParentIsRoot[' : ItemKey : ']') + Until ItemParentIsRoot EQ True$ + ItemData = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[' : ItemKey : ']') + URLPath = Insert(URLPath, 1, 0, 0, '/' : ItemData) + ItemKey = Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemParent[' : ItemKey : ']') + Repeat +* GoSub GetHomeURL +* URLPath = Insert(URLPath, 1, 0, 0, HomeURL : '/' : Get_Property(@Window : '.OLE_TRE_RESOURCES', 'OLE.ItemData[APIROOT]')) + end + + Convert @FM to '' in URLPath + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// +// Refresh the display of the URL path in the SRP Picture control. +// +//---------------------------------------------------------------------------------------------------------------------- +UpdateURLPath: + + GoSub GetFullURLPath + Set_Property(@Window : '.OLE_PIC_URL', 'OLE.Caption', URLPath) + +return diff --git a/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS.txt new file mode 100644 index 0000000..752e131 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_ARCHIVE_DATE_EVENTS.txt @@ -0,0 +1,199 @@ +Function NDW_HTTP_Logs_Archive_Date_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_HTTP_Logs_Archive_Date_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History (Date, Initials, Notes) + 09/23/19 dmb [SRPFW-278] Initial development. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler +#window NDW_HTTP_LOGS_ARCHIVE_DATE + +$insert LOGICAL +$insert MSG_EQUATES + +Equ EVENT_CONTINUE$ to 1 +Equ EVENT_STOP$ to 0 +Equ CR$ to \0D\ +Equ CRLF$ to \0D0A\ +Equ BACKSPACE$ to \08\ +Equ TAB$ to \09\ +Equ NEXT$ to 1 +Equ PREVIOUS$ to 2 + +Declare subroutine Set_Property, Send_Event, Send_Message, PlaceDialog, End_Dialog +Declare function Get_Property, Dialog_Box + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Control = Field(CtrlEntId, '.', 2, 2) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +If Event EQ 'OLE' then GoSub TransferParams + +GoToEvent Event for CtrlEntID +If Event EQ 'OLE' then GoSub RestoreParams + +Return EventFlow OR EVENT_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Event WINDOW.CREATE(CreateParam) + + GoSub SetupOLEControls + + PlaceDialog(-1, -1) + +end event + + +Event PUB_OK.CLICK() + + ArchiveDate = Get_Property(@Window : '.EDL_DATE', 'INVALUE') + End_Dialog(@Window, ArchiveDate) + + // Since we are ending the window now, there is no need to allow the event chain to continue. + // If we do, then we will get the "labeled common variable has been freed and is no longer valid" error. + EventFlow = EVENT_STOP$ + +end event + + +Event EDL_DATE.OPTIONS() + + CurrentDate = Get_Property(@Window : '.EDL_DATE', 'INVALUE') + NewDate = Dialog_Box('NDW_HTTP_DATEPICKER', @Window) + If CurrentDate NE NewDate then + Set_Property(CtrlEntId, 'INVALUE', NewDate) + end + +end event + + +Event OLE_SUBCLASS.OnOptionClick(CtrlId) + + Send_Event(CtrlId, 'OPTIONS') + +end event + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SetupOLEControls: + + // All OLE controls can use this qualify configuration. + Qualify = '' + Qualify<1> = 1 + Qualify<3> = '' + Qualify<4> = 0 + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP Subclass Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_SUBCLASS' + EditCtrls = 'EDL_DATE' + NumCtrls = DCount(EditCtrls, ',') + For EditCnt = 1 to NumCtrls + EditCtrl = Field(EditCtrls, ',', EditCnt, 1) + Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE') + Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl) + Set_Property(Ctrl, 'OLE.OptionButton[' : @Window : ';' : EditCtrl : ']', True$) + Set_Property(Ctrl, 'OLE.OptionImage[' : @Window : ';' : EditCtrl : ']', 'BMPS\SRPHTTPDateField.png') + Set_Property(Ctrl, 'OLE.Prompt[' : @Window : ';' : EditCtrl : ']', 'YYYY-MM-DD' : @FM : @FM : 'Center' : @FM : 'Center' : @FM : 'Segoe UI' : @SVM : 9 : @SVM : 400 : @VM : 0) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnOptionClick', Qualify) + Next EditCnt + +return + + +TransferParams: + + // ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to + // OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight + // event and ActiveX (OLE) events. + Transfer Param1 to Event + Transfer Param2 to Param1 + Transfer Param3 to Param2 + Transfer Param4 to Param3 + Transfer Param5 to Param4 + Transfer Param6 to Param5 + Transfer Param7 to Param6 + Transfer Param8 to Param7 + Transfer Param9 to Param8 + Transfer Param10 to Param9 + Transfer Param11 to Param10 + Transfer Param12 to Param11 + Transfer Param13 to Param12 + Transfer Param14 to Param13 + Transfer Param15 to Param14 + +return + + +RestoreParams: + + // Restore the event parameters so the rest of the event chain will see the parameter values as they were originally + // created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case + // there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*). + Transfer Param14 to Param15 + Transfer Param13 to Param14 + Transfer Param12 to Param13 + Transfer Param11 to Param12 + Transfer Param10 to Param11 + Transfer Param9 to Param10 + Transfer Param8 to Param9 + Transfer Param7 to Param8 + Transfer Param6 to Param7 + Transfer Param5 to Param6 + Transfer Param4 to Param5 + Transfer Param3 to Param4 + Transfer Param2 to Param3 + Transfer Param1 to Param2 + Transfer Event to Param1 + Event = 'OLE' + +return diff --git a/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_EVENTS.txt new file mode 100644 index 0000000..a4f06d5 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_HTTP_LOGS_EVENTS.txt @@ -0,0 +1,1086 @@ +Function NDW_HTTP_Logs_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_HTTP_Logs_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History (Date, Initials, Notes) + 06/18/19 jwh [SRPFW-277] Created NDW_HTTP_LOGFILES_Events. + 06/20/19 jwh [SRPFW-277] Got Report Table working with logs from 'C:\RevSoft\OInsight\httpLogs\' + 06/21/19 jwh [SRPFW-277] Got hyperlinks to work from table to open actual log files + 07/17/19 dmb [SRPFW-277] Rename to NDW_HTTP_Logs. + 07/17/19 dmb [SRPFW-277] Replace harcoded reference to 'C:\RevSoft\OInsight\httpLogs\' with a call to the + GetCapturePath service. + 07/18/19 dmb [SRPFW-277] Implement caching and filtering. + 07/19/19 dmb [SRPFW-277] Prompt user to select the log file folder first, defaulting to the configured + capture path. Allow user to select a different folder if there are no files. Save the last + known location in cache. + 07/19/19 dmb [SRPFW-277] Clear log count display when the list is being refreshed. Update the log count + display for every 100 logs found. + 07/19/19 dmb [SRPFW-277] Change the default sort order of the log list to be descending for date, time, + process ID, and sequence. + 08/11/19 dmb [SRPFW-278] Retrofit to use log indexes rather than the log files themselves. This speeds up + the process of populating the ReportTable. + 08/11/19 dmb [SRPFW-278] Add ability to rebuild log indexes. Modify the Action Bar so the Refresh Logs + are now in the new Log Actions group. + 08/11/19 dmb [SRPFW-278] Update the EDL_SEARCH_TEXT.CHAR event handler to avoid refreshing the list of + of logs if the user is backspacing in an empty control. + 08/13/19 dmb [SRPFW-278] Revamp the search feature so that text searching no longer filters the list but + locates the next row with the match. Add support for Next and Previous search requests. + 09/23/19 dmb [SRPFW-278] Various changes to add support for a Remote Address / Execute Time column. + 09/23/19 dmb [SRPFW-278] Add support to archive logs. + 09/24/19 dmb [SRPFW-278] Update archive log feature to display a success or error message as needed. + 09/24/19 dmb [SRPFW-278] Hide ReportTable and display Picture control with caption when archiving logs + to help indicate a process is running. + 09/24/19 dmb [SRPFW-278] Clear the log count indicator when the capture path is empty. + 09/25/19 dmb [SRPFW-278] Update the RefreshLogTable internal gosub so the log count will report 0 instead + of empty if the UDP has not yet been set. + 09/28/19 dmb [SRPFW-278] Fix VNAV in the OLE_ACTION_BAR.OnClick when archiving logs and cancelling the + CHOOSE folder dialog. + 11/14/19 dmb [SRPFW-296] Replace the Utility("RUNWIN") service with ShellExecute in the + OLE_RPT_LOGTABLE.OnItemHyperlink event handler since not all systems work properly with the + RUNWIN service. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler +#window NDW_HTTP_LOGS + +$insert LOGICAL +$insert MSG_EQUATES +$insert HTTP_FRAMEWORK_SETUP_EQUATES + +Equ CR$ to \0D\ +Equ CRLF$ to \0D0A\ +Equ BACKSPACE$ to \08\ +Equ TAB$ to \09\ +Equ NEXT$ to 1 +Equ PREVIOUS$ to 2 + +Declare subroutine Set_Property, Send_Event, Send_Message, PlaceDialog, Utility, SRP_JSON, Logging_Services, Yield +Declare subroutine SRP_Run_Command, ShellExecute +Declare function Get_Property, DirList, Dialog_Box, HTTP_Services, SRP_Path, Send_Message, SRP_Decode, SRP_JSON +Declare function RTI_OS_Directory, Logging_Services, SRP_Array, Database_Services, GetTickCount + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Control = Field(CtrlEntId, '.', 2, 2) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +If Event EQ 'OLE' then GoSub TransferParams +GoToEvent Event for CtrlEntID +If Event EQ 'OLE' then GoSub RestoreParams + +Return EventFlow OR EVENT_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Event WINDOW.CREATE(CreateParam) + + GoSub SetupOLEControls + + PlaceDialog(-2, -2) + + GoSub RefreshLogTable + +end event + + +Event OLE_ACTION_BAR.OnClick(Group, Item, Point, Button, Shift, Ctrl) + + Begin Case + Case Group EQ 1 + // Form Actions + Begin Case + Case Item EQ 1 + // Clear Filters + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'INVALUE', '') + Set_Property(@Window : '.EDL_START_DATE', 'INVALUE', '') + Set_Property(@Window : '.EDL_END_DATE', 'INVALUE', '') + Set_Property(@Window : '.EDL_START_TIME', 'INVALUE', '') + Set_Property(@Window : '.EDL_END_TIME', 'INVALUE', '') + GoSub RefreshLogTable + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'FOCUS', True$) + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'SELECTION', 1) + Set_Property(@Window : '.EDL_START_DATE', 'GOTFOCUS_VALUE', '') + Case Item EQ 2 + // Close Form + Send_Event(@Window, 'CLOSE') + End Case + + Case Group EQ 2 + // Log Actions + Begin Case + Case Item EQ 1 + // Refresh Logs + Set_Property(@Window, '@FULL_LOG_LIST', '') + Set_Property(@Window, '@FULL_RECORD_COLORS', '') + Set_Property(@Window, '@FULL_LOG_COUNT', 0) + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.List', '') + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.RecordColors', '') + GoSub RefreshLogTable + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'FOCUS', True$) + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'SELECTION', 1) + Case Item EQ 2 + GoSub RebuildLogIndex + // Refresh Logs + Set_Property(@Window, '@FULL_LOG_LIST', '') + Set_Property(@Window, '@FULL_RECORD_COLORS', '') + Set_Property(@Window, '@FULL_LOG_COUNT', 0) + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.List', '') + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.RecordColors', '') + GoSub RefreshLogTable + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'FOCUS', True$) + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'SELECTION', 1) + Case Item EQ 3 + // Archive Logs + ArchiveDate = Dialog_Box('NDW_HTTP_LOGS_ARCHIVE_DATE', @Window) + If ArchiveDate NE '' then + Utility('CURSOR', 'H') + Set_Property(@Window : '.OLE_PIC_MESSAGE', 'OLE.Caption', 'Please wait while logs are archived.' : @TM : @TM : 'This might take several minutes.') + Set_Property(@Window : '.OLE_PIC_MESSAGE', 'VISIBLE', True$) + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'VISIBLE', False$) + LogCapturePath = Get_Property(@Window, '@LOG_CAPTURE_PATH') + ArchivePathExists = False$ ; // Assume false for now. + // If the log capture path has not been identified, allow the user to pick one. + If LogCapturePath EQ '' then + // Default to the configured log capture folder. + LogCapturePath = HTTP_Services('GetCapturePath') + LogCapturePath = RTI_OS_Directory('CHOOSE', LogCapturePath, 'Path to the HTTP log files.') + end + If LogCapturePath NE '' then + LogArchivePath = SRP_Path('Combine', LogCapturePath, 'archive') + If RTI_OS_Directory('EXISTS', LogArchivePath) EQ -1 then + ArchivePathExists = RTI_OS_Directory('CREATE', LogArchivePath) + end else + ArchivePathExists = True$ + end + end + If ArchivePathExists EQ True$ then + // Both the log path and the log archive path are confirmed. + ArchiveDate = Oconv(ArchiveDate, 'DJS-') + ArchiveScript = Database_Services('ReadDataRow', SetupTable$, ArchiveScriptKeyID$) + Swap @FM with CRLF$ in ArchiveScript + WindowsTempPath = RTI_OS_Directory('GetWindowsTempPath') + ScriptFilePath = SRP_Path('Combine', WindowsTempPath, 'psoi ' : GetTickCount() : '.ps1') + Swap '{{ArchiveOlderThanDate}}' with ArchiveDate in ArchiveScript + Swap '{{ArchiveStorageFolder}}' with LogArchivePath in ArchiveScript + Swap '{{ArchiveLogsFromFolder}}' with LogCapturePath in ArchiveScript + OSWrite ArchiveScript to ScriptFilePath + // Create a command line to run the script. + ArchiveCommand = 'PowerShell.exe -noprofile -ExecutionPolicy ByPass -File "' : ScriptFilePath : '"' + Results = 'VAR' + SRP_Run_Command(ArchiveCommand, Results, WindowsTempPath) + Convert \0D0A\ to '' in Results + OSDelete ScriptFilePath + If Results[1, 2] EQ 'OK' then + Message = 'Logs have been successfully archived.' + Icon = '*' + end else + Error = Results[6, Len(Results)] + Message = 'There was an error archiving the logs: ' : Error + Icon = '!' + end + MsgStruct = '' + MsgStruct = Message + MsgStruct = Icon + MsgStruct = 2 + MsgStruct = 'L' + MsgStruct = 'HTTP Logs' + MsgStruct = 'Segoe UI' : @SVM : -12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + Msg(@Window, MsgStruct) + end + + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'VISIBLE', True$) + Set_Property(@Window : '.OLE_PIC_MESSAGE', 'VISIBLE', False$) + Set_Property(@Window : '.OLE_PIC_MESSAGE', 'OLE.Caption', '') + Utility('CURSOR', 'A') + end + End Case + End Case + +end event + + +Event EDL_SEARCH_TEXT.LOSTFOCUS(Flag, FocusID) + + If Flag EQ 1 then + // Only trigger the search if moving to another control on the form. + Send_Event(@Window : '.OLE_PUB_FIND_NEXT', 'OLE', 'OnClick') + end + +end event + + +Event EDL_START_DATE.OPTIONS() + + CurrentDate = Get_Property(@Window : '.EDL_START_DATE', 'INVALUE') + NewDate = Dialog_Box('NDW_HTTP_DATEPICKER', @Window) + If CurrentDate NE NewDate then + Set_Property(CtrlEntId, 'INVALUE', NewDate) + GoSub RefreshLogTable + end + +end event + + +Event EDL_END_DATE.OPTIONS() + + CurrentDate = Get_Property(CtrlEntId, 'INVALUE') + NewDate = Dialog_Box('NDW_HTTP_DATEPICKER', @Window) + If CurrentDate NE NewDate then + Set_Property(CtrlEntId, 'INVALUE', NewDate) + GoSub RefreshLogTable + end + +end event + + +Event EDL_START_DATE.LOSTFOCUS(Flag, FocusID) + + GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + StartDate = Get_Property(CtrlEntId, 'TEXT') + If GotFocusID NE StartDate then + GoSub RefreshLogTable + end + +end event + + +Event EDL_END_DATE.LOSTFOCUS(Flag, FocusID) + + GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + EndDate = Get_Property(CtrlEntId, 'TEXT') + If GotFocusID NE EndDate then + GoSub RefreshLogTable + end + +end event + + +Event EDL_START_TIME.LOSTFOCUS(Flag, FocusID) + + GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + StartTime = Get_Property(CtrlEntId, 'TEXT') + If GotFocusID NE StartTime then + GoSub RefreshLogTable + end + +end event + + +Event EDL_END_TIME.LOSTFOCUS(Flag, FocusID) + + GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + EndTime = Get_Property(CtrlEntId, 'TEXT') + If GotFocusID NE EndTime then + GoSub RefreshLogTable + end + +end event + + +Event OLE_PUB_FIND_NEXT.OnClick(Point, Button, Shift, Ctrl) + + Direction = NEXT$ + GoSub FindMatch + +end event + + +Event OLE_PUB_FIND_PREVIOUS.OnClick(Point, Button, Shift, Ctrl) + + Direction = PREVIOUS$ + GoSub FindMatch + +end event + + +Event OLE_RPT_LOGTABLE.OnItemHyperlink(Row, Col, Text) + + // Get the path to the log file from the hidden column and display it in the default .log viewer. + Record = Send_Message(CtrlEntId, 'OLE.RowToRecord', Row) + LogFilePath = Get_Property(CtrlEntId, 'OLE.ItemText[11;' : Record : ']') + ShellExecute(0, 'open' : \00\, LogFilePath : \00\, '', '', 5) + +end event + + +Event OLE_SUBCLASS.OnOptionClick(CtrlId) + + Send_Event(CtrlId, 'OPTIONS') + +end event + + +Event MENU.FILTER_TEXT.MENU() + + Set_Property(@Window : '.EDL_SEARCH_TEXT', 'FOCUS', True$) + +end event + + +Event MENU.FIND_NEXT.MENU() + + Send_Event(@Window : '.OLE_PUB_FIND_NEXT', 'OLE', 'OnClick') + +end event + + +Event MENU.FIND_PREVIOUS.MENU() + + Send_Event(@Window : '.OLE_PUB_FIND_PREVIOUS', 'OLE', 'OnClick') + +end event + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SetupOLEControls: + + // All OLE controls can use this qualify configuration. + Qualify = '' + Qualify<1> = 1 + Qualify<3> = '' + Qualify<4> = 0 + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP Subclass Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_SUBCLASS' + EditCtrls = 'EDL_START_DATE,EDL_END_DATE' + NumCtrls = DCount(EditCtrls, ',') + For EditCnt = 1 to NumCtrls + EditCtrl = Field(EditCtrls, ',', EditCnt, 1) + Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE') + Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl) + Set_Property(Ctrl, 'OLE.OptionButton[' : @Window : ';' : EditCtrl : ']', True$) + Set_Property(Ctrl, 'OLE.OptionImage[' : @Window : ';' : EditCtrl : ']', 'BMPS\SRPHTTPDateField.png') + Set_Property(Ctrl, 'OLE.Prompt[' : @Window : ';' : EditCtrl : ']', 'YYYY-MM-DD' : @FM : @FM : 'Center' : @FM : 'Center' : @FM : 'Segoe UI' : @SVM : 9 : @SVM : 400 : @VM : 0) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnOptionClick', Qualify) + Next EditCnt + + EditCtrls = 'EDL_START_TIME,EDL_END_TIME' + NumCtrls = DCount(EditCtrls, ',') + For EditCnt = 1 to NumCtrls + EditCtrl = Field(EditCtrls, ',', EditCnt, 1) + Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE') + Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl) + Set_Property(Ctrl, 'OLE.Prompt[' : @Window : ';' : EditCtrl : ']', 'hh:mm:ss AM/PM' : @FM : @FM : 'Center' : @FM : 'Center' : @FM : 'Segoe UI' : @SVM : 9 : @SVM : 400 : @VM : 0) + Next EditCnt + + EditCtrls = 'EDL_SEARCH_TEXT' + NumCtrls = DCount(EditCtrls, ',') + For EditCnt = 1 to NumCtrls + EditCtrl = Field(EditCtrls, ',', EditCnt, 1) + Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE') + Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl) + Set_Property(Ctrl, 'OLE.Prompt[' : @Window : ';' : EditCtrl : ']', 'Search anything...(Ctrl+F)' : @FM : @FM : 'Center' : @FM : 'Center' : @FM : 'Segoe UI' : @SVM : 9 : @SVM : 400 : @VM : 0) + Next EditCnt + + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP Button Control + // + //------------------------------------------------------------------------------------------------------------------ + ButtonCtrls = 'OLE_PUB_FIND_NEXT,OLE_PUB_FIND_PREVIOUS' + NumCtrls = DCount(ButtonCtrls, ',') + For ButtonCnt = 1 to NumCtrls + Ctrl = @Window : '.' : Field(ButtonCtrls, ',', ButtonCnt, 1) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + Next ButtonCnt + + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP ReportTable Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_RPT_LOGTABLE' + ColumnList = '' + ColumnList := 'Date' : @VM : 'Date' : @VM : '100' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : 'YYYY-MM-DD' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Time' : @VM : 'Time' : @VM : '100' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : 'hh:mm:ss AA' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Process ID' : @VM : 'Number' : @VM : '80' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Right' : @VM : @VM : '0' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Sequence' : @VM : 'Number' : @VM : '80' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Center' : @VM : @VM : '000000' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Log Type' : @VM : 'Text' : @VM : '80' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Method' : @VM : 'Text' : @VM : '80' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Home URL / Status Code' : @VM : 'Text' : @VM : '150' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'API Endpoint / Status Phrase' : @VM : 'Text' : @VM : '150' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Left' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'Remote Address / Execute Time' : @VM : 'Text' : @VM : '150' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Right' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @FM + ColumnList := 'View' : @VM : 'Text' : @VM : '75' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : True$ : @VM : @VM : 'Center' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' : @VM : '' : @VM : '' : @VM : True$ : @FM + ColumnList := 'Log File' : @VM : 'Text' : @VM : '350' : @VM : True$ : @VM : True$ : @VM : @VM : True$ : @VM : False$ : @VM : @VM : 'Left' : @VM : @VM : '' : @VM : False$ : @VM : 'Segoe UI' : @SVM : '9' + Set_Property(Ctrl, 'OLE.ColumnList', ColumnList) + Set_Property(Ctrl, 'OLE.SortOrder', 1 : @VM : 'D' : @FM : 2 : @VM : 'D' : @FM : 3 : @VM : 'D' : @FM : 4 : @VM : 'D') + Set_Property(Ctrl, 'OLE.AlwaysShowSelection', True$) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnItemHyperlink', Qualify) + + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP Picture Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_PIC_MESSAGE' + Set_Property(Ctrl, 'OLE.Border', 'XP Flat') + Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : '24') + Set_Property(Ctrl, 'OLE.BackgroundColor', '3DFace') + Set_Property(Ctrl, 'OLE.CaptionAlignment', 'Center' : @FM : 'Center') + + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP ShortcutBar Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_ACTION_BAR' + Set_Property(Ctrl, 'OLE.Border', 'XP Flat') + Set_Property(Ctrl, 'OLE.Animation', 'Never') + Set_Property(Ctrl, 'OLE.Theme', 'Office2007Blue') + Set_Property(Ctrl, 'OLE.GroupFont', 'Segoe UI' : @SVM : 11 : @SVM : 400) + Set_Property(Ctrl, 'OLE.ItemFont', 'Segoe UI' : @SVM : 9 : @SVM : 400) + Set_Property(Ctrl, 'OLE.GroupCount', 2) + Set_Property(Ctrl, 'OLE.GroupCaption[1]', 'Form Actions') + Set_Property(Ctrl, 'OLE.GroupItemCount[1]', 2) + Set_Property(Ctrl, 'OLE.ItemCaption[1;1]', 'Clear Filters') + Set_Property(Ctrl, 'OLE.ItemCaption[1;2]', 'Close Form') + Set_Property(Ctrl, 'OLE.GroupCaption[2]', 'Log Actions') + Set_Property(Ctrl, 'OLE.GroupItemCount[2]', 3) + Set_Property(Ctrl, 'OLE.ItemCaption[2;1]', 'Refresh Logs') + Set_Property(Ctrl, 'OLE.ItemCaption[2;2]', 'Rebuild Log Index') + Set_Property(Ctrl, 'OLE.ItemCaption[2;3]', 'Archive Logs') + Margins = 0 : @FM : 0 : @FM : 0 : @FM : 0 : @FM : 0 + Set_Property(Ctrl, 'OLE.HotTrackStyle', 'Item') + Set_Property(Ctrl, 'OLE.ItemBold[All; All]', True$) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + +return + + +RefreshLogTable: + + OrigLogList = Get_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.List') + FullLogList = Get_Property(@Window, '@FULL_LOG_LIST') + RecordColors = Get_Property(@Window, '@FULL_RECORD_COLORS') + LogCount = Get_Property(@Window, '@FULL_LOG_COUNT') + 0 + If LogCount EQ 1 then + LogFoundText = LogCount : ' Log Found' + end else + LogFoundText = LogCount : ' Logs Found' + end + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', LogFoundText) + If FullLogList EQ '' then + // There is no full log list available so rebuild it. + GoSub GetLogList + end + // Apply any filters that have been set. This will remove log rows that do not match the filter criteria. + GoSub ApplyFilters + // Compare the original log list with the new one created by any filters. If they match then there is no needs to + // refresh the display. + If OrigLogList NE LogList then + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.List', LogList) + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.RecordColors', RecordColors) + If LogCount EQ 1 then + LogFoundText = LogCount : ' Log Found' + end else + LogFoundText = LogCount : ' Logs Found' + end + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', LogFoundText) + // If a search value is entered, find it in the new filtered list. + Direction = NEXT$ + GoSub FindMatch + end + +return + + +TransferParams: + + // ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to + // OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight + // event and ActiveX (OLE) events. + Transfer Param1 to Event + Transfer Param2 to Param1 + Transfer Param3 to Param2 + Transfer Param4 to Param3 + Transfer Param5 to Param4 + Transfer Param6 to Param5 + Transfer Param7 to Param6 + Transfer Param8 to Param7 + Transfer Param9 to Param8 + Transfer Param10 to Param9 + Transfer Param11 to Param10 + Transfer Param12 to Param11 + Transfer Param13 to Param12 + Transfer Param14 to Param13 + Transfer Param15 to Param14 + +return + + +RestoreParams: + + // Restore the event parameters so the rest of the event chain will see the parameter values as they were originally + // created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case + // there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*). + Transfer Param14 to Param15 + Transfer Param13 to Param14 + Transfer Param12 to Param13 + Transfer Param11 to Param12 + Transfer Param10 to Param11 + Transfer Param9 to Param10 + Transfer Param8 to Param9 + Transfer Param7 to Param8 + Transfer Param6 to Param7 + Transfer Param5 to Param6 + Transfer Param4 to Param5 + Transfer Param3 to Param4 + Transfer Param2 to Param3 + Transfer Param1 to Param2 + Transfer Event to Param1 + Event = 'OLE' + +return + + +GetLogList: + + Utility('CURSOR', 'H') + + // Try to build the log list using the log index files. This is much quicker than parsing each individual log file. + GoSub GetLogFileIndexes + + // If there are log index files, proceed to build the log list from them. + If LogFileIndexes NE '' then + // Save the current log capture path since it is valid. + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + FullLogList = '' + RecordColors = '' + LogCount = 0 + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', '0 Logs Found') + // Build the log list one log row at a time. This will also allow us to create a custom color scheme for each + // log row based on the log type and other relevant information. + For Each LogFileIndex in LogFileIndexes using @FM + IndexFilePath = SRP_Path('Combine', LogCapturePath, LogFileIndex) + OSRead LogFile from IndexFilePath then + FileRead = True$ + end else + FileRead = False$ + end + If FileRead EQ True$ then + // Initialize the variables that might not be used. + Convert CR$ to '' in LogFile + Convert TAB$ to @VM in LogFile + For Each LogRow in LogFile using \0A\ + LogType = LogRow<0, 5> + HomeURLStatus = LogRow<0, 7> + LogFilePath = LogRow<0, 11> + LogRow<0, 11> = SRP_Path('Combine', LogCapturePath, LogFilePath[-1, 'B\']) + Begin Case + Case LogType _EQC 'Response' + Begin Case + Case HomeURLStatus[1, 1] EQ 1 + RecordColor = 'None' : @VM : 'ForestGreen' + Case HomeURLStatus[1, 1] EQ 2 + RecordColor = 'None' : @VM : 'ForestGreen' + Case HomeURLStatus[1, 1] EQ 3 + RecordColor = 'None' : @VM : 'ForestGreen' + Case HomeURLStatus[1, 1] EQ 4 + RecordColor = 'None' : @VM : 'Crimson' + Case HomeURLStatus[1, 1] EQ 5 + RecordColor = 'None' : @VM : 'FireBrick' + Case Otherwise$ + RecordColor = 'None' : @VM : 'ForestGreen' + End Case + Case LogType _EQC 'Aborted' + RecordColor = 'None' : @VM : 'Red' + Case LogType _EQC 'Debugger' + RecordColor = 'None' : @VM : 'Red' + Case LogType _EQC 'GetStatus' + RecordColor = 'None' : @VM : 'Red' + Case Otherwise$ + // Default colors. + RecordColor = 'None' : @VM : 'None' + End Case + FullLogList := LogRow : @FM + RecordColors := RecordColor : @FM + LogCount += 1 + If Mod(LogCount, 100) EQ 0 then + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', LogCount : ' Logs Found') + Yield(); Yield(); Yield(); Yield() + Utility('CURSOR', 'H') + end + Next LogRow + end + Next LogFileName + FullLogList[-1, 1] = '' + RecordColors[-1, 1] = '' + Set_Property(@Window, '@FULL_LOG_LIST', FullLogList) + Set_Property(@Window, '@FULL_RECORD_COLORS', RecordColors) + Set_Property(@Window, '@FULL_LOG_COUNT', LogCount) + end + + Utility('CURSOR', 'A') + +return + + +GetLogFileIndexes: + + LogFileIndexes = '' + // Check first to see if a valid log capture path has already been identified. + LogCapturePath = Get_Property(@Window, '@LOG_CAPTURE_PATH') + // If the log capture path has not been identified, allow the user to pick one. + If LogCapturePath EQ '' then + // Default to the configured log capture folder. + LogCapturePath = HTTP_Services('GetCapturePath') + LogCapturePath = RTI_OS_Directory('CHOOSE', LogCapturePath, 'Path to the HTTP log files.') + end + If LogCapturePath NE '' then + InitPath = SRP_Path('Combine', LogCapturePath, '*_Index.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFileIndexes = DirList() + If LogFileIndexes EQ '' then + // No log index files can be found. Check to see if there are detailed log files. If so, then offer to + // rebuild the index files. If not, then offer to pick another location. + RebuildIndexes = False$ + InitPath = SRP_Path('Combine', LogCapturePath, '*.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFiles = DirList() + If LogFiles NE '' then + // Detailed log files were found. Offer to rebuild the index files. + MsgStruct = '' + MsgStruct = 'No log indexes could be found but there are detailed log files.' : @TM : @TM : 'Would you like to rebuild the log indexes?' + MsgStruct = 'BNY' + MsgStruct = '?' + MsgStruct = 2 + MsgStruct = 'L' + MsgStruct = 'HTTP Logs' + MsgStruct = 'Segoe UI' : @SVM : -12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + RebuildIndexes = Msg(@Window, MsgStruct) + end + If RebuildIndexes EQ True$ then + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + GoSub RebuildLogIndex + GoSub GetLogFileIndexes + end else + // The log files may have been relocated or this is running from a different machine than the OEngineServer + // is running from. Allow the user an opportunity to pick a different directory. + MsgStruct = '' + MsgStruct = 'No log indexes could be found at this location:' : @TM : @TM : LogCapturePath : @TM : @TM : 'Would you like to select another path?' + MsgStruct = 'BNY' + MsgStruct = '?' + MsgStruct = 2 + MsgStruct = 'L' + MsgStruct = 'HTTP Logs' + MsgStruct = 'Segoe UI' : @SVM : -12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + PickAnother = Msg(@Window, MsgStruct) + If PickAnother EQ True$ then + LogCapturePath = RTI_OS_Directory('CHOOSE', '', 'Path to the HTTP log files.') + InitPath = SRP_Path('Combine', LogCapturePath, '*_Index.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFileIndexes = DirList() + If LogFileIndexes NE '' then + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + end + end + end + end else + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + end + end + +return + + +RebuildLogIndex: + + // Remove all current indexes. + LogCapturePath = Get_Property(@Window, '@LOG_CAPTURE_PATH') + InitPath = SRP_Path('Combine', LogCapturePath, '*_Index.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFileIndexes = DirList() + If LogFileIndexes NE '' then + For Each LogFileIndex in LogFileIndexes using @FM + IndexFilePath = SRP_Path('Combine', LogCapturePath, LogFileIndex) + OSDelete IndexFilePath + Next LogFileIndex + end + + // Get all detail logs and create new indexes. + GoSub GetLogFiles + If LogFiles NE '' then + LogCount = 0 + For Each LogFileName in LogFiles using @FM + If IndexC(LogFileName, 'Index', 1) else + LogFilePath = SRP_Path('Combine', LogCapturePath, LogFileName) + OSRead LogFile from LogFilePath then + FileRead = True$ + end else + FileRead = False$ + end + If FileRead EQ True$ then + LogDate = Iconv(LogFileName[1, '_'], 'DJS') + LogTime = Iconv(LogFileName[Col2() + 1, '_'], 'MT') + ProcessID = LogFileName[Col2() + 1, '_'] + Sequence = LogFileName[Col2() + 1, '_'] + LogType = LogFileName[Col2() + 1, '_'][1, '.'] + IncludeLogFile = True$ ; // Assume True for now. + // Initialize the variables that might not be used. + Method = '' + HomeURLStatus = '' + APIEndpointError = '' + RemoteAddressTime = '' + Begin Case + Case LogType _EQC 'Request' + If LogFile[1, 7] _EQC 'Request' then + GoSub ParseRequestLog + end else + // If a request encounters a runtime error, it will still produce a request log with + // a description of the error. However, this will also be captured in the Aborted Log + // so just ignore this redundant log. + IncludeLogFile = False$ + end + Case LogType _EQC 'Response' + GoSub ParseResponseLog + Case LogType _EQC 'Aborted' + GoSub ParseAbortedLog + Case LogType _EQC 'Debugger' + GoSub ParseDebuggerLog + Case LogType _EQC 'GetStatus' + GoSub ParseGetStatusLog + End Case + end + // If the log row is flagged to be included, update the counter and use the AppendLog service to update + // the log index. + If IncludeLogFile EQ True$ then + LogCount += 1 + If Mod(LogCount, 100) EQ 0 then + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', LogCount : ' Logs Found') + Yield(); Yield(); Yield(); Yield() + Utility('CURSOR', 'H') + end + objLog = Logging_Services('NewLog', LogCapturePath, Oconv(LogDate, 'DJS-') : '_Index.log', CRLF$, TAB$, '', '', False$, False$) + LogRow = LogDate : @FM : LogTime : @FM : ProcessID : @FM : Sequence : @FM : LogType : @FM : Method : @FM : HomeURLStatus : @FM : APIEndpointError : @FM : RemoteAddressTime : @FM : 'View...' : @FM : LogFilePath + Logging_Services('AppendLog', objLog, LogRow, @RM, @FM, True$) + end + end + Next LogFileName + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', LogCount : ' Logs Found') + end else + Set_Property(@Window : '.EDL_LOG_COUNT', 'INVALUE', '0 Logs Found') + end + +return + + +GetLogFiles: + + LogFiles = '' + // Check first to see if a valid log capture path has already been identified. + LogCapturePath = Get_Property(@Window, '@LOG_CAPTURE_PATH') + // If the log capture path has not been identified, allow the user to pick one. + If LogCapturePath EQ '' then + // Default to the configured log capture folder. + LogCapturePath = HTTP_Services('GetCapturePath') + LogCapturePath = RTI_OS_Directory('CHOOSE', LogCapturePath, 'Path to the HTTP log files.') + end + If LogCapturePath NE '' then + InitPath = SRP_Path('Combine', LogCapturePath, '*.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFiles = DirList() + If LogFiles EQ '' then + // The log files may have been relocated or this is running from a different machine than the OEngineServer is + // running from. Allow the user an opportunity to pick a different directory. + MsgStruct = '' + MsgStruct = 'No logs could be found at this location:' : @TM : @TM : LogCapturePath : @TM : @TM : 'Would you like to select another path?' + MsgStruct = 'BNY' + MsgStruct = '?' + MsgStruct = 2 + MsgStruct = 'L' + MsgStruct = 'HTTP Logs' + MsgStruct = 'Segoe UI' : @SVM : -12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + PickAnother = Msg(@Window, MsgStruct) + If PickAnother EQ True$ then + LogCapturePath = RTI_OS_Directory('CHOOSE', '', 'Path to the HTTP log files.') + InitPath = SRP_Path('Combine', LogCapturePath, '*.log') + Utility('CURSOR', 'H') + InitDir InitPath + LogFiles = DirList() + If LogFiles NE '' then + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + end + end + end else + Set_Property(@Window, '@LOG_CAPTURE_PATH', LogCapturePath) + end + end + +return + + +ApplyFilters: + + FilterLogList = '' + FilterRecordColors = '' + FilterLogCount = 0 + FilterStartDate = Get_Property(@Window : '.EDL_START_DATE', 'INVALUE') + FilterEndDate = Get_Property(@Window : '.EDL_END_DATE', 'INVALUE') + FilterStartTime = Get_Property(@Window : '.EDL_START_TIME', 'INVALUE') + FilterEndTime = Get_Property(@Window : '.EDL_END_TIME', 'INVALUE') + + If FilterStartDate : FilterEndDate : FilterStartTime : FilterEndTime NE '' then + // At least one filter has been set. + For Each Log in FullLogList using @FM setting LogPos + LogDate = Log[1, @VM] + LogTime = Log[Col2() + 1, @VM] + SearchText = Log[Col2() + 1, @FM] + IncludeLogFile = True$ ; // Assume True for now. + If FilterStartDate NE '' then + If LogDate LT FilterStartDate then + // Date of the log is before the filter start date. + IncludeLogFile = False$ + end else + If (LogDate EQ FilterStartDate) AND (FilterStartTime NE '') then + // Date of the log is the same as the filter start date. Check to see if this date also has + // a filter start time. + If LogTime LT FilterStartTime then + // Time of the log is before the filter start time. + IncludeLogFile = False$ + end + end + end + end + If FilterEndDate NE '' then + If LogDate GT FilterEndDate then + // Date of the log is after the filter end date. + IncludeLogFile = False$ + end else + If (LogDate EQ FilterEndDate) AND (FilterEndTime NE '') then + // Date of the log is the same as the filter end date. Check to see if this date also has + // a filter end time. + If LogTime GT FilterEndTime then + // Time of the log is after the filter end time. + IncludeLogFile = False$ + end + end + end + end + If IncludeLogFile EQ True$ then + FilterLogList := Log : @FM + FilterRecordColors := RecordColors : @FM + FilterLogCount += 1 + end + Next Log + FilterLogList[-1, 1] = '' + FilterRecordColors[-1, 1] = '' + Transfer FilterLogList to LogList + Transfer FilterRecordColors to RecordColors + Transfer FilterLogCount to LogCount + end else + Transfer FullLogList to LogList + end + +return + + +FindMatch: + + MatchSearchText = Get_Property(@Window : '.EDL_SEARCH_TEXT', 'INVALUE') + MatchFound = False$ ; // Assume false for now. + + If MatchSearchText NE '' then + CurrentRow = Get_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.SelPos') + CurrentLogList = Get_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.List') + LogListCount = DCount(CurrentLogList, @FM) + If Direction EQ PREVIOUS$ then + // Search is going backwards. In order to use the same search logic as forward searching, the current + // log list will be sorted in reverse. This will place all new searches into the remaining list of logs. + LenLogList = Len(CurrentLogList) + TempLogList = Str(\00\, LenLogList) + NewPos = LenLogList + 1 + Pos = 1 + Loop + Curr = CurrentLogList[Pos, @FM] + LenCurr = Len(Curr) + NewPos -= LenCurr + TempLogList[NewPos, LenCurr] = Curr + Pos += LenCurr + 1 + While Pos LT LenLogList + NewPos -= 1 + TempLogList[NewPos, 1] = @FM + Repeat + Transfer TempLogList to CurrentLogList + CurrentRow = LogListCount - CurrentRow + 1 + end + PastList = Field(CurrentLogList, @FM, 1, CurrentRow) + NewList = CurrentLogList[Col2() + 1, @RM] + PastListRowCount = DCount(PastList, @FM) + If PastList : NewList NE '' then + // Search for the string in the new log list. + If NewList NE '' then + For Each Log in NewList using @FM setting LogPos + LogDate = Log[1, @VM] + LogTime = Log[Col2() + 1, @VM] + SearchText = Log[Col2() + 1, @FM] + SearchText = Delete(SearchText, 0, 8, 0) + If IndexC(SearchText, MatchSearchText, 1) then + MatchFound = True$ + end + Until MatchFound + Next Log + end + + If MatchFound EQ True$ then + // The true log position is the total logs in the new list and the position in the past list. + LogPos += PastListRowCount + end else + // No match found in the new log list. Search the past log list before giving up. This will + // allow a search result to circle back. + If PastList NE '' then + For Each Log in PastList using @FM setting LogPos + LogDate = Log[1, @VM] + LogTime = Log[Col2() + 1, @VM] + SearchText = Log[Col2() + 1, @FM] + SearchText = Delete(SearchText, 0, 8, 0) + If IndexC(SearchText, MatchSearchText, 1) then + MatchFound = True$ + end + Until MatchFound + Next Log + end + end + end + end + + If MatchFound EQ True$ then + If Direction EQ PREVIOUS$ then + // Since the match was found in a reverse sorted log list, the true log position will need to be + // calculated. + LogPos = LogListCount - LogPos + 1 + end + Set_Property(@Window : '.OLE_RPT_LOGTABLE', 'OLE.SelPos', LogPos) + end + +return + + +ParseRequestLog: + + StartChar = Index(LogFile, 'HTTPRequestMethod', 1) + Method = Trim(LogFile[StartChar, 'F' : CR$]) + Method = Trim(Method[-1, 'B:']) + StartChar = Index(LogFile, 'HTTPServerName', 1) + ServerName = Trim(LogFile[StartChar, 'F' : CR$]) + ServerName = Trim(ServerName[-1, 'B:']) + HomeURLStatus = ServerName + StartChar = Index(LogFile, 'HTTPPathInfo', 1) + PathInfo = Trim(LogFile[StartChar, 'F' : CR$]) + PathInfo = Trim(PathInfo[-1, 'B:']) + StartChar = Index(LogFile, 'HTTPRemoteAddr', 1) + RemoteAddressTime = Trim(LogFile[StartChar, 'F' : CR$]) + RemoteAddressTime = Trim(RemoteAddressTime[-1, 'B:']) + If PathInfo NE '' then + If PathInfo[1, 1] NE '/' then PathInfo = '/' : PathInfo + end + APIEndpointError = HTTP_Services('GetAPIRootURL', False$) : PathInfo + +return + + +ParseResponseLog: + + StartChar = Index(LogFile, 'Time to Execute :', 1) + RemoteAddressTime = Trim(LogFile[StartChar, 'F' : CR$]) + RemoteAddressTime = Trim(RemoteAddressTime[-1, 'B:']) + StartChar = Index(LogFile, 'OECGI21', 1) + If StartChar NE 0 then + // Response is binary. Decode the body first. + ResponseBody = Trim(LogFile[StartChar, 'F' : CR$]) + ResponseBody = SRP_Decode(ResponseBody, 'HEX') + Transfer ResponseBody to LogFile + end + StartChar = Index(LogFile, 'Status:', 1) + Status = Trim(LogFile[StartChar, 'F' : CR$]) + Status = Trim(Status[-1, 'B:']) + HomeURLStatus = Status[1, 'F '] + APIEndpointError = Status[Col2() + 1, 999] + +return + + +ParseAbortedLog: + + Status = LogFile[-1, 'B' : \0A\] + HomeURLStatus = Status[1, 'F:'] + APIEndpointError = Trim(Status[Col2() + 1, 999]) + +return + + +ParseDebuggerLog: + + If SRP_JSON(objLog, 'Parse', LogFile) EQ '' then + SPStatCode = SRP_JSON(objLog, 'GetValue', 'SPStatCode') + HomeURLStatus = SPStatCode[1, 'F:'] + APIEndpointError = Trim(SPStatCode[Col2() + 1, 'F:']) + SRP_JSON(objLog, 'Release') + end + +return + + +ParseGetStatusLog: + + Status = Trim(LogFile[1, 'F' : CR$]) + Status = Trim(Status[-1, 'B:']) + HomeURLStatus = Trim(Status[1, 'F-']) + APIEndpointError = Trim(Status[Col2() + 1, 999]) + +return diff --git a/FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt b/FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt new file mode 100644 index 0000000..8a086a1 --- /dev/null +++ b/FRAMEWORKS/STPROC/NDW_WEB_ACCOUNTS_EVENTS.txt @@ -0,0 +1,403 @@ +Function NDW_Web_Accounts_Events(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : NDW_Web_Accounts_Events + + Description : This function acts as a commuter module for all events related to this window. + + Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the + application-specific promoted event handler. This makes it possible to add QuickEvents that need to + execute Basic+ logic without having use the Form Designer to make the association, although this is + limited to the events which are currently promoted. + + If the form needs to call the commuter module directly then the QuickEvent parameters should be + formatted like this: + + '@SELF','@EVENT',['@PARAM1','@PARAMx'] + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control calling the promoted event + Event [in] -- The event being executed. See the Notes section regarding "PRE" events + Param1-15 [in] -- Additional event parameter holders + EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in + EVENT_SETUP insert + + History (Date, Initials, Notes) + 10/24/18 dmb Initial development. + 11/21/18 dmb [SRPFW-257] Finish core functionality. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler +#window NDW_WEB_ACCOUNTS + +$insert LOGICAL +$insert MSG_EQUATES +$insert WEB_ACCOUNTS_EQUATES + +Equ EVENT_CONTINUE$ to 1 +Equ EVENT_STOP$ to 0 +Equ SetupTable$ to 'SYSENV' + +Declare subroutine WebAccounts_Services, Set_Property, PlaceDialog, End_Dialog, Msg, Send_Event, Send_Message +Declare subroutine Error_Services, HTTP_Authentication_Services +Declare function WebAccounts_Services, Get_Property, Memory_Services, HTTP_Authentication_Services, Error_Services +Declare function RTI_CreateGUID, Popup + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Debug +* Control = Field(CtrlEntId, '.', 2, 2) + Control = Field(CtrlEntId, '.', 2, 1) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +If Event EQ 'OLE' then GoSub TransferParams +GoToEvent Event for CtrlEntID +If Event EQ 'OLE' then GoSub RestoreParams + +Return EventFlow OR EVENT_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Event WINDOW.CREATE(CreateParam) + + GoSub SetupOLEControls + + PlaceDialog(-2, -2) + +end event + + +Event EDL_ID.LOSTFOCUS(Flag, FocusID) + + GotFocusID = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE') + ID = Get_Property(CtrlEntId, 'TEXT') + If GotFocusID NE ID then + WebAccountRow = WebAccounts_Services('GetWebAccounts', ID) + If Error_Services('NoError') then + GoSub UpdateForm + end + end + +end event + + +Event EDL_ID.OPTIONS() + + ID = Popup(@Window, '', 'WEB_ACCOUNTS') + If ID NE '' AND ID NE Char(27) then + Set_Property(CtrlEntId, 'GOTFOCUS_VALUE', '') + Set_Property(CtrlEntId, 'TEXT', ID) + Send_Event(CtrlEntId, 'LOSTFOCUS') + end + +end event + + +Event OLE_ACTION_BAR.OnClick(Group, Item, Point, Button, Shift, Ctrl) + + ResetAttempts = False$ + + Begin Case + Case Group EQ 1 + Begin Case + Case Item EQ 1 + // Clear Form + ID = '' + WebAccountRow = '' + GoSub UpdateForm + Set_Property('SYSTEM', 'FOCUS', @Window : '.EDL_ID') + Set_Property(@Window : '.EDL_ID', 'GOTFOCUS_VALUE', '') + + Case Item EQ 2 + // Close Form + Set_Property(@Window, 'TIMER', 1 : @FM : 1) + End Case + Case Group EQ 2 + Begin Case + Case Item EQ 1 + // New Account + GoSub CreateNewWebAccount + Case Item EQ 2 + // Save Account + GoSub UpdateWebAccount + End Case + Case Group EQ 3 + Begin Case + Case Item EQ 1 + // Reset Password + ID = Get_Property(@Window : '.EDL_ID', 'TEXT') + If ID NE '' then + CurrentPassword = HTTP_Authentication_Services('GetWebAccountPassword', ID, False$) + Password = HTTP_Authentication_Services('ResetWebAccountPassword', ID, CurrentPassword) + If Error_Services('NoError') then + WebAccountRow = WebAccounts_Services('GetWebAccounts', ID) + If Error_Services('NoError') then + GoSub UpdateForm + end + end else + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + end + Case Item EQ 2 + // Reset Attempts + ResetAttempts = True$ + GoSub UpdateWebAccount + If Error_Services('NoError') then + Set_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', 0) + end + Case Item EQ 3 + // Copy to Clipboard + AccountID = Get_Property(@Window : '.EDL_ID', 'INVALUE') + Name = Get_Property(@Window : '.EDL_NAME', 'INVALUE') + Password = Get_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE') + Clipboard = 'Account ID: ' : AccountID : \0D0A\ : 'Name: ' : Name : \0D0A\ : 'Password: ' : Password + Set_Property('CLIPBOARD', 'TEXT', Clipboard) + End Case + End Case + +end event + + +Event OLE_SUBCLASS.OnOptionClick(CtrlId) + + Send_Event(CtrlId, 'OPTIONS') + +end event + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal Gosubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +SetupOLEControls: + + // All OLE controls can use this qualify configuration. + Qualify = '' + Qualify<1> = 1 + Qualify<3> = '' + Qualify<4> = 0 + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP ShortcutBar Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_ACTION_BAR' + Set_Property(Ctrl, 'OLE.Border', 'XP Flat') + Set_Property(Ctrl, 'OLE.Animation', 'Never') + Set_Property(Ctrl, 'OLE.Theme', 'Office2007Blue') + Set_Property(Ctrl, 'OLE.GroupFont', 'Segoe UI' : @SVM : 11 : @SVM : 400) + Set_Property(Ctrl, 'OLE.ItemFont', 'Segoe UI' : @SVM : 9 : @SVM : 400) + Set_Property(Ctrl, 'OLE.GroupCount', 3) + Set_Property(Ctrl, 'OLE.GroupCaption[1]', 'Form Actions') + Set_Property(Ctrl, 'OLE.GroupCaption[2]', 'Account Actions') + Set_Property(Ctrl, 'OLE.GroupCaption[3]', 'Password Actions') + Set_Property(Ctrl, 'OLE.GroupExpandable[All]', False$) + Set_Property(Ctrl, 'OLE.GroupSpecial[All]', True$) + Set_Property(Ctrl, 'OLE.GroupItemCount[1]', 2) + Set_Property(Ctrl, 'OLE.ItemCaption[1;1]', 'Clear Form') + Set_Property(Ctrl, 'OLE.ItemCaption[1;2]', 'Close Form') + Set_Property(Ctrl, 'OLE.GroupItemCount[2]', 2) + Set_Property(Ctrl, 'OLE.ItemCaption[2;1]', 'New Account') + Set_Property(Ctrl, 'OLE.ItemCaption[2;2]', 'Save Account') + Set_Property(Ctrl, 'OLE.GroupItemCount[3]', 3) + Set_Property(Ctrl, 'OLE.ItemCaption[3;1]', 'Reset Password') + Set_Property(Ctrl, 'OLE.ItemCaption[3;2]', 'Reset Attempts') + Set_Property(Ctrl, 'OLE.ItemCaption[3;3]', 'Copy to Clipboard') + Margins = 0 : @FM : 0 : @FM : 0 : @FM : 0 : @FM : 0 + Set_Property(Ctrl, 'OLE.HotTrackStyle', 'Item') + Set_Property(Ctrl, 'OLE.ItemBold[All; All]', True$) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualify) + + //------------------------------------------------------------------------------------------------------------------ + // + // SRP Subclass Control + // + //------------------------------------------------------------------------------------------------------------------ + Ctrl = @Window : '.OLE_SUBCLASS' + EditCtrls = 'EDL_ID' + NumCtrls = DCount(EditCtrls, ',') + For EditCnt = 1 to NumCtrls + EditCtrl = Field(EditCtrls, ',', EditCnt, 1) + Handle = Get_Property(@Window : '.' : EditCtrl, 'HANDLE') + Send_Message(Ctrl, 'OLE.Subclass', Handle, @Window : '.' : EditCtrl) + Set_Property(Ctrl, 'OLE.OptionButton[' : @Window : ';' : EditCtrl : ']', True$) + Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnOptionClick', Qualify) + Next EditCnt + +return + + +TransferParams: + + // ActiveX controls pass their own event names through Param1. Modify the parameter values so they conform to + // OpenInsight event parameter values. This will allow commuter modules to be structured the same for OpenInsight + // event and ActiveX (OLE) events. + Transfer Param1 to Event + Transfer Param2 to Param1 + Transfer Param3 to Param2 + Transfer Param4 to Param3 + Transfer Param5 to Param4 + Transfer Param6 to Param5 + Transfer Param7 to Param6 + Transfer Param8 to Param7 + Transfer Param9 to Param8 + Transfer Param10 to Param9 + Transfer Param11 to Param10 + Transfer Param12 to Param11 + Transfer Param13 to Param12 + Transfer Param14 to Param13 + Transfer Param15 to Param14 + +return + + +RestoreParams: + + // Restore the event parameters so the rest of the event chain will see the parameter values as they were originally + // created by OpenInsight. This will also prevent the parameter values from being transferred multiple times in case + // there are multiple OLE promoted event handlers (e.g. APPNAME*..OIWIN* and APPNAME*OLE..OIWIN*). + Transfer Param14 to Param15 + Transfer Param13 to Param14 + Transfer Param12 to Param13 + Transfer Param11 to Param12 + Transfer Param10 to Param11 + Transfer Param9 to Param10 + Transfer Param8 to Param9 + Transfer Param7 to Param8 + Transfer Param6 to Param7 + Transfer Param5 to Param6 + Transfer Param4 to Param5 + Transfer Param3 to Param4 + Transfer Param2 to Param3 + Transfer Param1 to Param2 + Transfer Event to Param1 + Event = 'OLE' + +return + + +UpdateForm: + + Set_Property(@Window : '.EDL_ID', 'INVALUE', ID) + Set_Property(@Window : '.EDL_NAME', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.COB_ACCOUNT_ENABLED', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_DATE', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_TIME', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_DATE', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_TIME', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_OLD_PASSWORD', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_DATE', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_TIME', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_DATE', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_TIME', 'INVALUE', WebAccountRow) + Set_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE', WebAccountRow) + +return + + +CreateNewWebAccount: + + Send_Event(@Window : '.OLE_ACTION_BAR', 'OLE', 'OnClick', 1, 1) + ID = RTI_CreateGUID('B') + Convert '.,' to '' in ID + ID = ID[1, 6] + WebAccountRow = '' + WebAccountRow = True$ + WebAccountRow = 0 + WebAccounts_Services('SetWebAccounts', ID, WebAccountRow) + If Error_Services('NoError') then + HTTP_Authentication_Services('ResetWebAccountPassword', ID) + If Error_Services('NoError') then + Set_Property(@Window : '.EDL_ID', 'INVALUE', ID) + WebAccountRow = WebAccounts_Services('GetWebAccounts', ID) + If Error_Services('NoError') then + GoSub UpdateForm + Set_Property(@Window : '.EDL_NAME', 'FOCUS', True$) + end else + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + end else + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + end else + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + +return + + +UpdateWebAccount: + + ID = Get_Property(@Window : '.EDL_ID', 'INVALUE') + WebAccountRow = '' + WebAccountRow = Get_Property(@Window : '.EDL_NAME', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.COB_ACCOUNT_ENABLED', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_CURRENT_PASSWORD', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_DATE', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_CREATE_TIME', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_DATE', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_CURRENT_PASSWORD_EXPIRE_TIME', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_OLD_PASSWORD', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_DATE', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_OLD_PASSWORD_CREATE_TIME', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_DATE', 'INVALUE') + WebAccountRow = Get_Property(@Window : '.EDL_OLD_PASSWORD_EXPIRE_TIME', 'INVALUE') + If ResetAttempts EQ True$ then + Attempts = 0 + end else + Attempts = Get_Property(@Window : '.EDL_INVALID_PASSWORD_ATTEMPTS', 'INVALUE') + end + WebAccountRow = Attempts + WebAccounts_Services('SetWebAccounts', ID, WebAccountRow) + If Error_Services('HasError') then + MsgStruct = '' + MsgStruct = Error_Services('GetMessage') + MsgStruct = 'BO' + MsgStruct = 'H' + MsgStruct = 'SRP HTTP Framework' + Msg(@Window, MsgStruct) + end + +return diff --git a/FRAMEWORKS/STPROC/OATH_API.txt b/FRAMEWORKS/STPROC/OATH_API.txt new file mode 100644 index 0000000..546ea0d --- /dev/null +++ b/FRAMEWORKS/STPROC/OATH_API.txt @@ -0,0 +1,56 @@ +Function Oath_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Oath_API + + Description : API logic for the Oath resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [Resource].[HTTPMethod]. For example: + - Oath.POST + - Oath.ID.PUT + - Oath.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/22/18 dmb Original programmer. - [SRPFW-256] + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Web APIs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +API oath.GET + +end api diff --git a/FRAMEWORKS/STPROC/OAUTH_API.txt b/FRAMEWORKS/STPROC/OAUTH_API.txt new file mode 100644 index 0000000..2019d77 --- /dev/null +++ b/FRAMEWORKS/STPROC/OAUTH_API.txt @@ -0,0 +1,61 @@ +Function Oauth_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Oauth_API + + Description : API logic for the Oauth resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + EndpointSegment - The URL endpoint segment. + ParentURL - The URL path preceeding the current endpoint. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure Oauth[.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Oauth.POST + - Oauth.ID.PUT + - Oauth.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 07/12/19 dmb Original programmer. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API oauth.HEAD +API oauth.GET + +end api diff --git a/FRAMEWORKS/STPROC/PICTURE_API.txt b/FRAMEWORKS/STPROC/PICTURE_API.txt new file mode 100644 index 0000000..ad15a9e --- /dev/null +++ b/FRAMEWORKS/STPROC/PICTURE_API.txt @@ -0,0 +1,167 @@ +Function Picture_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Picture_API + + Description : API logic for the Picture resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure [.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Picture.POST + - Picture.ID.PUT + - Picture.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/19/18 dmb Original programmer. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS +$insert CONTACTS_EQUATES + +PictureFolder = '\WebAppData\ContactPictures\' + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API picture.GET +API picture.HEAD + + // Get the picture's physical file path from the CONTACT database row. + KeyID = ParentSegment + PicturePath = Drive() : HTTP_Resource_Services('GetColumnValues', 'CONTACTS', 'picture', KeyID) + + If PicturePath NE '' then + // Verify the picture actually exists. + If Dir(PicturePath) NE '' then + // Get the image extension. + ImageExt = PicturePath[-1, 'B.'] + If ImageExt _EQC 'jpg' then ImageExt = 'jpeg' + // Get the best content type that matches the client's and server's ability. + ContentType = HTTP_Services('GetBestContentNegotiation', 'Accept', 'text/plain' : @FM : 'image/' : ImageExt) + If ContentType NE '' then + OSRead PictureBinary from PicturePath then + Begin Case + Case ContentType _EQC 'text/plain' + PictureBody = SRP_Encode(PictureBinary, 'BASE64') + PictureBody = 'data:' : 'image/' : ImageExt : ';base64,' : PictureBody + HTTP_Services('SetResponseHeaderField', 'Content-Encoding', 'base64') + HTTP_Services('SetResponseBody', PictureBody, False$, 'text/plain') + + Case ContentType[1, 6] _EQC 'image/' + HTTP_Services('SetResponseBody', PictureBinary, True$, ContentType) + + End Case + end else + HTTP_Services('SetResponseError', '', '', 404, 'Picture for contact ' : KeyID : ' does not exist.', FullEndpointURL) + end + end + end else + HTTP_Services('SetResponseError', '', '', 404, 'Picture for contact ' : KeyID : ' does not exist.', FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 404, 'Picture for contact ' : KeyID : ' does not exist.', FullEndpointURL) + end + +end api + + +API picture.PUT + + KeyID = ParentSegment + TableName = 'CONTACTS' + + ContentType = HTTP_Services('GetHTTPContentType') + + If ContentType EQ '' OR ContentType _EQC 'text/plain' then + Open TableName to hTable then + Lock hTable, KeyID then + ResponseStatus = 200 ; // Updating an existing resource. + Read DataRow from hTable, KeyID else + DataRow = '' + ResponseStatus = 201 ; // Creating a new resource. + end + + // A URI scheme of the Base64 encoded image will be in the Data variable. + HTTPPostString = HTTP_Services('GetHTTPPostString') + HTTPPostString = HTTP_Services('DecodePercentString', HTTPPostString) + Scheme = HTTPPostString[1, 'F:'] + If Scheme _EQC 'data' then + MediaType = HTTPPostString[Col2() + 1, 'F;'] ; // Should be "image/png" or "image/jpg" + Encoding = HTTPPostString[Col2() + 1, 'F,'] ; // Should be "base64" + EncodedData = HTTPPostString[Col2() + 1, Len(HTTPPostString)] ; // Should be the actual Base64 encoded content. + DecodedData = SRP_Decode(EncodedData, 'BASE64') + FileType = MediaType[-1, 'B/'] + FileName = KeyID : '.' : FileType + FilePath = Drive() : PictureFolder : FileName + Status() = 0 + OSWrite DecodedData to FilePath + StatusCode = Status() + If StatusCode then + Begin Case + Case StatusCode EQ 1 ; Error = 'Bad OS filename. Code: ' : StatusCode + Case StatusCode EQ 2 ; Error = 'Access denied by operating system. Code: ' : StatusCode + Case StatusCode EQ 3 ; Error = 'Disk or directory full. Code: ' : StatusCode + Case StatusCode EQ 4 ; Error = 'File does not exist. Code: ' : StatusCode + Case StatusCode EQ 5 ; Error = 'Unknown error. Code: ' : StatusCode + Case StatusCode EQ 6 ; Error = 'Attempt to write to read-only file. Code: ' : StatusCode + Case Otherwise$ ; Error = 'Unknown error. Code: ' : StatusCode + End Case + HTTP_Services('SetResponseError', '', '', 501, Error, FullEndpointURL) + end else + DataRow = PictureFolder : FileName + Write DataRow to hTable, KeyID then + HTTP_Services('SetResponseStatus', ResponseStatus) + HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL) + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error writing ' : KeyID : ' to the ' : TableName : ' table.', FullEndpointURL) + end + end + end else + HTTP_Services('SetResponseError', '', '', 415, '', FullEndpointURL) + end + Unlock hTable, KeyID else Null + end else + HTTP_Services('SetResponseError', '', '', 423, KeyID : ' is currently locked.', FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, 'Error opening the ' : TableName : ' table.', FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 415, 'Content-Type ' : ContentType : ' is not supported. Must specify "text/plain" or nothing.', FullEndpointURL) + end + +end api diff --git a/FRAMEWORKS/STPROC/PING_API.txt b/FRAMEWORKS/STPROC/PING_API.txt new file mode 100644 index 0000000..9742ec3 --- /dev/null +++ b/FRAMEWORKS/STPROC/PING_API.txt @@ -0,0 +1,82 @@ +Function Ping_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Ping_API + + Description : API logic for the Ping resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure Ping[.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Ping.POST + - Ping.ID.PUT + - Ping.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 06/24/19 dmb [SRPFW-276] Original programmer. + 01/18/20 dmb [SRPFW-296] Update the ping.GET API by replacing Utility_DotNet('TIMEZONE') with + the SRP_DateTime service (SRP Utilities 2.1) to avoid localization problems and potential + 502 Bad Gateway errors. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS + +Declare function SRP_DateTime + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +API ping.HEAD +API ping.GET + + Properties = 'currentDateTime' + Values = SRP_DateTime('Format', SRP_DateTime('Now', True$), "DDD, DD MMM YYYY hh:mm:ss 'GMT'") + objResource = HTTP_Resource_Services('AddProperties', '', Properties, Values) + Rels = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : APIURL + HTTP_Resource_Services('AddLinkRelations', objResource, Rels, URLs) + + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api diff --git a/FRAMEWORKS/STPROC/SRP_BREADCRUMBBAR.txt b/FRAMEWORKS/STPROC/SRP_BREADCRUMBBAR.txt new file mode 100644 index 0000000..708e66c --- /dev/null +++ b/FRAMEWORKS/STPROC/SRP_BREADCRUMBBAR.txt @@ -0,0 +1,1033 @@ +Function SRP_BreadcrumbBar(CtrlEntId, @Service, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : SRP_BreadcrumbBar + + Description : Object commuter for the SRP BreadcrumbBar utility. + + Notes : The SRP BreadcrumbBar is a utility using the SRP EditTable ActiveX control. It is an emulation + of the Breadcrumb control used in Windows Vista and emulated in XP through third-party components + (e.g. http://qttabbar.wikidot.com/qtaddressbar) + + This commuter allows the developer to get and set "properties" of the BreadcrumbBar as well as + execute internal "methods" using the Message parameter. Generic parameters have been provided that + will be unique to each Message. + + There are a few setup conditions for the SRP BreadcrumbBar to work as a complete utility: + + - The SYSPROG*SRP_UTILITY..OIWIN* custom event handler must exist in SYSREPOSEVENTEXES. The + source for this is in SYSPROG_SRP_UTILITY_OIWIN and it contains commands for copying the + appropriate items into SYSREPOSEVENTEXES for convenience, although a restart of OpenInsight + will be required. + - The Init method must be called after any other QUALIFY_EVENT messages for the SRP EditTable + have been submitted. Otherwise, the redirect to the custom event handler will be undone. + - The RightArrow.png and DownArrow.png image files should be located in an accessible folder + (e.g., .\BMPS) and then the RightArrow$ and DownArrow$ equates in this routine need to be + updated as needed. + + Parameters : + CtrlEntId [in] -- The fully qualified name of the control (SRP EditTable) being used as a BreadcrumbBar + Message [in] -- The message to be execute (e.g. Property, Method) + Param1-15 [in] -- Additional event parameter holders + Response [out] -- Either a Boolean flag indicating success of the Message or the information the Message + is supposed to return + + History : (Date, Initials, Notes) + 12/11/08 dmb v1.0.0 - Original programmer + 01/18/09 dmb v1.0.0 - Add RemoveAllSegments method + 02/03/09 dmb v1.0.0 - Add GetSegmentTree property + 07/31/15 dmb v1.0.0 - Begin adding meta data to the code so the SRP Editor can tooltip the methods. + 07/31/15 dmb v1.0.0 - Replace the OI-based context menu logic with the new SRP EditTable ShowContextMenu + method. Add OnContextMenuClick as an event hook in the Control_Events gosub. + 07/31/15 dmb v1.0.0 - Change the Send_Event calls to the parent form to just send the SRP BreadcrumbBar + event rather than the word SRP_UTILITY since this is getting intercepted by the + promoted SRP_UTILITY event handler. This allows the parent form to manage the event + handler as a form event. + 07/31/15 dmb v1.0.0 - Add equates for the right arrow and down arrow images. These values can change + depending on where the images are stored. The default is in the BMPS\FW_Current + folder (which is where SRP FrameWorks keeps all images.) + 07/31/15 dmb v1.0.0 - Refactor the GetSegmentChildren message so the Root item can now have children and + a drop-down to change the root child entry. + 07/31/15 dmb v1.0.0 - Change the Send_Event calls from the Parent (i.e., form) to the SRP EditTable + control. This allows the control to behave like a custom ActiveX control with its + own custom events. + 07/31/15 dmb v1.0.0 - Fix a minor bug in the AddSegment message that would not allow child segments to be + added in a non-linear order. + 08/04/15 dmb v1.0.0 - Modify the SetRootImage method so that arguments which are empty will default to + the current settings. + 08/04/15 dmb v1.0.0 - Add support to store miscellaneous (non-visible to the end user) data with each + segment. + 08/04/15 dmb v1.0.0 - Use the SRP_Sort_Array function to alway sort the context menu in the + Create_Child_Dropdown gosub. + 08/05/15 dmb v1.0.0 - Widen the width of the dropdown segments to conform more to Windows 8/10 styles. + 08/05/15 dmb v1.0.0 - Change the default colors and styles to conform to Windows 8/10 theme. + 08/18/15 dmb v1.0.0 - Major refactor of code. Replace most global common variables with SRP HashTable in + order to allow for Key ID identification of segments. + 08/18/15 dmb v1.0.0 - Remove GetSegmentTree property. No longer needed. + 08/18/15 dmb v1.0.0 - Remove GetSegmentLevel property. No longer needed. + 08/18/15 dmb v1.0.0 - Add SegmentExists property. + 05/15/16 dmb v1.0.0 - Add Enabled property. + 08/04/16 dmb v1.0.0 - Fix GetSegmentChildren property when SegmentKey is passed in as 'Root'. + 04/13/17 dmb v1.0.0 - Add GetPrevActiveSegment property. + 05/07/20 dmb v2.0.0 - Updated with current formatting standards and Enhanced BASIC+. + 05/08/20 dmb v2.0.0 - Update the GetSegmentPath property to support ExcludeRootSegment and + ExcludeArrowSegments flags so these segments can be excluded from the path. + 05/08/20 dmb v2.0.1 - Fix bug in GetSegmentPath property that wasn't honoring the ExcludeArrowSegments + flag if the arrow was on the end of the segment. + 06/19/20 dmb v2.1.0 - Add RemoveSegment method. + 06/19/20 dmb v2.1.0 - Add RemoveAllChildrenSegments method + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert MENU_EQUATES +$insert PS_EQUATES + +SRPBreadcrumbBarCommon = 'SBBC_' : CtrlEntId +Common //SRPBreadcrumbBarCommon// SBBC_Errors@, SBBC_PreviousCell@, SBBC_Colors@(6), SBBC_RootVisible@, SBBC_RootInfo@, SBBC_ActiveSegment@, SBBC_CellFont@, SBBC_Debug@, SBBC_HashTable@, SBBC_PrevActiveSegment@ + +// BreadcrumbBar UI equates +Equ ColdGridLineBaseColor$ to SBBC_Colors@(1) +Equ WarmGridLineBaseColor$ to SBBC_Colors@(2) +Equ HotGridLineBaseColor$ to SBBC_Colors@(3) +Equ ColdHighlightBaseColor$ to SBBC_Colors@(4) +Equ WarmHighlightBaseColor$ to SBBC_Colors@(5) +Equ HotHighlightBaseColor$ to SBBC_Colors@(6) + +Equ RootSegment$ to SRPBreadcrumbBarCommon : '*Root' +Equ ChildMarker$ to SRPBreadcrumbBarCommon : '*C' + +// Adding these to allow for dynamic variables in menu items +Equ MENUPOS_MSGTYPE$ to 12 +Equ MENUPOS_RECEIPIENT$ to 13 +Equ MENUPOS_MESSAGE$ to 14 +Equ MENUPOS_MSGPARMS$ to 15 + +// Right-button Down Windows Message +Equ WM_RBUTTONDOWN to 516 ; // 0x0204 + +Equ SRP_Utility$ to 'SRP_BREADCRUMBBAR' +Equ RightArrow$ to 'BMPS\RightArrow.png' +Equ DownArrow$ to 'BMPS\DownArrow.png' + +Declare subroutine SRP_BreadcrumbBar, Set_Property, Send_Message, Utility, Send_Event, PostMessage, GetCursorPos, ScreenToClient, GetWindowRect +Declare function SRP_BreadcrumbBar, Get_Property, Send_Message, Utility, Struct_To_Var, Blank_Struct, RetStack, SRP_Rotate_Array, SRP_Sort_Array + +// SRP HashTable declarations. +Declare function SRP_HashTable_Create, SRP_HashTable_Contains, SRP_HashTable_Count, SRP_HashTable_Get, SRP_HashTable_GetKeys, SRP_HashTable_GetValues, SRP_HashTable_GetKeyValuePairs +Declare subroutine SRP_HashTable_Set, SRP_HashTable_Release, SRP_HashTable_Remove + +GoToService else + // If none of the above, it should be an OpenInsight event to the underlying control. + GoSub ControlEvents +end + +Return Response OR True$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Methods, Properties, and Events +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// Init - Method +//---------------------------------------------------------------------------------------------------------------------- +Service Init(TypeFace, StyleOverride) + + If TypeFace NE '' then + SBBC_CellFont@ = TypeFace + end else + SBBC_CellFont@ = 'Segoe UI' : @SVM : '-11' : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 5 : @SVM : 0 : @SVM : 39 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 12 : @SVM : 2 : @SVM : 0 : @SVM : 23 + end + + // Establish the colors for the BreadcrumbBar. If the user didn't pass in any colors then a default color will + // be used. "Cold" means the segment isn't highlighted, "Warm" means the segment is connected to a "Hot" segment + // but should be offset by a different color, and "Hot" means the segment is highlighted. + ColdGridLineBaseColor$ = 'None' + WarmGridLineBaseColor$ = 'RGB(222,222,222)' + HotGridLineBaseColor$ = 'RGB(112,192,231)' + ColdHighlightBaseColor$ = 'None' + WarmHighlightBaseColor$ = 'RGB(245,245,245)' + HotHighlightBaseColor$ = 'RGB(229,243,251)' + + // Set up general properties that affect the entire EditTable. + Set_Property(CtrlEntId, 'OLE.BorderType', 'XP Flat') ; // XP border when possible. + Set_Property(CtrlEntId, 'OLE.WorkspaceBkColor', 'Window') ; // Fill in the space with no cells with the current theme's Window color. + Set_Property(CtrlEntId, 'OLE.Dimension', 1 : @FM : 1) ; // Create a 1 column by 1 row EditTable. + Set_Property(CtrlEntId, 'OLE.SuppressMouseMoveEvent', False$) ; // Make the mouse move event is triggered. + Set_Property(CtrlEntId, 'OLE.AllowInserts', False$) ; // Prevent the user from inserting rows using the Insert key. + Set_Property(CtrlEntId, 'OLE.AllowDeletions', False$) ; // Prevent the user from deleting rows using the Delete key. + Set_Property(CtrlEntId, 'OLE.NewRowCount', 0) ; // Prevent the user from adding rows using the Enter key + // Set up properties that affect navigation functional and visual behavior. + Set_Property(CtrlEntId, 'OLE.QuickTabOut', True$) ; // Force the focus to move to the next control if the user tries to navigate on an empty row (i.e. just like AREV). "Yes" is the default, but it is added here anyway to help explain what the EditTable can do. + Set_Property(CtrlEntId, 'OLE.CellProtection[All; All]', 'Selectable') ; // All cells should be selectable. + Set_Property(CtrlEntId, 'OLE.SelectionStyle', @FM : @FM : @FM : @FM : 0) ; // Do not show any border if a cell is selected. + Set_Property(CtrlEntId, 'OLE.ScrollBarsVisible', 'N' : @FM : 'N') ; // Do not show any scrollbar. + // Set up the Column and Row headers. + Set_Property(CtrlEntId, 'OLE.HeaderRow[1]', @FM: False$) ; // Hide the header row. + Set_Property(CtrlEntId, 'OLE.DataRow[All]', @FM :@FM : @FM : True$) ; // Height of the cell should be autosized to fit the height of the SRP EditTable control. + Set_Property(CtrlEntId, 'OLE.HeaderColumn[1]', @FM: False$) ; // Hide the header column. + // Set up the header cells. + Set_Property(CtrlEntId, 'OLE.CellGridLines[All; All]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.DataColumn[1]', @FM : @FM : @FM : True$) + + EventQualifier = True$ : @FM : 12 : '*' : 'SYSPROG*SRP_UTILITY..OIWIN*' + Send_Message(CtrlEntId, 'QUALIFY_EVENT', 'OLE.OnMouseMove', EventQualifier) + Send_Message(CtrlEntId, 'QUALIFY_EVENT', 'OLE.OnMouseExit', EventQualifier) + Send_Message(CtrlEntId, 'QUALIFY_EVENT', 'OLE.OnClick', EventQualifier) + Send_Message(CtrlEntId, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', EventQualifier) + + // Set the SRP_UTILITY UDP so the generic event handler can route the events to the correct handler. + Set_Property(CtrlEntId, '@SRP_UTILITY', SRP_Utility$) + + // Clear common variables and initialize the SRP Hash Table. + SBBC_Errors@ = '' + SBBC_PreviousCell@ = '' + SBBC_RootVisible@ = '' + SBBC_RootInfo@ = '' + SBBC_ActiveSegment@ = '' + SBBC_HashTable@ = SRP_HashTable_Create() + SRP_HashTable_Set(SBBC_HashTable@, RootSegment$, '') + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// AddSegment - Method +// +// SegmentInfo - @VM array of Segment information that uses the following format: +// <0, 1> - Key - The segment's unique key. - [Required] +// <0, 2> - Data - The segment's display data. - [Required] +// <0, 3> - Misc - Miscellaneous data as needed by the developer. - [Optional] +// ParentSegment - Key to the parent segment. Default is the root segment. - [Optional] +// SetActive - Flag to indicate if this new segment should become the current active segment. Default is +// true. - [Optional] +// +// Adds a new segment to the SRP BreadcrumbBar. +//---------------------------------------------------------------------------------------------------------------------- +Service AddSegment(SegmentInfo, ParentSegment, SetActive=BOOLEAN) + + // If no valid parent segment was provided then assume the Active Segment. + If Len(ParentSegment) then + ParentExists = SRP_HashTable_Contains(SBBC_HashTable@, ParentSegment) + end else + ParentExists = False$ + end + If Not(ParentExists) then ParentSegment = RootSegment$ + + SegmentKey = SegmentInfo[1, @VM] + SegmentData = SegmentInfo[Col2() + 1, @VM] + SegmentMisc = SegmentInfo[Col2() + 1, @VM] + + SegmentExists = SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) + + If Not(SegmentExists) then + If Len(SegmentKey) AND Len(SegmentData) then + // Add this segment. + SRP_HashTable_Set(SBBC_HashTable@, SegmentKey, SegmentData : @VM : SegmentMisc) + + // Add this segment to the list of children belonging to the parent segment. + ParentChildren = SRP_HashTable_Get(SBBC_HashTable@, ParentSegment : '*Children') + If Len(ParentChildren) then + // Add the sibling to the list. + ParentChildren := @VM : SegmentKey + end else + // First child of this segment. + ParentChildren = SegmentKey + end + SRP_HashTable_Set(SBBC_HashTable@, ParentSegment : '*Children', ParentChildren) + + // Name the parent for this segment. + SRP_HashTable_Set(SBBC_HashTable@, SegmentKey : '*Parent', ParentSegment) + + // By default adding a segment will also make it the Active Segment. However, sometimes one needs to be + // added without making it the Active Segment so a check is made before calling the SetActiveSegment + // method. + If SetActive NE False$ then SRP_BreadcrumbBar(CtrlEntId, 'SetActiveSegment', SegmentKey, True$) + end else + SBBC_Errors@<-1> = 'No Segment key or data was provided.' + end + end else + SBBC_Errors@<-1> = 'Segment ' : SegmentKey : ' already exists.' + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RemoveSegment - Method +// +// SegmentKey - Segment key. - [Required] +// SetParentActive - Flag to indicate if the parent segment of the one being removed should become the current active +// segment. Default is true. - [Optional] +// +// Removes the indicated segment from the SRP BreadcrumbBar. This will also remove any child segments that exist. If +// this segment is the only child of a parent segment, the child marker will also be removed. +//---------------------------------------------------------------------------------------------------------------------- +Service RemoveSegment(SegmentKey, SetParentActive=BOOLEAN) + + If SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) then + NoChildren = False$ ; // Assume false for now. + // First check to see if this segment has children. If so, then recursively call the RemoveSegment method for + // each child. Eveentually segments will no longer have children which means they can be removed safely. + Loop + SegmentChildren = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentChildren', SegmentKey) + If SegmentChildren NE '' then + For Each SegmentChild in SegmentChildren using @FM + SRP_BreadcrumbBar(CtrlEntId, 'RemoveSegment', SegmentChild, False$) + Next SegmentChild + end else + NoChildren = True$ + end + Until NoChildren EQ True$ + Repeat + + // This segment has no children. Remove the segment from the hash table, remove the hash table key that + // identifies the parent for this segment, then remove this segment from the list of children for its original + // parent. + SRP_HashTable_Remove(SBBC_HashTable@, SegmentKey) + ParentSegment = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentParent', SegmentKey) + SRP_HashTable_Remove(SBBC_HashTable@, SegmentKey : '*Parent') + ParentChildren = SRP_HashTable_Get(SBBC_HashTable@, ParentSegment : '*Children') + Locate SegmentKey in ParentChildren using @VM setting Pos then + ParentChildren = Delete(ParentChildren, 0, Pos, 0) + SRP_HashTable_Set(SBBC_HashTable@, ParentSegment : '*Children', ParentChildren) + end + + // By default removing a segment will also make its parent the Active Segment. However, sometimes one needs to + // be added without making it the Active Segment so a check is made before calling the SetActiveSegment + // method. + If SetParentActive NE False$ then + SRP_BreadcrumbBar(CtrlEntId, 'SetActiveSegment', ParentSegment, True$) + end + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RemoveAllChildrenSegments - Method +// +// SegmentKey - Segment key of the parent. - [Required] +// SetActive - Flag to indicate if the parent segment should become the current active segement. Default is true. +// - [Optional] +// +// Removes all children segments (and their children, etc.) from the indicated parent segment. +//---------------------------------------------------------------------------------------------------------------------- +Service RemoveAllChildrenSegments(SegmentKey, SetActive=BOOLEAN) + + If SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) then + // Check for any children and remove them if they exist. + SegmentChildren = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentChildren', SegmentKey) + If SegmentChildren NE '' then + For Each SegmentChild in SegmentChildren using @FM + SRP_BreadcrumbBar(CtrlEntId, 'RemoveSegment', SegmentChild, False$) + Next SegmentChild + end + + If SetActive NE False$ then + SRP_BreadcrumbBar(CtrlEntId, 'SetActiveSegment', SegmentKey, True$) + end + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// RemoveAllSegments - Method +//---------------------------------------------------------------------------------------------------------------------- +Service RemoveAllSegments(ClearSegmentTree=BOOLEAN) + + // Clear existing SRP EditTable cells. + Dimension = Get_Property(CtrlEntId, 'OLE.Dimension') + NumColumns = Dimension<1> + Send_Message(CtrlEntId, 'OLE.DeleteColumns', 1, NumColumns) + + If ClearSegmentTree NE False$ then + SBBC_ActiveSegment@ = '' + SRP_HashTable_Release(SBBC_HashTable@) + SBBC_HashTable@ = SRP_HashTable_Create() + SRP_HashTable_Set(SBBC_HashTable@, RootSegment$, '') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// DisplaySegmentPath - Method +//---------------------------------------------------------------------------------------------------------------------- +Service DisplaySegmentPath() + + // Don't allow any changes to be seen until this is finished. + Set_Property(CtrlEntId, 'OLE.Redraw', False$) + + // Clear existing SRP EditTable cells. + SRP_Breadcrumbbar(CtrlEntId, 'RemoveAllSegments', False$) + + // Get the current segment path and update the SRP EditTable accordingly. + SegmentPath = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentPath') + NumColumns = DCount(SegmentPath, @FM) + + For ColumnCnt = 1 to NumColumns + SegmentKey = SegmentPath + Begin Case + Case SegmentKey EQ RootSegment$ + SRP_BreadcrumbBar(CtrlEntId, 'SetRootVisible', True$) + + Case SegmentKey EQ ChildMarker$ + Send_Message(CtrlEntId, 'InsertColumns', -1, 1) + Set_Property(CtrlEntId, 'OLE.CellPadding[':ColumnCnt:'; All]', 5 : @FM : 2) + Set_Property(CtrlEntId, 'OLE.CellProtection[':ColumnCnt:'; 1]', 'Selectable') + Set_Property(CtrlEntId, 'OLE.CellGridLines[':ColumnCnt:'; 1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.CellImage[':ColumnCnt:'; 1]', RightArrow$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.DataColumn[':ColumnCnt:']', 18 : @FM : @FM : @FM : False$) + + Case Otherwise$ + Send_Message(CtrlEntId, 'InsertColumns', -1, 1) + Set_Property(CtrlEntId, 'OLE.CellPadding[':ColumnCnt:'; All]', 5 : @FM : 2) + Set_Property(CtrlEntId, 'OLE.CellProtection[':ColumnCnt:'; 1]', 'Selectable') + Set_Property(CtrlEntId, 'OLE.CellGridLines[':ColumnCnt:'; 1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.CellImage[':ColumnCnt:'; 1]', '') + Set_Property(CtrlEntId, 'OLE.CellFont[':ColumnCnt:'; All]', SBBC_CellFont@) + SegmentData = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentData', SegmentKey) + Set_Property(CtrlEntId, 'OLE.CellText[':ColumnCnt:'; 1]', SegmentData) + TextRect = Utility('TEXTRECT', '', SegmentData : @FM : (1024 + 32) : @FM : '' : @FM : SBBC_CellFont@) + TextWidth = TextRect<1> + 30 + Set_Property(CtrlEntId, 'OLE.DataColumn[':ColumnCnt:']', TextWidth : @FM : @FM : @FM : False$) + + End Case + Next ColumnCnt + + // Display all changed. + Set_Property(CtrlEntId, 'OLE.Redraw', True$) + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ShowHighlight - Method +//---------------------------------------------------------------------------------------------------------------------- +Service ShowHighlight(CurrentCell, ForceShow=BOOLEAN) + + CurrentCol = Field(CurrentCell, ';', 1) + PreviousCol = Field(SBBC_PreviousCell@, ';', 1) + ShowHighlight = True$ ; // Assume this will be shown unless another condition prohibits this. + + SegmentPath = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentPath') + NumSegments = DCount(SegmentPath, @FM) + + Begin Case + Case ForceShow EQ True$ + // Regardless of the situation, force the highlight to occur. + + Case CurrentCol EQ 1 AND SegmentPath<1> EQ RootSegment$ + // Cursor is hovering over the root segment. Do not highlight. + SRP_BreadcrumbBar(CtrlEntId, 'ClearHighlight') + ShowHighlight = False$ + + Case CurrentCell EQ SBBC_PreviousCell@ + // Cursor is hovering over the same cell as before. Nothing has changed. + ShowHighlight = False$ + + Case CurrentCol EQ -1 + // Cursor is hovering over the fill space. Do not highlight. + SRP_BreadcrumbBar(CtrlEntId, 'ClearHighlight') + ShowHighlight = False$ + + End Case + + If ShowHighlight EQ True$ then + // First, unhighlight the previous segment if previous cell is unassociated with the current cell. + ClearHighLight = False$ + Begin Case + Case SegmentPath EQ ChildMarker$ AND (CurrentCol LT PreviousCol) ; ClearHighLight = True$ + Case SegmentPath NE ChildMarker$ AND (CurrentCol GT PreviousCol) ; ClearHighLight = True$ + Case SegmentPath NE ChildMarker$ AND SegmentPath NE ChildMarker$ ; ClearHighLight = True$ + End Case + If ClearHighLight EQ True$ then SRP_BreadcrumbBar(CtrlEntId, 'ClearHighlight') + + WarmHighlightColor = WarmHighlightBaseColor$ + WarmGridLineColor = WarmGridLineBaseColor$ + HotHighlightColor = HotHighlightBaseColor$ + HotGridLineColor = HotGridLineBaseColor$ + + // Now highlight the current column. + Set_Property(CtrlEntId, 'OLE.CellColors[':CurrentCol:'; 1]', @FM : HotHighlightColor) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':CurrentCol:'; 1]', HotGridLineColor : @FM : 'None' : @FM : HotGridLineColor : @FM : 'None') + + // Now highlight the associated column, if applicable. + Begin Case + Case SegmentPath EQ ChildMarker$ AND SegmentPath NE RootSegment$ + AssocCol = CurrentCol - 1 + Set_Property(CtrlEntId, 'OLE.CellColors[':AssocCol:'; 1]', @FM : WarmHighlightColor) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':AssocCol:'; 1]', WarmGridLineColor : @FM : 'None' : @FM : WarmGridLineColor : @FM : 'None') + + Case SegmentPath NE ChildMarker$ AND SegmentPath EQ ChildMarker$ + AssocCol = CurrentCol + 1 + Set_Property(CtrlEntId, 'OLE.CellColors[':AssocCol:'; 1]', @FM : HotHighlightColor) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':AssocCol:'; 1]', HotGridLineColor : @FM : 'None' : @FM : HotGridLineColor : @FM : 'None') + + End Case + + SBBC_PreviousCell@ = CurrentCell + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ClearHighlight - Method +//---------------------------------------------------------------------------------------------------------------------- +Service ClearHighlight(CurrentCol) + + If CurrentCol EQ '' then + CurrentCol = Field(SBBC_PreviousCell@, ';', 1) + end + + SegmentPath = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentPath') + + // Clear the highlight of the current cell. + Set_Property(CtrlEntId, 'OLE.CellColors[':CurrentCol:';1]', @FM : ColdHighlightBaseColor$) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':CurrentCol:';1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + + // Now highlight the associated column, if applicable (which means the mouse is hovering over the droparrow cell) + Begin Case + Case SegmentPath EQ ChildMarker$ + AssocCol = CurrentCol - 1 + Set_Property(CtrlEntId, 'OLE.CellColors[':AssocCol:';1]', @FM : ColdHighlightBaseColor$) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':AssocCol:';1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.CellImage[':CurrentCol:'; 1]', RightArrow$ : @FM : 'None') + + Case SegmentPath NE ChildMarker$ AND SegmentPath EQ ChildMarker$ + AssocCol = CurrentCol + 1 + Set_Property(CtrlEntId, 'OLE.CellColors[':AssocCol:';1]', @FM : ColdHighlightBaseColor$) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':AssocCol:';1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.CellImage[':AssocCol:'; 1]', RightArrow$ : @FM : 'None') + + End Case + + SBBC_PreviousCell@ = '' + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// Close - Method +// +// Releases the SRP Hash Table to avoid memory leaks. +//---------------------------------------------------------------------------------------------------------------------- +Service Close() + + If Len(SBBC_HashTable@) then + SRP_HashTable_Release(SBBC_HashTable@) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetError - Property +//---------------------------------------------------------------------------------------------------------------------- +Service GetError() + + Response = SBBC_Errors@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSegmentPath - Property +// +// ExcludeRootSegment - Flag to indicate if the root segemtn should be excluded from the path. Default is Fasle$ +// - [Optional] +// ExcludeArrowSegments - Flag to indicate if right arrow segments should be excluded from the path. Default is False$. +// - [Optional] +// +// Returns an @FM delimited array of segment keys that comprises the current path displayed in the SRP BreadcrumbBar. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSegmentPath(ExcludeRootSegment=BOOLEAN, ExcludeArrowSegments=BOOLEAN) + + If ExcludeRootSegment NE True$ then ExcludeRootSegment = False$ + If ExcludeArrowSegments NE True$ then ExcludeArrowSegments = False$ + + SegmentPath = '' + + ActiveSegment = SRP_BreadcrumbBar(CtrlEntId, 'GetActiveSegment') + + If Len(ActiveSegment) then + SegmentPath = ActiveSegment + Transfer ActiveSegment to SegmentKey + SegmentChildren = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentChildren', SegmentKey) + // If there are children then insert a special place holder. + If Len(SegmentChildren) AND Not(ExcludeArrowSegments) then SegmentPath := @FM : ChildMarker$ + + Loop + ParentSegment = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentParent', SegmentKey) + If Len(ParentSegment) then + If (ParentSegment NE RootSegment$) OR ((ParentSegment EQ RootSegment$) AND SBBC_RootVisible@ AND Not(ExcludeRootSegment)) then + SegmentChildren = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentChildren', ParentSegment) + // If there are children then insert a special place holder. + If Len(SegmentChildren) AND Not(ExcludeArrowSegments) then SegmentPath = Insert(SegmentPath, 1, 0, 0, ChildMarker$) + // Insert the parent segment. + SegmentPath = Insert(SegmentPath, 1, 0, 0, ParentSegment) + SegmentKey = ParentSegment + end else + // There are no more segments so set the parent to empty to end the loop. + ParentSegment = '' + end + end + Until ParentSegment EQ '' + Repeat + end else + SBBC_Errors@<-1> = 'No active segment could not be located.' + end + + Response = SegmentPath + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSegmentChildren - Property +// +// SegmentKey - Segment key to get the children for. - [Required] +// +// Returns an array of children for the segment key being passed in. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSegmentChildren(SegmentKey) + + If SegmentKey EQ 'Root' then SegmentKey = RootSegment$ + + SegmentChildren = '' + + SegmentExists = SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) + + If SegmentExists then + SegmentChildren = SRP_HashTable_Get(SBBC_HashTable@, SegmentKey : '*Children') + Convert @VM to @FM in SegmentChildren + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + + Response = SegmentChildren + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSegmentData - Property +// +// SegmentKey - Segment key. - [Required] +// +// Returns the data associated with the segment. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSegmentData(SegmentKey) + + SegmentData = '' + + If SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) then + Segment = SRP_HashTable_Get(SBBC_HashTable@, SegmentKey) + SegmentData = Segment<0, 1> + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + + Response = SegmentData + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSegmentMisc - Property +// +// SegmentKey - Segment key. - [Required] +// +// Returns the miscellaneous information associated with the segment. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSegmentMisc(SegmentKey) + + SegmentMisc = '' + + If SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) then + Segment = SRP_HashTable_Get(SBBC_HashTable@, SegmentKey) + SegmentMisc = Segment<0, 2> + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + + Response = SegmentMisc + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetSegmentParent - Property +// +// SegmentKey - Segment key. - [Required] +// +// Returns the parent segment key for the segment key being passed in. +//---------------------------------------------------------------------------------------------------------------------- +Service GetSegmentParent(SegmentKey) + + If SegmentKey EQ RootSegment$ then Segment = '' + + SegmentParent = '' + + If Len(SegmentKey) then + SegmentParent = SRP_HashTable_Get(SBBC_HashTable@, SegmentKey : '*Parent') + end + + Response = SegmentParent + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRootVisible - Property +// +// Returns the visibility status of the root segment. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRootVisible() + + Response = SBBC_RootVisible@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRootVisible - Property +// +// RootVisible - Flag to determine if the root segment is visible. - [Required] +// +// Makes the root segment visible. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRootVisible(RootVisible=BOOLEAN) + + If RootVisible NE '' then + SBBC_RootVisible@ = RootVisible + If SBBC_RootVisible@ then + Send_Message(CtrlEntId, 'InsertColumns', 1, 1) + SegmentWidth = Field(SBBC_RootInfo@, @FM, 3, 1) + Set_Property(CtrlEntId, 'OLE.DataColumn[1]', SegmentWidth : @FM : @FM : @FM : False$) + Set_Property(CtrlEntId, 'OLE.CellPadding[1; All]', 3 : @FM : 2) + Set_Property(CtrlEntId, 'OLE.CellProtection[1; 1]', 'Full') + Set_Property(CtrlEntId, 'OLE.CellGridLines[1; 1]', ColdGridLineBaseColor$ : @FM : 'None' : @FM : ColdGridLineBaseColor$ : @FM : 'None') + ImageInfo = Field(SBBC_RootInfo@, @FM, 1, 2) + Set_Property(CtrlEntId, 'OLE.CellImage[1; 1]', ImageInfo) + end else + Send_Message(CtrlEntId, 'DeleteColumns', 1, 1) + end + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetRootImage - Property +// +// Returns the details pertaining to the root segment image. See SetRootImage for details on the layout. +//---------------------------------------------------------------------------------------------------------------------- +Service GetRootImage() + + Response = SBBC_RootInfo@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetRootImage - Property +// +// RootImage - Path to the graphical image to display in the root segment (assuming it is visible.) - [Optional] +// TransparentColor - Specify the transparent color of the image. Default is "Auto". - [Optional] +// SegmentWidth - The width of the root segment. Default is the width of the image. - [Optional] +// RootVisible - Flag to determine if the root should be visible (assuming it isn't already.) - [Optional] +// +// Updates one or more details relating to the root segment image. If the root image is not visible or not told to +// become visible then any new details are kept in memory only. +//---------------------------------------------------------------------------------------------------------------------- +Service SetRootImage(RootImage, TransparentColor, SegmentWidth, RootVisible) + + If Len(RootImage) then SBBC_RootInfo@<1> = RootImage + If Len(TransparentColor) then SBBC_RootInfo@<2> = TransparentColor + If Len(SegmentWidth) then SBBC_RootInfo@<3> = SegmentWidth + + Begin Case + Case (RootVisible EQ True$) AND (SBBC_RootVisible@ NE True$) + // The SetRootImage method was called with a request to display the root segment (if it is not already visible.) + // Since it was not already visible, the SetRootVisible method will be used to display it. + SRP_BreadcrumbBar(CtrlEntId, 'SetRootVisible', True$) + + Case RootVisible EQ True$ + // The SetRootImage method was called with a request to display the root segment (if it is not already visible.) + // Since it is already visible, just set the CellImage of the SRP EditTable. + Set_Property(CtrlEntId, 'OLE.CellImage[1; 1]', SBBC_RootInfo@) + SBBC_RootVisible@ = True$ + + Case SBBC_RootVisible@ EQ True$ + // If root segment is already visible, update the image in the SRP EditTable immediately. + Set_Property(CtrlEntId, 'OLE.CellImage[1; 1]', SBBC_RootInfo@) + + End Case + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetActiveSegment - Property +// +// Returns the key to the currently active segment. +//---------------------------------------------------------------------------------------------------------------------- +Service GetActiveSegment() + + Response = SBBC_ActiveSegment@ + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetActiveSegment - Property +// +// SegmentKey - Unique key for the segment to become active. - [Required] +// DisplaySegment - Flag to determine if the newly active segment should be displayed as such in the SRP +// BreadcrumbBar. The default is True. This should be set to False if the segment needs to be active +// (perhaps if the AddSegment method was intended to use the active segment as the default parent) +// but not immediately refreshed in the UI. - [Optional] +// +// Sets the indicated segement as active. Normally this means it is the segment that is the visible end point being +// displayed in the SRP BreadcrumbBar. However, it can also be active but not visible. See the DisplaySegment notes for +// further details. +//---------------------------------------------------------------------------------------------------------------------- +Service SetActiveSegment(SegmentKey, DisplaySegment=BOOLEAN) + + If DisplaySegment EQ False$ else DisplaySegment = True$ + + SegmentExists = SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) + If SegmentExists then + SBBC_PrevActiveSegment@ = SBBC_ActiveSegment@ + SBBC_ActiveSegment@ = SegmentKey + If DisplaySegment then SRP_BreadcrumbBar(CtrlEntId, 'DisplaySegmentPath') + end else + SBBC_Errors@<-1> = 'Segment does not exist.' + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetPrevActiveSegment - Property +// +// Returns the key to the previous active segment. +//---------------------------------------------------------------------------------------------------------------------- +Service GetPrevActiveSegment() + + Response = SBBC_PrevActiveSegment@ + +end service + + + +//---------------------------------------------------------------------------------------------------------------------- +// SegmentExists - Property +// +// SegmentKey - Segment key. - [Required] +// +// Returns a flag indicating if the segment exists or not. +//---------------------------------------------------------------------------------------------------------------------- +Service SegmentExists(SegmentKey) + + SegmentExists = SRP_HashTable_Contains(SBBC_HashTable@, SegmentKey) + + Response = SegmentExists + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// Enabled - Property +// +// EnabledFlag - [Required] +// +// Enables or disables the SRP BreadcrumbBar, depending on the value of EnabledFlag. +//---------------------------------------------------------------------------------------------------------------------- +Service Enabled(EnabledFlag) + + If EnabledFlag NE '' then + CellColors = Get_Property(CtrlEntId, 'OLE.CellColors[1;1]') + If EnabledFlag EQ False$ then + Set_Property(CtrlEntId, 'ENABLED', False$) + EnabledColor = '3DFace' + end else + Set_Property(CtrlEntId, 'ENABLED', True$) + EnabledColor = 'White' + end + CellColors<2> = EnabledColor + Set_Property(CtrlEntId, 'OLE.CellColors[All;All]', CellColors) + Set_Property(CtrlEntId, 'OLE.WorkspaceBkColor', EnabledColor) + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// OnSegmentClick - Event +//---------------------------------------------------------------------------------------------------------------------- +Service OnSegmentClick(CurrentCell) + + CurrentCol = Field(CurrentCell, ';', 1) + PreviousCol = Field(SBBC_PreviousCell@, ';', 1) + If CurrentCol NE PreviousCol then + // It is possible that the previous cell is still highlighted (especially if a context menu was displayed) so + // it needs to be cleared. + SRP_BreadcrumbBar(CtrlEntId, 'ClearHighlight', PreviousCol) + end + + SegmentPath = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentPath') + NumSegments = Count(SegmentPath, @FM) + (SegmentPath NE '') + SegmentKey = SegmentPath + + Begin Case + Case SegmentKey EQ SBBC_ActiveSegment@ + // Do nothing. User is clicking on currently active segment. + + Case SegmentKey EQ ChildMarker$ + // User clicked on an arrow segment. Make the segments appear as if they are clicked. However, it is possible + // that the previous segment was an arrow segment that had a context menu displayed. In this case, the + // normal trapping of mouse movement won't work so the highlight needs to be cleared explicitly. + Set_Property(CtrlEntId, 'OLE.CellImage[':CurrentCol:'; 1]', DownArrow$ : @FM : 'None') + Set_Property(CtrlEntId, 'OLE.CellPadding[':CurrentCol:'; All]', 5 : @FM : 2) + HotHighlightColor = 'RGB(203,232,246)' + HotGridLineColor = 'RGB(038,160,218)' + Set_Property(CtrlEntId, 'OLE.CellColors[':CurrentCol:'; 1]', @FM : HotHighlightColor) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':CurrentCol:'; 1]', HotGridLineColor : @FM : 'None' : @FM : HotGridLineColor : @FM : 'None') + PreviousCol = CurrentCol - 1 + Set_Property(CtrlEntId, 'OLE.CellColors[':PreviousCol:'; 1]', @FM : HotHighlightColor) + Set_Property(CtrlEntId, 'OLE.CellGridLines[':PreviousCol:'; 1]', HotGridLineColor : @FM : 'None' : @FM : HotGridLineColor : @FM : 'None') + + // Display the list of children. + RegularSegment = SegmentPath + SegmentChildren = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentChildren', RegularSegment) + GoSub CreateChildDropdown + + Case SegmentKey NE RootSegment$ + // User clicked on a regular segment. Update the Active Segment. + SRP_BreadcrumbBar(CtrlEntId, 'SetActiveSegment', SegmentKey) + SRP_BreadcrumbBar(CtrlEntId, 'ShowHighlight', CurrentCell, True$) + + // Send an event to the control on the form so it can respond as if this were a true ActiveX control. + Send_Event(CtrlEntID, 'OnSegmentClick', SegmentKey) + + Case Otherwise$ + + End Case + + SBBC_PreviousCell@ = CurrentCell + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// OnMenuClick - Event +//---------------------------------------------------------------------------------------------------------------------- +Service OnMenuClick(SegmentKey) + + SRP_BreadcrumbBar(CtrlEntID, 'SetActiveSegment', SegmentKey) + + // Send an event to the control on the form so it can respond as if this were a true ActiveX control. + Send_Event(CtrlEntID, 'OnSegmentClick', SegmentKey) + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +* InitParams: +* +* If Assigned(CtrlEntId) else CtrlEntId = '' +* If Assigned(Message) else Message = '' +* If Assigned(Param1) else Param1 = '' +* If Assigned(Param2) else Param2 = '' +* If Assigned(Param3) else Param3 = '' +* If Assigned(Param4) else Param4 = '' +* If Assigned(Param5) else Param5 = '' +* If Assigned(Param6) else Param6 = '' +* If Assigned(Param7) else Param7 = '' +* If Assigned(Param8) else Param8 = '' +* If Assigned(Param9) else Param9 = '' +* If Assigned(Param10) else Param10 = '' +* If Assigned(Param11) else Param11 = '' +* If Assigned(Param12) else Param12 = '' +* If Assigned(Param13) else Param13 = '' +* If Assigned(Param14) else Param14 = '' +* If Assigned(Param15) else Param15 = '' +* +* return + + +ClearError: + + SBBC_Errors@ = '' + +return + + +CreateChildDropdown: + + Menu = '' + + NumSegmentChildren = Count(SegmentChildren, @FM) + (SegmentChildren NE '') + For SegChildCnt = 1 to NumSegmentChildren + SegmentChild = SegmentChildren + SegmentData = SRP_BreadcrumbBar(CtrlEntId, 'GetSegmentData', SegmentChild) + Menu<-1> = SegmentChild : @VM : SegmentData + Next SegChildCnt + Menu = SRP_Sort_Array(Menu, 'AL2', True$) + + // Calculate the position of the context menu. Visually it should appear just underneath the SRP EditTable control + // and 69 pixels to the left of the right edge of the current cell. + CellSize = Send_Message(CtrlEntId, 'OLE.GetCellRect', CurrentCol : @FM : 1) + CellXPos = CellSize<1> + CellYPos = CellSize<2> + CellWidth = CellSize<3> + CellHeight = CellSize<4> + MenuXPos = CellXPos + CellWidth - 38 + MenuYPos = CellHeight + 1 + Send_Message(CtrlEntID, 'OLE.ShowContextMenu', MenuXPos : ',' : MenuYPos, Menu, '') + +return + + +//---------------------------------------------------------------------------------------------------------------------- +// ControlEvents +// +// This section handles the OpenInsight events for the underlying controls. Events are routed to this utility via the +// SRP_UTILITY custom event which is in SYSPROG. +//---------------------------------------------------------------------------------------------------------------------- +ControlEvents: + + Event = Service + + Begin Case + Case Event EQ 'OnMouseMove' ; SRP_BreadcrumbBar(CtrlEntId, 'ShowHighlight', Param1) + Case Event EQ 'OnMouseExit' ; SRP_BreadcrumbBar(CtrlEntId, 'ClearHighlight') + Case Event EQ 'OnClick' ; SRP_BreadcrumbBar(CtrlEntId, 'OnSegmentClick', Param1) + Case Event EQ 'OnContextMenuClick' ; SRP_BreadcrumbBar(CtrlEntId, 'OnMenuClick', Param1) + End Case + +return diff --git a/FRAMEWORKS/STPROC/VERSION_API.txt b/FRAMEWORKS/STPROC/VERSION_API.txt new file mode 100644 index 0000000..1ca2bee --- /dev/null +++ b/FRAMEWORKS/STPROC/VERSION_API.txt @@ -0,0 +1,81 @@ +Function Version_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Version_API + + Description : API logic for the Version resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure [.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Version.POST + - Version.ID.PUT + - Version.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/19/18 dmb Original programmer. + 05/28/19 dmb [SRPFW-274] Replace all references to AddLinkRelationships with AddLinkRelations. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API version.HEAD +API version.GET + + Version = HTTP_Services('GetVersion') + If Error_Services('NoError') then + Swap CRLF$ with @FM in Version + Properties = 'version' : @FM : 'date' : @FM : 'time' + Values = Version<1> : @FM : Field(Version<2>, ' ', 1, 1) : @FM : Field(Version<2>, ' ', 2, 1) + objResource = HTTP_Resource_Services('AddProperties', '', Properties, Values) + Rels = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : APIURL + HTTP_Resource_Services('AddLinkRelations', objResource, Rels, URLs) + + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api diff --git a/FRAMEWORKS/STPROC/WEBACCOUNTS_API.txt b/FRAMEWORKS/STPROC/WEBACCOUNTS_API.txt new file mode 100644 index 0000000..c85da38 --- /dev/null +++ b/FRAMEWORKS/STPROC/WEBACCOUNTS_API.txt @@ -0,0 +1,205 @@ +Function Webaccounts_API(@API) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Webaccounts_API + + Description : API logic for the Webaccounts resource. + + Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables: + + HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) + APIURL - The URL for the API entry point (e.g., api.mysite.com/v1). + FullEndpointURL - The URL submitted by the client, including query params. + FullEndpointURLNoQuery - The URL submitted by the client, excluding query params. + ParentURL - The URL path preceeding the current endpoint. + the SelfURL. + CurrentAPI - The name of this stored procedure. + + Parameters : + API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]: + - APIPattern must follow this structure [.ID.[]] + - HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc. + Examples: + - Webaccounts.POST + - Webaccounts.ID.PUT + - Webaccounts.ID.firstName.GET + Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API + services do not rely upon anything being returned in the response. This is what the + various services like SetResponseBody and SetResponseStatus services are for. A response + value is only helpful if the developers want to use it for debug purposes. + + History : (Date, Initials, Notes) + 11/19/18 dmb Original programmer. + 04/09/19 dmb [SRPFW-271] Replace FullEndpointURL with FullEndpointURLNoQuery in the GetObjects service + within the webaccounts.GET API to avoid query params in the embedded object self URLs. + 05/28/19 dmb [SRPFW-274] Replace all references to AddLinkRelationships with AddLinkRelations. + 01/23/20 dmb [SRPFW-296] Add matching HEAD APIs for all GET APIs. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert APP_INSERTS +$insert API_SETUP +$insert HTTP_INSERTS + +Declare function WebAccounts_Services + +AuthenticatedAccountID = HTTP_Authentication_Services('GetAuthenticatedAccountID') + +GoToAPI else + // The specific resource endpoint doesn't have a API handler yet. + HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Endpoint Handlers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +API webaccounts.HEAD +API webaccounts.GET + + objResource = HTTP_Resource_Services('GetObject') + If Error_Services('NoError') then + objWebAccounts = HTTP_Resource_Services('GetObject', 'WEB_ACCOUNTS', AuthenticatedAccountID, 'NAME', '', '', '', '', FullEndpointURLNoQuery) + If Error_Services('NoError') then + HTTP_Resource_Services('AddEmbeddedResources', objResource, 'webaccounts', objWebAccounts) + // Add _links sub-properties for HAL implementation. + Rels = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : ParentURL + HTTP_Resource_Services('AddLinkRelations', objResource, Rels, URLs) + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + +end api + + +API webaccounts.ID.HEAD +API webaccounts.ID.GET + + AccountID = EndpointSegment + + If AccountID EQ AuthenticatedAccountID then + objResource = HTTP_Resource_Services('GetObject', 'WEB_ACCOUNTS', AccountID, 'NAME') + If Error_Services('NoError') then + objPassword = HTTP_Resource_Services('GetObject', 'WEB_ACCOUNTS', AccountID, 'CURRENT_PASSWORD' : @FM : 'CURRENT_PASSWORD_CREATED' : @FM : 'CURRENT_PASSWORD_EXPIRES', 'value' : @FM : 'created' : @FM : 'expires') + If Error_Services('NoError') then + // Add the password nested property. + HTTP_Resource_Services('AddProperty', objResource, 'password', objPassword, 'ObjectHandle') + end + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + Names = 'self' : @FM : 'password' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : FullEndpointURL : '/password' : @FM : APIURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 401, 'This account is not authorized for this endpoint.', FullEndpointURL) + end + +end api + + +API webaccounts.ID.password.HEAD +API webaccounts.ID.password.GET + + AccountID = ParentSegment + + If AccountID EQ AuthenticatedAccountID then + objResource = HTTP_Resource_Services('GetObject', 'WEB_ACCOUNTS', AccountID, 'CURRENT_PASSWORD' : @FM : 'CURRENT_PASSWORD_CREATED' : @FM : 'CURRENT_PASSWORD_EXPIRES', 'value' : @FM : 'created' : @FM : 'expires') + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + Names = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : APIURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + If Error_Services('NoError') then + HTTP_Resource_Services('AddFormAction', objResource, 'resetPassword', 'PATCH', FullEndpointURL, 'Reset Password', 'value', '' : @VM : True$ : @VM : True$) + end + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 401, 'This account is not authorized for this endpoint.', FullEndpointURL) + end + +end api + + +API webaccounts.ID.password.PATCH + + AccountID = ParentSegment + + If AccountID EQ AuthenticatedAccountID then + Password = HTTP_Authentication_Services('GetWebAccountPassword', AccountID, False$) + Body = HTTP_Services('GetHTTPPostString') + Body = HTTP_Services('DecodePercentString', Body) + If SRP_JSON(objJSON, 'Parse', Body) EQ '' then + NewPassword = SRP_JSON(objJSON, 'GetValue', 'value') + SRP_JSON(objJSON, 'Release') + HTTP_Authentication_Services('SetWebAccountPassword', AccountID, Password, NewPassword) + If Error_Services('NoError') then + objResource = HTTP_Resource_Services('GetObject', 'WEB_ACCOUNTS', AccountID, 'CURRENT_PASSWORD' : @FM : 'CURRENT_PASSWORD_CREATED' : @FM : 'CURRENT_PASSWORD_EXPIRES', 'value' : @FM : 'created' : @FM : 'expires') + If Error_Services('NoError') then + // Add _links sub-properties for HAL implementation. + Names = 'self' : @FM : 'apiEntryPoint' + URLs = FullEndpointURL : @FM : APIURL + HTTP_Resource_Services('AddLinkRelations', objResource, Names, URLs) + end + If Error_Services('NoError') then + HTTP_Resource_Services('AddFormAction', objResource, 'resetPassword', 'PATCH', FullEndpointURL, 'Reset Password', 'value', '' : @VM : True$ : @VM : True$) + end + If Error_Services('NoError') then + // Serialize the object into a JSON string. + jsonResource = HTTP_Resource_Services('GetSerializedResource', objResource) + // Set the response body with the JSON string and set the Content-Type response header. + HTTP_Services('SetResponseBody', jsonResource, False$, 'application/hal+json') + end else + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 403, Error_Services('GetMessage'), FullEndpointURL) + end + end else + Error_Services('Add', 'Error parsing JSON body within the ' : CurrentAPI : ' module.') + HTTP_Services('SetResponseError', '', '', 500, Error_Services('GetMessage'), FullEndpointURL) + end + end else + HTTP_Services('SetResponseError', '', '', 401, 'This account is not authorized for this endpoint.', FullEndpointURL) + end + +end api diff --git a/FRAMEWORKS/STPROC/WEBACCOUNTS_SERVICES.txt b/FRAMEWORKS/STPROC/WEBACCOUNTS_SERVICES.txt new file mode 100644 index 0000000..b2a1f9c --- /dev/null +++ b/FRAMEWORKS/STPROC/WEBACCOUNTS_SERVICES.txt @@ -0,0 +1,204 @@ +Function WebAccounts_Services(@Service, @Params) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : WebAccounts_Services + + Description : Handler program for all WebAccounts services. + + Notes : + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 10/13/18 dmb [SRPFW-254] Original programmer. + 10/13/18 dmb [SRPFW-254] Add GetWebAccounts, SetWebAccounts, and ConvertMVWebAccountsToJSON serives. + 10/22/18 dmb [SRPFW-254] Add ConvertJSONWebAccountsToMV service. + 01/18/20 dmb [SRPFW-296] Update the ConvertJSONWebAccountsToMV service by replacing + Utility_DotNet('TIMEZONE') with the SRP_DateTime service (SRP Utilities 2.1) to avoid + localization problems and potential 502 Bad Gateway errors. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert SERVICE_SETUP +$insert WEB_ACCOUNTS_EQUATES + +Equ SecondsPerHour$ to 60 * 60 ; // 60 minutes * 60 seconds = 3600 +Equ SecondsPerDay$ to 24 * SecondsPerHour$ ; // 24 hours * 60 minutes * 60 seconds = 86400 + +Declare function WebAccounts_Services, Memory_Services, Database_Services, SRP_JSON, RTI_CreateGUID, SRP_DateTime +Declare subroutine WebAccounts_Services, Memory_Services, Database_Services, SRP_JSON + +GoToService else + Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') +end + +Return Response OR '' + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Service Parameter Options +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Options BOOLEAN = True$, False$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Services +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// GetWebAccounts +// +// Returns the database row from the WebAccounts table for the indicated Account ID. The default format is MultiValue. +//---------------------------------------------------------------------------------------------------------------------- +Service GetWebAccounts(AccountID, ReturnJSON) + + WebAccountsRow = '' + + If AccountID NE '' then + WebAccountsRow = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If ReturnJSON EQ True$ then + WebAccountsRow = WebAccounts_Services('ConvertMVWebAccountsToJSON', AccountID, WebAccountsRow) + end + end else + Error_Services('Add', 'AccountID argument was missing in the ' : Service : ' service.') + end + + Response = WebAccountsRow + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// SetWebAccounts +// +// Updates the WebAccounts database row for the indicated Account ID. +//---------------------------------------------------------------------------------------------------------------------- +Service SetWebAccounts(AccountID, WebAccountsRow) + + If (AccountID NE '') AND (WebAccountsRow NE '') then + Database_Services('WriteDataRow', 'WEB_ACCOUNTS', AccountID, WebAccountsRow) + end else + Error_Services('Add', 'AccountID or WebAccountsRow argument was missing in the ' : Service : ' service.') + end + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ConvertMVWebAccountsToJSON +// +// Converts a MultiValue formatted WebAccounts row into a serialized JSON object and returns the result. If the +// mvWebAccounts argument is empty, the service will attempt to get it from the WebAccounts table. If the itemURL +// argument is not empty, HAL+JSON properties will be added to the JSON object. +//---------------------------------------------------------------------------------------------------------------------- +Service ConvertMVWebAccountsToJSON(AccountID, mvWebAccounts, itemURL) + + jsonWebAccounts = '' + + If AccountID NE '' then + + If mvWebAccounts EQ '' then mvWebAccounts = Database_Services('ReadDataRow', 'WEB_ACCOUNTS', AccountID) + If Error_Services('NoError') then + @DICT = Database_Services('GetTableHandle', 'DICT.WEB_ACCOUNTS') + @ID = AccountID + @RECORD = mvWebAccounts + + // WebAccounts object. + If SRP_JSON(objJSONWebAccounts, 'New', 'Object') then + SRP_JSON(objJSONWebAccounts, 'SetValue', 'id', @ID, 'String') + SRP_JSON(objJSONWebAccounts, 'SetValue', 'name', {NAME}, 'String') + If SRP_JSON(objPassword, 'New', 'Object') then + SRP_JSON(objPassword, 'SetValue', 'value', {CURRENT_PASSWORD}, 'String') + SRP_JSON(objPassword, 'SetValue', 'created', {CURRENT_PASSWORD_CREATED}, 'String') + SRP_JSON(objPassword, 'SetValue', 'expires', {CURRENT_PASSWORD_EXPIRES}, 'String') + SRP_JSON(objJSONWebAccounts, 'Set', 'password', objPassword) + SRP_JSON(objPassword, 'Release') + end + + jsonWebAccounts = SRP_JSON(objJSONWebAccounts, 'Stringify', 'Styled') +* Swap \0D0A\ with @FM in jsonWebAccounts + SRP_JSON(objJSONWebAccounts, 'Release') + end else + Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.') + end + end + end else + Error_Services('Add', 'AccountID argument was missing in the ' : Service : ' service.') + end + + Response = jsonWebAccounts + +end service + + +//---------------------------------------------------------------------------------------------------------------------- +// ConvertJSONWebAccountsToMV +// +// Converts a serialized JSON WebAccounts object into a MultiValue formatted WebAccounts row and returns the result. +//---------------------------------------------------------------------------------------------------------------------- +Service ConvertJSONWebAccountsToMV(jsonWebAccounts) + + mvWebAccounts = '' + + If jsonWebAccounts NE '' then + If SRP_JSON(objJSONWebAccounts, 'Parse', jsonWebAccounts) EQ '' then + AccountID = SRP_JSON(objJSONWebAccounts, 'GetValue', 'id') + mvWebAccounts = WebAccounts_Services('GetWebAccounts', AccountID, False$) + If Error_Services('NoError') then + mvWebAccounts = SRP_JSON(objJSONWebAccounts, 'GetValue', 'name') + mvWebAccounts = SRP_JSON(objJSONWebAccounts, 'GetValue', 'password.value') + CreateDateTime = SRP_JSON(objJSONWebAccounts, 'GetValue', 'password.created') + TMZ = Oconv(SRP_DateTime('Format', SRP_DateTime('Now', True$), "DDD, DD MMM YYYY hh:mm:ss 'GMT'")[-1, 'B '], 'MD2') ; // Get the TimeZone modifier. + CreateDate = Iconv(Field(CreateDateTime, ' ', 2, 3), 'D') + CreateTime = Iconv(Field(CreateDateTime, ' ', 5, 1), 'MT') + thisSeconds = CreateDate * SecondsPerDay$ + CreateTime + thisSeconds += TMZ * SecondsPerHour$ + CreateDate = Int(thisSeconds / SecondsPerDay$) + CreateTime = Mod(thisSeconds, SecondsPerDay$) + mvWebAccounts = CreateDate + mvWebAccounts = CreateTime + ExpireDateTime = SRP_JSON(objJSONWebAccounts, 'GetValue', 'password.expires') + ExpireDate = Iconv(Field(ExpireDateTime, ' ', 2, 3), 'D') + ExpireTime = Iconv(Field(ExpireDateTime, ' ', 5, 1), 'MT') + thisSeconds = ExpireDate * SecondsPerDay$ + ExpireTime + thisSeconds += TMZ * SecondsPerHour$ + ExpireDate = Int(thisSeconds / SecondsPerDay$) + ExpireTime = Mod(thisSeconds, SecondsPerDay$) + mvWebAccounts = ExpireDate + mvWebAccounts = ExpireTime + SRP_JSON(objJSONWebAccounts, 'Release') + end + end else + Error_Services('Add', 'Error parsing jsonWebAccounts in the ' : Service : ' service.') + end + end else + Error_Services('Add', 'jsonWebAccounts argument was missing in the ' : Service : ' service.') + end + + Response = mvWebAccounts + +end service + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//---------------------------------------------------------------------------------------------------------------------- +// GoSubLabel +// +//---------------------------------------------------------------------------------------------------------------------- +GoSubLabel: + +return diff --git a/FRAMEWORKS/STPROC/WEB_ACCOUNTS_ACTIONS.txt b/FRAMEWORKS/STPROC/WEB_ACCOUNTS_ACTIONS.txt new file mode 100644 index 0000000..ce321dd --- /dev/null +++ b/FRAMEWORKS/STPROC/WEB_ACCOUNTS_ACTIONS.txt @@ -0,0 +1,226 @@ +Function Web_Accounts_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Web_Accounts_Actions + + Description : Handles calculated columns and MFS calls for the current table. + + Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly. + If called from outside of a calculated column these will need to be set and restored. + + Parameters : + Action [in] -- Name of the action to be taken + CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be + populated when the CalcField action is being used. + FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM + delimited array, with the current MFS name as the first value in the array, and the BFS + name as the last value. Normally set by a calling MFS. + Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the + entire handle structure that the Basic+ Open statement would provide. Normally set by a + calling MFS. + Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS. + FMC [in] -- Various functions. Normally set by a calling MFS. + Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for + "get handle" functions). Normally set by a calling MFS. + Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but + for some actions can be set by the action handler to indicate failure. + OrigRecord [in] -- Original content of the record being processed by the current action. This is + automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within + BASE_MFS. + Param1-10 [in/out] -- Additional request parameter holders + ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.) + Can also be used to return a special value, such as the results of the CalcField + method. + + History : (Date, Initials, Notes) + 10/30/18 dmb [SRPFW-254] Original programmer. + 01/18/20 dmb [SRPFW-296] Update the CURRENT_PASSWORD_CREATED and CURRENT_PASSWORD_EXPIRES calculated + column logic by replacing Utility_DotNet('TIMEZONE') with the SRP_DateTime service (SRP + Utilities 2.1) to avoid localization problems and potential 502 Bad Gateway errors. + +***********************************************************************************************************************/ + +#pragma precomp SRP_PreCompiler + +$insert LOGICAL +$insert FILE.SYSTEM.EQUATES +$insert ACTION_SETUP +$insert WEB_ACCOUNTS_EQUATES + +Declare function SRP_DateTime + +If KeyID then GoSub Initialize_System_Variables + +Begin Case + + Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn + Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE + Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD + Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE + Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD + Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE + Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD + Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE + Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD + Case Otherwise$ ; Status = 'Invalid Action' + +End Case + +If KeyID then GoSub Restore_System_Variables + +Return ActionFlow OR ACTION_CONTINUE$ + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Calculated Columns +// +// The typical structure of a calculated column will look like this: +// +// Declare function Database_Services +// +// @ANS = Database_Services('CalculatedColumn') +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +CalculateColumn: + + // Make sure the ActionFlow return variable is cleared in case nothing is calculated. + ActionFlow = '' + + Begin Case + Case CalcColName EQ 'CURRENT_PASSWORD_CREATED' ; GoSub CURRENT_PASSWORD_CREATED + Case CalcColName EQ 'CURRENT_PASSWORD_EXPIRES' ; GoSub CURRENT_PASSWORD_EXPIRES + End Case + +return + + +CURRENT_PASSWORD_CREATED: + + Created = Iconv(Oconv({CURRENT_PASSWORD_CREATE_DATE}, 'D4/') : ' ' : Oconv({CURRENT_PASSWORD_CREATE_TIME}, 'MTS'), 'DTS') + Created = SRP_DateTime('Format', SRP_DateTime('ToUTC', Created), "DDD, DD MMM YYYY hh:mm:ss 'GMT'") + ActionFlow = Created + +return + + +CURRENT_PASSWORD_EXPIRES: + + Expires = Iconv(Oconv({CURRENT_PASSWORD_EXPIRE_DATE}, 'D4/') : ' ' : Oconv({CURRENT_PASSWORD_EXPIRE_TIME}, 'MTS'), 'DTS') + Expires = SRP_DateTime('Format', SRP_DateTime('ToUTC', Expires), "DDD, DD MMM YYYY hh:mm:ss 'GMT'") + ActionFlow = Expires + +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// MFS Actions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +READ_RECORD_PRE: + // In order to stop a record from being read in this action these lines of code must be used: + // + // OrigFileError = 100 : @FM : KeyID + // Status = 0 + // Record = '' + // ActionFlow = ACTION_STOP$ +return + + +READ_RECORD: + // In order to stop a record from being read in this action these lines of code must be used: + // + // OrigFileError = 100 : @FM : KeyID + // Status = 0 + // Record = '' +return + + +READONLY_RECORD_PRE: + // In order to stop a record from being read in this action these lines of code must be used: + // + // OrigFileError = 100 : @FM : KeyID + // Status = 0 + // Record = '' + // ActionFlow = ACTION_STOP$ +return + + +READONLY_RECORD: + // In order to stop a record from being read in this action these lines of code must be used: + // + // OrigFileError = 100 : @FM : KeyID + // Status = 0 + // Record = '' +return + + +WRITE_RECORD_PRE: +return + + +WRITE_RECORD: +return + + +DELETE_RECORD_PRE: +return + + +DELETE_RECORD: +return + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Internal GoSubs +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +Initialize_System_Variables: + + // Save these for restoration later + SaveDict = @DICT + SaveID = @ID + SaveRecord = @RECORD + OrigFileError = @FILE.ERROR + + // Now make sure @DICT, ID, and @RECORD are populated + CurrentDictName = '' + If @DICT then + DictHandle = @DICT<1, 2> + Locate DictHandle in @TABLES(5) Using @FM Setting fPos then + CurrentDictName = Field(@TABLES(0), @FM, fPos, 1) + end + end + + If CurrentDictName NE DictName then + Open DictName to @DICT else Status = 'Unable to initialize @DICT' + end + + @ID = KeyID + If Record else + // Record might not have been passed in. Read the record from the database table just to make sure. + @FILE.ERROR = '' + Open TableName to hTable then + FullFSList = hTable[1, 'F' : @VM] + BFS = FullFSList[-1, 'B' : @SVM] + LastHandle = hTable[-1, 'B' : \0D\] + FileHandle = \0D\ : LastHandle[1, @VM] + + Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus) + end + end + @RECORD = Record + +return + + +Restore_System_Variables: + + Transfer SaveDict to @DICT + Transfer SaveID to @ID + Transfer SaveRecord to @RECORD + @FILE.ERROR = OrigFileError + +return diff --git a/FRAMEWORKS/STPROCINS/ACTION_SETUP.txt b/FRAMEWORKS/STPROCINS/ACTION_SETUP.txt new file mode 100644 index 0000000..dadaa85 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/ACTION_SETUP.txt @@ -0,0 +1,133 @@ +Compile insert Action_Setup +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Action_Setup + + Description : Declarations and equates used by the table action commuters. + + Notes : Action_Setup also populates several variables that will often be useful within action handler code. + + History : (Date, Initials, Notes) + 08/13/10 dmb Original programmer. + 09/18/19 dmb Add TableVolumes@ and new Unused global commons in the /Tables/ common block. Remove + dependency upon the Locate statement in @Tables to find the volume of the current table. + - [SRPFW-282] + +***********************************************************************************************************************/ + +Common /Tables/ TableNames@, TableAccounts@, TableHandles@, SysObjHandle@, ActionListHandle@, PromotedListHandle@, NoActionListHandle@, NoPromotedListHandle@, TableVolumes@, Unused10@, Unused11@, Unused12@, Unused13@ + +Declare function RetStack + + +// SRP List declarations. +Declare function SRP_List_Create, SRP_List_CreateFromFastArray, SRP_List_Count, SRP_List_GetAt, SRP_List_GetVariable, SRP_List_Locate +Declare subroutine SRP_List_Add, SRP_List_InsertAt, SRP_List_Release, SRP_List_RemoveAt, SRP_List_SetAt + + +// Initialize handles if necessary. +// The handle to SYSOBJ is formatted for use with MFS/BFS calls. +If Len(SysObjHandle@) else Open 'SYSOBJ' to SysObjHandle@ then SysObjHandle@ = SysObjHandle@<0, 2> +If Len(ActionListHandle@) else ActionListHandle@ = SRP_List_Create() +If Len(PromotedListHandle@) else PromotedListHandle@ = SRP_List_Create() +If Len(NoActionListHandle@) else NoActionListHandle@ = SRP_List_Create() +If Len(NoPromotedListHandle@) else NoPromotedListHandle@ = SRP_List_Create() + + +// Return values to indicate how the action flow should continue. +Equ ACTION_STOP$ to 0 ; // Action flow should stop +Equ ACTION_CONTINUE$ to 1 ; // Action flow should continue until a later process changes this value +Equ ACTION_CONTINUE_NO_PROMOTED$ to 2 ; // Action flow should by-pass the promoted (generic) logic but allow the system action to execute +Equ ACTION_CONTINUE_NO_SYSTEM$ to 3 ; // Action flow should execute the promoted (generic) logic but stop the system action from executing +Equ ACTION_SYSTEM_ONLY$ to 4 ; // Action flow should execute the system action only + + +// Make sure any action parameters which have not been assigned are nulled. +If Assigned(Code) else Code = '' +If Assigned(Action) else Action = '' +If Assigned(CalcColName) else CalcColName = '' +If Assigned(FSList) else FSList = '' +If Assigned(Handle) else Handle = '' +If Assigned(Name) then KeyID = Name +If Assigned(KeyID) else KeyID = '' +If Assigned(FMC) else FMC = '' +If Assigned(Record) else Record = '' +If Assigned(Param1) else Param1 = '' +If Assigned(Param2) else Param2 = '' +If Assigned(Param3) else Param3 = '' +If Assigned(Param4) else Param4 = '' +If Assigned(Param5) else Param5 = '' +If Assigned(Param6) else Param6 = '' +If Assigned(Param7) else Param7 = '' +If Assigned(Param8) else Param8 = '' +If Assigned(Param9) else Param9 = '' +If Assigned(Param10) else Param10 = '' +If Assigned(OrigRecord) else OrigRecord = '' + + +// Get the program stack +RetStack = RetStack() + + +// 11 is the code value for the OPEN.FILE primitive. No need to call the following logic since it would be premature. +If Code NE 11 then + // Get the name of the database table if it has already been opened with the OPEN.FILE action. + If Len(Handle) then + // Being called from within the MFS. Most methods will pass in the valid database table handle. This should already + // be stored in the TableHandles@ global common. The associated regular database table name will be found in the + // TableNames@ global common. + Locate Handle in TableHandles@ using @FM Setting fPos then + TableName = TableNames@ + DictName = 'DICT.' : TableName + AccountName = TableAccounts@ + Volume = TableVolumes@ + TableHandle = FSList : @VM : Handle + end else + // If the handle was unable to be located in the TableHandles@ global common, this could be a situation where + // the handle was modified on-the-fly by the calling procedure (such as the MFS stack being manipulated for + // some reason). In this case, loop though each hnadle in TableHandles@ and see if it is contained within the + // handle being passed into the MFS. This isn't as precise, but a match will almost certainly be the correct + // handle. + FoundHandle = 0 + NumberHandles = DCount(TableHandles@, @FM) + For fPos = 1 to NumberHandles + CompareHandle = TableHandles@ + If Index(Handle, CompareHandle, 1) then + FoundHandle = 1 + TableName = TableNames@ + end + Until FoundHandle + Next CompareHandle + If FoundHandle then + DictName = 'DICT.' : TableName + AccountName = TableAccounts@ + Locate TableName in @Tables(0) using @FM setting fPos then + VolumeName = @Tables(1) + BFSType = VolumeName[1, '*'] + Volume = VolumeName[Col2() + 1, 99] + end else + Volume = '' + end + TableHandle = FSList : @VM : Handle + end + end + end + + If Assigned(TableName) else + // Either the Handle argument wasn't assigned or no match could be found in the TableHandles@ global common. + // Most likely this is because an ACTION commuter is being called directly from a program other than an MFS. + // Therefore the name of the database table will be extracted from the name of the ACTIONS program (which is + // assumed to follow the format _ACTIONS. + CurProc = RetStack[1, 'F' : @FM] + TableName = CurProc + Swap '_ACTIONS' with '' in TableName + + DictName = 'DICT.' : TableName + AccountName = '' + Volume = '' + Open TableName to TableHandle else TableHandle = '' + end +end diff --git a/FRAMEWORKS/STPROCINS/API_SETUP.txt b/FRAMEWORKS/STPROCINS/API_SETUP.txt new file mode 100644 index 0000000..9c360c2 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/API_SETUP.txt @@ -0,0 +1,48 @@ +Compile insert API_Setup +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : API_Setup + + Description : Sets up the current web API. + + Notes : See the comments added below. + + History : (Date, Initials, Notes) + 11/17/18 dmb Original programmer. - [SRPFW-257] + 02/03/19 dmb Update URLSegments logic to exclude the query params that are now returned by the + FullEndpointURL service. - [SRPFW-257] + 02/11/19 dmb Add FullEndpointNoQuery variable. This is the same as the FullEndpointURL but strips off the + query params. This will be used by logic that needs the full endpoint and also needs to + append additional segments. - [SRPFW-257] + +***********************************************************************************************************************/ + +Common /Debugging/ DebugFlag@ + +// Utility services. +Declare function Error_Services, HTTP_Services, HTTP_Resource_Services, RetStack +Declare subroutine Error_Services, HTTP_Services, HTTP_Resource_Services + +// The API URL is fixed for any application but should be customized for the application itself. This is not always +// passed into the request correctly, especially if a proxy service or rewrite rules are being used. +APIURL = HTTP_Services('GetAPIRootURL', True$) + +// The Full End Point URL indicates the URL submitted by the client. +FullEndpointURL = HTTP_Services('GetFullEndpointURL') +FullEndpointURLNoQuery = FullEndpointURL[1, 'F?'] +URLSegments = FullEndpointURLNoQuery +If URLSegments[-1, 1] EQ '/' then URLSegments[-1, 1] = '' +Convert '/' to @FM in URLSegments +NumSegments = DCount(URLSegments, @FM) +ParentURL = Field(FullEndpointURL, '/', 1, NumSegments - 1) +EndpointSegment = URLSegments +ParentSegment = URLSegments + +// The HTTP method (or verb) submitted by the client. +HTTPMethod = HTTP_Services('GetHTTPRequestMethod') + +// Get the name of the current service handler in case it needs to be used for error management. +CurrentAPI = RetStack()<1> diff --git a/FRAMEWORKS/STPROCINS/APP_INSERTS.txt b/FRAMEWORKS/STPROCINS/APP_INSERTS.txt new file mode 100644 index 0000000..60e7cdb --- /dev/null +++ b/FRAMEWORKS/STPROCINS/APP_INSERTS.txt @@ -0,0 +1,252 @@ +Compile insert App_Inserts + +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : App_Inserts + + Description : Common declarations and equates used by the application. + + Notes : App_Inserts is designed to be the most commonly used insert within SRP FrameWorks routines. + + History : (Date, Initials, Notes) + 07/23/98 dmb Original programmer. + 10/04/13 dmb Added insert for SystemFont$, SystemTypeface$, and SystemPoint$ to make it easier for + commuters to apply the FrameWorks default font. - [SRPFW-17] + +***********************************************************************************************************************/ + +Declare function Msg, PopUp, Set_Property, Get_Property, Utility, Send_Message, Dialog_Box, Start_Window +Declare function Start_MDIChild, Set_Printer, Get_Printer, SRP_Show_Window, MCP, GetTickCount +Declare function Form_Services, Error_Services, Memory_Services, MCP +Declare subroutine Set_Property, Utility, Send_Event, Send_Message, End_Dialog, Send_Info, Msg, SendMessage +Declare subroutine Forward_Event, Lock_Record, Post_Event, SRP_Show_Window, SRP_Set_Prop_Array +Declare subroutine Form_Services, Error_Services, SRP_Stopwatch, Memory_Services, MCP + +Equ SystemTable$ to 'APP_INFO' + +* Logical equates + +$insert LOGICAL + +Equ Success$ to 1 +Equ Failure$ to 0 +Equ Passed$ to 1 +Equ Failed$ to 0 +Equ Qualified$ to 1 +Equ Not_qualified$ to 0 +Equ Confirmed$ to 1 +Equ Not_confirmed$ to 0 +Equ OK$ to 1 + +* General equates + +Equ Tab$ to Char(9) +Equ Esc$ to \1B\ +Equ CRLF$ to \0D0A\ +Equ Lock$ to 1 +Equ Unlock$ to 2 +Equ ReadOnly$ to 0 +Equ FullWrite$ to 1 +Equ NoAccess$ to -1 + +* Font equates + +Equ Tahoma_8_Reg$ to 'Tahoma' : @SVM : -11 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 +Equ Tahoma_8_Reg_UL$ to 'Tahoma' : @SVM : -11 : @SVM : 400 : @SVM : 0 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 +Equ Tahoma_8_Bold$ to 'Tahoma' : @SVM : -11 : @SVM : 700 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + +Equ Tahoma_12_Reg$ to 'Tahoma' : @SVM : 12 : @SVM : 400 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 +Equ Tahoma_12_Reg_UL$ to 'Tahoma' : @SVM : 12 : @SVM : 400 : @SVM : 0 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 +Equ Tahoma_12_Bold$ to 'Tahoma' : @SVM : 12 : @SVM : 700 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 34 : @SVM : 0 : @SVM : 3 : @SVM : 2 : @SVM : 1 : @SVM : 0 : @SVM : 0 : @SVM : 0 : @SVM : 0 + +* Promoted Event equates + +Equ Create$ to 1 +Equ Activated$ to 2 +Equ Read_Pre_System$ to 3 +Equ Clear_Post_System$ to 4 +Equ Close_Post_System$ to 5 +Equ Size$ to 6 +Equ Delete_Post_System$ to 7 +Equ Winmsg$ to 8 +Equ Write_Pre_System$ to 9 +Equ Gotfocus$ to 10 +Equ Lostfocus$ to 11 +Equ Inactivated$ to 12 +Equ Read_Post_System$ to 13 +Equ Clear_Pre_System$ to 14 +Equ Poschanged$ to 15 +Equ Close_Pre_System$ to 16 +Equ Write_Post_System$ to 17 +Equ Delete_Pre_System$ to 18 +Equ InsertRow$ to 19 +Equ DeleteRow$ to 20 +Equ ColSize$ to 21 +Equ RightClickUp$ to 22 +Equ MouseOver$ to 23 +Equ MouseOff$ to 24 +Equ OLE$ to 25 +Equ Click$ to 26 +Equ Timer$ to 27 +Equ ContextMenu$ to 28 + +// General Windows API equates +Equ WM_USER to 1024 +Equ WM_CLOSE to 16 +Equ WM_COMMAND to 273 +Equ WM_LBUTTONDOWN to 513 ; // 0x0201 +Equ WM_LBUTTONUP to 514 ; // 0x0202 +Equ WM_LBUTTONDBLCLK to 515 ; // 0x0203 +Equ WM_RBUTTONDOWN to 516 ; // 0x0204 +Equ WM_RBUTTONUP to 517 ; // 0x0205 +Equ WM_PARENTNOTIFY to 528 ; // 0x0210 +Equ WM_SYSCOLORCHANGE to 21 ; // 0x0015 +Equ WM_SETCURSOR to 32 ; // 0x0020 +Equ WM_SIZE to 5 ; // 0x0005 +Equ WM_MOVE to 3 ; // 0x0003 +Equ WM_GETMINMAXINFO to 36 ; // 0x0024 +Equ WM_WINDOWPOSCHANGING to 70 + +// ShowWindow API equates +Equ SW_FORCEMINIMIZE to 11 +Equ SW_HIDE to 0 +Equ SW_MAXIMIZE to 3 +Equ SW_MINIMIZE to 6 +Equ SW_RESTORE to 9 +Equ SW_SHOW to 5 +Equ SW_SHOWDEFAULT to 10 +Equ SW_SHOWMAXIMIZED to 3 +Equ SW_SHOWMINIMIZED to 2 +Equ SW_SHOWMINNOACTIVE to 7 +Equ SW_SHOWNA to 8 +Equ SW_SHOWNOACTIVATE to 4 +Equ SW_SHOWNORMAL to 1 + + +Equ WS_CAPTION$ to 0x00C00000 +Equ WS_SYSMENU$ to 0x00080000 +Equ WS_THICKFRAME$ to 0x00040000 +Equ WS_EX_TOOLWINDOW$ to 0x00000080 +Equ WS_EX_CLIENTEDGE$ to 0x200 +Equ WS_CLIPCHILDREN$ to 0x02000000 + +Equ SM_CYCAPTION$ to 4 +Equ F4_VK_CODE to 115 ; // 115 is the virtual key code for F4. +Equ TAB_VK_CODE to 9 + +* Edittable/Datatable equates + +Equ DTN_ABORTEDIT to 17 +Equ DTM_EDITCURCELL to WM_USER + 95 ; * Change to Edit mode now +Equ DTM_SETEDITKEY to 1118 ; * Set key to change to Edit Mode +Equ DTM_SETCOLFORMAT to WM_USER + 18 + +Equ DT_BEGINEDIT to 1 ;* begin edit mode +Equ DT_ENDEDIT to 2 ;* end the edit +Equ DT_ABORTEDIT to 3 ;* Esc will undo changes +Equ DTS_EDIT to 4 +Equ DTCS_PROTECT to 8 + +* Help equates + +Equ HELP_CONTEXT to 1 +Equ HELP_QUIT to 2 +Equ HELP_INDEX to 3 +Equ HELP_CONTENTS to 3 +Equ HELP_HELPONHELP to 4 +Equ HELP_SETINDEX to 5 +Equ HELP_SETCONTENTS to 5 +Equ HELP_CONTEXTPOPUP to 8 +Equ HELP_FORCEFILE to 9 +Equ HELP_KEY to 257 +Equ HELP_COMMAND to 258 +Equ HELP_PARTIALKEY to 261 +Equ HELP_MULTIKEY to 513 +Equ HELP_SETWINPOS to 515 + +* Color equates + +Equ Msg_Light_Grey$ to 212:@VM:208:@VM:200 +Equ Msg_Dark_Grey$ to 127:@VM:127:@VM:127 +Equ Msg_Light_Blue$ to 0:@VM:255:@VM:255 +Equ Msg_Dark_Blue$ to 0:@VM:0:@VM:255 +Equ Msg_Red$ to 255:@VM:0:@VM:0 +Equ Msg_Green$ to 0:@VM:255:@VM:0 +Equ Msg_Purple$ to 255:@VM:0:@VM:255 +Equ Msg_Yellow$ to 255:@VM:255:@VM:0 +Equ Msg_Black$ to 0:@VM:0:@VM:0 +Equ Msg_White$ to 255:@VM:255:@VM:255 + +* RGB colors +EQU USEPARENT$ TO 0 ;* \000000\ +EQU BLACK$ TO 1 ;* \FFFFFF\ +EQU RED$ TO 255 ;* \0000FF\ +EQU ORANGE$ TO 33023 ;* \0080FF\ +EQU GREEN$ TO 65280 ;* \00FF00\ +EQU YELLOW$ TO 65535 ;* \00FFFF\ +EQU GREY$ TO 12632256 ;* \C0C0C0\ +EQU BLUE$ TO 16711680 ;* \FF0000\ +EQU PURPLE$ TO 16711808 ;* \FF0080\ +EQU MAGENTA$ TO 16711935 ;* \FF00FF\ +EQU CYAN$ TO 16776960 ;* \FFFF00\ +EQU WHITE$ TO 16777215 ;* \FFFFFF\ + +// The following color equates are used directly +// Example: Set_Property(CtrlEntID, "BACKCOLOR", COLOR_BTNFACE$) +EQU COLOR_SCROLLBAR$ TO 2147483648 ;* \80000000\ +EQU COLOR_BACKGROUND$ TO 2164260864 ;* \81000000\ +EQU COLOR_ACTIVECAPTION$ TO 2181038080 ;* \82000000\ +EQU COLOR_INACTIVECAPTION$ TO 2197815296 ;* \83000000\ +EQU COLOR_MENU$ TO 2214592512 ;* \84000000\ +EQU COLOR_WINDOW$ TO 2231369728 ;* \85000000\ +EQU COLOR_WINDOWFRAME$ TO 2248146944 ;* \86000000\ +EQU COLOR_MENUTEXT$ TO 2264924160 ;* \87000000\ +EQU COLOR_WINDOWTEXT$ TO 2281701376 ;* \88000000\ +EQU COLOR_CAPTIONTEXT$ TO 2298478592 ;* \89000000\ +EQU COLOR_ACTIVEBORDER$ TO 2315255808 ;* \8A000000\ +EQU COLOR_INACTIVEBORDER$ TO 2332033024 ;* \8B000000\ +EQU COLOR_APPWORKSPACE$ TO 2348810240 ;* \8C000000\ +EQU COLOR_HIGHLIGHT$ TO 2365587456 ;* \8D000000\ +EQU COLOR_HIGHLIGHTTEXT$ TO 2382364672 ;* \8E000000\ +EQU COLOR_BTNFACE$ TO 2399141888 ;* \8F000000\ +EQU COLOR_BTNSHADOW$ TO 2415919104 ;* \90000000\ +EQU COLOR_GRAYTEXT$ TO 2432696320 ;* \91000000\ +EQU COLOR_BTNTEXT$ TO 2449473536 ;* \92000000\ +EQU COLOR_INACTIVECAPTIONTEXT$ TO 2466250752 ;* \93000000\ +EQU COLOR_BTNHIGHLIGHT$ TO 2483027968 ;* \94000000\ + +// The following color equates are used with the GetSysColor WinAPI command +// Example: Set_Property(CtrlEntID, "BACKCOLOR", GetSysColor(API_COLOR_BTNFACE$)) +Equ API_COLOR_SCROLLBAR$ To 0 +Equ API_COLOR_BACKGROUND$ To 1 +Equ API_COLOR_ACTIVECAPTION$ To 2 +Equ API_COLOR_INACTIVECAPTION$ To 3 +Equ API_COLOR_MENU$ To 4 +Equ API_COLOR_WINDOW$ To 5 +Equ API_COLOR_WINDOWFRAME$ To 6 +Equ API_COLOR_MENUTEXT$ To 7 +Equ API_COLOR_WINDOWTEXT$ To 8 +Equ API_COLOR_CAPTIONTEXT$ To 9 +Equ API_COLOR_ACTIVEBORDER$ To 10 +Equ API_COLOR_INACTIVEBORDER$ To 11 +Equ API_COLOR_APPWORKSPACE$ To 12 +Equ API_COLOR_HIGHLIGHT$ To 13 +Equ API_COLOR_HIGHLIGHTTEXT$ To 14 +Equ API_COLOR_BTNFACE$ To 15 +Equ API_COLOR_BTNSHADOW$ To 16 +Equ API_COLOR_GRAYTEXT$ To 17 +Equ API_COLOR_BTNTEXT$ To 18 +Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19 +Equ API_COLOR_BTNHIGHLIGHT$ To 20 + +// Preference Manager +Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\' +PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT') +Convert ',' to @SVM in PMSystemFont +Equ SystemFont$ to PMSystemFont +Equ SystemTypeface$ to SystemFont$[1, @SVM] +Equ SystemPoint$ to SystemFont$[Col2() + 1, @SVM] + diff --git a/FRAMEWORKS/STPROCINS/CONTACTS_EQUATES.txt b/FRAMEWORKS/STPROCINS/CONTACTS_EQUATES.txt new file mode 100644 index 0000000..e7c8237 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/CONTACTS_EQUATES.txt @@ -0,0 +1,36 @@ +Compile insert CONTACTS_EQUATES +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : CONTACTS_EQUATES + + Description : Equates used by any service that works with the CONTACTS database table. + + Notes : + + History : (Date, Initials, Notes) + 07/06/17 dmb Original programmer. - [SRPFW-187] + +***********************************************************************************************************************/ + +Equ CONTACTS_CONTACT_ID$ To 0 +Equ CONTACTS_MODIFIED_BY$ To 1 +Equ CONTACTS_MODIFIED_DATE$ To 2 +Equ CONTACTS_MODIFIED_TIME$ To 3 +Equ CONTACTS_FIRST_NAME$ To 4 +Equ CONTACTS_LAST_NAME$ To 5 +Equ CONTACTS_ADDRESS$ To 6 +Equ CONTACTS_CITY$ To 7 +Equ CONTACTS_STATE$ To 8 +Equ CONTACTS_ZIP$ To 9 +Equ CONTACTS_COUNTY$ To 10 +Equ CONTACTS_PHONE_TYPE$ To 11 +Equ CONTACTS_PHONE_NUMBER$ To 12 +Equ CONTACTS_EMAIL$ To 13 +Equ CONTACTS_COMPANY$ To 14 +Equ CONTACTS_URL$ To 15 +Equ CONTACTS_BIRTHDATE$ To 16 +Equ CONTACTS_PICTURE$ To 17 +Equ CONTACTS_NOTES$ To 18 diff --git a/FRAMEWORKS/STPROCINS/EVENT_SETUP.txt b/FRAMEWORKS/STPROCINS/EVENT_SETUP.txt new file mode 100644 index 0000000..86f684c --- /dev/null +++ b/FRAMEWORKS/STPROCINS/EVENT_SETUP.txt @@ -0,0 +1,99 @@ +Compile insert Event_Setup + +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Event_Setup + + Description : Declarations and equates used by the form event commuters. + + Notes : Event_Setup also populates several variables that will often be useful within event handler code. + + History : (Date, Initials, Notes) + 08/13/10 dmb Original programmer. + +***********************************************************************************************************************/ + +Declare function Get_Property, Set_Property, Get_Current_Event, Get_Window_ID, Get_Record + +// Return values to indicate how the event flow should continue. +Equ EVENT_STOP$ to 0 ; // Event flow should stop +Equ EVENT_CONTINUE$ to 1 ; // Event flow should continue until a later process changes this value +Equ EVENT_CONTINUE_NO_PROMOTED$ to 2 ; // Event flow should by-pass the promoted (generic) logic but allow the system event handler to execute +Equ EVENT_CONTINUE_NO_SYSTEM$ to 3 ; // Event flow should execute the promoted (generic) logic but stop the system event handler from executing +Equ EVENT_SYSTEM_ONLY$ to 4 ; // Event flow should execute the system event handler only (normal option for third-party windows running in FrameWorks) + +// Make sure any event parameters which have not been assigned are nulled. +If Assigned(CtrlEntId) else CtrlEntId = '' +If Assigned(Event) else Event = '' +If Assigned(Param1) else Param1 = '' +If Assigned(Param2) else Param2 = '' +If Assigned(Param3) else Param3 = '' +If Assigned(Param4) else Param4 = '' +If Assigned(Param5) else Param5 = '' +If Assigned(Param6) else Param6 = '' +If Assigned(Param7) else Param7 = '' +If Assigned(Param8) else Param8 = '' +If Assigned(Param9) else Param9 = '' +If Assigned(Param10) else Param10 = '' +If Assigned(Param11) else Param11 = '' +If Assigned(Param12) else Param12 = '' +If Assigned(Param13) else Param13 = '' +If Assigned(Param14) else Param14 = '' +If Assigned(Param15) else Param15 = '' + +// Get the design time name of the window in case this is a multi-instance window. +Window = @Window[1, 'F*'] + +MDIFrame = Get_Property(@Window, 'MDIFRAME') +Parent = Get_Property(@Window, 'PARENT') +If MDIFrame EQ '' then MDIFrame = Parent ; // Dialog boxes won't set the MDIFRAME property so use the PARENT property. + +// Always get the CtrlClassID since we are not passing it through the event parameters. +CtrlClassId = Get_Property(CtrlEntId, 'TYPE') + +// Get the name of the control on the window based on the CtrlClassId. +Begin Case + Case CtrlClassId EQ 'WINDOW' + Control = Window + Case CtrlClassId EQ 'RADIOBUTTON' + Control = Field(CtrlEntId, '.', 2, 2) + Case CtrlClassId EQ 'MENU' + Control = CtrlEntId[-1, 'B.'] + Case 1 + Control = Field(CtrlEntId, '.', 2, 1) +End Case + +// If this is an OLE control, get the ProgID. +ProgID = '' +If CtrlClassId EQ 'OLECONTROL' then ProgID = Get_Property(CtrlEntId, 'ORIG_TEXT') + +// Get the Event Type so generic event functionality can be executed properly. +EventType = Get_Current_Event() + +// Combine the event type and control into an event action. +If EventType EQ 'OLE' then + // Because the Promoted_Events function transfers parameters, this will only appear correctly in a commuter module. + EventAction = Event : '.' : Control +end else + EventAction = EventType : '.' : Control +end + +// Get the current window's key ID. Strip off the @SVM if this window is ignoring self-locks. +KeyID = Get_Property(@Window, 'ID')[1, 'F' : @SVM] + +// If KeyID is null then check to see if the key controls are populated. If so, then this is probably a locked record. +// ID properties are null with locked records. +If KeyID EQ '' then + KeyID = Get_Window_ID(@Window) +end + +// Get the current window's record. +Record = Get_Property(@Window, 'ATRECORD') + +// If the window uses QuickEvents to call the commuter module, check for @EVENT in the event parameter. This is here for +// backwards compatability. OpenInsight 7.1 and higher automatically swaps @EVENT with the actual event. Prior versions +// of OpenInsight will just pass the literal through. Therefore, this will swap out @EVENT with the actual event. +If Event EQ '@EVENT' then Swap '@EVENT' with EventType in Event diff --git a/FRAMEWORKS/STPROCINS/HTTP_FRAMEWORK_SETUP_EQUATES.txt b/FRAMEWORKS/STPROCINS/HTTP_FRAMEWORK_SETUP_EQUATES.txt new file mode 100644 index 0000000..7c03b87 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/HTTP_FRAMEWORK_SETUP_EQUATES.txt @@ -0,0 +1,131 @@ +Compile insert HTTP_Framework_Setup_Equates +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Framework_Setup_Equates + + Description : + + Notes : The SRP HTTP Framework stores configuration settings in the SYSENV\SRP_HTTP_FRAMEWORK_SETUP[*AppID] + record. These equates define the meaning of each value and can be used in routines that read/write + data to this configuration record. + + History : (Date, Initials, Notes) + 11/07/16 dmb Original programmer. + 01/01/17 dmb [SRPFW-116] Added HTTP_FRAMEWORK_SETUP_FLUSH_CACHE$. + 02/03/17 dmb [SRPFW-132] Added HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_URLS$. + 02/27/17 dmb [SRPFW-125] Added HTTP_FRAMEWORK_SETUP_ABORTED_SERVICE$. + 03/04/17 dmb [SRPFW-154] Added HTTP_FRAMEWORK_SETUP_ENABLE_LOGGING$. + 03/07/17 dmb [SRPFW-155] Added HTTP_FRAMEWORK_SETUP_DEBUGGER_SETTING$ and + HTTP_FRAMEWORK_SETUP_DEBUGGER_INTERCEPT$. + 07/07/17 dmb [SRPFW-154] Added HTTP_FRAMEWORK_SETUP_LOG_ERRORS_ONLY$. + 10/22/18 dmb [SRPFW-253] Added HTTP_FRAMEWORK_SETUP_WHITELISTED_IPS$. + 11/01/18 dmb [SRPFW-255] Added HTTP_FRAMEWORK_SETUP_ENABLE_HTTP_BASIC_AUTHENTICATION$. + 11/01/18 dmb [SRPFW-255] Added HTTP_FRAMEWORK_SETUP_NEW_PASSWORD_TIME_TO_LIVE$. + 11/01/18 dmb [SRPFW-255] Added HTTP_FRAMEWORK_SETUP_OLD_PASSWORD_TIME_TO_LIVE$. + 11/01/18 dmb [SRPFW-256] Added HTTP_FRAMEWORK_SETUP_INVALID_PASSWORD_LIMIT$. + 11/01/18 dmb [SRPFW-256] Added HTTP_FRAMEWORK_SETUP_CONTAINMENT_ACTION$. + 11/05/18 dmb [SRPFW-257] Added ResourcesKeyID$ equate. + 11/18/18 dmb [SRPFW-257] Added HTTP_FRAMEWORK_SETUP_API_CALL_PROCEDURE$. + 11/18/18 dmb [SRPFW-257] Added Equ APISignatureKeyID$. + 11/18/18 dmb [SRPFW-257] Added Equ APICommentBlockKeyID$. + 11/18/18 dmb [SRPFW-257] Added Equ APIBodyBlockKeyID$. + 09/23/19 dmb [SRPFW-278] Added Equ ArchiveScriptKeyID$. + 06/15/20 dmb [SRPFW-313] Added HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_PATHS$ as a synonym for + HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_URLS$ (which is being deprecated). + 06/15/20 dmb [SRPFW-313] Added HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_QUERY_PARAMS$. + 06/30/20 dmb [SRPFW-313] Added HTTP_FRAMEWORK_SETUP_BANNED_IPS$. + 06/30/20 dmb [SRPFW-313] Added HTTP_FRAMEWORK_SETUP_WHITELISTED_IPS_TYPE$ + +***********************************************************************************************************************/ + +Equ EVENT_CONTINUE$ to 1 +Equ EVENT_STOP$ to 0 +Equ ApplicationPath$ to Drive() + +Equ SetupTable$ to 'SYSENV' +Equ SetupRowKeyID$ to 'SRP_HTTP_FRAMEWORK_SETUP' +Equ ResourcesKeyID$ to 'SRP_HTTP_FRAMEWORK_RESOURCES' +Equ APISignatureKeyID$ to 'SRP_HTTP_FRAMEWORK_TEMPLATE_API_SIGNATURE' +Equ APICommentBlockKeyID$ to 'SRP_HTTP_FRAMEWORK_TEMPLATE_API_COMMENT_BLOCK' +Equ APIBodyBlockKeyID$ to 'SRP_HTTP_FRAMEWORK_TEMPLATE_API_BODY' +Equ ArchiveScriptKeyID$ to 'SRP_HTTP_FRAMEWORK_HTTP_LOGS_ARCHIVE_SCRIPT' + +// Identifies the primary URL of the website, e.g., www.mywebsite.com. +Equ HTTP_FRAMEWORK_SETUP_HOME_URL$ to 1 +// Identifies the path that is appended to the Home URL wherein the entry point of the API begins, e.g., /api +// +// The HTTP_Service_Setup uses the above information to create proper RESTful responses wherein paths to other +// web service APIs need to be included within the response. Thus, in the above examples, the two are joined +// when creating fully resolved API URLs, e.g., www.mywebsite.com/api/ +Equ HTTP_FRAMEWORK_SETUP_API_URL$ to 2 +// Used in HTTP_MCP to identify the local OS path where request and response content can be saved for off-line +// analysis. If the path does not exist, then no attempt to store this information will be made. +Equ HTTP_FRAMEWORK_SETUP_CAPTURE_PATH$ to 3 +// Boolean setting that determines if authentication is enabled. Used by HTTP_Authentication_Services. +// Note: Only an explicit value of 0 (False) will disable authentication. Any other value, including an empty +// value, will enable authentication. +Equ HTTP_FRAMEWORK_SETUP_ENABLE_AUTHENTICATION$ to 4 +// Used with HTTP authentication to associate resource links to the same protective space. +Equ HTTP_FRAMEWORK_SETUP_REALM_VALUE$ to 5 +// Name of the entry point web service. This is used by HTTP_MCP to call the first web service. This should not +// include the standard HTTP prefix or SERVICES suffix. The default value is entry_point. +Equ HTTP_FRAMEWORK_SETUP_ENTRY_POINT_SERVICE$ to 6 +// Boolean setting that determines if code should be flushed when the web service is finished. This allows changes +// in web service procedures to always be available without having to restart the OEngineServer. +Equ HTTP_FRAMEWORK_SETUP_FLUSH_CACHE$ to 7 +// @VM list of Paths that should not be authenticated. This includes Paths that support OAuth redirects since these +// requests will unlikely be authenticated (although they should be secret and secure with the OAuth authenticating +// server). +Equ HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_URLS$ to 8 +Equ HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_PATHS$ to 8 +// Service handler for HTTP Requests that get aborted either due to Runtime Errors or Status Errors. If the Debugger +// Intercept has been enabled, this handler will only receive Status Error aborts. +Equ HTTP_FRAMEWORK_SETUP_ABORTED_SERVICE$ to 9 +// Boolean setting that determines if logging is enabled. This is used by the CreateLogFile service. +// Note: Only an explicit value of 0 (False) will disable logging. Any other value, including an empty +// value, will enable logging. +Equ HTTP_FRAMEWORK_SETUP_ENABLE_LOGGING$ to 10 +// Debugger Setting value that will be passed into the RTI_Debugger_Setting subroutine. 0=Disabled, 1=Enabled, and +// 2=Intercept. If value is 2, the value of HTTP_FRAMEWORK_SETUP_DEBUGGER_INTERCEPT$ will be used to determine the +// name of the intercept stored procedure. +Equ HTTP_FRAMEWORK_SETUP_DEBUGGER_SETTING$ to 11 +// Service handler for HTTP Requests that abort due to a Runtime Error and the Debugger Intercept has been enabled. +// See HTTP_FRAMEWORK_SETUP_DEBUGGER_SETTING$. +Equ HTTP_FRAMEWORK_SETUP_DEBUGGER_INTERCEPT$ to 12 +// Boolean setting that determines if only error responses (i.e., status codes of 4xx or 5xx) should be logged. This is +// used by the CreateLogFile service. Note: Only an explicit value of 0 (False) will disable logging. Any other value, +// including an empty value, will enable logging. +Equ HTTP_FRAMEWORK_SETUP_LOG_ERRORS_ONLY$ to 13 +// @VM list of IPs that should be permitted. If this list is empty, then all IPs are permitted. Note, a valid IP does +// not automatically mean the request is authenticated. That is a separate check. +Equ HTTP_FRAMEWORK_SETUP_WHITELISTED_IPS$ to 14 +// Boolean setting that determines if HTTP Basic Authentication is enabled. Used by HTTP_Authentication_Services. This +// is ignored if the Enable Authentication flag is set to False. +Equ HTTP_FRAMEWORK_SETUP_ENABLE_HTTP_BASIC_AUTHENTICATION$ to 15 +// If HTTP Basic Authentication is enabled, this is how long (in hours) new passwords that are created can be valid +// before needing to be reset. If left empty, passwords do not expire. +Equ HTTP_FRAMEWORK_SETUP_NEW_PASSWORD_TIME_TO_LIVE$ to 16 +// If HTTP Basic Authentication is enabled, this is how long (in hours) old passwords can remain valid. This should be a +// short period of time allowing for the new password to propogate. If left empty, old passwords will only be valid for +// 1 hour. +Equ HTTP_FRAMEWORK_SETUP_OLD_PASSWORD_TIME_TO_LIVE$ to 17 +// If HTTP Basic Authentication is enabled, this is how many attempts to access the system with an invalid password will +// be allowed before containment action is taken. +Equ HTTP_FRAMEWORK_SETUP_INVALID_PASSWORD_LIMIT$ to 18 +// If HTTP Basic Authentication is enabled, this determines the containment action to take when the number of invalid +// password attempts has been exceeded. +Equ HTTP_FRAMEWORK_SETUP_CONTAINMENT_ACTION$ to 19 +// The type of method used to call the API. +Equ HTTP_FRAMEWORK_SETUP_API_CALL_PROCEDURE$ to 20 +// @VM/@TM delimited list of query params that should be used to further define which URL paths should be +// non-authenticated. +Equ HTTP_FRAMEWORK_SETUP_NON_AUTHENTICATED_QUERY_PARAMS$ to 21 +// @VM list of IPs that should be banned. +Equ HTTP_FRAMEWORK_SETUP_BANNED_IPS$ to 22 +// Flag to determine if Whitelisted IPs should represent only those IPs that will be permitted (default) or if +// Whitelisted IPs should always be permitted (i.e., do not require other forms of authentication). Empty value or 1 +// means restriced IP access, 2 means IPs are always permitted. +Equ HTTP_FRAMEWORK_SETUP_WHITELISTED_IPS_TYPE$ to 23 diff --git a/FRAMEWORKS/STPROCINS/HTTP_INSERTS.txt b/FRAMEWORKS/STPROCINS/HTTP_INSERTS.txt new file mode 100644 index 0000000..f31c054 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/HTTP_INSERTS.txt @@ -0,0 +1,28 @@ +Compile insert HTTP_Inserts +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Inserts + + Description : Declares and equates used by HTTP services. + + Notes : + + History : (Date, Initials, Notes) + 02/06/15 dmb Original programmer. - [SRPFW-77] + 02/16/15 dmb Add HTTP_Services in the declaration list. - [SRPFW-83] + 02/27/16 dmb Add SRP_Hash in the declaration list. - [SRPFW-112] + +***********************************************************************************************************************/ + +// Utility services. +Declare function Namecap, HexConv, Run_OECGI_Request +Declare function SRP_Extract_XML, SRP_Encode, SRP_Decode, SRP_Hash +Declare function HTTP_JSON_Services, HTTP_Services, SRP_JSON +Declare subroutine HTTP_JSON_Services, HTTP_Services, SRP_JSON + +// Application services. +Declare function HTTP_Authentication_Services +Declare subroutine HTTP_Authentication_Services, HTTP_Entry_Point_Services diff --git a/FRAMEWORKS/STPROCINS/HTTP_SERVICE_SETUP.txt b/FRAMEWORKS/STPROCINS/HTTP_SERVICE_SETUP.txt new file mode 100644 index 0000000..3c72fb1 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/HTTP_SERVICE_SETUP.txt @@ -0,0 +1,54 @@ +Compile insert HTTP_Service_Setup +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : HTTP_Service_Setup + + Description : Sets up the current HTTP service by parsing the current URL as needed. + + Notes : See the comments added below. + + History : (Date, Initials, Notes) + 02/25/15 dmb Original programmer. - [SRPFW-84] + 02/22/16 dmb Swap hardcoded URL equates with Xlates from SYSENV\SRP_HTTP_FRAMEWORK_SETUP configuration + record. - [SRPFW-103] + 02/23/16 dmb Add a work-around fix for IIS web server requests. - [SRPFW-102] + 02/25/16 dmb Replace Xlates into SYSENV\SRP_HTTP_FRAMEWORK_SETUP with GetHomeURL and GetAPIRootURL + services. - [SRPFW-108] + 03/09/16 dmb Refactor code to be more streamlined. Remove several lines of code and optimize for changes + to the RunHTTPService service. - [SRPFW-112] + +***********************************************************************************************************************/ + +Common /Debugging/ DebugFlag@ + +// Utility services. +Declare function Error_Services, HTTP_Services, HTTP_Resource_Services, RetStack +Declare subroutine Error_Services, HTTP_Services, HTTP_Resource_Services + +// The API URL is fixed for any application but should be customized for the application itself. This is not always +// passed into the request correctly, especially if a proxy service or rewrite rules are being used. +APIURL = HTTP_Services('GetAPIRootURL', True$) + +// The Full End Point URL indicates the URL submitted by the client. +FullEndPointURL = HTTP_Services('GetFullEndPointURL') + +// The HTTP method (or verb) submitted by the client. +HTTPMethod = HTTP_Services('GetHTTPRequestMethod') + +// The Self URL represents the Full End Point URL up to the current segment. This often used in hypermedia responses +// so clients know how to trace back. +LenRemainingURL = Len(RemainingURL) +LenFullEndPointURL = Len(FullEndPointURL) +SelfURL = FullEndPointURL[1, (LenFullEndPointURL - LenRemainingURL)] +If SelfURL[-1, 1] = '/' then SelfURL[-1, 1] = '' +HTTP_Services('SetSelfURL', SelfURL) + +// The Next Segment is the segment in the URL path that will come immediately after the current segment. This could +// represent another service or it could represent an Item ID for the current service/resource. +NextSegment = RemainingURL[1, '/'] + +// Get the name of the current service handler in case it needs to be used for error management. +CurrentServiceHandler = RetStack()<1> diff --git a/FRAMEWORKS/STPROCINS/INET_EQUATES.txt b/FRAMEWORKS/STPROCINS/INET_EQUATES.txt new file mode 100644 index 0000000..0249500 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/INET_EQUATES.txt @@ -0,0 +1,77 @@ +compile insert Inet_Equates + + +* CGI enviromental variables (see source\oinsight\c\oicgi\request.h) +equ QUERY_STRING$ to 1 +equ PATH_INFO$ to 2 +equ CONTENT_TYPE$ to 3 +equ CONTENT_LENGTH$ to 4 +equ GATEWAY_INTERFACE$ to 5 +equ HTTPS$ to 6 +equ HTTP_ACCEPT$ to 7 +equ HTTP_COOKIE$ to 8 +equ HTTP_FROM$ to 9 +equ HTTP_REFERER$ to 10 +equ HTTP_USER_AGENT$ to 11 +equ PATH_TRANSLATED$ to 12 +equ REMOTE_ADDR$ to 13 +equ REMOTE_HOST$ to 14 +equ REMOTE_IDENT$ to 15 +equ REMOTE_USER$ to 16 +equ REQUEST_METHOD$ to 17 +equ SCRIPT_NAME$ to 18 +equ SERVER_NAME$ to 19 +equ SERVER_PORT$ to 20 +equ SERVER_PROTOCOL$ to 21 +equ SERVER_SOFTWARE$ to 22 +equ SERVER_URL$ to 23 +equ NOURLDECODE$ to 24 ; * // Mr C, Added 7th November 2003 +equ RESPONSE_IS_BINARY$ to 25 ; * // Mr C, Added 15th March 2006 +Equ REGISTRY_SETTINGS$ To 26 ;* bzs 031706 + +* BZS 031813 Added for OECGI4+ +Equ OECGI_VERSION$ To 27 +Equ GET_STRING$ To 28 +Equ POST_STRING$ To 29 +Equ ADDITIONAL_VALUES_STRING$ TO 30 + +* BZS 042419 Added for encryption +Equ ENCODING_STRING$ To 31 + +* Gateway Services Monitor window name +equ GS_MONITOR$ to 'INET_GATEWAY' + +* OMNIEVENT calls +equ INCOMING$ to 'INCOMING' ;* Param1 = request +equ OUTCOMING$ to 'OUTCOMING' ;* Param1 = response +equ INPROGRESS$ to 'INPROGRESS' ;* Param1 = time left before timeout (in secs) + + +* persistent configuration information +equ CFG_TABLE$ to "SYSENV" +equ CFG_KEY$ to "CFG_INET" + +* fields in CFG_INET +equ CFG_CALLBACK$ to 1 +equ CFG_ERRTEXT$ to 2 +Equ CFG_DEFAULTS$ To 3 ;* bzs 061209 +Equ CFG_QUERYPARAM_FLAG$ To 4 ;* BZS 060311 +Equ CFG_INET_WHITELIST$ To 5 ;* bzs 061711 +Equ CFG_TYPE_COMPRESSION$ To 6 ;* bzs 042419 +Equ CFG_TYPE_COMPRESSION_DEFAULT$ To "deflate":@VM:"gzip" ;* bzs 042419 what we support, in the preferred order +Equ CFG_MIN_COMPRESSION$ To 7 ;* bzs 042419 +Equ CFG_MIN_COMPRESSION_DEFAULT$ To 1000 ;* bzs 042419 + +* values in CFG_INET +equ CFG_FN_SECURITY$ to 1 ;* a la INET_SECURITY +equ CFG_FN_FINALIZE$ to 2 ;* a la INET_FINALIZE +equ CFG_FN_ABORTED$ to 3 ;* errtext=() - called when an inet procedure has crashed and the gateway recovers +equ CFG_FN_WHITELIST$ to 4 ;* a la INET_WHITELIST +Equ CFG_FN_HANDLER$ To 5 ;* bzs 031517 RESTful processing routine, if applicable + +* values in CFG_INET (multiple lines @tm-delim'd) +equ CFG_ERR_NORESULT$ to 1 + +* bzs 061209 values in CFG_INET +Equ CFG_DEF_CGI$ To 1 ; * a la ".CGI" +Equ CFG_DEF_PAGE$ To 2 ; * a la "/login" diff --git a/FRAMEWORKS/STPROCINS/INVOICES_EQUATES.txt b/FRAMEWORKS/STPROCINS/INVOICES_EQUATES.txt new file mode 100644 index 0000000..e400f3b --- /dev/null +++ b/FRAMEWORKS/STPROCINS/INVOICES_EQUATES.txt @@ -0,0 +1,15 @@ +compile insert INVOICES_EQUATES +/*---------------------------------------- + Author : Table Create Insert Routine + Written : 13/02/2020 + Description : Insert for Table INVOICES +----------------------------------------*/ + + +Equ INVOICES.INVOICE_NO$ To 0 +Equ INVOICES.CLIENT_NO$ To 1 +Equ INVOICES.INVOICE_DATE$ To 2 +Equ INVOICES.SHIPPING_DESTINATION$ To 3 +Equ INVOICES.CONTACTS$ To 4 +Equ INVOICES.PHONE_NUMBERS$ To 5 +Equ INVOICES.TERMS$ To 6 diff --git a/FRAMEWORKS/STPROCINS/MENU_EQUATES.txt b/FRAMEWORKS/STPROCINS/MENU_EQUATES.txt new file mode 100644 index 0000000..e5a2ea8 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/MENU_EQUATES.txt @@ -0,0 +1,43 @@ +Compile Insert Menu_Equates + +* // These should have been in PS_EQUATES + +Equ MENUPOS_TYPE$ To 1 +Equ MENUPOS_END$ To 2 +Equ MENUPOS_ITEMNAME$ To 3 +Equ MENUPOS_TEXT$ To 4 +Equ MENUPOS_GREY$ To 5 +Equ MENUPOS_CHECK$ To 6 +Equ MENUPOS_HIDDEN$ To 7 +Equ MENUPOS_ACCEL$ To 8 +Equ MENUPOS_HELP_TEXT$ To 9 +Equ MENUPOS_HANDLER$ To 10 +Equ MENUPOS_STYLE$ To 11 + +* // These are used by CREATE_CONTEXT_MENU, and denote the structure of a menu item as passed in the +* // second parameter + +* Menu equates + +Equ MenuItem_Name$ to 1 +Equ MenuItem_Pos$ to 2 +Equ MenuItem_Text$ to 3 +Equ MenuItem_State$ to 4 + +Equ MF_ByCommand$ to 0x000 +Equ MF_ByPosition$ to 0x0400 +Equ MF_Separator$ to 2048 + +Equ MenuItemTypePos$ To 1 +Equ MenuItemTextPos$ To 2 +Equ MenuItemNamePos$ To 3 +Equ MenuItemGrayPos$ To 4 +Equ MenuItemCheckPos$ To 5 +Equ MenuItemStylePos$ To 6 +Equ MenuItemEndFlagPos$ To 7 + +Equ ContextMenuSuffix$ To ".CONTEXT_MENU" +Equ ContextMenuClass$ To "FLOATING" +Equ ContextMenuType$ To "MENU" + +Equ ContextMenuHeaderType$ To ".POPUP" diff --git a/FRAMEWORKS/STPROCINS/SECURITY_EQUATES.txt b/FRAMEWORKS/STPROCINS/SECURITY_EQUATES.txt new file mode 100644 index 0000000..cc3b984 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/SECURITY_EQUATES.txt @@ -0,0 +1,3 @@ +compile insert SECURITY_EQUATES + +Common /Application Security/ Username%, Login%, AccessLevel%, SecurityUnused4%, SecurityUnused5%, SecurityUnused6%, SecurityUnused7%, SecurityUnused8% diff --git a/FRAMEWORKS/STPROCINS/SERVICE_SETUP.txt b/FRAMEWORKS/STPROCINS/SERVICE_SETUP.txt new file mode 100644 index 0000000..d4de932 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/SERVICE_SETUP.txt @@ -0,0 +1,43 @@ +Compile insert Service_Setup + +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : Service_Setup + + Description : Equates used by the Service modules. + + Notes : + + History : (Date, Initials, Notes) + 08/13/10 dmb Original programmer. + +***********************************************************************************************************************/ + +Declare function RetStack, Error_Services +Declare subroutine Error_Services + + +// Make sure any request parameters which have not been assigned are nulled. +If Assigned(Service) else Service = '' +If Assigned(Error) else Error = '' +If Assigned(Param1) else Param1 = '' +If Assigned(Param2) else Param2 = '' +If Assigned(Param3) else Param3 = '' +If Assigned(Param4) else Param4 = '' +If Assigned(Param5) else Param5 = '' +If Assigned(Param6) else Param6 = '' +If Assigned(Param7) else Param7 = '' +If Assigned(Param8) else Param8 = '' +If Assigned(Param9) else Param9 = '' +If Assigned(Param10) else Param10 = '' +If Assigned(Response) else Response = '' + +// Create the service Key ID in case Memory_Services is used. +ServiceModule = RetStack()<1> +ServiceKeyID = ServiceModule : '*' : Service + +// Clear any error conditions. +Error_Services('Clear') diff --git a/FRAMEWORKS/STPROCINS/SRPMAIL_INSERTS.txt b/FRAMEWORKS/STPROCINS/SRPMAIL_INSERTS.txt new file mode 100644 index 0000000..ec3d761 --- /dev/null +++ b/FRAMEWORKS/STPROCINS/SRPMAIL_INSERTS.txt @@ -0,0 +1,42 @@ +Compile insert SRPMAIL_INSERTS + +Declare function SRPSendMail, SRP_Send_Mail + +*---------------------------------------------------- +* Configuration + +* field +Equ SendUsing$ to 1 +Equ SMTPServerPickupDir$ to 2 +Equ SMTPServerPort$ to 3 +Equ SMTPServer$ to 4 +Equ SMTPAuthenticate$ to 5 +Equ SMTPSendUsername$ to 6 +Equ SMTPSendPassword$ to 7 + +* SendUsing values +Equ SendUsing_Pickup$ to 1 +Equ SendUsing_Port$ to 2 + +* SMTPServerPort values +Equ SMTPServerPortDefault$ to 25 + +*---------------------------------------------------- +* Message + +* fields +Equ SRPMail_Subject$ to 1 +Equ SRPMail_From$ to 2 +Equ SRPMail_To$ to 3 +Equ SRPMail_Cc$ to 4 +Equ SRPMail_Bcc$ to 5 +Equ SRPMail_ReplyTo$ to 6 +Equ SRPMail_BodyType$ to 7 +Equ SRPMail_Body$ to 8 +Equ SRPMail_Attachments$ to 9 +Equ SRPMail_Importance$ to 10 + +* Importance Levels +Equ SRPMail_Importance_Low$ to 0 +Equ SRPMail_Importance_Normal$ to 1 +Equ SRPMail_Importance_High$ to 2 diff --git a/FRAMEWORKS/STPROCINS/WEB_ACCOUNTS_EQUATES.txt b/FRAMEWORKS/STPROCINS/WEB_ACCOUNTS_EQUATES.txt new file mode 100644 index 0000000..8ca463c --- /dev/null +++ b/FRAMEWORKS/STPROCINS/WEB_ACCOUNTS_EQUATES.txt @@ -0,0 +1,36 @@ +compile insert WEB_ACCOUNTS_EQUATES +/*********************************************************************************************************************** + + This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written + permission from SRP Computer Solutions, Inc. + + Name : WEB_ACCOUNTS_EQUATES + + Description : Equates used by any service that works with the WEB_ACCOUNTS database table. + + Notes : + + History : (Date, Initials, Notes) + 10/30/18 dmb Original programmer. - [SRPFW-254] + 11/01/18 dmb Add WEB_ACCOUNTS.ACCOUNT_ENABLED$. - [SRPFW-256] + 11/01/18 dmb Add WEB_ACCOUNTS.INVALID_PASSWORD_ATTEMPTS$. - [SRPFW-256] + +***********************************************************************************************************************/ + +Equ WEB_ACCOUNTS.ID$ To 0 +Equ WEB_ACCOUNTS.MODIFIED_BY$ To 1 +Equ WEB_ACCOUNTS.MODIFIED_DATE$ To 2 +Equ WEB_ACCOUNTS.MODIFIED_TIME$ To 3 +Equ WEB_ACCOUNTS.NAME$ To 4 +Equ WEB_ACCOUNTS.CURRENT_PASSWORD$ To 5 +Equ WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_DATE$ To 6 +Equ WEB_ACCOUNTS.CURRENT_PASSWORD_CREATE_TIME$ To 7 +Equ WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_DATE$ To 8 +Equ WEB_ACCOUNTS.CURRENT_PASSWORD_EXPIRE_TIME$ To 9 +Equ WEB_ACCOUNTS.OLD_PASSWORD$ To 10 +Equ WEB_ACCOUNTS.OLD_PASSWORD_CREATE_DATE$ To 11 +Equ WEB_ACCOUNTS.OLD_PASSWORD_CREATE_TIME$ To 12 +Equ WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_DATE$ To 13 +Equ WEB_ACCOUNTS.OLD_PASSWORD_EXPIRE_TIME$ To 14 +Equ WEB_ACCOUNTS.ACCOUNT_ENABLED$ To 15 +Equ WEB_ACCOUNTS.INVALID_PASSWORD_ATTEMPTS$ To 16